Home
Softono
chatbotfullpipeline

chatbotfullpipeline

Open source Python
18
Stars
4
Forks
0
Issues
0
Watchers
1 month
Last Commit

About chatbotfullpipeline

Personalized Multimodal AI Agent via Google ADK & Gemini. Featuring Realtime Soniox STT, Long-term Memory (mem0), and LLM-generated Wiki Knowledge Base (inspired by Karpathy)

Platforms

Web Self-hosted Cloud

Languages

Python

πŸ€– MemRAG Chatbot

Multimodal AI Research Assistant được xΓ’y dα»±ng trΓͺn Google Agent Development Kit (ADK)

KαΊΏt hợp RAG Β· Bα»™ nhα»› dΓ i hαΊ‘n Β· Transcription thời gian thα»±c Β· Wiki Knowledge Graph

Live Demo


πŸ›  Tech Stack

Python FastAPI Google Gemini React TypeScript Vite TailwindCSS

AWS ECS S3 DynamoDB RDS ElastiCache CloudFront

Qdrant Terraform GitHub Actions Docker


✨ TΓ­nh nΔƒng nα»•i bαΊ­t

Tính năng Mô tả
πŸš€ Realtime Chat Streaming SSE token-by-token, phαΊ£n hα»“i tα»©c thΓ¬
πŸ“„ Multimodal PDF RAG Upload PDF β†’ chunk β†’ embed β†’ semantic search vα»›i trΓ­ch dαΊ«n
🧠 Long-term Memory TΓ­ch hợp mem0 ghi nhα»› thΓ΄ng tin cΓ‘ nhΓ’n xuyΓͺn phiΓͺn
πŸŽ™οΈ Realtime Transcription Soniox STT, 60+ ngΓ΄n ngα»―, tα»± lΖ°u transcript β†’ RAG
🌐 Wiki Knowledge Graph Tα»± tα»•ng hợp tα»« tΓ i liệu + meetings, visualize bαΊ±ng React Flow
⚑ Redis Caching ElastiCache cache wiki/graph/session/docs β€” giαΊ£m latency
πŸ” Auth JWT + Google OAuth2, refresh token rotation, CSRF protection
πŸ—οΈ IaC ToΓ n bα»™ hαΊ‘ tαΊ§ng AWS quαΊ£n lΓ½ bαΊ±ng Terraform

πŸ›οΈ KiαΊΏn trΓΊc hệ thα»‘ng

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        USER (Browser)                                    β”‚
β”‚              https://d3qrt08bgfyl3d.cloudfront.net                       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                             β”‚ HTTPS
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚         CloudFront           β”‚
              β”‚   /api/* β†’ ALB (proxy)       β”‚
              β”‚   /*     β†’ S3 Frontend       β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                      β”‚          β”‚
          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”  β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
          β”‚  S3 Bucket   β”‚  β”‚  Application Load Balancer   β”‚
          β”‚  (React SPA) β”‚  β”‚  memrag-backend-alb-*.elb    β”‚
          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                         β”‚
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚              ECS EC2 β€” FastAPI Backend               β”‚
              β”‚                   Port 8000                          β”‚
              β”‚                                                      β”‚
              β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
              β”‚  β”‚ Chat API β”‚  β”‚ Docs API β”‚  β”‚ Wiki / Auth API  β”‚  β”‚
              β”‚  β”‚  (SSE)   β”‚  β”‚ (upload) β”‚  β”‚ Transcription WS β”‚  β”‚
              β”‚  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
              β”‚       β”‚             β”‚                  β”‚            β”‚
              β”‚  β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
              β”‚  β”‚      Google ADK Agent (Gemini 2.5-flash)        β”‚ β”‚
              β”‚  β”‚           9 Tools + ContextFilterPlugin         β”‚ β”‚
              β”‚  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
              β”‚       β”‚    β”‚    β”‚    β”‚    β”‚    β”‚                     β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                      β”‚    β”‚    β”‚    β”‚    β”‚    β”‚
          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ” β”Œβ”€β–Όβ”€β”€β” β”‚ β”Œβ”€β–Όβ”€β”€β” β”‚ β”Œβ”€β–Όβ”€β”€β”€β”€β”€β”€β”
          β”‚  ElastiCacheβ”‚ β”‚mem0β”‚ β”‚ β”‚Wikiβ”‚ β”‚ β”‚DynamoDBβ”‚
          β”‚  Redis Cacheβ”‚ β”‚    β”‚ β”‚ β”‚S3  β”‚ β”‚ β”‚Sessionsβ”‚
          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              β”Œβ”€β”€β–Όβ”€β”€β”  β”Œβ”€β”€β–Όβ”€β”€β”€β”€β”
                              β”‚     β”‚  β”‚  RDS  β”‚
                              β”‚Qdrant  β”‚Postgresβ”‚
                              β”‚(RAG)β”‚  β”‚(Auth) β”‚
                              β””β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ”„ Data Flow

πŸ’¬ Chat Flow

User nhαΊ―n tin
    └─► POST /api/v1/chat/stream (SSE)
            └─► ChatService._ensure_session() [DynamoDB]
                    └─► ContextFilterPlugin (tΓ³m tαΊ―t nαΊΏu > 22 msgs)
                            └─► ADK Runner β†’ Gemini 2.5-flash
                                    β”œβ”€β–Ί read_wiki_index / read_wiki_page
                                    β”œβ”€β–Ί search_documents (RAG β€” Qdrant)
                                    β”œβ”€β–Ί retrieve_memories (mem0)
                                    └─► ─── SSE stream tokens ──► Browser

πŸ“„ Upload PDF Flow

Upload PDF
    └─► POST /api/v1/documents/upload
            β”œβ”€β–Ί extract text β†’ StorageBackend.save() [S3]
            β”œβ”€β–Ί RAGService: chunk β†’ embed β†’ Qdrant upsert
            β”œβ”€β–Ί Cache.delete("docs:{user_id}:list")
            └─► [background] WikiService 4-phase pipeline
                    β”œβ”€β–Ί Phase 1 MAP:    extract entities/topics (parallel)
                    β”œβ”€β–Ί Phase 2 REDUCE: merge + deduplicate by slug
                    β”œβ”€β–Ί Phase 3 SYNTH:  LLM synthesize per page β†’ S3
                    └─► Phase 4 FINAL:  rebuild index + link_index

πŸŽ™οΈ Transcription Flow

Start meeting β†’ POST /transcription/start [DynamoDB]
    β”‚
Audio stream β†’ WS /transcription/audio/{meeting_id}
    └─► SonioxService β†’ Soniox STT β†’ utterances β†’ DynamoDB
    β”‚
Stop meeting β†’ POST /transcription/stop
    β”œβ”€β–Ί TranscriptRAGService.ingest() [Qdrant]
    └─► [background] WikiService.update_wiki_from_transcript()

⚑ Cache Strategy

Request Δ‘αΊΏn API
    β”‚
    β”œβ”€β–Ί Cache.get(key) ──► HIT  ──► Return cached data (< 1ms)
    β”‚
    └─► MISS ──► TΓ­nh toΓ‘n / DB query
                    └─► Cache.set(key, data, ttl)
                            └─► Return data

TTL: wiki_page=10min | wiki_graph=2min | sessions=1min | docs=1min | user=5min

πŸš€ Quickstart β€” Local Dev

YΓͺu cαΊ§u

  • Docker & Docker Compose
  • Node.js 20+
  • Python 3.11+ vα»›i uv
  • Google Gemini API Key

1. Clone & cαΊ₯u hΓ¬nh

git clone https://github.com/minh2004pd/chatbotfullpipeline.git
cd chatbotfullpipeline

# TαΊ‘o file .env tα»« example
cp .env.example .env
# β†’ Điền GEMINI_API_KEY vΓ  cΓ‘c biαΊΏn cαΊ§n thiαΊΏt

2. Khởi Δ‘α»™ng services

# ChαΊ‘y toΓ n bα»™: Redis, Qdrant, DynamoDB Local, Postgres, Backend
docker compose up -d

# Kiểm tra logs backend
docker logs -f memrag-backend

3. ChαΊ‘y Frontend

cd frontend
npm install
npm run dev
# β†’ http://localhost:5173

4. API Docs

URL MΓ΄ tαΊ£
http://localhost:8000/docs Swagger UI
http://localhost:6333/dashboard Qdrant Dashboard
http://localhost:8001 DynamoDB Local

πŸ§ͺ Testing

# ChαΊ‘y toΓ n bα»™ test suite
cd backend && uv run pytest

# Vα»›i coverage report
uv run pytest --cov=app --cov-report=term-missing

# ChαΊ‘y test cα»₯ thể
uv run pytest tests/services/test_wiki_service.py -v

Test coverage: | Module | Test file | |--------|-----------| | Wiki pipeline | tests/services/test_wiki_service.py | | Auth + JWT | tests/core/test_auth.py | | Session CRUD | tests/services/test_dynamo_session_service.py | | Cache Service | tests/core/test_cache_service.py | | RAG Service | tests/services/test_rag_service.py |


πŸ” CI/CD Pipeline

git push origin main
        β”‚
        β”œβ”€β”€ backend/** thay Δ‘α»•i?
        β”‚       β”‚
        β”‚   β”Œβ”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚   β”‚   JOB: lint      β”‚   β”‚   JOB: test      β”‚  ← chαΊ‘y song song
        β”‚   β”‚  ruff format     β”‚   β”‚ pytest + coverage β”‚
        β”‚   β”‚  ruff check      β”‚   β”‚ upload artifact   β”‚
        β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚           β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚                      β”‚ cαΊ£ 2 pass
        β”‚            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚            β”‚  JOB: build-push   β”‚  ← push main only
        β”‚            β”‚  docker build      β”‚
        β”‚            β”‚  tag: <sha>+latest β”‚
        β”‚            β”‚  push β†’ ECR        β”‚
        β”‚            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚                      β”‚
        β”‚            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚            β”‚   JOB: deploy      β”‚  ← environment: production
        β”‚            β”‚  ECS rolling updateβ”‚
        β”‚            β”‚  wait stable βœ“     β”‚
        β”‚            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚
        └── frontend/** thay Δ‘α»•i?
                β”‚
            β”Œβ”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
            β”‚  JOB: validate           β”‚
            β”‚  tsc --noEmit + eslint   β”‚
            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚
            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
            β”‚  JOB: deploy             β”‚
            β”‚  npm build               β”‚
            β”‚  s3 sync (immutable)     β”‚
            β”‚  CloudFront invalidate   β”‚
            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

☁️ Infrastructure (AWS)

AWS ap-southeast-2
β”œβ”€β”€ VPC (10.0.0.0/16)
β”‚   β”œβ”€β”€ Public Subnets  β†’ ALB, NAT Gateway
β”‚   └── Private Subnets β†’ ECS EC2, RDS, ElastiCache
β”‚
β”œβ”€β”€ ECS Cluster (EC2 launch type)
β”‚   └── Backend Task (FastAPI :8000)
β”‚
β”œβ”€β”€ Qdrant (ECS Fargate + EFS volume)
β”‚
β”œβ”€β”€ ALB β†’ ECS Backend (port 8000)
β”œβ”€β”€ CloudFront β†’ S3 (frontend) + ALB (/api/*)
β”‚
β”œβ”€β”€ RDS PostgreSQL (db.t3.micro) β€” Auth
β”œβ”€β”€ DynamoDB β€” Sessions + Meetings
β”œβ”€β”€ ElastiCache Redis (cache.t3.micro) β€” Caching
β”œβ”€β”€ S3 β€” Uploads + Wiki pages
└── ECR β€” Docker images

Triển khai:

cd infrastructure

terraform init
terraform plan    # kiểm tra trΖ°α»›c
terraform apply   # tαΊ‘o hαΊ‘ tαΊ§ng (~10-15 phΓΊt)
terraform output  # xem endpoints

Outputs quan trọng: | Output | GiΓ‘ trα»‹ | |--------|---------| | cloudfront_url | URL frontend public | | alb_dns_name | Backend ALB endpoint | | redis_primary_endpoint | ElastiCache Redis | | rds_endpoint | PostgreSQL host |


πŸ“ CαΊ₯u trΓΊc dα»± Γ‘n

.
β”œβ”€β”€ backend/                  # FastAPI + Google ADK
β”‚   β”œβ”€β”€ app/
β”‚   β”‚   β”œβ”€β”€ agents/           # ADK Agent + 9 Tools
β”‚   β”‚   β”œβ”€β”€ api/v1/           # REST endpoints
β”‚   β”‚   β”œβ”€β”€ core/             # Config, Cache, DB, DI
β”‚   β”‚   β”œβ”€β”€ repositories/     # Data access layer
β”‚   β”‚   β”œβ”€β”€ services/         # Business logic
β”‚   β”‚   └── schemas/          # Pydantic models
β”‚   β”œβ”€β”€ tests/                # pytest (~40 test files)
β”‚   β”œβ”€β”€ Dockerfile
β”‚   └── pyproject.toml
β”‚
β”œβ”€β”€ frontend/                 # React 18 + Vite + TypeScript
β”‚   └── src/
β”‚       β”œβ”€β”€ api/              # Axios clients
β”‚       β”œβ”€β”€ components/       # UI components
β”‚       β”œβ”€β”€ hooks/            # React Query hooks
β”‚       β”œβ”€β”€ store/            # Zustand state
β”‚       └── types/            # TypeScript types
β”‚
β”œβ”€β”€ infrastructure/           # Terraform (AWS)
β”‚   β”œβ”€β”€ ecs.tf                # ECS cluster + task def
β”‚   β”œβ”€β”€ rds.tf                # PostgreSQL
β”‚   β”œβ”€β”€ elasticache.tf        # Redis
β”‚   β”œβ”€β”€ dynamodb.tf           # Sessions + Meetings
β”‚   β”œβ”€β”€ s3_frontend.tf        # Frontend hosting
β”‚   β”œβ”€β”€ alb.tf                # Load balancer
β”‚   └── variables.tf          # Input variables
β”‚
β”œβ”€β”€ docs/                     # Documentation
β”‚   β”œβ”€β”€ codebase.md           # KiαΊΏn trΓΊc chi tiαΊΏt
β”‚   β”œβ”€β”€ spec.md               # Product specification
β”‚   β”œβ”€β”€ wiki.md               # Wiki system design
β”‚   └── cicd-flow.md          # CI/CD flow
β”‚
β”œβ”€β”€ .github/workflows/
β”‚   β”œβ”€β”€ ci-cd.yml             # Backend CI/CD
β”‚   └── deploy-frontend.yml   # Frontend deploy
β”‚
└── docker-compose.yml        # Local dev stack

πŸ› οΈ Development Rules

Để Δ‘αΊ£m bαΊ£o chαΊ₯t lượng vΓ  deploy mượt mΓ :

  1. πŸ§ͺ ChαΊ‘y full test suite trΖ°α»›c khi hoΓ n thΓ nh bαΊ₯t kα»³ task nΓ o:
    cd backend && uv run pytest
  2. πŸ“ Bα»• sung test case cho mọi tΓ­nh nΔƒng mα»›i (unit + integration).
  3. πŸ“š CαΊ­p nhαΊ­t docs β€” docs/, CLAUDE.md, README.md khi thay Δ‘α»•i kiαΊΏn trΓΊc.
  4. 🎨 Format code trΖ°α»›c khi commit:
    cd backend && uv run ruff format .

🌐 Environment Variables

BiαΊΏn BαΊ―t buα»™c MΓ΄ tαΊ£
GEMINI_API_KEY βœ… Google Gemini API key
JWT_SECRET_KEY βœ… (prod) JWT signing secret (32+ chars)
STORAGE_BACKEND β€” local hoαΊ·c s3 (default: local)
S3_BUCKET βœ… (nαΊΏu S3) TΓͺn S3 bucket
S3_ACCESS_KEY_ID βœ… (nαΊΏu S3) AWS Access Key
S3_SECRET_ACCESS_KEY βœ… (nαΊΏu S3) AWS Secret Key
QDRANT_URL β€” Qdrant server URL
REDIS_URL β€” Redis connection URL
REDIS_ENABLED β€” BαΊ­t/tαΊ―t cache (default: true)
DATABASE_URL β€” PostgreSQL connection string
SONIOX_API_KEY β€” Soniox STT API key
WIKI_ENABLED β€” BαΊ­t/tαΊ―t wiki pipeline (default: true)
DEBUG β€” Dev mode β€” bỏ qua JWT (true/false)

πŸ“„ License

MIT Β© 2026 minh2004pd