Files
wehub-resource-sync 426e9eeabd
Benchmark Bridge Tests / benchmark (bunx @biomejs/biome check packages/lifeops-bench/src, benchmark-lint) (push) Waiting to run
Benchmark Bridge Tests / benchmark (bunx vitest run --config packages/lifeops-bench/vitest.config.ts --root packages/lifeops-bench --passWithNoTests, benchmark-tests) (push) Waiting to run
Build Agent Image / build-and-push (push) Waiting to run
Chat shell gestures / Chat shell gesture + parity e2e (push) Waiting to run
ci / test (push) Waiting to run
ci / lint-and-format (push) Waiting to run
ci / build (push) Waiting to run
ci / dev-startup (push) Waiting to run
Cloud Gateway Discord / Test (push) Waiting to run
Cloud Gateway Webhook / Test (push) Waiting to run
Cloud Tests / lint-and-types (push) Waiting to run
Cloud Tests / unit-tests (push) Waiting to run
Cloud Tests / integration-tests (push) Waiting to run
Cloud Tests / e2e-tests (push) Blocked by required conditions
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
Deploy Apps Worker (Product 2) / Determine environment (push) Waiting to run
Deploy Apps Worker (Product 2) / Deploy apps worker to apps-control host (${{ needs.determine-env.outputs.environment }}) (push) Blocked by required conditions
Deploy Eliza Provisioning Worker / Determine environment (push) Waiting to run
Deploy Eliza Provisioning Worker / Deploy worker to Hetzner host (${{ needs.determine-env.outputs.environment }} @ ${{ needs.determine-env.outputs.deployment_sha }}) (push) Blocked by required conditions
Dev Smoke / Classify changed paths (push) Waiting to run
Dev Smoke / bun run dev onboarding chat (push) Blocked by required conditions
Dev Smoke / Vite HMR dependency-level smoke (push) Blocked by required conditions
Electrobun Submodule Guard / electrobun gitlink is fetchable (push) Waiting to run
gitleaks / gitleaks (push) Waiting to run
Markdown Links / Relative Markdown Links (push) Waiting to run
Publish @elizaos/example-code / check_npm (push) Waiting to run
Publish @elizaos/example-code / publish_npm (push) Blocked by required conditions
Publish @elizaos/plugin-elizacloud / verify_version (push) Waiting to run
Publish @elizaos/plugin-elizacloud / publish_npm (push) Blocked by required conditions
Quality (Extended) / Homepage Build (PR smoke) (push) Waiting to run
Quality (Extended) / Comment-only diff guard (push) Waiting to run
Quality (Extended) / Format + Type Safety Ratchet (push) Waiting to run
Quality (Extended) / Develop Gate (secret scan + UI determinism) (push) Waiting to run
Quality (Extended) / Develop Gate (lint) (push) Waiting to run
Sandbox Live Smoke / Sandbox live smoke (push) Waiting to run
Snap Build & Test / Build Snap (amd64) (push) Waiting to run
Snap Build & Test / Build Snap (arm64) (push) Waiting to run
supply-chain / sbom (push) Waiting to run
supply-chain / vulnerability-scan (push) Waiting to run
Build, Push & Deploy to Phala Cloud / build-and-push (push) Waiting to run
Test Packaging / Validate Packaging Configs (push) Waiting to run
Test Packaging / PyPI on Python ${{ matrix.python }} (push) Waiting to run
Test Packaging / Pack & Test JS Tarballs (push) Waiting to run
Test Packaging / elizaos CLI global-install smoke (node + bun) (push) Waiting to run
UI Fixture E2E / ui-fixture-e2e (push) Waiting to run
UI Fixture E2E / fixture-e2e (push) Waiting to run
UI Story Gate / story-gate (push) Waiting to run
vault-ci / test (macos-latest) (push) Waiting to run
vault-ci / test (ubuntu-latest) (push) Waiting to run
vault-ci / test (windows-latest) (push) Waiting to run
vault-ci / app-core wiring tests (push) Waiting to run
verify-patches / verify patches/CHECKSUMS.sha256 (push) Waiting to run
Voice Benchmark Smoke / voice-emotion fixture smoke (push) Waiting to run
Voice Benchmark Smoke / voiceagentbench fixture smoke (push) Waiting to run
Voice Benchmark Smoke / voicebench-quality unit smoke (push) Waiting to run
Voice Benchmark Smoke / voicebench TypeScript unit (no audio) (push) Waiting to run
Voice Benchmark Smoke / voice bench smoke summary (push) Blocked by required conditions
Windows CI / windows ([bun run --cwd packages/app-core test bun run --cwd packages/elizaos test bun run --cwd packages/cloud/shared test], app-and-cli) (push) Waiting to run
Windows CI / windows ([bun run --cwd packages/scenario-runner test bun run --cwd packages/vault test bun run --cwd packages/security test bun run --cwd plugins/plugin-coding-tools test], framework-packages) (push) Waiting to run
Windows CI / windows ([bun run --cwd plugins/plugin-elizacloud test bun run --cwd plugins/plugin-discord test bun run --cwd plugins/plugin-anthropic test bun run --cwd plugins/plugin-openai test bun run --cwd plugins/plugin-app-control test bun run --cwd plugins/pl… (push) Waiting to run
Windows CI / windows ([node packages/scripts/run-turbo.mjs run build --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/agent --concurrency=4 node packages/scripts/run-bash-linux-only.mjs scripts/verify-riscv64-buildpaths.sh node packages/scripts/run… (push) Waiting to run
Windows CI / windows ([node packages/scripts/run-turbo.mjs run typecheck --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/cloud-shared --concurrency=4 bun run --cwd packages/core test bun run --cwd packages/shared test], core-runtime, 75) (push) Waiting to run
Test Packaging / Build & Test PyPI Package (push) Waiting to run
Voice Workbench / headless workbench (mocked backends) (push) Has been cancelled
Voice Workbench / real acoustic lane (nightly, provisioned only) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:43:05 +08:00

6.0 KiB

Smithers harness integration

This documents how the Smithers agent harness (smithers-orchestrator, https://github.com/smithersai/smithers — a Bun + JSX durable workflow engine) is wired into the benchmark suite as a fourth harness alongside eliza, hermes, and openclaw.

What Smithers is

Smithers is a durable control plane for long-running coding agents: you author workflows as .tsx (JSX components <Workflow>, <Task>, <Sequence>, <Parallel>, <Branch>, <Ralph>), run them for minutes-to-days, and get crash recovery, retries, approvals, replay, evals, and GEPA-style prompt optimization. State persists to SQLite; tasks validate against Zod schemas.

For benchmarking we don't need the durable workflow engine per turn — we need a single-turn primitive: given messages + tools, produce one model response with token usage. Smithers exposes exactly that through its OpenAIAgent (a ToolLoopAgent built on the Vercel ai SDK), which the adapter drives directly.

Architecture

orchestrator → bfcl runner (BENCHMARK_HARNESS=smithers)
  → smithers_adapter.bfcl.SmithersBFCLAgent
    → SmithersClient.send_message(text, context)      [Python]
      → spawn: bun run smithers_turn.mjs               [one-shot subprocess]
        → new OpenAIAgent({ model: provider.chat(model) })  [Smithers / ai SDK]
          → Cerebras /v1/chat/completions (gemma-4-31b)
      ← {text, thought, actions, params:{tool_calls, usage}}  [one JSON line]

Key decisions:

  • Per-turn bun subprocess. Mirrors the hermes (venv subprocess) and openclaw (CLI subprocess) pattern. The orchestrator never imports Bun/Smithers deps; it only needs bun on PATH and a resolved Smithers install.
  • Forced chat-completions. @ai-sdk/openai v6 defaults bare model ids to the /responses endpoint, which Cerebras does not implement (404). The harness uses provider.chat(model) to force /v1/chat/completions.
  • Execute-less tools. Benchmark tools are declared without an execute handler, so the ToolLoopAgent halts after emitting tool calls and returns them for the runner to score (BFCL is single-turn, no real tool execution).
  • Usage passthrough. The ai SDK usage block (inputTokens, outputTokens, totalTokens, cachedInputTokens, raw provider counts) is normalized to the same telemetry shape hermes/openclaw write, so cost accounting reads Smithers runs identically.

Files

Path Role
smithers-adapter/smithers_adapter/smithers_turn.mjs One-shot per-turn Bun harness (canonical source; copied into the install dir at runtime so Bun resolves smithers-orchestrator).
smithers-adapter/smithers_adapter/client.py SmithersClient — spawns the harness, parses output, writes telemetry. API-compatible with HermesClient.
smithers-adapter/smithers_adapter/server_manager.py SmithersManager — thin lifecycle (validate bun + install, materialize script).
smithers-adapter/smithers_adapter/bfcl.py SmithersBFCLAgent + build_bfcl_agent_fn — BFCL glue.
orchestrator/adapters.py SMITHERS_BENCHMARKS gate + adapter path / ignored-dir registration.
bfcl/runner.py, bfcl/__main__.py smithers dispatch branch.

Install

mkdir -p ~/.eliza/agents/smithers/0.22.0 && cd $_
bun add smithers-orchestrator@0.22.0 @ai-sdk/openai ai zod

Resolution precedence: SMITHERS_DIR env → ~/.eliza/agents/smithers/manifest.json → newest versioned subdir → ~/.eliza/agents/smithers/0.22.0. Requires bun >= 1.3.0.

Run

cd packages/benchmarks
CEREBRAS_API_KEY=... BENCHMARK_HARNESS=smithers \
BENCHMARK_MODEL_PROVIDER=cerebras BENCHMARK_MODEL_NAME=gemma-4-31b \
PYTHONPATH=smithers-adapter:hermes-adapter:openclaw-adapter:eliza-adapter \
.venv-standard/bin/python -m benchmarks.bfcl run --provider eliza --model gemma-4-31b --categories simple --sample 8

Verified live (measured on the previous default model, Cerebras gpt-oss-120b): BFCL simple → 87.5% (7/8) and 100% (3/3) on small samples — in range with hermes/openclaw (100% on the same samples).

Extending coverage

The harness contract is benchmark-agnostic (SmithersClient.send_message). To add another benchmark:

  1. Add smithers_adapter/<bench>.py mirroring hermes_adapter/<bench>.py, swapping HermesClientSmithersClient.
  2. Add "<bench>" to SMITHERS_BENCHMARKS in orchestrator/adapters.py.
  3. Add a smithers dispatch branch in that benchmark's runner (as in bfcl/runner.py).

Good next targets (single-turn / tool-calling, lowest friction): action_calling, clawbench, agentbench, mint, tau_bench.

GEPA prompt optimization

Smithers ships GEPA-style reflective prompt optimization:

smithers optimize workflow.tsx \
  --cases evals/cases.jsonl --suite bfcl-gepa \
  --provider cerebras --model gemma-4-31b \
  --artifact .smithers/optimizations/bfcl-gepa.json

GEPA discovers every <Task> prompt in a workflow, runs a baseline eval over the case file, asks the optimizer model to emit prompt patches ({"patches":[{"nodeId","prompt","rationale"}]}), re-runs the suite with the candidate artifact, and writes the artifact only when the score improves by --minImprovement. Score = passRate * 0.8 + assertionPassRate * 0.2.

How to use it to compete in these benchmarks. The Smithers BFCL agent uses a fixed system prompt (_DEFAULT_SYSTEM_PROMPT in bfcl.py). To lift the score:

  1. Express the BFCL turn as a one-<Task> Smithers workflow whose prompt is the system prompt + the query, with the expected function call(s) as the eval expected.
  2. Build evals/bfcl.jsonl from a slice of BFCL cases.
  3. Run smithers optimize ... --provider cerebras to evolve the prompt.
  4. Feed the winning prompt back as _DEFAULT_SYSTEM_PROMPT (or load the artifact via SMITHERS_OPTIMIZATION_ARTIFACT).

This is Smithers' structural advantage in the comparison: the same harness that runs the benchmark can self-optimize its prompts against a held-out eval slice before the scored run, using a cheap Cerebras model as the patch generator.