smart-chatbot-api / PROJECT.md
GitHub Actions
Deploy from GitHub Actions (2026-05-31 09:04 UTC)
55c0d78
|
Raw
History Blame Contribute Delete
7.74 kB
# Smart Chatbot β€” Project Navigation
**What it is:** A chatbot-as-a-service (CaaS) microservice for SMEs. Tenants embed the widget on their site; the chatbot answers domain questions grounded in the tenant's knowledge base (RAG). Sold as prepaid token credits or monthly subscription.
---
## Current Focus
**Next:** Phase 3 release gate β€” Simulated Tenant QA Pipeline (all prior gates including Qdrant migration are complete).
Full task spec: `current_state/project_status.md`
---
## Tech Stack
| Layer | Technology |
|---|---|
| Backend | FastAPI, Python, SQLAlchemy, Alembic |
| Database | PostgreSQL (dev/prod), SQLite (HuggingFace Spaces) |
| Vector DB | Qdrant β€” shared collection with required `tenant_id` payload filter; ChromaDB legacy fallback code only |
| Embeddings | Google Gemini Embedding 2 (`gemini-embedding-2`, 3072-dim) |
| LLM | LiteLLM Router β€” provider-agnostic, model aliases in env vars, auto-fallback chains |
| Frontend | Preact + Shadow DOM widget, Vite build |
| Auth | API key (widget) + Google OAuth + TOTP 2FA + JWT (admin) |
| Infra | Docker multi-env, Nginx, Redis/Celery workers, Qdrant, HuggingFace Spaces |
| CI/CD | GitHub Actions |
---
## Project Structure
```
app/
routers/ # Route handlers (knowledge_base, system_prompt)
schemas/ # Pydantic request/response models
middleware/ # TenantAuthMiddleware (API key β†’ tenant_id)
models/ # SQLAlchemy models
services/ # Business logic (EmbeddingService, VectorStore, RetrievalService, LLMService, CreditService, WordPress sync, kb_reindex)
workers/ # Celery background workers (wordpress_sync, kb_reindex)
utils/ # api_key, token_counter, seeding
dependencies/ # FastAPI dependencies (admin_auth)
alembic/ # DB migrations
tests/ # 469 tests, organized by domain
auth/ # Admin + super-admin auth, JWT, TOTP, OAuth
knowledge_base/ # KB CRUD, chunking, pagination, reindex, sync
chat/ # Conversations, RAG context, input limits, history
billing/ # Credits, billing modes, concurrency
vector_store/ # Qdrant, ChromaDB, embedding service
workers/ # Summarization worker, WP sync jobs
llm/ # LLM service, retrieval, AI verdict, RAG
infra/ # Middleware, rate limiter, seeding, widget, system prompt
frontend/ # Preact chat widget (Vite build β†’ chatbot-widget.js)
current_state/ # Architecture and status documents (see below)
archive/ # Historical notes and discussion logs (never retroactively edited)
docs/ # Specs and error logs
```
---
## Key Architecture Decisions
**Multi-tenancy:** API key β†’ `tenant_id` extracted in middleware. All DB queries and vector store operations are scoped to `tenant_id`. Qdrant uses one shared collection with required `tenant_id` payload filters inside the adapter; PostgreSQL remains the source of truth and Qdrant is a rebuildable search index.
**RAG pipeline:** `/chat` β†’ `RetrievalService.retrieve(query, tenant_id)` β†’ top-k KB docs injected into system message β†’ LLM response grounded in KB.
**User auth model:** Two modes β€” `anonymous` (most SMEs: no end-user login, visitors are anonymous) and `authenticated` (SaaS/e-commerce: host page passes authenticated user identity). Toggle via admin panel config.
**LLM provider abstraction:** `LLMService` wraps LiteLLM Router. Model aliases (`chat-model`, `summarization-model`, `judge-llm`) declared in env vars β€” swapping providers requires only an env var change, no code change. Auto-fallback chains configured per alias. `complete_with_usage()` returns `LLMResult` with token counts for billing.
**API versioning:** All public endpoints prefixed `/api/v1/` β€” in place before first client embeds widget (one-way door).
**Widget embedding:** Preact + Shadow DOM β€” 3KB bundle, fully isolated from host-site CSS/JS, works on any tech stack (WordPress, Vue, React, plain HTML). Admin console generates per-tenant snippet: `<script src="widget.js" data-api-key="tenant_abc123"></script>`. Widget reads `data-api-key` at runtime.
**Per-tenant customization:** All theme/branding/chatbot identity settings stored as `customization JSONB` on `tenants` table β€” zero schema migrations for new settings. Only fields that need filtering (e.g. `credits`, `is_active`) get proper columns.
**Multi-tenant secrets:** Shared secrets (`GROQ_API_KEY`, `DATABASE_URL`) live in backend env. Per-tenant config (system prompt, KB, theme) lives in DB. BYOK tenants store their own LLM API key encrypted in `customization JSONB`.
**Credit deduction atomicity:** Single SQL `UPDATE tenants SET balance_usd = balance_usd - :amount WHERE id = :tenant_id AND balance_usd >= :amount` β€” check rows affected (1 = success, 0 = insufficient balance). No race condition possible without application-level locking.
---
## Key Files
| File | Purpose |
|---|---|
| `app/main.py` | Entry point β€” router registration, middleware, startup |
| `app/models/conversation_manager.py` | LLM call lives here β€” chat logic, context assembly |
| `app/models/nlp_engine.py` | Analytics and routing only β€” keep as-is |
| `app/utils/config.py` | Singleton config β€” safe to defer refactor |
| `.env` / `.env.staging` / `.env.production` | Environment-specific values |
---
## Business Model
| Tier | Best for | How it works |
|---|---|---|
| Prepaid credits | Informational sites, low-volume SMEs | Buy credits upfront, deducted per message |
| Monthly subscription | E-commerce, SaaS, high-volume SMEs | Fixed fee, predictable revenue |
Gifted accounts (V1 only): Monireach tops up manually via super-admin; no Stripe needed. Full payment integration is post-V1.
---
## Deployment Roadmap
| Stage | Tenants | Stack | Monthly cost |
|---|---|---|---|
| Now | 0–10 | HuggingFace Spaces (demo/portfolio) | Free |
| Early | 10–100 | Railway or Fly.io (managed, zero DevOps) | $10–30 |
| Growth | 100–1000 | Hetzner VPS + Docker Compose | €10–20 |
| Scale | 1000+ | Hetzner + K3s (lightweight Kubernetes) | €30–80 |
Target: Hetzner CAX31 ARM (4 vCPU, 8GB RAM, €14.10/month). PostgreSQL: Supabase managed at small scale β†’ self-hosted at large scale. Admin panels: Cloudflare Pages (free). HF Space kept as public demo proxy only.
**K3s local practice (after V1 stable):** Deploy the full stack to a local K3s cluster in parallel with Docker Compose β€” not a replacement for the dev workflow, but a learning environment for writing real K8s manifests (`Deployment`, `Service`, `Ingress`, `ConfigMap`, `Secret`) against a real multi-service app. Makes the eventual Hetzner β†’ K3s production migration familiar ground.
---
## Where to Find Things
| What you need | File |
|---|---|
| Task status, V1 checklist, current progress | `current_state/project_status.md` |
| Full details on completed tasks (sub-tasks, bugs, decisions) | `current_state/milestone.md` |
| Auth model, tenant isolation, API key design | `docs/security_architecture.md` |
| Frontend widget architecture, embedding, theming | `docs/frontend_architecture.md` |
| Khmer language strategy, LLM provider selection | `docs/khmer_llm_strategy.md` |
| Admin console scope and integration status | `~/projects/smart_chatbot_admin_console/PROJECT.md` |
| Super-admin console scope and task status | `~/projects/smart_chatbot_super_admin/current_state/project_status.md` |
| Docker setup, env vars, service topology | `DOCKER_SETUP.md` |
| Historical discussions (system expansion, billing design) | `archive/` |
---
## Live Deployments
| Environment | URL |
|---|---|
| HuggingFace Spaces (public API) | `https://huggingface.co/spaces/monireach88/smart-chatbot-api` |
| Portfolio (widget embedded) | `https://monireach.com` |