Hybrid coding assistant with a LangGraph orchestration loop, structured tool execution, and FastAPI control-plane API.
- Python 3.12+
- Docker (for PostgreSQL and Redis)
docker compose up -d
docker compose build sandbox-image
cp .env.example .env
# Set OPENAI_API_KEY, ANTHROPIC_API_KEY, and/or GEMINI_API_KEY in .env
pip install -e ".[dev]"
coding-assistant serveAPI: http://127.0.0.1:8000/docs
In one terminal, start the server. In another, run the interactive client:
coding-assistant chat
# optional: --workspace /path/to/repo --api-url http://127.0.0.1:8000Slash commands: /help, /workspace <path>, /status, /exit. Each line you type starts an agent run on the server.
curl -s -X POST http://127.0.0.1:8000/v1/runs \
-H 'Content-Type: application/json' \
-d '{"workspace_root": "/path/to/repo", "message": "List Python files in src"}'LLM → StructuredAction → Host Validation → Tool Execution
See docs/phase-1-core-runtime.md through docs/phase-10-mcp-ecosystem.md, and procedure.md.
Metrics: GET http://127.0.0.1:8000/metrics
Planner calls use capability-based routing (routing.config.json). Preview:
-
Set
GEMINI_API_KEYin.env(from Google AI Studio). -
Either use the Gemini-first routing file:
ROUTING_CONFIG_PATH=routing.config.gemini.json coding-assistant serve
or override every tier with one model:
ROUTING_DEFAULT_MODEL=gemini/gemini-2.5-flash coding-assistant serve
The default
routing.config.jsonalso listsgemini/gemini-2.0-flashinfallback_chainafter OpenAI/Anthropic.For Gemini-only setups, use
routing.config.gemini.json(Gemini-only fallback chain; no OpenAI attempts).
Supported LiteLLM ids include gemini/gemini-2.5-flash, gemini/gemini-2.0-flash, and gemini/text-embedding-004 (for EMBEDDING_MODEL).
curl -s 'http://127.0.0.1:8000/v1/routing/resolve?capability=planning&complexity=high'