Skip to main content
ageval: Configurable and pluggable agent evaluation framework

ageval

English · 简体中文


stars release CI license docs install uv demo

Table of contents

TOC


How to avoid rewriting scaffolds for the huge set of agent runtime × model × environment combinations?

ageval keeps one stable Core and swaps the agent under test and the environment through plugins. Install the CLI and skills so a coding agent can design or convert a benchmark and finish the eval; after results land on the Hub, datasets, plugins, and Agent packages can be shared or reused publicly.

Getting started

uv tool install ageval-cli
# install everything, or only what you need
uv tool install 'ageval-cli[all]' # every CLI extra (not the Hub service)
uv tool install 'ageval-cli[e2b]' # one extra at a time

ageval -V

Run a dataset straight from the Hub (ageval.zjureal.com; the CLI default), or any local dataset root:

ageval registry list                        # datasets visible on the Hub
ageval run official/minimal-demo@0.1.3 --task terminal-jsonl-agg
ageval run <org>/<name>@<version> --task <task-id>
ageval executors -v
ageval view <org>/<name>@<version> --no-browser

Install skills

Install skills for your local coding agent (CLI usage, plugins, dataset authoring, and more):

# install all
npx skills add ZJU-REAL/ageval
# install specific ones
npx skills add ZJU-REAL/ageval --skill ageval-cli

Develop from source

To try the in-repo dataset examples and Agent catalog packs, or to build from source, clone the repo:

git clone https://github.com/ZJU-REAL/ageval.git
cd ageval
uv sync --frozen --all-packages
uv run ageval -V

Run the in-repo minimal example and inspect the results in the local Viewer:

uv run ageval tasks examples/datasets/minimal-demo
uv run ageval run  examples/datasets/minimal-demo --task terminal-jsonl-agg
uv run ageval view examples/datasets/minimal-demo --no-browser

Features

Quickly switch the agent under test

Environments and agent runtimes both plug in. The default path is ACP; nooa, dsh, and miniswe use the same plugin path. Change one line in profiles.yaml, or pass --agent for a one-off switch.

Let the Agent run the eval

With the CLI and skills installed, a coding agent can author or convert a dataset and run the eval end to end. Afterwards, ageval view opens that dataset or a directory of datasets and replays the trajectory locally: phase timing, tool calls, and a reproduce command for failed tasks. The same window lists Agent and Plugin packages on this machine. See Getting started.

Two scoring styles

Only a separate evaluator.py can return PASS:

  • Default is a deterministic script: compare artifacts to gold, optionally split into checks
  • Open-ended tasks can add a judge role on the same profiles.yaml and use LLM-as-judge.

Share and reuse on Hub

Upload datasets, plugins, Agent packages, and results to ageval Hub. A local suite, including one still running, or a single Attempt can also be sent as a read-only link /s/{token}. Opening that link does not require a sign-in, and it does not list the suite. Leaderboard scores name the Agent and environment used; pull a published Agent with --agent; compare models side by side.

Screenshots

Hub leaderboard: scores by Agent and model

Leaderboard: scores by Agent and model

Local viewer: replay tool calls in a trajectory

Trajectory: replay tool calls in the local viewer

More screenshots

Agents: packages you can pull from Hub

Agents: packages you can pull from Hub

Plugin marketplace: environment and agent runtime plugins

Plugin marketplace: environment and agent runtime plugins

Pareto: pass rate vs time

Pareto: pass rate vs time

Verifier: deterministic script checks

Verifier: deterministic script checks

How it works

End-to-end flow

  1. ageval lock resolves the plugin graph (ExtensionGraph), checks capabilities and credentials, and writes lock.json (secrets stay locators).
  2. ageval run opens an environment and uploads task files (local / Docker / E2B, …).
  3. run.py drives the task loop inside that environment; swapping env or Agent does not require editing this file.
  4. Only evaluator.py can return PASS; gold uploads after the run; cleanup always runs.
%%{init: {"theme":"base","themeVariables":{"actorBkg":"#eaf1ff","actorBorder":"#5B7BFF","actorTextColor":"#10233f","actorLineColor":"rgba(45,49,66,0.2)","signalColor":"#4f5d75","signalTextColor":"#2d3142","labelBoxBkgColor":"#eaf1ff","labelBoxBorderColor":"#5B7BFF","labelTextColor":"#10233f","noteBkgColor":"#f1f5f9","noteBorderColor":"#64748b","noteTextColor":"#1e293b"}}}%%
sequenceDiagram
    autonumber
    actor u as you
    participant r as run entry
    participant e as Environment<br/>local / docker / e2b…
    participant t as run.py + Agent
    participant v as evaluator.py

    u->>r: ageval lock<br/>dataset + profiles → lock.json
    Note over r: the check fails — the run does not start
    u->>r: ageval run
    r->>r: mint run identity
    r->>e: open one environment
    r->>e: upload task files
    e->>t: execute run.py
    loop task loop
        t->>t: ACP invoke · attach_stdio
    end
    t-->>r: trajectory.jsonl
    Note over r,v: run ends → gold uploads, then evaluation
    r->>v: run evaluator.py
    v-->>r: PASS / FAIL / ERROR
    r->>r: record · finally cleanup<br/>lock.json · result.json · trajectory.jsonl

Core base

ageval Core is a fixed five-phase pipeline: lock → environment → run → evaluate → record. Inputs are the user, dataset, and profiles; outputs land in evidence (lock.json, result.json, trajectory.jsonl). At ageval lock, one environment plugin and one Agent plugin are bound. Before the run starts, limits cap wall-clock time, memory, process forks, and call counts; cleanup always runs. Swapping an Agent or an environment does not require changing Core.

ageval Core base overview

Plugins

Core does not hard-code a particular Agent or environment. Plugins declare what they provide and what capabilities they need; ageval lock resolves a dependency graph (ExtensionGraph), and later dispatch follows that graph.

# Agent plugin (e.g. dsh)
plugin_id: dsh
slots:
  exclusive:
    - id: executor
inject:
  - service: environment
    capabilities: [exec, upload]

# Environment plugin (e.g. docker)
plugin_id: docker
slots:
  exclusive:
    - id: environment

Plugin mechanism: dependency graph drives Core dispatch

Project structure

ageval/
├── src/ageval/
│   ├── cli/                         # argv, help, exit code
│   ├── application/
│   │   ├── composition.py           # sole production wiring; CLI imports build_* here
│   │   ├── lock.py                  # load_and_lock
│   │   ├── run.py                   # mint identity → run_attempt
│   │   ├── campaign.py / suite/     # matrix · suite · Always-k
│   │   └── agent_ops/ / plugin_ops / registry_ops/
│   ├── attempt/                     # Attempt pipeline
│   │   ├── __init__.py              # run_attempt
│   │   └── phases/                  # environment → run → evaluate → record · cleanup
│   ├── config/                      # dataset + task.yaml + profiles
│   ├── environments/protocol.py     # EnvironmentProvider · caps; no vendor SDK
│   ├── plugins/
│   │   ├── slots.py                 # exclusive / chain
│   │   └── contrib/                 # acp · local · docker/attempt (official base, in the wheel) · e2b · daytona · ssh
│   ├── runtime/                     # identity, parent Agent Service, task_worker
│   ├── evaluation/                  # bind PASS
│   └── evidence/                    # trajectory.jsonl layout
├── src/ageval_sdk/                  # ageval_sdk for run.py (no PASS, no host credentials)
├── plugins/                         # external ageval.plugin/1 (nooa, dsh, miniswe, …)
├── examples/
│   ├── datasets/
│   │   ├── minimal-demo/            # terminal-jsonl-agg · tau2-dialog-min · multiagent-env-min
│   │   └── tau3-airline-5/            # airline-00 … airline-04
│   └── agents/                      # ageval.agent/1
├── apps/shared                      # Hub + Viewer overlap chrome
├── apps/viewer                      # ageval view SPA
├── apps/hub                         # Hub SPA
├── services/registry/               # package + results HTTP
├── docs/                            # mechanism design
└── website/                         # product docs

Docs

Metadata

Release files for ageval-cli 0.9.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ageval-cli 0.9.0
File Size Uploaded
ageval_cli-0.9.0.tar.gz 15.9 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for ageval-cli 0.9.0
File Interpreter ABI Platform
ageval_cli-0.9.0-py3-none-any.whl Python 3 none any Details

Total release size: 19.7 MB

Release files / ageval_cli-0.9.0.tar.gz

Download URL ageval_cli-0.9.0.tar.gz
Size 15.9 MB
Tags Source
SHA-256 checksum
How to use checksums
00df679261ef06c7d58e0b607278626149bfb66c15828f59bc5153fd8bde1066
BLAKE2b-256 checksum
How to use checksums
56ffdeb1a371cbfa41f489c21fbde33dba9266a12aef2efdca121e1299426423
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / ageval_cli-0.9.0-py3-none-any.whl

Download URL ageval_cli-0.9.0-py3-none-any.whl
Size 3.8 MB
Tags Python 3
SHA-256 checksum
How to use checksums
da72c27ceccf139854ba486a5b032aac1bed2ec7557007d4f8e5ccbfd7c67d0a
BLAKE2b-256 checksum
How to use checksums
dc2f3d25a9e0c2f7c39991f06ab1f7002df55aca02260e1b3468c6202b88ac10
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

0.9.0 This release

2 release files

0.8.4

2 release files

0.8.3

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.3

2 release files

0.7.2

2 release files

0.7.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page