Benzi compiles your codebase into a resolved, queryable map of calls, data flow, control flow, and class hierarchy first; then it reads, explains, runs, edits and verifies your code using it. Includes a runtime tracer that settles what static analysis can’t.
github.com/oooscoos/BenziBenzi is a compiler-first agentic harness. It can autonomously investigate bugs, modify an entire project, build features, execute tests, and repair failures. The difference? Benzi compiles your codebase into a single, uniform representation first, and then works on every task using that. Quick facts:
CodeIndex compiles ten languages: Python, JavaScript, TypeScript, Java, C#, C++, C, Go, Rust and Ruby. FrontendIndex covers the web layer: HTML, CSS and DOM-JS. Want another language? Please open a feature request on GitHub.
The compiler and index run on your machine, so your codebase is never uploaded. Benzi is model-agnostic: plug in your own API key for the provider you prefer.
Run the Benzi agent as a VS Code extension or from the command line. Or take the compiler on its own, without Benzi's agentic loop, and plug it into the agent you already use over MCP. Benzi is free to use during beta.
A body tells you what it does. The edges tell you what it means. Switch lenses:
The skeleton. Every proven edge the compiler resolved, plus the candidate edges it couldn't — dynamic dispatch, tagged with the set of overrides it might land on. Walk it forward to see what a route reaches, reverse for the full blast radius.
reverse blast radius main └─ run_capture └─ Sensor.read ← you are here ├─ calibrate └─ db.insert (external) 3 proven callers · 1 possible via dispatch
Trace a parameter backward through the caller's assignments and up the call graph to the literal it originates in — and walk a return forward to where it finally lands.
backflow Sensor.read(sensor_id) sensor_id ← req.query.id @ api.py:41 sensor_id ← route.params @ main.py:12 sensor_id ← "T-42" origin: fixture 2 call sites · 1 defaulted arg
The tool that answers "when does this happen". One-level outline of a body: every branch header verbatim, every loop exit with its label, every early return, interleaved with the calls in source order — indented to real nesting.
def tick(self): if self.game_over or self.paused: return if self.pending: # queued turn self.direction = pending.pop(0) if self._off_board(head) or head in body: return self.end_game() # ← the guard ...
Not a mock-up — this is the shape of the real map. Select a symbol and its callers, its callees, the values that move through it, and the tier behind every edge all come back at once.
A call that resolved (solid), a dispatch candidate (dashed — a traced run is what turns it observed), and the value crossing an edge (seafoam), because the argument expression is what binds the parameter. Pick any node — the panel reports the same three.
Precision over recall — a coin-flip would undermine the whole map. So nothing is ever guessed silently; it's tagged.
In-repo edge, on hard compiler evidence.
Ambiguous: the bounded set of possible targets.
Confirmed by an actual run, with real values.
Into a library, with the import evidence.
Seen but not settled, and it says why.
Never parsed, with the reason.
Benzi runs every write through the same compiler that built the map, then keeps the map in step with the code. Nothing lands unchecked, and any write can be undone.
The index is always in context; facts Benzi learns are saved as durable memories, so a future session opens already knowing them — the convention, the gotcha, the bug's real origin.
# a memory that pays for itself later type gotcha name "config-load-order" body "env.py must import before settings," "or SECRET_KEY reads empty. Load-bearing." # → every future session opens knowing this
Every lookup is O(1): the compiler has already resolved the answers into hashmaps, so the tools read them instead of searching. This list shows 16 of Benzi's 36 tools. Full tool list here.
Every horse portrait is drawn in code — procedural SVG, no image files — and matched horses flirt back through a live AI model. Frontend, backend and prompts were all written by Benzi.
One configuration, one attempt per instance, no ensembling, no test-time selection — graded by the official SWE-bench harness.
See every run, instance by instance, or read the technical report for the method and setup.
On a separate bug-fixing benchmark: 24 real bugs across 10 languages, each fixed once. The models stay the same — Sonnet and DeepSeek — so the only thing that changes is the harness: Benzi, Claude Code, or a plain DeepSeek harness. Below is how much source each one had to read, bug by bug, easiest to hardest. Hover any point for the bug and its count.
Source lines read (lower is better) across the same 24 bugs — 9,125 and 16,407 for the two Benzi series, against 20,704 for Claude Code and 43,598 for a plain harness. It's the one metric whose measurement is identical across harnesses, and the gap widens with difficulty.
On CodeGraph's own benchmark — their repos, their questions, their methodology — all four answers were scored blind by frontier models, from a fresh account:
Unmatched technical depth, architectural insights, edge-case coverage, and structural visualizations (flowcharts/tables).
Exceptionally precise, concise line-by-line tracing, high citation accuracy, and immediate zero-fluff code mechanics.
Strong overall structure, clear stage-by-stage breakdowns, and reliable coverage of core mechanisms.
Highly readable, great code snippets and summaries, but slightly less granular on deep runtime invariants.
Benzi ranked first with every reviewer. Full results →
Nine questions, straight answers — what runs where, what it costs, and how Benzi differs from the tools you already know.
Run Benzi's own agentic loop — in the editor or from a terminal — or hand the compiled index to the agent you already use. Bring your own key; free during beta.
The full product, with the loop closed: model, key and account live in one settings panel, and the CLI shares the same login.
Install Benzi from the VS Code Marketplace.
Click the Benzi icon in the left activity bar to open the Benzi: Settings panel.
Pick your model and paste your API key: an Anthropic key, or a non-Anthropic one (DeepSeek, Groq, Kimi and others).
Enter your email and press Send, then type in the one-time code it emails you.
Press Save model & keys, then Run Benzi.
The same loop, headless — for scripts and CI. Python 3.11–3.14 on Windows, macOS and Linux.
$ pip install benziInstalls the benzi-login, benzi-headless and benzi-mcp commands.
$ benzi-login --login you@example.com $ benzi-headless . "fix the failing test in parser.py"
The login is the one VS Code uses: --anthropic-key YOUR_KEY, or --nonanthropic-key YOUR_KEY for DeepSeek, Groq, Kimi and others.
No model, no key, none of Benzi's loop: benzi-mcp serves the compiled index to Claude Code, Cursor or any MCP client, and your own agent makes every model call.
The same package as above — Python 3.11–3.14 on Windows, macOS and Linux.
Log in exactly as you would for headless. You can skip the model and key, because your own agent does the model calls.
Then register benzi-mcp with your agent. For example, in Claude Code, once for all your projects:
$ claude mcp add --scope user benzi -- benzi-mcp
benzi-mcp then serves whichever folder you start Claude Code in, so switching projects needs nothing extra. To pin it to one repo no matter where you start, pass that repo's path:
$ claude mcp add --scope user benzi -- benzi-mcp /path/to/your/repo
Docs, releases, discussions and the issue tracker live there.
Open the repo →