Ask natural language questions about any Python codebase. Powered by function-level AST chunking, ChromaDB vector search, and a LangGraph agent loop with Claude.
Copy .env.example to .env and fill in your keys:
cp .env.example .env
Required keys:
ANTHROPIC_API_KEY— from console.anthropic.comOPENAI_API_KEY— fortext-embedding-3-smallembeddingsMONGODB_URI— MongoDB Atlas connection stringDJANGO_SECRET_KEY— any random string for devJWT_SECRET— random string signing login tokens; generate withpython -c "import secrets; print(secrets.token_hex(32))". Required in production — the server refuses to start without it.
cd backend
pip install -r requirements.txt
python manage.py runserverBackend runs at http://localhost:8000
cd frontend
npm install
npm run devFrontend runs at http://localhost:5173
- Drag-and-drop a
.zipof your Python repo into the upload area - Wait for indexing to complete (you'll see chunk count)
- Ask questions in the chat — answers include
filename:start-endcitations
| Endpoint | Method | Description |
|---|---|---|
/api/upload/ |
POST | Upload ZIP or raw source (multipart or JSON) |
/api/query/ |
POST | Ask a question, get answer + citations |
/api/sessions/ |
GET/POST | List or create chat sessions |
/api/sessions/<id>/ |
GET/DELETE | Get or delete a session |
User question
│
▼
[Retrieve] ── top-5 chunks from ChromaDB
│
▼
[Grade] ── relevant or irrelevant?
│
├─ irrelevant ──► [Rewrite] ──► back to Retrieve (max 2 retries)
│
└─ relevant ───► [Generate] ── Claude answers with citations
Chunking is by function/class scope (Python ast module), not word count — so the LLM always receives complete, syntactically valid code.