feat(evals): passive/interactive agent eval framework over memory2 - #3411
feat(evals): passive/interactive agent eval framework over memory2#3411spomichter wants to merge 10 commits into
Conversation
EvalCase/PassiveEval/InteractiveEval with EvalRig protocol dispatch, EvalRunner implementing the rig (model call / mcp skill / agent loop / live-store sampling), scorers as plain functions wrapping openevals, generated + hand VQA suites over go2 replays, dimsim go-to-bed interactive suite, dimos evals CLI + EvalModule MCP skills. extracts _init_model to dimos/agents/model.py for shared use.
…e-store sampling)
…ackages, no __all__)
Codecov Report❌ Patch coverage is @@ Coverage Diff @@
## main #3411 +/- ##
==========================================
+ Coverage 76.09% 76.12% +0.03%
==========================================
Files 1190 1201 +11
Lines 115295 115988 +693
Branches 10367 10415 +48
==========================================
+ Hits 87729 88294 +565
- Misses 24554 24671 +117
- Partials 3012 3023 +11
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 6 files with indirect coverage changes 🚀 New features to boost your workflow:
|
…anges reuse mcp_client._init_model lazily instead of extracting it — keeps this PR scoped to dimos/evals (+ cli registration). extraction can be its own PR if we want it shared properly.
|
@greptile review |
|
We need to design runtime and scorer information access more carefully. The current scheme is wrong IMO because it evaluates against Memory2 state produced by the runtime itself. To simulate real operation as faithfully as possible, the agent should have access to all information exposed by the running blueprint, including RPCs, streams, and Memory2. Scoring should instead use independent, privileged simulator state, such as ground-truth robot and object poses and object types. |
Problem
Eval framework, supports both InteractiveEvals and PassiveEvals, @paul-nechifor old dimsim spatial memory eval replicated via the new framework here pretty clean:
Uses langchain openevals for VQA formatting so its compatible with all public benchmarks we'd want to run. Scoring is generic and done via lambda one-liners. Agent loop runs LLM queries with a light agent_loop in the EvalRunner -- kept minimal and using langchain client since just doing dumb QA.
Closes DIM-1392, DIM-1390
Solution
dimos/evals/package. one word (evals) everywhere, no benchmark vs eval splitPassiveEval(frozen mem2 recording, any replay window, non-autoregressive) andInteractiveEval(live sim/robot, actions mutate state, scored by sampling teh live recorder store)Streams, no copies, no parallel data structreswithin,ramp, Vector3 subtraction etc), graded [0,1] credit not only pass/failinputs/reference_outputs, evaluators wrapped not subclassed) so external benchmarks map on natively and we can test against themPassiveEval[T]tiesexpected/parse/scoretogehter so mypy catches a mismatched case at suite definition time, not mid-rundimos evals run ...), mcp (EvalModuleskills so coding agents can iterate), and pytest--blindablation built in — same suite with observations withheld, alredy caught two guessable MCQsMoondreamChatadapter so evals run keyless on any gpu boxdefining evals
passive one-off over a replay — the whole thing is one literal:
interactive — the case names its environment, score is sampled from the live mem2 store every
interval_sand reduced byaggregate:running
or
dimos evals run dimos.evals.suites.go2_smoke --blind. every run writes results.jsonl + summary.json + per-case transcripts to~/.local/state/dimos/evals/run-*/.first real numbers
luna sighted: examples 1.00 / smoke 1.00 / vqa 0.86, blind = refusals. interactive rig scored 0.856 on a scripted go-to-bed in dimsim. the full agentic go-to-bed scores 0.0 right now —
unitree-go2-agenticpublishes no /odom in dimsim on current main (upstream test_dimsim_spatial_memory fails teh same way, suspect the control coordinator refactor). separate ticket coming.Breaking Changes
None
How to Test
interactive (needs deno + display):
dimos evals run dimos.evals.suites.dimsim_house --live-db recording_go2.dbContributor License Agreement