@mr_r0b0t: hermesbench v0.1 — a benchmark purpose-built for Hermes Agent tool-calling Runs real Hermes Agent subprocess in an isol…
Summary
hermesbench v0.1 is a new benchmark for evaluating local models on Hermes Agent tool-calling, featuring real agent harness, deterministic verifiers, and hardware telemetry. It includes 43 tasks across 11 categories and is designed to measure how well models use the Hermes Agent.
View Cached Full Text
Cached at: 06/16/26, 11:43 PM
hermesbench v0.1 — a benchmark purpose-built for Hermes Agent tool-calling
Runs real Hermes Agent subprocess in an isolated tmux session with full tool access. 48 tasks across 11 families: terminal, file read, patch edit, search, write, process mgmt, todo planning, execute code, web lookup, memory facts, error recovery.
What sets it apart from BFCL, τ-bench, Terminal-Bench, and other agent evals:
• Real harness — not a synthetic API or simplified sandbox. The model runs inside the actual Hermes Agent with its full 35-tool surface, same prompt format, same constraints.
• Deterministic verifiers only — every task evaluates pass/fail via stdlib Python checks on the conversation trace and filesystem state. No LLM-as-judge. No flaky heuristics.
• Full traces with token IDs — every system/user/assistant/tool message captured and exportable as loss-masked SFT training data.
• Hardware telemetry — 5 Hz logging of GPU power, temperature, joules-per-token, and thermal throttle seconds per task.
• Replayable terminal recordings — every task produces a .cast file you can replay or render to GIF/MP4.
First results: nex-agi/nex-n2-pro:free → 32/48 (66.7%). Flawless on terminal smoke (5/5) and file read (6/6). Struggled on patch edit (1/5), write (2/5), and memory (1/3) — the model frequently fell back to wrong tools or skipped required calls.
http://github.com/am423/hermesbenchv0_1…
am423/hermesbenchv0_1
Source: https://github.com/am423/hermesbenchv0_1
hermesbench v0.1
A benchmark for local models running inside the Hermes Agent harness. Captures full conversation traces (every tool call + result + reasoning + token IDs), asciinema recordings, and 5 Hz hardware telemetry. Designed to be the ground truth for “how good is this model at using hermes-agent?” — not just at generating text.
Repo:
github.com/am423/hermesbenchv0_1(private until v0.1 release) Plan: seeproject.md(1,813 lines, 11 sections, 75 answered design questions) Rubric: seerubric.md(the self-grade)
What it does
- 43 tasks across 11 categories — terminal smoke, file read, patch, search, write, process, todo, execute_code, web_lookup, memory, error_recovery
- Runs the real
AIAgentfrom~/.hermes/hermes-agent/in a subprocess with a customtmux_isolatedenvironment backend - Captures three artifacts per task run:
trace.jsonl— every system/user/assistant/tool message with token IDs and reasoning content (loss-masked SFT-ready)trace.cast— asciinema v2 recording of the model’s terminal session (X-shareable, replayable)stats.jsonl— 5 Hz hardware telemetry (CPU, GPU, RAM, NVMe, host power, model process tree) with thermal warnings
- Deterministic verifiers for every task (stdlib-only, no LLM-as-judge, no flakiness from network calls)
- 6 metric groups + 9 hardware metrics in the per-model summary: pass rate, tool efficiency, token efficiency, wall clock, recovery rate, format compliance, GPU power/temp, joules-per-token, thermal AUC, throttle seconds
Quick start (5 minutes)
# 1. Install (editable, with all deps)
make install
# 2. Verify environment
make doctor
# 3. Run a single task against a local model server
python3 -m hermesbench run \
--task t01_terminal_smoke/t01_echo \
--model qwen2.5-coder-7b-instruct-q4_k_m \
--base-url http://127.0.0.1:8080/v1
# 4. Run all 43 tasks
python3 -m hermesbench run --all \
--model qwen2.5-coder-7b-instruct-q4_k_m \
--base-url http://127.0.0.1:8080/v1
# 5. Render a task's cast to an X-ready GIF
python3 -m hermesbench render \
traces/<run_id>/t01_terminal_smoke/t01_echo/trace.cast \
--format gif --out t01.gif
CLI
| Command | What it does |
|---|---|
hermesbench list | List all 43 tasks |
hermesbench list --difficulty 2 | Filter by difficulty |
hermesbench validate | Lint all task.yaml + verifier files |
hermesbench run --task <id> | Run one task |
hermesbench run --all | Run all 43 tasks |
hermesbench run --all --dry-run | Validate without spawning hermes (Q72) |
hermesbench run --resume <run_id> | Resume a crashed run (Q24) |
hermesbench run --n-runs 3 | Run each task 3× for variance (Q34) |
hermesbench doctor | Pre-flight checks (Q70) |
hermesbench score results/<run>/ | Re-score from existing results |
hermesbench render <cast> | .cast → .gif/.mp4 with stats overlay (Q3.1a) |
hermesbench render --examples | Show 5 common render invocations (Q71) |
hermesbench export-sft <runs> | Traces → SFT jsonl with loss masks (Q45-Q47) |
Architecture (30-second version)
task.yaml + fixtures/
│
▼
runner.py ────► statsd (subprocess, niced, pinned core)
│ │
│ ▼
│ .stats.jsonl (5 Hz telemetry)
│
├──► hermes-agent (subprocess, --print-mode jsonl, --line-buffered)
│ │
│ │ TERMINAL_ENV=tmux_isolated
│ ▼
│ tmux session ──► .cast (asciinema v2, via pipe-pane)
│ (worktree, isolated $HOME, unshare --net, ulimit)
│ │
│ └─► read_file, patch, search_files, terminal, …
│
├──► .trace.jsonl (system/user/assistant/tool + token IDs + reasoning)
│
▼
scoring.py ──► results/<run_id>/<task_id>/
│
├──► pass_rate, J/tok, thermal warnings, hardware table
├──► export-sft ──► sft_dataset.jsonl (with loss masks)
└──► render ──► .gif / .mp4 (with --overlay-stats HUD)
See project.md §3 for the full design rationale.
Layout
hermesbenchv0_1/
├── README.md # this file
├── project.md # the design plan (1,813 lines)
├── rubric.md # the self-grade (95/100)
├── Makefile # demo / doctor / test / lint / install
├── pyproject.toml # Python 3.11+, ruff, mypy strict
├── requirements.lock # Q75: pinned versions
├── .pre-commit-config.yaml
├── .github/workflows/ci.yml
├── hermesbench/ # the package
│ ├── types.py # TaskSpec, VerifierResult, HardwareMetrics
│ ├── backend/ # base, registry, tmux_isolated, recorder, worktree
│ ├── statsd/ # 5 Hz telemetry collector
│ ├── trace.py # Q52 trace reader/normalizer
│ ├── scoring.py # metrics, thermal compare, J/tok
│ ├── hermes_invocation.py # Q22 path, Q50 SHA, Q57 smoke
│ ├── runner.py # full task lifecycle
│ └── cli.py # click + rich CLI
├── tasks/ # 43 tasks in 11 categories
│ ├── _template/ # canonical task shape
│ ├── t01_terminal_smoke/ # 5 tasks
│ ├── t02_file_read/ # 6 tasks (incl. Q61 parallel)
│ ├── t03_patch_edit/ # 5 tasks
│ ├── t04_search_grep/ # 5 tasks
│ ├── t05_write_new/ # 5 tasks
│ ├── t06_process_mgmt/ # 5 tasks
│ ├── t07_todo_plan/ # 3 tasks
│ ├── t08_execute_code/ # 5 tasks
│ ├── t09_web_lookup/ # 3 tasks (mocked)
│ ├── t10_memory_facts/ # 3 tasks
│ └── t11_error_recovery/ # 3 tasks (Q58)
├── fixtures/ # task input data (small_repo/, broken_code/, …)
├── scripts/
│ ├── generate_tasks.py # idempotent task generator (Q28)
│ └── fake_model_server.py # for end-to-end testing
├── tests/ # 47/47 passing
└── docs/
├── trace_format_reconciliation.md # Q52
├── adding_backends.md # Q9.3
└── glossary.md # Q9.4
Tests
make test # 47 passed, 1 deselected
test_smoke.py— package import, pytest collecttest_recorder.py— asciinema v2 roundtrip (unit + integration)test_statsd.py— 5 Hz samples for 2s, schema verificationtest_statsd_pinning.py— priority lowering + core detectiontest_statsd_sources.py— per-source shape validationtest_scoring.py— hardware metrics, J/tok, thermal comparetest_cli.py— every subcommand + exit codestest_verifier_contract.py— every verifier returns VerifierResult-liketest_trace.py— Q52 reconciliationtest_lint_verifiers.py— AST walk, stdlib allowlisttest_lint_fixtures.py— injection pattern scannertest_lint_fixture_sizes.py— 100 KB cap
Adding a new task
cp -r tasks/_template tasks/t12_my_category/t01_my_task/
$EDITOR tasks/t12_my_category/t01_my_task/task.yaml
# ... author verifier.py ...
python3 -m hermesbench validate tasks/t12_my_category/t01_my_task/
See tasks/_template/ for the full schema and
docs/glossary.md for terminology.
Adding a new environment backend
See docs/adding_backends.md. In short:
subclass BaseHermesBenchEnvironment, register with
@register_backend("name"), import from
hermesbench/backend/__init__.py.
License
MIT.
Similar Articles
@gregisenberg: how to set up hermes agent step by step. built-in memory, 40+ tools, works on your phone, and what to think of hermes v…
Hermes is a personal AI agent that runs in the terminal, featuring built-in memory and 40+ tools, with mobile support and comparisons to OpenClaw.
NousResearch/hermes-agent
Hermes Agent is an open-source, self-improving AI agent framework by Nous Research featuring a closed learning loop, cross-platform deployment, and compatibility with hundreds of LLMs. It provides a terminal interface, persistent memory, automated scheduling, and research-ready tooling for scaling AI workflows.
@witcheer: someone in the community worked on a real benchmark of seven self-hostable memory providers for Hermes Agent, each fed …
A community member benchmarked seven self-hostable memory providers for Hermes Agent, testing each with 71,060 conversation turns and 3,750 questions about changing facts; full results and GitHub repo are in the thread.
Jetson Orin NX Build for Hermes Agent + Benchmarking
A detailed build and benchmarking of a Jetson Orin NX system for running Hermes Agent, achieving 14.65 tok/s at 8k context and 10.21 tok/s at 60k context with Gemma 4 26B quantized model.
Tried every Hermes Agent alternative so you don't have to (2026 roundup)
A roundup comparing eleven Hermes Agent alternatives, split into open-source and managed options, with quick takes on security, performance, and features.