verifiers 0.4.1.dev49__tar.gz → 0.4.1.dev51__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/PKG-INFO +1 -1
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/grid.py +23 -1
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_agent_user.py +2 -7
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_multi_turn.py +2 -2
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_multi_turn_tool.py +2 -2
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_network_policy.py +2 -7
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_resume_tool.py +2 -2
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_skills.py +2 -2
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_user_echo.py +2 -2
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/cli/replay.py +4 -6
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/openclaw/harness.py +41 -8
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/task.py +9 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/.gitignore +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/LICENSE +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/README.md +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/pyproject.toml +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/conftest.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/agent_user.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/agent_user_harness.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/counter_tool.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/duet.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/echo.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/echo_acp_resume.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/echo_agentic.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/echo_tool.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/echo_tool_compose/docker-compose.yaml +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/echo_user_sim.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/fetch_tool.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/network_policy.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/parallel.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/pyproject.toml +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/skill_codeword.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/skills/project-codeword/SKILL.md +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/tool_response_image.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_agentic_judge.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_compose_scoring.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_examples.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_limits.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_multi_agent.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_multimodal_tool.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_parallel.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_rubric_judge.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_sampling.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_scoring_network.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_shared_tool.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_single_turn.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_stateful_tool.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_tool_vms.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/test_user_sim.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/cli/test_replay.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/conftest.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/harnesses/test_core.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/harnesses/test_rlm.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/interception/test_tunnel.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/judges/conftest.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/judges/test_judge.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/judges/test_reference.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/judges/test_rubric.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/runtimes/test_e2b.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/runtimes/test_private_network.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/serve/test_client.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/serve/test_delta.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/serve/test_pool.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/test_agent.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/test_dialects.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/test_graph.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/test_harbor_grading_network.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/test_scoring_network.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/test_semantic.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/test_task.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/test_taskset.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/test_trace.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/utils/test_compile.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/utils/test_loaders.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/utils/test_platform.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/unit/utils/test_score.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/acp/runner.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/agent.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/cli/eval/hint.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/cli/resume.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/clients/base.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/configs/agent.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/configs/cli/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/configs/cli/debug.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/configs/cli/env.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/configs/cli/eval.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/configs/cli/replay.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/configs/cli/validate.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/configs/client.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/configs/harness.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/configs/judge.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/configs/retries.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/configs/runtime.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/configs/scoring.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/configs/select.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/configs/task.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/configs/taskset.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/env.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/envs/agentic_judge/env.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/envs/user_sim/env.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/episode.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/errors.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/grading.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/graph.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harness.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/browser_use/program.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/codex/gate.mjs +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/deepseek/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/deepseek/gate.mjs +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/deepseek/harness.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/deepseek/usage.mjs +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/node.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/opencode/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/opencode/harness.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/opencode/mcp-ready.js +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/pi/gate.mjs +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/compaction.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/core.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/install.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/launch.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/mcp.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/harnesses/utils/replay.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/judge.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/judges/decision.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/apptainer.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/compose.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/container.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/deployment.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/docker/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/e2b.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/private_network.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/runtime.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/strategies.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/semantic.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/serve/delta.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/serve/encoding.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/session.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/state.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/trace.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/types.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/artifacts.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/compile.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/decorators.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/env.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/eval.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/loaders.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/paths.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/platform.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/prime.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/retries.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/scope.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/score.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/trace_store.py +0 -0
- {verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/verifiers/v1/utils/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.4.1.
|
|
3
|
+
Version: 0.4.1.dev51
|
|
4
4
|
Summary: Verifiers: Environments for LLM Reinforcement Learning
|
|
5
5
|
Project-URL: Homepage, https://github.com/primeintellect-ai/verifiers
|
|
6
6
|
Project-URL: Documentation, https://github.com/primeintellect-ai/verifiers
|
|
@@ -68,10 +68,32 @@ COMPOSE_VMS = ("prime", "modal")
|
|
|
68
68
|
# TODO: drop each entry once its fix lands.
|
|
69
69
|
CI_MODEL_GAPS = {
|
|
70
70
|
"kimi-code": "Prime chat completions rejects kimi-code's prompt_cache_key",
|
|
71
|
-
"openclaw": "openclaw cannot load the custom `internal/` model provider",
|
|
72
71
|
}
|
|
73
72
|
|
|
74
73
|
|
|
74
|
+
# Harnesses whose program rewrites earlier turns by design, so a rollout can record
|
|
75
|
+
# several branches. Each test names the ones it lets fork. Recheck on version bumps.
|
|
76
|
+
FORKS = {
|
|
77
|
+
# Acts only through tool calls: it drops a tool-less reply from its history and
|
|
78
|
+
# resends only its format error.
|
|
79
|
+
"mini-swe-agent": "https://github.com/SWE-agent/mini-swe-agent/blob/v2.4.6/src/minisweagent/agents/default.py#L114",
|
|
80
|
+
# Moves its runtime-context message to the tail of every request and drops the
|
|
81
|
+
# earlier one, unless the provider's replay policy is append-only.
|
|
82
|
+
"openclaw": "https://github.com/openclaw/openclaw/blob/v2026.9.5/src/agents/internal-runtime-context.ts#L402-L408",
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def assert_one_branch(
|
|
87
|
+
trace: vf.Trace, harness: vf.HarnessConfig, forks: Sequence[str] = ()
|
|
88
|
+
) -> None:
|
|
89
|
+
"""A rollout records one branch, unless its harness is one of `forks` (see `FORKS`)."""
|
|
90
|
+
assert set(forks) <= FORKS.keys(), (
|
|
91
|
+
f"no FORKS reason for {set(forks) - FORKS.keys()}"
|
|
92
|
+
)
|
|
93
|
+
if harness.id not in forks:
|
|
94
|
+
assert trace.num_branches == 1, f"{trace.num_branches} branches"
|
|
95
|
+
|
|
96
|
+
|
|
75
97
|
def agent_seats(taskset: str, env_id: str = "") -> list[str]:
|
|
76
98
|
"""The agent seats the env declares for `taskset`: `agent` for a plain taskset, its
|
|
77
99
|
own roles for a recipe env."""
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
upstream (agent-user-harness), on the runtimes that can switch users."""
|
|
4
4
|
|
|
5
5
|
import pytest
|
|
6
|
-
from grid import grid, runtimes_grid
|
|
6
|
+
from grid import assert_one_branch, grid, runtimes_grid
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
@pytest.mark.parametrize(
|
|
@@ -52,11 +52,6 @@ async def test_agent_user_harness(run, harness, harness_runtime, scripted_model)
|
|
|
52
52
|
client=scripted_model,
|
|
53
53
|
)
|
|
54
54
|
(trace,) = episode.traces
|
|
55
|
-
|
|
56
|
-
# scripted "OK") from its history and resends only its format error, so the
|
|
57
|
-
# trace forks by design. Recheck on version bumps:
|
|
58
|
-
# https://github.com/SWE-agent/mini-swe-agent/blob/v2.4.6/src/minisweagent/agents/default.py#L114
|
|
59
|
-
if harness.id != "mini-swe-agent":
|
|
60
|
-
assert trace.num_branches == 1
|
|
55
|
+
assert_one_branch(trace, harness, forks=("mini-swe-agent",))
|
|
61
56
|
assert trace.ok, [error.message for error in trace.errors]
|
|
62
57
|
assert trace.num_turns >= 1
|
|
@@ -4,7 +4,7 @@ every other `dialect` a harness config can select. A turn the harness re-sends
|
|
|
4
4
|
differently, beyond what its `replay_view` declares, forks the trace."""
|
|
5
5
|
|
|
6
6
|
import pytest
|
|
7
|
-
from grid import dialect_grid, grid, mark
|
|
7
|
+
from grid import assert_one_branch, dialect_grid, grid, mark
|
|
8
8
|
|
|
9
9
|
MULTI_TURN = [
|
|
10
10
|
*grid(needs=("shell",)),
|
|
@@ -28,7 +28,7 @@ async def test_multi_turn(run, harness, harness_runtime):
|
|
|
28
28
|
max_tokens=8192,
|
|
29
29
|
)
|
|
30
30
|
(trace,) = episode.traces
|
|
31
|
-
|
|
31
|
+
assert_one_branch(trace, harness, forks=("openclaw",))
|
|
32
32
|
assert trace.ok, [error.message for error in trace.errors]
|
|
33
33
|
assert trace.num_turns >= 1 # ran a command, then finished
|
|
34
34
|
assert trace.reward == 1.0
|
|
@@ -5,7 +5,7 @@ placements (colocated in the harness's box, in a Compose service beside it, or i
|
|
|
5
5
|
runtime) on the runtime x runtime grid."""
|
|
6
6
|
|
|
7
7
|
import pytest
|
|
8
|
-
from grid import RUNTIMES, grid, placements
|
|
8
|
+
from grid import RUNTIMES, assert_one_branch, grid, placements
|
|
9
9
|
|
|
10
10
|
import verifiers.v1 as vf
|
|
11
11
|
|
|
@@ -22,7 +22,7 @@ async def test_tool(run, harness, harness_runtime):
|
|
|
22
22
|
taskset_overrides={"task": {"tools": {"colocated": True}}},
|
|
23
23
|
)
|
|
24
24
|
(trace,) = episode.traces
|
|
25
|
-
|
|
25
|
+
assert_one_branch(trace, harness, forks=("openclaw",))
|
|
26
26
|
assert trace.ok, [error.message for error in trace.errors]
|
|
27
27
|
assert trace.num_turns >= 1
|
|
28
28
|
# Reward 1.0 is the proof the tool ran. How a program surfaces an MCP tool to the
|
|
@@ -4,7 +4,7 @@ agent runs an egress probe under each policy the task data declares
|
|
|
4
4
|
on prime."""
|
|
5
5
|
|
|
6
6
|
import pytest
|
|
7
|
-
from grid import grid
|
|
7
|
+
from grid import assert_one_branch, grid
|
|
8
8
|
|
|
9
9
|
from verifiers.v1.utils.loaders import harness_class
|
|
10
10
|
|
|
@@ -54,12 +54,7 @@ async def test_network_policy(run, harness, harness_runtime, notice):
|
|
|
54
54
|
assert set(by_name) == set(NOTICES)
|
|
55
55
|
for name, episode in by_name.items():
|
|
56
56
|
[trace] = episode.traces
|
|
57
|
-
|
|
58
|
-
# (the probe output as a final answer) from its history, so the trace forks
|
|
59
|
-
# by design. Recheck on version bumps:
|
|
60
|
-
# https://github.com/SWE-agent/mini-swe-agent/blob/v2.4.6/src/minisweagent/agents/default.py#L114
|
|
61
|
-
if harness.id != "mini-swe-agent":
|
|
62
|
-
assert trace.num_branches == 1
|
|
57
|
+
assert_one_branch(trace, harness, forks=("mini-swe-agent", "openclaw"))
|
|
63
58
|
assert trace.ok, [error.message for error in trace.errors]
|
|
64
59
|
prompt = prompt_text(trace)
|
|
65
60
|
if notice and NOTICES[name]:
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
exchange (echo-acp-resume), across the harness x runtime grid."""
|
|
3
3
|
|
|
4
4
|
import pytest
|
|
5
|
-
from grid import grid
|
|
5
|
+
from grid import assert_one_branch, grid
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
@pytest.mark.parametrize(
|
|
@@ -19,7 +19,7 @@ async def test_resume_tool(run, harness, harness_runtime):
|
|
|
19
19
|
rollout_timeout=600,
|
|
20
20
|
)
|
|
21
21
|
(trace,) = episode.traces
|
|
22
|
-
|
|
22
|
+
assert_one_branch(trace, harness, forks=("openclaw",))
|
|
23
23
|
assert trace.ok, [error.message for error in trace.errors]
|
|
24
24
|
assert trace.stop_condition == "user_closed"
|
|
25
25
|
assert trace.rewards["resumed"].score == 1.0
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
installs (skill-codeword), across the harness x runtime grid."""
|
|
3
3
|
|
|
4
4
|
import pytest
|
|
5
|
-
from grid import grid
|
|
5
|
+
from grid import assert_one_branch, grid
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
@pytest.mark.parametrize(
|
|
@@ -17,6 +17,6 @@ async def test_skills(run, harness, harness_runtime):
|
|
|
17
17
|
max_tokens=8192,
|
|
18
18
|
)
|
|
19
19
|
(trace,) = episode.traces
|
|
20
|
-
|
|
20
|
+
assert_one_branch(trace, harness, forks=("openclaw",))
|
|
21
21
|
assert trace.ok, [error.message for error in trace.errors]
|
|
22
22
|
assert trace.reward == 1.0, trace.last_reply
|
|
@@ -3,7 +3,7 @@ conversation each turn (echo-user-sim), across the harness x runtime grid; and t
|
|
|
3
3
|
caller drives an agent turn by turn through `agent.interaction`."""
|
|
4
4
|
|
|
5
5
|
import pytest
|
|
6
|
-
from grid import grid
|
|
6
|
+
from grid import assert_one_branch, grid
|
|
7
7
|
|
|
8
8
|
import verifiers.v1 as vf
|
|
9
9
|
|
|
@@ -25,7 +25,7 @@ async def test_user(run, harness, harness_runtime):
|
|
|
25
25
|
max_tokens=8192,
|
|
26
26
|
)
|
|
27
27
|
(trace,) = episode.traces
|
|
28
|
-
|
|
28
|
+
assert_one_branch(trace, harness, forks=("openclaw",))
|
|
29
29
|
assert trace.ok, [error.message for error in trace.errors]
|
|
30
30
|
assert trace.num_turns >= 2 # genuinely multi-turn
|
|
31
31
|
assert trace.stop_condition == "user_closed" # leaving the interaction ended it
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"""Offline scoring for saved traces.
|
|
2
2
|
|
|
3
|
-
Replay
|
|
4
|
-
transcript — trace-only handlers plus the layered
|
|
3
|
+
Replay re-scores each trace with `Task.rescore`: its scores cleared, everything
|
|
4
|
+
computable from the saved transcript recomputed — trace-only handlers plus the layered
|
|
5
|
+
config's judges. Runtime-requiring
|
|
5
6
|
signals don't run offline, so a replay carries offline scores only; the source run keeps
|
|
6
7
|
the runtime-recorded values. Its saved config is the base for replay-specific overrides.
|
|
7
8
|
Multi-agent runs don't support replay: re-scoring is per trace, and the env's
|
|
@@ -152,16 +153,13 @@ async def run_replay(config: ReplayConfig, source: Path, out: Path) -> list[Trac
|
|
|
152
153
|
st.state, st.detail, st.end = "skipped", "rollout errored", time.time()
|
|
153
154
|
else:
|
|
154
155
|
st.state = "running"
|
|
155
|
-
# Clear the recorded scores; only offline-recomputable ones come back.
|
|
156
|
-
trace.info.pop("judge_calls", None)
|
|
157
|
-
trace.rewards, trace.metrics, trace.extra_usage = {}, {}, []
|
|
158
156
|
# The declared Task for a rebuilt row, the base Task for the
|
|
159
157
|
# WireTaskData fallback.
|
|
160
158
|
task = (task_cls if isinstance(row, data_cls) else Task)(
|
|
161
159
|
row, config=config.taskset.task
|
|
162
160
|
)
|
|
163
161
|
try:
|
|
164
|
-
await task.
|
|
162
|
+
await task.rescore(trace)
|
|
165
163
|
st.state, st.detail = "scored", f"reward {trace.reward:.3f}"
|
|
166
164
|
except Exception as exc:
|
|
167
165
|
st.state, st.detail = "error", type(exc).__name__
|
|
@@ -61,6 +61,14 @@ if (patched !== source) {
|
|
|
61
61
|
NODE
|
|
62
62
|
"""
|
|
63
63
|
|
|
64
|
+
# OpenClaw rejects a model it cannot resolve as the primary model, which makes setting
|
|
65
|
+
# it in a scratch config a check for whether its catalog knows the model.
|
|
66
|
+
CATALOG_CHECK = r"""
|
|
67
|
+
mkdir -p "$OPENCLAW_STATE_DIR"
|
|
68
|
+
printf '{}' >"$OPENCLAW_CONFIG_PATH"
|
|
69
|
+
exec "$VF_OPENCLAW_BIN" config set agents.defaults.model.primary "$VF_OPENCLAW_MODEL"
|
|
70
|
+
"""
|
|
71
|
+
|
|
64
72
|
OPENCLAW_COMMAND = [
|
|
65
73
|
"sh",
|
|
66
74
|
"-c",
|
|
@@ -130,6 +138,10 @@ class OpenClawHarness(ACPHarness[OpenClawHarnessConfig]):
|
|
|
130
138
|
SUPPORTS_MCP = True
|
|
131
139
|
SUPPORTS_SKILLS = True
|
|
132
140
|
|
|
141
|
+
def __init__(self, config: OpenClawHarnessConfig) -> None:
|
|
142
|
+
super().__init__(config)
|
|
143
|
+
self._cataloged: dict[str, bool] = {}
|
|
144
|
+
|
|
133
145
|
async def setup(self, runtime: Runtime) -> None:
|
|
134
146
|
directory = OPENCLAW_DIR.format(version=self.config.version)
|
|
135
147
|
binary = OPENCLAW_BIN.format(version=self.config.version)
|
|
@@ -151,6 +163,23 @@ class OpenClawHarness(ACPHarness[OpenClawHarnessConfig]):
|
|
|
151
163
|
)
|
|
152
164
|
await super().setup(runtime)
|
|
153
165
|
|
|
166
|
+
async def _in_catalog(self, runtime: Runtime, model: str, state_dir: str) -> bool:
|
|
167
|
+
"""Whether OpenClaw's model catalog knows `model`, checked once per model."""
|
|
168
|
+
if model not in self._cataloged:
|
|
169
|
+
check_dir = f"{state_dir}/catalog-check"
|
|
170
|
+
result = await runtime.run(
|
|
171
|
+
["sh", "-c", CATALOG_CHECK],
|
|
172
|
+
{
|
|
173
|
+
**self.config.resolved_env,
|
|
174
|
+
"OPENCLAW_STATE_DIR": check_dir,
|
|
175
|
+
"OPENCLAW_CONFIG_PATH": f"{check_dir}/openclaw.json",
|
|
176
|
+
"VF_OPENCLAW_BIN": OPENCLAW_BIN.format(version=self.config.version),
|
|
177
|
+
"VF_OPENCLAW_MODEL": json.dumps(model),
|
|
178
|
+
},
|
|
179
|
+
)
|
|
180
|
+
self._cataloged[model] = result.exit_code == 0
|
|
181
|
+
return self._cataloged[model]
|
|
182
|
+
|
|
154
183
|
async def prepare_acp(
|
|
155
184
|
self,
|
|
156
185
|
ctx: ModelContext,
|
|
@@ -162,10 +191,20 @@ class OpenClawHarness(ACPHarness[OpenClawHarnessConfig]):
|
|
|
162
191
|
data: TaskData,
|
|
163
192
|
) -> ACPConfig:
|
|
164
193
|
system_prompt, prompt = self.resolve_prompt(data)
|
|
165
|
-
provider, _,
|
|
194
|
+
provider, _, model_id = ctx.model.partition("/")
|
|
166
195
|
state_dir = f".vf-openclaw/{trace.id}"
|
|
167
196
|
config_path = f"{state_dir}/openclaw.json"
|
|
168
197
|
skills_dir = f"{state_dir}/skills"
|
|
198
|
+
provider_config = {
|
|
199
|
+
"baseUrl": endpoint,
|
|
200
|
+
"apiKey": "${OPENCLAW_INTERCEPT_KEY}",
|
|
201
|
+
"request": {"allowPrivateNetwork": True},
|
|
202
|
+
}
|
|
203
|
+
if not await self._in_catalog(runtime, ctx.model, state_dir):
|
|
204
|
+
# Catalog models keep OpenClaw's defaults. Others need a declared model, and
|
|
205
|
+
# OpenClaw's chat completions default for them rewrites replayed turns.
|
|
206
|
+
provider_config["api"] = "openai-responses"
|
|
207
|
+
provider_config["models"] = [{"id": model_id, "name": model_id}]
|
|
169
208
|
config = {
|
|
170
209
|
"gateway": {
|
|
171
210
|
"mode": "local",
|
|
@@ -193,13 +232,7 @@ class OpenClawHarness(ACPHarness[OpenClawHarnessConfig]):
|
|
|
193
232
|
"deny": self.config.disabled_tools or [],
|
|
194
233
|
},
|
|
195
234
|
"models": {
|
|
196
|
-
"providers": {
|
|
197
|
-
provider: {
|
|
198
|
-
"baseUrl": endpoint,
|
|
199
|
-
"apiKey": "${OPENCLAW_INTERCEPT_KEY}",
|
|
200
|
-
"request": {"allowPrivateNetwork": True},
|
|
201
|
-
}
|
|
202
|
-
},
|
|
235
|
+
"providers": {provider: provider_config},
|
|
203
236
|
},
|
|
204
237
|
"mcp": {
|
|
205
238
|
"servers": {
|
|
@@ -224,6 +224,15 @@ class Task(Generic[DataT, StateT, ConfigT]):
|
|
|
224
224
|
as a rollout would."""
|
|
225
225
|
return None
|
|
226
226
|
|
|
227
|
+
async def rescore(self, trace: Trace) -> None:
|
|
228
|
+
"""Score a finished trace again, offline: clear its rewards, metrics and judge
|
|
229
|
+
calls, then run this task's signals that need only the trace."""
|
|
230
|
+
if trace.has_error:
|
|
231
|
+
raise ValueError("the rollout errored: its transcript is incomplete")
|
|
232
|
+
trace.info.pop("judge_calls", None)
|
|
233
|
+
trace.rewards, trace.metrics, trace.extra_usage = {}, {}, []
|
|
234
|
+
await self.score(trace)
|
|
235
|
+
|
|
227
236
|
def defer_scoring(self) -> Self:
|
|
228
237
|
"""An independent copy whose task signals are deferred.
|
|
229
238
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/agent_user_harness.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/echo_acp_resume.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/network_policy.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/skill_codeword.py
RENAMED
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev49 → verifiers-0.4.1.dev51}/tests/integration/fixtures/tool_response_image.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|