Benzi
by
Variant Technologies
An AI coding agent that doesn't read — it queries.
Benzi is free to use — actively in development, a work in progress.
Full README, benchmarks, and demos on GitHub
What is Benzi
Most AI coding agents dump a repository into a context window and hope the model finds what matters. Benzi works differently: before answering anything, a real compiler — built on tree-sitter — parses every file in the project and resolves it into a precise, queryable map. Every symbol, every call edge, every reference, every class in its inheritance chain. One pass, done.
Call flow and data flow are joined at every call site, so a bad value traces to its origin in one tool call. Claude Code greps; Cursor embeds; Aider maps signatures; Benzi resolves — and answers in O(1). Ten languages so far, plus a second engine for markup (HTML, CSS, DOM-JS).
What people say
"78.2% for $37 is a slap in the face to the 'brute force wins' school." — Alex Xiang, zicode (translated)
"Benzi is proving that the core competency of coding tools is shifting from simple 'reading comprehension' to 'structural grasping ability.'" — Gi Pyeong Lee, Tech Blog
"Fewer tokens, no context drift. Wild idea, honestly." — prompt 🤖 AI News
"It analyzes changes before writing them — and beats Claude Code on benchmarks." — Ponte al dIA (translated)
SWE-bench Verified
The full SWE-bench Verified set — 500 real GitHub issues from twelve Python repositories — run end to end on DeepSeek v4-flash, one attempt per instance, graded by the official swebench.harness.run_evaluation inside its own per-instance Docker images, with network access to GitHub and PyPI blocked inside every container.
| Resolved | 391 / 500 — 78.2% |
| Total cost, all 500 instances | $37.33 |
| Cost per instance resolved | $0.095 |
| Source lines read (total / median) | 231,574 / 379 |
| Model turns (total / median) | 16,091 / 27 |
Full technical report and per-instance breakdowns: GitHub.
How it works
- Compile. Tree-sitter parses every file; imports are resolved, class ancestry built, every identifier traced to its definition. The output is an index, not a blob of text.
- Query. The agent answers questions and plans edits through structured tools over that index —
profile,get_callers,backflow,trace_path,skim_source, and ~30 more. - Edit, gated. Every write passes syntax and semantic gates against the real language parser — a broken parse auto-reverts, checking blast radius before a change lands, not just after.
- Verify by running it. A focused repro runs under a runtime tracer — real argument values, real returns, real dispatch — which both proves the change and settles the map.
- Reindex, incrementally. The map follows the filesystem, never the agent's account of what it did — each turn re-parses only the files whose bytes actually moved.
Tools
A sample of Benzi's 35+ tools — the full list is on GitHub:
| Tool | What it answers |
|---|---|
get_callers |
Every call site that reaches a function — the code that will feel a change. |
call_tree |
The transitive call closure from one function, forward or in reverse. |
trace_path |
The call chain connecting two functions, and the data carried along it. |
backflow / forwardflow |
Where a wrong value came from / where a return value ends up. |
profile |
The full 360 on one symbol in a single call. |
search_symbols |
Case-insensitive substring search across every symbol in the repo. |
get_hierarchy |
A type's resolved bases and its direct subclasses. |
skim_source |
A body's one-level outline, so you know which lines are worth reading. |
execute_from / execute_generated_testcase |
Runs code under the call tracer; writes and runs a self-contained repro. |
Full list of 35+: GitHub.
Features
- Six states, never a guess — every call site and file carries one: resolved, external, candidate, unresolved, observed, or unindexed. Whatever static analysis can't settle is flagged as unsettled, not guessed.
- Runtime tracer — hooks every call during execution and overlays the observations back onto the static map.
- Persistent memory — durable per-repo facts survive restarts.
- Dual-engine: code + markup — a separate index for HTML/CSS/DOM-JS.
- Model-agnostic — Anthropic, OpenAI, or any compatible API.
Language support
Python · JavaScript · TypeScript · Java · C# · C++ · C · Go · Rust · Ruby
One compiler, ten languages. Python is deepest — it's the only one with the runtime tracer. Depth varies elsewhere; see Language support on GitHub for specifics.
Install
pip install benzi
# one-time setup -- verify your email, then bring your own API key
benzi-login --login you@example.com
benzi-login --anthropic-key sk-ant-... # or --nonanthropic-key for
# groq/deepseek/kimi/etc
# then, from inside (or pointed at) any repo:
benzi . "what does this repo do?"
This also installs benzi-mcp — the same compiled index exposed as tools over MCP, for whatever agent you already run (Claude Code, Cursor, your own harness). Point your MCP client at it after the same benzi-login step; output quality then depends on that harness, since this mode has no agentic loop of its own.
. means "the repo I'm standing in" — pass a path instead if you're running it from somewhere else. Your key stays on your own machine and talks to your model provider directly; Benzi's servers never see it or proxy the call. Run benzi-login with no flags any time to see what's currently saved, or benzi --help for every option.
Benzi is also available as a live web demo (no install, no key needed) and a VS Code extension.
FAQ
Do I need an API key? For the CLI, MCP, and the VS Code extension, yes — bring your own Anthropic or OpenAI-compatible key. Only the browser demo runs without one.
How is this different from Cursor, Copilot, or Claude Code? They find code by searching text — grep, or embedding similarity. Benzi resolves it first: a tree-sitter compiler builds a real index of symbols, call edges, inheritance and data flow, and the agent queries that index instead of guessing which files to read.
Full FAQ (privacy, pricing, CodeGraph comparison, repo size limits): GitHub.
Full README on GitHub — benchmarks, demos, and more.
Release files for benzi 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| benzi-0.1.0-cp313-cp313-win_amd64.whl | CPython 3.13 | CPython 3.13 | Windows x86-64 | Details |
| benzi-0.1.0-cp312-cp312-win_amd64.whl | CPython 3.12 | CPython 3.12 | Windows x86-64 | Details |
Total release size: 6.5 MB
Release files / benzi-0.1.0-cp313-cp313-win_amd64.whl
| Download URL | benzi-0.1.0-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 3.4 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
0445e796be4b794b35a7376fc9de035451ad1d703356a56f635d9bb467e72bbc
|
|
BLAKE2b-256 checksum How to use checksums |
48a84252f11b390a9910ca888af6001be282b4c1ef5484a9730bf52af75863e5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / benzi-0.1.0-cp312-cp312-win_amd64.whl
| Download URL | benzi-0.1.0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 3.1 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
9d7507e8a1b787530d56bab1e216337327cbf7335b5aff3f8b4a7dc91f062b13
|
|
BLAKE2b-256 checksum How to use checksums |
1d6642b8edefd1d202b3d57104b48c48ec99729e0e0571abb20abb04f8e89f0d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|