REBOOT is adaptive retrieval middleware for code-focused LLM agents. It runs as a Python FastAPI service and exposes tools over MCP (Model Context Protocol) so any MCP-compatible agent can use REBOOT for codebase retrieval.
See NOTICE.md for usage/rights.
- MCP tools (mounted at
http://localhost:<port>/mcp):reboot_search(query, file_context?)reboot_feedback(query_id, signal, node_ids?, details?)(signal:positive|negative)reboot_explain(query_id?)reboot_ingest(repo_path, incremental?, verbose?)(async job)reboot_ingest_status(job_id)reboot_ingest_cancel(job_id)
- REST endpoints (same underlying logic as the MCP tools):
GET /healthPOST /queryPOST /feedbackGET /reboot-explainPOST /ingest(async job)GET /ingest-status/{job_id}POST /ingest-cancel/{job_id}
- Graph visualizer UI (served by the app; see
graphiti_visualizerrouter inmiddleware/main.py). - Eval harness under
eval/for repeatable retrieval evaluation runs.
From the repo root (the directory containing docker-compose.yml):
- Start Neo4j:
docker compose up neo4j -d- Create
.env:
cp .env.example .envFill in at least OPENAI_API_KEY (and EMBEDDING_API_KEY if you use a separate key/provider).
- Create and activate a virtualenv, then install deps:
python -m venv .venv.\.venv\Scripts\Activate.ps1
pip install -r middleware/requirements.txt- Run the server:
python -m uvicorn middleware.main:app --reload --port 8000- Health check:
curl http://localhost:8000/healthREBOOT uses environment variables (loaded from .env in the repo root). See .env.example.
Common variables:
- Neo4j
NEO4J_URI(defaultbolt://localhost:7687)NEO4J_USER(defaultneo4j)NEO4J_PASSWORD(defaultreboot_dev)
- LLM / embeddings
OPENAI_API_KEY,OPENAI_BASE_URL,OPENAI_MODELEMBEDDING_API_KEY,EMBEDDING_BASE_URL,EMBEDDING_MODEL
- Service
SERVER_PORT(default8000)SQLITE_PATH(defaults tomiddleware/feedback.db)CONFIDENCE_DECAY_LAMBDA,DEMO_TIME_OFFSET_DAYS
Point your MCP-capable agent at:
http://localhost:8000/mcp
Then instruct it to use REBOOT for codebase questions. Example prompt snippet:
- ALWAYS call reboot_search before answering questions about the codebase.
- Use reboot_explain if the user asks why context was retrieved.
- Call reboot_feedback with signal=positive/negative after the user reacts to the answer.
ONBOARDING.md: full local setup and run guidePROJECT.md: architecture, tool/API details, design notesPLAN.md: implementation structure and original planeval/README.md: eval harness
- Feedback signals are currently only
positiveandnegative. - Async ingest returns a
job_id; clients should poll status (/ingest-status/{job_id}/reboot_ingest_status) rather than expecting an immediateepisodes_addedcount. - Incremental ingest uses a local state file (
middleware/ingestion/ingest_state.json) to track per-repo file mtimes.