Home/Research/Publication

LLM-as-a-Developer: Evaluating 51 Agent Frameworks

You cannot evaluate a software framework without a user to use it. When the framework is an agent SDK, the user is a developer, so we simulate the developer. One controlled simulation, run across 51 Agent Development Kits, turns effort into a measurement of usability and output into a measurement of effectiveness.

MatrAIx
Jintao Huang, Xiaomin Li, and Core Team
July 18, 2026
11 min read

Simulated users are how you evaluate a product before real users are involved. But a product's "user" is not always a person typing prompts. For an Agent Development Kit (ADK), the SDK a person uses to build an LLM agent, the real user is an engineer: someone reading the API, wiring up tools, and fighting through errors until their agent runs.

So to evaluate that product, you simulate that user. This post is about a methodology we call LLM-as-a-Developer: a controlled simulation of the developer that measures, at ecosystem scale, both how usable a framework is and how good the agents you build with it turn out to be.

The core idea: simulate the user, where the user is a developer

Simulation-based evaluation has one defining virtue: it replaces an expensive, slow, biased human loop with a controlled, repeatable, scalable one. LLM-as-a-Judge did this for the evaluator. It simulates a human grader so you can score thousands of outputs without a human in the loop.

We apply the same move to a different bottleneck. Developers today face dozens of agent frameworks, LangChain, LangGraph, CrewAI, AutoGen, Semantic Kernel, Google ADK, OpenAI Agents SDK, and a long tail beyond, with no principled way to answer the obvious question: which framework produces the best agents, and at what development cost? Answering it the traditional way means having experts hand-implement every benchmark against every framework's API, an O(N × M) effort that is slow, biased toward whichever framework the author already knows, and impossible at ecosystem scale.

Instead, we simulate the developer:

An LLM coding agent is dropped into a fresh environment with one framework's repository. It reads the docs and source, writes a task-solving agent, runs it, reads the errors, and repairs the code, the same explore → write → test → fix loop a human follows the first time they pick up a new SDK.

That is the entire methodology in one sentence. And because we run the identical simulated developer against every framework, same model, same tools, same budget, same starting point, we eliminate the single biggest confound in framework benchmarking: the human expert who already knows framework A better than framework B.

Diagram contrasting traditional evaluation, which needs a human to write an adapter per framework, with LLM-as-a-Developer, which holds a simulated developer constant and varies only the framework.
Traditional evaluation needs a human expert per framework (O(N×M) effort). LLM-as-a-Developer holds one simulated developer constant and varies only the framework, yielding two signals: the generation process measures API complexity; the execution results measure framework effectiveness.

Why simulating the developer is the right unit of measurement

Simulating the developer produces two measurements from a single run that no survey or model-benchmark can produce together:

Contrast the alternatives. Developer surveys capture what people say, not how frameworks behave. Agent benchmarks vary the model and hold the framework fixed. Hand-written comparisons reflect the author's familiarity and cannot scale. Simulating the developer is the only approach that is controlled, scalable, and dual-signal at once.

Anatomy of the simulated developer

The method only works if the simulation is faithful: it has to behave like a real developer onboarding to a framework, not a script. Three design choices make it faithful.

It works from the framework's own materials, nothing else. Inside a per-framework Docker container, the simulated developer gets exactly what a human would: the curated documentation (browsed incrementally, 20K characters per call) and the source code, mounted read-only and searchable. No hand-written hints, no per-framework special-casing. Information is restricted to each framework's own repository, so the comparison stays apples-to-apples.

It debugs like a developer, through a validate-and-repair loop rather than one-shot generation. The simulation writes an agent.py and runs it through a three-level validation pipeline of increasing fidelity:

On any failure, the validator pattern-matches the error against 70+ known signatures and hands back a structured diagnostic, a root-cause diagnosis plus a concrete fix, exactly like a senior colleague pointing at the bug:

DIAGNOSIS: Agent is connecting to a hardcoded URL (https://api.openai.com) instead of the proxy endpoint. The execution environment routes all LLM traffic through a local proxy at ADK_BASE_URL.

FIX: Replace all hardcoded URLs with os.environ["ADK_BASE_URL"].

The simulated developer reads the hint and makes a targeted single-edit repair instead of blindly regenerating. This is what makes the effort signal meaningful: it reflects real debugging, not random retries.

Everything downstream is uniform. Every generated agent exposes one entry point, solve(prompt, workdir), so any benchmark can invoke any framework's agent identically. And all LLM traffic, whatever provider API a framework natively targets (OpenAI, Anthropic, Google), is routed through a single token proxy that translates protocols and captures per-call tokens, latency, and tool-call sequences. That is how one simulated developer can be measured consistently across 51 frameworks and 4 benchmarks.

Three-stage pipeline: environment setup with per-framework Docker, the simulated developer's explore-write-validate-repair loop, and benchmarking through a token proxy.
The pipeline that realizes the methodology. (1) Collect repositories and build per-framework Docker environments. (2) Run the simulated developer's explore–write–validate–repair loop to produce agent.py. (3) Benchmark the generated agent through a token proxy and result evaluator.

ADK Arena: the methodology as a running system

We packaged all of this into ADK Arena, a fully automated pipeline that takes a framework's GitHub repository as input and produces benchmark scores as output, with zero manually written agent code. It has three stages: environment setup (collect 51 ADKs, build isolated Docker images), agent generation (the simulated-developer loop above), and benchmarking against four established suites that span different agent skills: SWE-bench (code editing), τ²-bench (conversational tool use), MCP-Atlas (multi-tool orchestration), and Terminal-Bench (terminal interaction).

51
Frameworks
204
Agent–benchmark pairs
5.6×
Effort spread
0
Hand-written agents

The 51 frameworks we tested

We ran the simulated developer against every one of these popular Python Agent Development Kits, spanning official vendor SDKs, research releases, and community projects:

LangChainLangGraphLlamaIndexCrewAIAutoGenAG2OpenAI AgentsAnthropic SDKGoogle ADKSemantic KernelPydanticAIHaystackAgnoComposioStrandsSmoLAgentsGuidanceCAMELMetaGPTSwarmsGriptapeUpsonicControlFlowAgency SwarmAgentlyLagentMCP AgentAtomicAgentsAgentUniverseEvoAgentXNerveAgent SquadMotleyCrewTaskflowAIAgent FrameworkCouncilAIQwen AgentAgentFlowAgentScopeAutoAgentPraisonAIAgentLiteOctotoolsFastAgentGPTSwarmSolaceTaskweaverLangroidAutoAgentsBeeAIOpenSage

Each was evaluated across four benchmarks (SWE-bench, τ²-bench, MCP-Atlas, Terminal-Bench). For the full per-framework generation effort and execution results, see the paper: arxiv.org/abs/2606.05548.

The evidence

The methodology is the point; the numbers are how we know it works. Running the simulated developer across all 51 frameworks (204 pairs, two developer models authoring agents, all executing on the same backbone) produced four results worth calling out.

Effort is a real usability signal. The simulated developer produces a validated agent for 57% of runs, and its per-agent effort varies 5.6× ($0.6 → $3.4) across frameworks. Clean APIs (LangGraph, OpenAI Agents, Haystack, AG2) are cheap to onboard; sprawling ones cost several times more. Effort tracks API complexity, though not as a clean pass/fail line, the cheapest runs are often frameworks where the developer gave up early.

The developer you simulate matters more than the model that runs the agent. On the same execution backbone, agents authored by the stronger developer model resolve ~2× as many tasks (41% vs 22% mean). A more careful simulated developer wires up the framework's full loop and registers tools; a lazier one emits a single model call and returns. That is itself a validation of the method: the measurement is sensitive to exactly the thing it should be, the quality of the developer.

A well-chosen framework can rival hand-built agents. The best single-benchmark generated agents are competitive with, and sometimes beat, production coding agents at a fraction of the cost. On MCP-Atlas the generated Agno agent resolves 68% of tasks at 38K tokens per task, beating Copilot's 58% at 327K (~9× fewer tokens). For reference, the five production agents we benchmarked (all on the same backbone):

SystemSWE-benchτ²-benchMCP-AtlasTerminalAvg
Copilot74%46%58%46%56.0%
OpenHands60%46%52%36%48.5%
OpenCode76%48%18%38%45.0%
Claude Code48%46%38%30%40.5%
Codex CLI60%46%36%16%39.5%

Per-task averages over the 50-task subset per benchmark. The median generated framework resolves only 32%, so beating the frontier is a top-of-distribution effect, not a guarantee.

Docs, source, and prior knowledge are largely substitutable. When we ablate what the simulated developer can see, genuine native framework usage stays inside a narrow 28–40% band. Counterintuitively, Source only (40%) beats Docs only (28%): documentation's worked examples anchor the simulation toward copying quickstart snippets into thin wrappers, while raw source pushes it toward the real API. Even with no reference at all (33%), prior knowledge of popular frameworks carries a third of them. No single information source is a hard bottleneck.

Why this generalizes.

The specific numbers will age as models and frameworks change; the method will not. "Simulate the user, hold the simulation constant, vary the thing under test, and read off effort and outcome" is a general recipe. When the user is a developer, you measure SDK usability and the quality of what gets built. When the user is an evaluator, you get LLM-as-a-Judge. Whenever a human-in-the-loop makes evaluation expensive, slow, or biased, simulating that human with a controlled agent turns it into something you can run on demand, at scale.

Read the paper & get the code

The full study, with per-framework generation effort, execution results, and the information-source ablation, is on arXiv. The complete pipeline is open source: the LLM-as-a-Developer simulation loop, per-framework Docker isolation, the three-level validate-and-repair pipeline, the token proxy, and all four benchmark adapters.

Paper — arxiv.org/abs/2606.05548 →
Code — github.com/jintao-h/ADK-Arena →

Note. ADK Arena is research from the MatrAIx community on simulating developers as users of agent frameworks. Reported figures are from the study's controlled runs and are meant to illustrate the methodology, not to rank any single framework definitively.