Skip to content

feat(agent evals): add the Pi agent as well as pointcloud sim evals - #3879

Draft
hvent90 wants to merge 3 commits into
feat/agent-evals-splitfrom
feat/pi-eval-agent
Draft

feat(agent evals): add the Pi agent as well as pointcloud sim evals#3879
hvent90 wants to merge 3 commits into
feat/agent-evals-splitfrom
feat/pi-eval-agent

Conversation

@hvent90

@hvent90 hvent90 commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Contribution path

  • Small, safe change that does not need a tracking issue

Problem

We should have a control or baseline when doing agent evals. None such existed. An example of a control or baseline would simply be having Claude Code, Codex, OpenCode, Pi, or some similar established coding agent run against our agent evals.

Solution

Add a wrapper for the Pi agent harness.

How to Test

uv run dimos evals run dimos.evals.suites.dimsim_pointcloud_mapping \
    --agent dimos.evals.agents.pi \
    --set max_steps=30 \
    # --set instructions="custom instructions that are appended to the prompt that will influence the agent to approach the task in a particular way"

AI assistance

I used Fable 5 to write this PR and I further iterated on it from there.

Checklist

  • I have read and approved the CLA.

@hvent90 hvent90 changed the title feat(evals): the Pi coding agent and a point-cloud mapping eval feat(evals): add the Pi agent as well as pointcloud sim evals Sep 1, 2026
@hvent90 hvent90 changed the title feat(evals): add the Pi agent as well as pointcloud sim evals feat(agent evals): add the Pi agent as well as pointcloud sim evals Sep 1, 2026
@codecov

codecov Bot commented Sep 1, 2026

Copy link
Copy Markdown

❌ 1 Tests Failed:

Tests completed Failed Passed Skipped
4914 1 4913 40
View the top 1 failed test(s) by shortest run time
dimos.teleop.hosted.test_go2_command::test_repeated_estop_reissues_damp
Stack Traces | 0.023s run time
module = <dimos.teleop.hosted.go2_command.Go2CommandModule object at 0x7f51f3d7cf80>
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f51f3d7d010>

    def test_repeated_estop_reissues_damp(
        module: Go2CommandModule, monkeypatch: pytest.MonkeyPatch
    ) -> None:
        module.go2.sport_command.return_value = True
        acks: list[tuple[Any, bool]] = []
        monkeypatch.setattr(module, "_send_ack", lambda nonce, ok: acks.append((nonce, ok)))
    
        module._on_state_json(b'{"type": "estop", "nonce": 1}')
        wait_until(lambda: module.go2.sport_command.call_count == 1, timeout=2.0)
        module._on_state_json(b'{"type": "estop", "nonce": 1}')  # retransmit, same nonce
        wait_until(lambda: module.go2.sport_command.call_count == 2, timeout=2.0)
    
>       assert acks.count((1, True)) == 2
E       assert 1 == 2
E        +  where 1 = <built-in method count of list object at 0x7f520ba09980>((1, True))
E        +    where <built-in method count of list object at 0x7f520ba09980> = [(1, True)].count

acks       = [(1, True), (1, True)]
module     = <dimos.teleop.hosted.go2_command.Go2CommandModule object at 0x7f51f3d7cf80>
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f51f3d7d010>

.../teleop/hosted/test_go2_command.py:251: AssertionError

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

Restores the Pi agent split out of feat/agent-evals-split: Pi runs
headless over the recording as a file with every model call captured
by a local recording proxy, and the dimsim point-cloud mapping suite
runs it under three prompt conditions.
… as an error

Pi gains instructions, builtin_guidance, tools and passthrough_env fields
so a suite can state its condition without restating the agent's own
contract, and a skill can replace the built-in recording/robot guidance.
The recording handed to Pi is now the case's selected streams written to
a fresh store, not the whole source file. A Pi that exits non-zero (a
rejected flag, say) raises with its stderr instead of passing as an
empty answer.

The point-cloud suite's conditions drop the shared prefix accordingly,
and grade_rooms takes its visit radius as a parameter.
…tants

The suite no longer carries per-agent condition text (selection guidance,
access contracts, composed conditions) or run commands for one agent; the
case is the instruction, the stack, and the grader. Whoever compares
approaches passes their own text with --set instructions.

Pi's docstring is a plain list of its settings. The provider name and the
proxy's hop-by-hop header set are inlined where they are used instead of
living as module constants.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant