π Updates β’ π Quick start β’ π§ͺ Build experiments β’ π‘ Capture trajectories β’ π Score results β’ π View results
Evaluate any agent on any dataset, with full trajectory visibility.
English | δΈζ
A2E (Agent Auditing Engine) is an open-source platform for auditing agent harnesses end to end. It helps you:
- Build experiments β pair any benchmark with any agent harness and run them through one CLI
- Capture trajectories β auto-instrument LLM and tool calls into standardized traces
- Score results β score both the process and the final outcome with multidimensional metrics
- View results β browse datasets, experiments, and trace trees in a local UI
The loop is simple: build β capture β score β view. A local server stores runs, traces, and scores for every step.
A2E is harness and vendor agnostic, with out-of-the-box support for popular agent SDKs (OpenAI Agents SDK, Claude Agent SDK, LangGraph, Google ADK, AutoGen AgentChat, CrewAI, LlamaIndex, Agno, smolagents) reached through any OpenAI-compatible or Anthropic endpoint. Each harness is auto-instrumented through OpenInference, so your agent code stays untouched β see the supported harness table for the full list and instrumentor paths.
- 2026-08-12 β π€ Paper page live on Hugging Face.
- 2026-08-11 β π Colab quickstart notebook published β run A2E end to end in the browser.
- 2026-08-10 β β¨β¨ Full codebase of A2E released.
- 2026-08-07 β π A2E preprint posted on arXiv.
Dependency
bash scripts/start.shAPI key
cp .env.example .env
# fill in the values belowThen open http://localhost:6006.
Pick a dataset and an agent harness, then run:
# Terminal 1 β keep the server up
bash scripts/start.sh # β http://localhost:6006
# Terminal 2 β one official n=1 cell (evaluators + seed per dataset)
# source scripts/a2e_net.sh # autogen-agentchat: source scripts/autogen_env.sh
bash scripts/run_n1.sh <agent> <dataset>
# e.g. bash scripts/run_n1.sh agno tau-bench
# bash scripts/run_n1.sh langgraph deepsearchqa
# bash scripts/run_n1.sh llama-index gdpval-aaOr follow the interactive walkthrough: bash example/run_examples.sh.
Run custom experiments from task/ (same env as run_n1.sh; do not uv sync):
# source scripts/a2e_net.sh
cd task
"$AEP_PY" examples/run_experiment.py \
--dataset <dataset> \
--agent <framework> # default: agno
--model kimi/kimi-k3 \
--evaluators <a,b,...> # see table below; run_n1.sh sets this
--n 1 \
--sample-seed 20260816 \
--domain retail # tau-bench / tau2 / tau3| Flag | Purpose |
|---|---|
--list |
Print all datasets / agent harnesses / evaluators |
--dataset |
Dataset name (required) |
--agent |
Agent harness (defaultagno) |
--model |
OverrideA2E_MODEL for this run |
--evaluators |
Comma-separated scorers |
--n |
Sample size (absolute count, random without replacement) |
--domain |
retail / airline (tau-bench / tau2) |
# source scripts/a2e_net.sh
cd task
"$AEP_PY" examples/run_experiment.py --listEach benchmark includes a built-in evaluator preset. Use --evaluators to override
it; use --list to inspect every available benchmark, harness, and evaluator.
| Benchmark | Kind | Built-in default evaluators | Sandbox |
|---|---|---|---|
tau-bench |
Tool | tool_recall, llm_judge |
/ |
tau2 |
Tool | tool_recall, llm_judge |
/ |
tau3 |
Tool | tool_recall, llm_judge |
/ |
traject-bench |
Tool | tool_recall, llm_judge |
/ |
mmlu |
QA | mc_letter, llm_judge |
/ |
gsm8k |
QA | numeric_match, llm_judge |
/ |
humaneval |
QA | substring, llm_judge |
/ |
persistbench |
QA | substring, llm_judge |
/ |
gdpval-aa |
QA | llm_judge |
/ |
gpqa |
QA | mc_letter, llm_judge |
/ |
mmlu-pro |
QA | mc_letter, llm_judge |
/ |
arc-challenge |
QA | mc_letter, llm_judge |
/ |
truthfulqa |
QA | mc_letter, llm_judge |
/ |
agieval |
QA | mc_letter, llm_judge |
/ |
commonsenseqa |
QA | mc_letter, llm_judge |
/ |
hellaswag |
QA | mc_letter, llm_judge |
/ |
openbookqa |
QA | mc_letter, llm_judge |
/ |
bbh |
QA | exact_match, llm_judge |
/ |
math |
QA | numeric_match, llm_judge |
/ |
swe-bench-lite |
Sandbox | swe_resolved, swe_fail_to_pass, swe_pass_to_pass |
β |
swe-bench-verified |
Sandbox | swe_resolved, swe_fail_to_pass, swe_pass_to_pass |
β |
swe-bench-pro |
Sandbox | swe_resolved, swe_fail_to_pass, swe_pass_to_pass |
β |
terminal-bench-2 |
Sandbox | tb_resolved |
β |
terminal-bench-2.1 |
Sandbox | tb_resolved |
β |
All supported agent harnesses are auto-instrumented. Select one with --agent:
--agent |
Harness |
|---|---|
agno |
Agno |
smolagents |
smolagents |
llama-index |
LlamaIndex |
langgraph |
LangGraph |
crewai |
CrewAI |
google-adk |
Google ADK |
autogen-agentchat |
AutoGen AgentChat |
claude-sdk |
Claude Agent SDK |
openai-agents |
OpenAI Agents SDK |
Implementation and OpenInference instrumentor paths are listed under Capture trajectories.
Sandbox benchmarks require Docker and pull images of 1β3 GB each. For a repeatable SWE-bench run, pass a cached instance ID to the helper script:
bash task/run_sandbox_experiment.sh <cached_instance_id>While an experiment runs, Monitor auto-instruments the agent: LLM calls, tool calls, and related spans are written to the server as OpenTelemetry / OpenInference traces. You do not need a separate capture step for supported harnesses.
Supported auto-instrumented agent harnesses:
Shared OpenInference plumbing also lives under monitor/openinference-instrumentation
and monitor/openinference-semantic-conventions. Wiring is selected via
framework_for_agent() in task/runners/.../registry.py.
Captured trajectories show up in the Trace view at http://localhost:6006: open a sample and switch to Trace for its span tree of LLM and tool calls.
After trajectories land on the server, score the process and the outcome with the
unified evaluation pipeline in eval/. Lightweight inline scoring can still ride
along with --evaluators on the experiment CLI; use eval/ for deeper metric
groups across planning, tool usage, memory, correctness, efficiency, and safety.
Full details: eval/README.md.
# Terminal 1 β keep the server up
bash scripts/start.sh # β http://localhost:6006
# Terminal 2
cd server
uv run python ../eval/scripts/run_eval.py \
--base-url http://localhost:6006 \
--experiment-id <experiment_id> \
--part all| Part | What it scores |
|---|---|
plan |
Planning quality and decision-making |
skill |
Execution skill (e.g. conciseness) |
memory |
Memory / faithfulness |
tool |
Tool selection and execution |
correct |
Final task correctness |
efficiency |
Tokens, cost, turns, latency |
safety |
Safety-related behaviors |
cd server
uv run python ../eval/scripts/run_eval.py \
--base-url http://localhost:6006 \
--experiment-id <experiment_id> \
--part planSupported parts:
plan, skill, memory, tool, correct, efficiency, safety
The React viewer is served by a2e serve at http://localhost:6006 (built by scripts/start.sh). Swipe between Task / Trace / Eval for the same sample; open Trace for the span tree.
scripts/start.sh builds the production UI. For Vite HMR, start the API and the UI separately:
# Terminal 1 β API only (after deps are installed)
cd server && uv run a2e serve # http://127.0.0.1:6006
# Terminal 2
cd ui && pnpm install && pnpm dev # http://127.0.0.1:5173 (proxies /v1 β :6006)Or use a2e serve --dev for Vite HMR via the server templates.
AEP/
βββ scripts/ # One-click install + server start
βββ task/ # Build experiments (datasets, agents, runners)
βββ monitor/ # Capture trajectories (auto-instrumentation)
βββ eval/ # Score results (process and outcomes)
βββ server/ # Store runs, traces, and scores
βββ ui/ # View results
βββ example/ # Interactive walkthrough
Those directories are not layers stacked on top of each other β they are four independent processes that meet at the server. The diagram below shows what each one sends across:
task/+monitor/β βtask/pairs a benchmark with an agent harness and runs the pair in a sandbox.monitor/wraps that run, auto-instrumenting every LLM and tool call, and writes the run plus its traces to the server. The harness stays unmodified: nothing in your agent code has to know A2E exists.server/β the hub One local store holding three kinds of records:data(datasets and samples),trace(execution trees), andeval(scores). Every other component talks only to this store, never directly to each other, so a run can be scored or re-scored long after it finished.eval/β β‘ β’ Pulls traces back out and scores them on two axes: trace eval judges the process (did the agent call the right tools, in a sensible order?) while outcome eval judges the final answer. Scores are written back to the server against the same trace IDs.ui/β β£ Reads it all back and renders datasets, experiments, trace trees, and scores at http://localhost:6006.
Because everything routes through the server, each stage is independently runnable β you can capture traces today, add an evaluator next week, and score the old runs without re-running a single agent.
A2E depends on and draws from the following open-source projects:
A2E is licensed under the MIT License.
If you find A2E useful in your research, please cite:
@misc{wang2026a2eendtoendagent,
title={$A^2E$ : An End-to-End Agent Auditing Engine},
author={Haoning Wang and Mingxun Zhang and Chenyue Yu and Yingjun Shang and Xia Hu and Guanchu Wang and Na Zou},
year={2026},
eprint={2608.07346},
archivePrefix={arXiv},
primaryClass={cs.AI},
url={https://arxiv.org/abs/2608.07346},
}
