Self-hosted AI assistant platform. RAG, MCP tools, 5 messaging channels, admin dashboard. Django 5 + React 19. Open source. WIP — PRs welcome.
Your own AI butler. Doesn’t judge. Doesn’t sleep. Occasionally hallucinates — but so does your best employee.
Multi-tenant AI concierge with RAG knowledge base, MCP tools, 5 messaging channels, and a full admin dashboard. Built on Django 5 + React 19. Fully open source, self-hosted, no license keys, no paywalls.
Work in progress. The project is functional but not finished. Bugs exist, some features are rough around the edges, and the documentation may lie to you. If something breaks — congratulations, you found a feature request. PRs, issues, and constructive complaints are very welcome.
Jeeves is a white-label AI assistant platform. Deploy it on your server, connect a knowledge base, plug in messaging channels (WhatsApp, Telegram, Email, Web Widget, Voice), and get an AI concierge that answers questions from your docs, captures leads, and escalates to humans when needed.
Target audience: agencies, service businesses, SaaS operators who need a customizable AI assistant without building one from scratch.
| Layer | Technology |
|---|---|
| Backend | Django 5, Django REST Framework, Python 3.12 |
| Frontend | React 19, Vite 7, Tailwind CSS 3 |
| Database | PostgreSQL 16 + pgvector |
| Vector Search | Qdrant (primary), pgvector (fallback) |
| Queue | Celery + Redis |
| AI / LLM | OpenAI, Anthropic (Claude), Ollama (local), Kimi (Moonshot) |
| Embeddings | OpenAI, Cohere, Hugging Face, Ollama (local) |
| MCP | FastMCP 2.0 (stdio transport) |
| Infrastructure | Docker Compose, Nginx, Gunicorn |
| Auth | JWT (SimpleJWT), API Key, Client Token |
| Encryption | Fernet (EncryptedJSONField for credentials) |
| i18n | i18next (frontend), per-agent language config (backend) |
| CI/CD | GitHub Actions |
.
├── backend/
│ ├── Jeeves/ # Django project root
│ │ ├── accounts/ # Users (4 roles: admin, owner, manager, client), JWT auth
│ │ ├── agents/ # AgentConfig, AgentSession, AgentLog, MCP orchestrator
│ │ ├── api/ # Client-facing REST endpoints, bootstrap provisioning
│ │ ├── branches/ # Org hierarchy Level 1 + documents + embeddings
│ │ ├── specializations/ # Org hierarchy Level 2 + documents + embeddings
│ │ ├── clients/ # Tenants, channels (WA/TG/Email/Widget), HITL, leads, QR codes
│ │ ├── concierge_platform/ # PlatformDefaults, FeatureFlag, SystemMessage
│ │ ├── EmbeddingModel/ # AI model registry (EmbeddingModel, LLMProvider, ModelPair)
│ │ ├── mcp_hub/ # MCP server management + SSE streaming + tool execution
│ │ ├── processing/ # Document parsing, chunking, embedding, UsageStats, Celery tasks
│ │ ├── rag/ # RAG engine: vector search, context builder, LLM client
│ │ └── tools/ # ToolCard catalog, ToolConnection, EdgeMiddleware, InstalledMCPServer
│ ├── mcp_servers/ # 9 standalone FastMCP servers (stdio)
│ │ ├── rag/ # Semantic search over knowledge base
│ │ ├── escalation/ # HITL escalation to live managers
│ │ ├── email/ # Send/read/search emails (SMTP/IMAP)
│ │ ├── leads/ # Lead capture + qualification
│ │ ├── memory/ # Persistent conversational memory (Qdrant + Cohere)
│ │ ├── coaching/ # AI coaching + gap analysis
│ │ ├── sales_intel/ # Website scraping + tech stack detection
│ │ ├── xlsx/ # Excel generation with formulas (LibreOffice)
│ │ └── common/ # Shared Django ORM bootstrap
│ ├── chrome_extension/ # Browser extension source (content + background scripts)
│ ├── docker-compose.yml
│ ├── Dockerfile
│ └── requirements.txt
├── frontend/
│ ├── src/
│ │ ├── pages/ # 37+ pages (owner admin + client portal + setup wizard)
│ │ ├── components/ # UI components (layout, forms, chat, integrations, tools)
│ │ ├── api/ # Axios clients (auth, owner, client, agent, tools, embedding)
│ │ ├── context/ # AuthContext, ThemeContext, BootstrapContext
│ │ ├── locales/ # 8 language translation files (en/de/fr/es/it/nl/da/uk)
│ │ └── modules/ # Experimental modules (pixel dashboard)
│ ├── docker-compose.yml
│ └── Dockerfile
├── docs/ # Development plans + specs
├── CLAUDE.md # Instructions for Claude Code
├── SETUP.md # Full installation guide
└── .github/workflows/ # CI/CD (pytest + eslint + build)
See SETUP.md for the full installation guide.
# 1. Clone and configure
git clone https://github.com/ChuprinaDaria/jeeves.git
cd jeeves
make setup # copies .env.example files
# Edit backend/.env — set SECRET_KEY, FIELD_ENCRYPTION_KEY, OPENAI_API_KEY
# 2. Start all services
make up # docker compose up -d
make migrate # run database migrations
make superuser # create admin account
# 3. Open dashboard
# http://localhost:3000
Or manually:
cp backend/.env.example backend/.env
cp frontend/.env.example frontend/.env
cd backend && docker compose up -d
docker compose exec web python manage.py migrate
docker compose exec web python manage.py createsuperuser
cd ../frontend && docker compose up -d
| Service | Port | Description |
|---|---|---|
postgres |
5433 | PostgreSQL 16 + pgvector |
redis |
6380 | Cache + Celery broker |
web |
8000 | Django API (Gunicorn) |
celery_worker |
— | Async task processing |
celery_beat |
— | Scheduled tasks (digest, escalation timeouts, session cleanup) |
qdrant |
6333 | Vector search (optional, enabled via USE_QDRANT) |
nginx |
80 | Reverse proxy + static files |
Jeeves runs two agent personas with different capabilities:
Full-power agent for business owners. Available in the dashboard Sandbox.
Customer-facing agent optimized for lead capture. Runs on WhatsApp, Telegram, Web Widget.
User message → Build system prompt + history
→ LLM call with available MCP tools (OpenAI function schema)
→ If tool call returned: execute via MCP → feed result back → repeat
→ If final text: return response
→ Log everything to AgentLog
→ Max 10 iterations (prevents infinite loops)
Auto-injected parameters (hidden from LLM): client_id, session_id, user_id.
Each client gets an AgentConfig with customizable settings:
language — conversation languagetemperature — creativity (0-1)max_tokens — response length limitsystem_prompt — custom prompt (falls back to PlatformDefaults)9 FastMCP servers running as stdio subprocesses. Each bootstraps Django ORM through mcp_servers.common.django_setup.
| Server | Scope | Tools | Description |
|---|---|---|---|
rag |
assistant, manager | search_knowledge_base |
Semantic search over the knowledge base (Qdrant or pgvector) |
escalation |
assistant, manager | escalate_to_manager, check_escalation_status |
Route unanswered questions to live managers via Telegram |
email |
assistant | send_email, read_emails, search_emails, analyze_emails |
Send/read/search emails via client SMTP/IMAP |
leads |
manager, leads | capture_lead, qualify_lead, update_lead |
Lead capture, qualification, interest scoring |
memory |
assistant, manager | save_memory, search_memory, clear_memory |
Persistent conversational memory (Qdrant + Cohere embeddings) |
coaching |
assistant | analyze_gaps, generate_coaching_plan |
AI coaching, gap analysis, skill development |
sales_intel |
assistant | scrape_website, detect_tech_stack, research_company |
Website scraping and company research |
xlsx |
assistant | generate_xlsx, add_worksheet, add_formula |
Excel generation with formulas (uses LibreOffice for recalc) |
sequential-thinking |
assistant | think |
Chain-of-thought reasoning (npm: @modelcontextprotocol/server-sequential-thinking) |
Scopes control which tools are available to which agent:
assistant — full tools in Sandboxmanager — limited tools for customer-facing Consultantleads — lead-specific tools onlyConfigured in settings.py under MCP_SERVERS and MCP_TOOL_SCOPES.
Documents are organized in a three-level hierarchy with weighted search:
| Level | Weight | Description |
|---|---|---|
| Client | 0.8 | Client-specific documents (highest priority) |
| Specialization | 0.5 | Domain-specific shared docs |
| Branch | 0.3 | Regional shared docs |
Qdrant (primary, USE_QDRANT=true):
jeeves_embeddingspgvector (fallback):
POST /api/whatsapp/meta/webhook/ClientZeroConfig)POST /api/clients/telegram/webhook//start command (welcome + QR linking), /start2 (custom linking)/widget/chat.js (inject into any page)/widget/chat (embedded chat)/api/clients/telephony/*/owner/*)Platform-wide administration. Protected by BootstrapGate (checks setup completion).
| Page | What it does |
|---|---|
| Dashboard | Platform statistics, overview |
| Clients | CRUD clients, stats per client, API key generation |
| Branches | Manage org hierarchy Level 1 |
| Specializations | Manage org hierarchy Level 2 |
| AI Providers > LLM | Configure LLM providers (OpenAI, Anthropic, Ollama, Kimi) + test connections |
| AI Providers > Embeddings | Configure embedding models (OpenAI, Cohere, HF, Ollama) + test connections |
| AI Providers > Pairs | Assign LLM + embedding model pairs |
| Tools | Tool catalog management, discovery, URL import |
| MCP Servers | MCP server configuration |
| Feature Flags | Per-client feature toggles (off / selected / all) |
| System Messages | Multi-language system prompts (default, assistant, consultant) |
| Settings | Platform defaults (temperature, max_tokens, language, etc.) |
| Setup Wizard | First-time setup: owner account creation |
/l/:tag/*)Per-client management. Authenticated via X-Client-Token header.
| Page | What it does |
|---|---|
| Dashboard | Stats, top questions, recent activity, web conversations |
| History | Conversation browser with date/channel filter, search, sentiment |
| Tools | Connected tools, flow canvas visual editor, edge middleware |
| Integrations | WhatsApp QR, Telegram token, Email SMTP config, Widget config |
| Leads | Lead list, detail view, scoring, qualification status |
| Training | Prompt library, create/edit prompts, vote on suggestions |
| Sandbox | Test RAG queries, upload files, image analysis, live chat |
| Settings | Language, theme, profile, logo upload |
Full documentation: backend/docs/API_DOCUMENTATION.md
| Mode | Header | Used by |
|---|---|---|
| JWT Bearer | Authorization: Bearer <token> |
Owner/Admin dashboard |
| Client Token | X-Client-Token: <tag> |
Client portal, web widget |
| API Key | X-API-Key: <key> |
External API clients, webhooks |
POST /api/accounts/register/ — register userPOST /api/accounts/login/ — JWT loginPOST /api/accounts/refresh/ — refresh JWTGET /api/accounts/me/ — current user profilePOST /api/rag/query/ — query knowledge basePOST /api/rag/chat/ — RAG chat (supports image analysis)POST /api/mcp/chat/ — MCP chat (SSE streaming, full agent orchestration)POST /api/rag/upload/ — upload documentGET /api/clients/conversations/ — list conversationsGET /api/clients/conversations/statistics/ — aggregated statsGET /api/clients/top-questions/ — most asked questionsGET /api/clients/leads/ — list captured leadsGET /api/clients/documents/ — list documentsGET /api/clients/knowledge-blocks/ — list knowledge blocksPOST /api/clients/reports/daily-digest/send/ — trigger daily digestGET /api/owner/dashboard/stats/ — platform statisticsCRUD /api/owner/clients/ — manage clientsCRUD /api/owner/branches/ — manage branchesCRUD /api/owner/specializations/ — manage specializationsCRUD /api/owner/ai-providers/llm/ — manage LLM providersCRUD /api/owner/ai-providers/embeddings/ — manage embedding modelsCRUD /api/owner/ai-providers/pairs/ — manage model pairsCRUD /api/owner/tools/ — manage tool catalogCRUD /api/owner/feature-flags/ — manage feature flagsCRUD /api/owner/system-messages/ — manage system messagesGET|PUT /api/owner/settings/defaults/ — platform defaultsGET|POST|PATCH /api/clients/whatsapp/meta/config/ — WhatsApp Meta configGET|POST|PATCH /api/clients/telegram/config/ — Telegram configGET|POST /api/clients/email-smtp/config/ — Email SMTP configGET|POST|PATCH /api/clients/web-widget/config/ — Web Widget configGET|POST /api/clients/hitl/config/ — HITL escalation configCRUD /api/clients/telephony/ — voice/telephony configGET|PUT /api/clients/channel-auto-reply/<channel>/ — auto-reply rulesGET /api/tools/catalog/ — tool catalogPOST /api/tools/<slug>/connect/ — connect toolPOST /api/tools/<slug>/disconnect/ — disconnect toolGET /api/tools/my/ — connected toolsCRUD /api/tools/flow/connections/ — flow canvas connectionsCRUD /api/tools/flow/edges/<conn_id>/middleware/ — edge middlewarePOST /api/setup/owner/ — create first owner accountPOST /api/setup/complete/ — mark setup complete200+ total endpoints. See backend/docs/API_DOCUMENTATION.md for the complete list.
| Task | Schedule | Description |
|---|---|---|
check_inactive_chat_sessions |
Every 60 seconds | Detect + clean up idle conversations |
send_daily_digest |
Daily at 17:00 (Europe/Kyiv) | Email summary of last 24h to client contacts |
check_escalation_timeouts |
Every 5 minutes | Auto-close expired HITL escalations |
| Task | Description |
|---|---|
process_client_document |
Parse + chunk + embed client document |
process_branch_document |
Parse + chunk + embed branch document |
process_specialization_document |
Parse + chunk + embed specialization document |
Rate limited: 10 tasks/minute per model type. Cost tracked in UsageStats.
Jeeves is designed for complete data sovereignty. When you self-host Jeeves, your data stays on your server — period.
fetch, requests.post, axios — every external call is user-configuredYour AI provider (OpenAI, Anthropic, Cohere, etc.) will receive the queries and documents you send to their API — that’s inherent to using any LLM. If this concerns you, use a local model via Ollama (fully supported).
ClientAPIKey model, X-API-Key header4 roles with view-level permission checks:
| Role | Access |
|---|---|
ADMIN |
Full platform access |
OWNER |
Platform admin dashboard, all clients |
MANAGER |
HITL escalation, assigned clients |
CLIENT |
Own portal only |
META_APP_SECRET)FIELD_ENCRYPTION_KEY env var (base64-encoded Fernet key).env files never committed to git| Variable | Description |
|---|---|
SECRET_KEY |
Django secret key (generate: python -c "import secrets; print(secrets.token_urlsafe(50))") |
FIELD_ENCRYPTION_KEY |
Fernet key for credential encryption (generate: python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())") |
OPENAI_API_KEY |
OpenAI API key (or configure another LLM provider) |
| Variable | Default | Description |
|---|---|---|
DB_NAME |
admin_db |
PostgreSQL database name |
DB_USER |
admin_user |
Database user |
DB_PASS |
— | Database password |
DB_HOST |
postgres |
Database host |
DB_PORT |
5432 |
Database port |
| Variable | Description |
|---|---|
ANTHROPIC_API_KEY |
Anthropic Claude API |
COHERE_API_KEY |
Cohere embeddings + reranking |
HUGGINGFACE_API_KEY |
Hugging Face models |
KIMI_API_KEY |
Kimi (Moonshot) API |
| Variable | Default | Description |
|---|---|---|
USE_QDRANT |
True |
Enable Qdrant vector search |
QDRANT_HOST |
qdrant |
Qdrant hostname |
QDRANT_COLLECTION |
jeeves_embeddings |
Qdrant collection name |
QDRANT_PORT |
6333 |
Qdrant port |
| Variable | Description |
|---|---|
FIELD_ENCRYPTION_KEY |
Base64 Fernet key for credential encryption |
BOOTSTRAP_SECRET |
HMAC secret for bootstrap webhook verification |
| Variable | Description |
|---|---|
META_WABA_ID |
WhatsApp Business Account ID |
META_APP_ID |
Meta app ID |
META_APP_SECRET |
Meta app secret (webhook signature verification) |
META_ACCESS_TOKEN |
Meta access token |
TWILIO_ACCOUNT_SID |
Twilio SID (legacy WhatsApp) |
TWILIO_AUTH_TOKEN |
Twilio auth token |
| Variable | Default | Description |
|---|---|---|
CELERY_BROKER_URL |
redis://redis:6379/0 |
Celery broker |
CELERY_RESULT_BACKEND |
redis://redis:6379/0 |
Celery results |
CORS_ALLOWED_ORIGINS |
— | Frontend origins (comma-separated) |
CSRF_TRUSTED_ORIGINS |
— | Trusted origins for CSRF |
ALLOWED_HOSTS |
localhost,127.0.0.1,web,nginx |
Django allowed hosts |
DEBUG |
True |
Debug mode (set False in production) |
GitHub Actions (.github/workflows/main-tests.yml):
mainALLOWED_HOSTS, CSRF_TRUSTED_ORIGINS, | Provider | Type | Default Model |
|---|---|---|
| OpenAI | openai |
gpt-4o-mini |
| Anthropic | anthropic |
Claude family |
| Ollama (main) | ollama_main |
qwen2.5:7b |
| Ollama (light) | ollama_light |
qwen2.5:1.5b |
| Kimi (Moonshot) | kimi |
Advanced reasoning |
client.llm_provider_model (FK to LLMProvider) — preferredclient.llm_provider + client.llm_model_name — legacyLLM_CONFIG default — fallback| Provider | Models |
|---|---|
| OpenAI | text-embedding-3-small, text-embedding-3-large |
| Ollama | bge-m3, nomic-embed-text |
| Hugging Face | Via transformers |
| Cohere | embed-multilingual-v3.0 (reranking support) |
Jeeves is free forever and actively developed. Pull requests, bug reports, and feature ideas are welcome.
Found a bug? Open an issue.
Elastic License 2.0 — See LICENSE for full terms.
In short:
Jeeves — by Daria Chuprina & open-source community. Forever free.