verifiers 0.3.2.dev107__tar.gz → 0.3.2.dev109__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.3.2.dev107 → verifiers-0.3.2.dev109}/PKG-INFO +2 -2
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/pyproject.toml +1 -1
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/test_e2e.py +1 -4
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/agent.py +9 -2
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/configs/agent.py +1 -1
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/configs/harness.py +13 -5
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harness.py +49 -20
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/claude_code/harness.py +1 -2
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/codex/harness.py +1 -2
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/kimi_code/harness.py +7 -4
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/openclaw/harness.py +1 -26
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/pi/harness.py +8 -6
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/prime_agent/harness.py +4 -4
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/rlm/harness.py +15 -4
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/rollout.py +6 -3
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/runtimes/prime.py +11 -57
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/task.py +5 -2
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/tasksets/harbor/env.py +1 -1
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/tasksets/harbor/taskset.py +3 -3
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/.gitignore +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/LICENSE +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/README.md +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/conftest.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/fixtures/duet_v1.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/test_configs.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/test_envs.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/test_graph.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/test_judges.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/test_platform_run.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/test_serve_delta.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/test_taskset.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/tests/v1/test_trace.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/acp/runner.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/cli/eval/hint.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/cli/resume.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/clients/base.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/configs/cli/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/configs/cli/debug.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/configs/cli/env.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/configs/cli/eval.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/configs/cli/init.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/configs/cli/replay.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/configs/cli/validate.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/configs/client.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/configs/judge.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/configs/retries.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/configs/runtime.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/configs/task.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/configs/taskset.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/env.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/envs/agentic_judge/env.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/envs/isolated_verifier/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/envs/isolated_verifier/env.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/envs/user_sim/env.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/episode.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/errors.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/graph.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/browser_use/program.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/node.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/utils/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/utils/compaction.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/utils/core.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/utils/install.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/utils/launch.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/utils/mcp.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/interception/tool.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/judge.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/runtimes/apptainer.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/runtimes/container.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/runtimes/docker/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/semantic.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/serve/delta.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/serve/encoding.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/session.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/state.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/trace.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/types.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/utils/artifacts.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/utils/compile.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/utils/decorators.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/utils/loaders.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/utils/paths.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/utils/platform.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/utils/prime.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/utils/retries.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/utils/score.py +0 -0
- {verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/utils/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.3.2.
|
|
3
|
+
Version: 0.3.2.dev109
|
|
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
|
|
@@ -36,7 +36,7 @@ Requires-Dist: numpy>=2.1.0
|
|
|
36
36
|
Requires-Dist: openai<3.0.0,>=2.54.0
|
|
37
37
|
Requires-Dist: prime-pydantic-config[toml]>=0.4.3
|
|
38
38
|
Requires-Dist: prime-runs>=0.1.3
|
|
39
|
-
Requires-Dist: prime-sandboxes>=0.
|
|
39
|
+
Requires-Dist: prime-sandboxes>=0.3.0
|
|
40
40
|
Requires-Dist: prime-tunnel>=0.1.8
|
|
41
41
|
Requires-Dist: pydantic>=2.12.3
|
|
42
42
|
Requires-Dist: pyzmq>=27.1.0
|
|
@@ -356,10 +356,7 @@ async def test_acp_resume_with_tool(run_v1, harness, harness_runtime, tmp_path):
|
|
|
356
356
|
(trace,) = await run_v1(
|
|
357
357
|
"echo-acp-resume-v1",
|
|
358
358
|
harness=harness,
|
|
359
|
-
runtime={
|
|
360
|
-
"type": harness_runtime,
|
|
361
|
-
**({"vm": True} if harness_runtime == "prime" else {}),
|
|
362
|
-
},
|
|
359
|
+
runtime={"type": harness_runtime},
|
|
363
360
|
output_dir=tmp_path,
|
|
364
361
|
max_turns=8,
|
|
365
362
|
max_tokens=8192,
|
|
@@ -540,6 +540,13 @@ class Agent:
|
|
|
540
540
|
) -> dict:
|
|
541
541
|
"""Resolve one run's runtime config, pairing checks, timeouts,
|
|
542
542
|
interception — shared by `run` and `interaction`."""
|
|
543
|
+
harness = self.harness
|
|
544
|
+
skills = [*task.data.skills, *harness.config.skills]
|
|
545
|
+
if skills:
|
|
546
|
+
# Skill installations can hold run-specific state, such as RLM's package environment.
|
|
547
|
+
harness = type(harness)(
|
|
548
|
+
harness.config.model_copy(update={"skills": skills})
|
|
549
|
+
)
|
|
543
550
|
if runtime is not None:
|
|
544
551
|
_check_borrowed_placement(task, runtime, self.runtime_config)
|
|
545
552
|
runtime_config = runtime.config
|
|
@@ -550,7 +557,7 @@ class Agent:
|
|
|
550
557
|
)
|
|
551
558
|
run_is_local = runtime_is_local(runtime_config)
|
|
552
559
|
validate_pairing(
|
|
553
|
-
|
|
560
|
+
harness,
|
|
554
561
|
type(task),
|
|
555
562
|
runtime_config,
|
|
556
563
|
tools=[*task.toolsets(task.config), *shared_tools.values()],
|
|
@@ -558,7 +565,7 @@ class Agent:
|
|
|
558
565
|
timeouts = resolve_rollout_timeouts(self.timeout, task)
|
|
559
566
|
return {
|
|
560
567
|
"agent_config": self.config,
|
|
561
|
-
"harness":
|
|
568
|
+
"harness": harness,
|
|
562
569
|
"ctx": self.ctx,
|
|
563
570
|
"runtime_config": runtime_config,
|
|
564
571
|
"timeouts": replace(
|
|
@@ -14,7 +14,7 @@ class TimeoutConfig(BaseConfig):
|
|
|
14
14
|
"""Timeout (in seconds) for different phases of an agent's run."""
|
|
15
15
|
|
|
16
16
|
setup: float | None = None # one shared budget: task setup + provisioning
|
|
17
|
-
"""Timeout (in seconds) for
|
|
17
|
+
"""Timeout (in seconds) for task/harness setup through session preparation."""
|
|
18
18
|
rollout: float | None = None
|
|
19
19
|
"""Timeout (in seconds) for the agent's solve attempt. Unset: the task's own
|
|
20
20
|
timeout, else 4 hours. `0` disables the timeout."""
|
|
@@ -4,7 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import os
|
|
6
6
|
from pathlib import Path
|
|
7
|
-
from typing import Annotated
|
|
7
|
+
from typing import Annotated, Literal
|
|
8
8
|
|
|
9
9
|
from pydantic import ConfigDict, Field, FiniteFloat
|
|
10
10
|
from pydantic_config import BaseConfig
|
|
@@ -15,6 +15,14 @@ PinnedVersion = Annotated[str, Field(pattern=r"^[A-Za-z0-9._+-]+$")]
|
|
|
15
15
|
"""A release/tag a harness pins its program install to."""
|
|
16
16
|
|
|
17
17
|
|
|
18
|
+
SkillSource = Path | Annotated[dict[Literal["runtime"], str], Field(min_length=1)]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def skill_destination(skill: SkillSource, dest: str) -> str:
|
|
22
|
+
"""Runtime roots merge into `dest`; host folders keep their resolved name."""
|
|
23
|
+
return dest if isinstance(skill, dict) else f"{dest}/{skill.resolve().name}"
|
|
24
|
+
|
|
25
|
+
|
|
18
26
|
class HarnessConfig(BaseConfig):
|
|
19
27
|
id: ID = "bash"
|
|
20
28
|
"""Installed harness package, set through the seat's
|
|
@@ -44,10 +52,10 @@ class HarnessConfig(BaseConfig):
|
|
|
44
52
|
tool_timeout: FiniteFloat = Field(600.0, gt=0)
|
|
45
53
|
"""Seconds a single MCP tool call may take; raise it for tools that boot a VM."""
|
|
46
54
|
disabled_tools: list[str] | None = None
|
|
47
|
-
skills: list[
|
|
48
|
-
"""
|
|
49
|
-
|
|
50
|
-
|
|
55
|
+
skills: list[SkillSource] = Field(default_factory=list)
|
|
56
|
+
"""Host skill folders or `{runtime: path}` roots of skills inside the runtime.
|
|
57
|
+
Sources are installed in order; later files override matching earlier files.
|
|
58
|
+
Only harnesses with native skill support (`SUPPORTS_SKILLS`) accept them."""
|
|
51
59
|
|
|
52
60
|
@property
|
|
53
61
|
def name(self) -> str:
|
|
@@ -8,7 +8,7 @@ from collections.abc import Mapping
|
|
|
8
8
|
from typing import TYPE_CHECKING, ClassVar, Generic, TypeVar
|
|
9
9
|
|
|
10
10
|
from verifiers.v1.clients import ModelContext
|
|
11
|
-
from verifiers.v1.configs.harness import HarnessConfig
|
|
11
|
+
from verifiers.v1.configs.harness import HarnessConfig, skill_destination
|
|
12
12
|
from verifiers.v1.errors import HarnessError, SandboxError, boundary
|
|
13
13
|
from verifiers.v1.runtimes import ProgramResult, Runtime
|
|
14
14
|
from verifiers.v1.task import TaskData
|
|
@@ -45,8 +45,8 @@ class Harness(ABC, Generic[ConfigT]):
|
|
|
45
45
|
where model-directed execution changes the rules: the subprocess-on-host
|
|
46
46
|
warning, the judge env's sandbox requirement."""
|
|
47
47
|
SUPPORTS_SKILLS: ClassVar[bool] = False
|
|
48
|
-
"""Whether the program discovers SKILL.md skills —
|
|
49
|
-
`install_skills` with
|
|
48
|
+
"""Whether the program discovers SKILL.md skills — it calls
|
|
49
|
+
`install_skills` with a run-scoped discovery location; configuring
|
|
50
50
|
`skills` on a harness without support is rejected up front."""
|
|
51
51
|
NEEDS_CONTAINER: ClassVar[bool] = True
|
|
52
52
|
"""Whether the program must run in a container runtime: True for every harness
|
|
@@ -97,35 +97,64 @@ class Harness(ABC, Generic[ConfigT]):
|
|
|
97
97
|
"""Provision this harness in `runtime` before its execution timeout starts."""
|
|
98
98
|
|
|
99
99
|
async def install_skills(self, runtime: Runtime, dest: str) -> None:
|
|
100
|
-
"""
|
|
101
|
-
|
|
102
|
-
`setup` passes."""
|
|
103
|
-
uploads = []
|
|
104
|
-
executables = []
|
|
100
|
+
"""Install `config.skills` in the program's discovery directory.
|
|
101
|
+
Runtime roots are copied in place; host skill folders are uploaded."""
|
|
105
102
|
for skill in self.config.skills:
|
|
103
|
+
target_dir = skill_destination(skill, dest)
|
|
104
|
+
if isinstance(skill, dict):
|
|
105
|
+
result = await runtime.run(
|
|
106
|
+
[
|
|
107
|
+
"bash",
|
|
108
|
+
"-e",
|
|
109
|
+
"-o",
|
|
110
|
+
"pipefail",
|
|
111
|
+
"-c",
|
|
112
|
+
r"""
|
|
113
|
+
[ -d "$1" ]
|
|
114
|
+
source=$(CDPATH= cd -- "$1/." && pwd -P)
|
|
115
|
+
mkdir -p -- "$2"
|
|
116
|
+
target=$(CDPATH= cd -- "$2/." && pwd -P)
|
|
117
|
+
[ "$source" != "$target" ] || exit 0
|
|
118
|
+
# A source such as "." must not copy the destination back into itself.
|
|
119
|
+
exclude=$(printf '%s' "./${target#"${source%/}/"}" | sed 's/[][\\*?]/\\&/g')
|
|
120
|
+
tar -C "$source" --exclude="$exclude" -cf - . | tar -xpf - -C "$target"
|
|
121
|
+
""",
|
|
122
|
+
"vf-skills",
|
|
123
|
+
skill["runtime"],
|
|
124
|
+
target_dir,
|
|
125
|
+
],
|
|
126
|
+
{},
|
|
127
|
+
)
|
|
128
|
+
if result.exit_code:
|
|
129
|
+
raise RuntimeError(
|
|
130
|
+
f"installing runtime skills from {skill['runtime']!r} failed: {result.stderr}"
|
|
131
|
+
)
|
|
132
|
+
continue
|
|
106
133
|
# Resolve so `.`/`..` entries get their real folder name (and can't
|
|
107
134
|
# place files outside `dest`).
|
|
108
135
|
skill = skill.resolve()
|
|
109
136
|
if not skill.is_dir():
|
|
110
137
|
raise ValueError(f"skill {str(skill)!r} is not a folder")
|
|
138
|
+
uploads = []
|
|
139
|
+
executables = []
|
|
111
140
|
for file in skill.rglob("*"):
|
|
112
141
|
if not file.is_file():
|
|
113
142
|
continue
|
|
114
|
-
target = f"{
|
|
143
|
+
target = f"{target_dir}/{file.relative_to(skill).as_posix()}"
|
|
115
144
|
uploads.append((target, file.read_bytes()))
|
|
116
145
|
if os.access(file, os.X_OK):
|
|
117
146
|
executables.append(target)
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
147
|
+
# Finish this source before the next one overwrites matching files.
|
|
148
|
+
results = await asyncio.gather(
|
|
149
|
+
*(runtime.write(target, data) for target, data in uploads),
|
|
150
|
+
return_exceptions=True,
|
|
151
|
+
)
|
|
152
|
+
for result in results:
|
|
153
|
+
if isinstance(result, BaseException):
|
|
154
|
+
raise result
|
|
155
|
+
if executables:
|
|
156
|
+
# `write` moves bytes, not modes; restore the execute bits scripts need.
|
|
157
|
+
await runtime.run(["chmod", "+x", *executables], {})
|
|
129
158
|
|
|
130
159
|
async def _check_result(
|
|
131
160
|
self, trace: Trace, runtime: Runtime, result: ProgramResult
|
{verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/claude_code/harness.py
RENAMED
|
@@ -15,7 +15,6 @@ ACP_VERSION = "0.67.0"
|
|
|
15
15
|
CLAUDE_BIN = f"{PACKAGES_DIR}/node_modules/.bin/claude"
|
|
16
16
|
ACP_BIN = f"{PACKAGES_DIR}/node_modules/.bin/claude-agent-acp"
|
|
17
17
|
CLAUDE_CONFIG_ROOT = ".vf-claude"
|
|
18
|
-
SKILLS_DIR = ".claude/skills"
|
|
19
18
|
ACP_INSTALL = r"""
|
|
20
19
|
set -e
|
|
21
20
|
export PATH="/var/tmp/vf-node/bin:$PATH"
|
|
@@ -39,7 +38,6 @@ class ClaudeCodeHarness(ACPHarness[ClaudeCodeHarnessConfig]):
|
|
|
39
38
|
SUPPORTS_SKILLS = True
|
|
40
39
|
|
|
41
40
|
async def setup(self, runtime: Runtime) -> None:
|
|
42
|
-
await self.install_skills(runtime, SKILLS_DIR)
|
|
43
41
|
await ensure_node(runtime)
|
|
44
42
|
versions = {"version": self.config.version, "acp_version": ACP_VERSION}
|
|
45
43
|
directory = CLAUDE_ACP_DIR.format(**versions)
|
|
@@ -74,6 +72,7 @@ class ClaudeCodeHarness(ACPHarness[ClaudeCodeHarnessConfig]):
|
|
|
74
72
|
) -> ACPConfig:
|
|
75
73
|
system_prompt, prompt = self.resolve_prompt(data)
|
|
76
74
|
config_dir = self.config_dir(trace)
|
|
75
|
+
await self.install_skills(runtime, f"{config_dir}/skills")
|
|
77
76
|
versions = {"version": self.config.version, "acp_version": ACP_VERSION}
|
|
78
77
|
session_meta = {
|
|
79
78
|
"claudeCode": {
|
|
@@ -22,7 +22,6 @@ PACKAGES_DIR = f"{CODEX_DIR}/acp"
|
|
|
22
22
|
ACP_VERSION = "1.2.0"
|
|
23
23
|
CODEX_BIN = f"{PACKAGES_DIR}/node_modules/.bin/codex"
|
|
24
24
|
ACP_BIN = f"{PACKAGES_DIR}/node_modules/.bin/codex-acp"
|
|
25
|
-
SKILLS_DIR = ".agents/skills"
|
|
26
25
|
INSTALL = r"""
|
|
27
26
|
set -e
|
|
28
27
|
export PATH="/var/tmp/vf-node/bin:$PATH"
|
|
@@ -58,7 +57,6 @@ class CodexHarness(ACPHarness[CodexHarnessConfig]):
|
|
|
58
57
|
raise RuntimeError(f"Codex {failure['category']}: {failure['safeMessage']}")
|
|
59
58
|
|
|
60
59
|
async def setup(self, runtime: Runtime) -> None:
|
|
61
|
-
await self.install_skills(runtime, SKILLS_DIR)
|
|
62
60
|
await ensure_node(runtime)
|
|
63
61
|
logger.info(
|
|
64
62
|
"codex: ensuring Codex %s and codex-acp %s are installed",
|
|
@@ -137,6 +135,7 @@ class CodexHarness(ACPHarness[CodexHarnessConfig]):
|
|
|
137
135
|
mcp_urls: dict[str, str],
|
|
138
136
|
) -> dict[str, str]:
|
|
139
137
|
home = self.trace_home(trace)
|
|
138
|
+
await self.install_skills(runtime, f"{home}/skills")
|
|
140
139
|
mcp_config = "features={mcp_2026_07_28=true}\n" + (
|
|
141
140
|
"mcp_servers={"
|
|
142
141
|
+ ",".join(
|
{verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/kimi_code/harness.py
RENAMED
|
@@ -8,7 +8,7 @@ import tomli_w
|
|
|
8
8
|
from verifiers.v1.acp import ACPConfig, ACPHarness
|
|
9
9
|
from verifiers.v1.clients import ModelContext
|
|
10
10
|
from verifiers.v1.configs.harness import HarnessConfig, PinnedVersion
|
|
11
|
-
from verifiers.v1.harnesses.utils.install import ensure_installed
|
|
11
|
+
from verifiers.v1.harnesses.utils.install import ensure_installed, remove_dir
|
|
12
12
|
from verifiers.v1.runtimes import Runtime
|
|
13
13
|
from verifiers.v1.task import TaskData
|
|
14
14
|
from verifiers.v1.trace import Trace
|
|
@@ -18,7 +18,6 @@ logger = logging.getLogger(__name__)
|
|
|
18
18
|
BINARY = "/tmp/vf-kimi-code/bin/kimi"
|
|
19
19
|
KIMI_HOME = ".vf-kimi-code"
|
|
20
20
|
ACP_COMMAND = [BINARY, "acp"]
|
|
21
|
-
SKILLS_DIR = f"{KIMI_HOME}/skills"
|
|
22
21
|
|
|
23
22
|
INSTALL = r"""
|
|
24
23
|
set -e
|
|
@@ -52,7 +51,6 @@ class KimiCodeHarness(ACPHarness[KimiCodeHarnessConfig]):
|
|
|
52
51
|
SUPPORTS_SKILLS = True
|
|
53
52
|
|
|
54
53
|
async def setup(self, runtime: Runtime) -> None:
|
|
55
|
-
await self.install_skills(runtime, SKILLS_DIR)
|
|
56
54
|
logger.info(
|
|
57
55
|
"kimi-code: ensuring Kimi Code %s is installed", self.config.version
|
|
58
56
|
)
|
|
@@ -77,6 +75,8 @@ class KimiCodeHarness(ACPHarness[KimiCodeHarnessConfig]):
|
|
|
77
75
|
data: TaskData,
|
|
78
76
|
) -> ACPConfig:
|
|
79
77
|
kimi_home = f"{KIMI_HOME}/{trace.id}"
|
|
78
|
+
skills_dir = f"{kimi_home}/skills"
|
|
79
|
+
await self.install_skills(runtime, skills_dir)
|
|
80
80
|
provider_type = {
|
|
81
81
|
"chat_completions": "openai",
|
|
82
82
|
"responses": "openai_responses",
|
|
@@ -88,7 +88,7 @@ class KimiCodeHarness(ACPHarness[KimiCodeHarnessConfig]):
|
|
|
88
88
|
else endpoint
|
|
89
89
|
)
|
|
90
90
|
config = {
|
|
91
|
-
"extra_skill_dirs": [
|
|
91
|
+
"extra_skill_dirs": [skills_dir] if self.config.skills else [],
|
|
92
92
|
**(
|
|
93
93
|
{
|
|
94
94
|
"permission": {
|
|
@@ -125,3 +125,6 @@ class KimiCodeHarness(ACPHarness[KimiCodeHarnessConfig]):
|
|
|
125
125
|
prompt=prompt,
|
|
126
126
|
system_prompt=system_prompt,
|
|
127
127
|
)
|
|
128
|
+
|
|
129
|
+
async def cleanup(self, trace: Trace, runtime: Runtime) -> None:
|
|
130
|
+
await remove_dir(runtime, f"{KIMI_HOME}/{trace.id}", "Kimi Code state")
|
{verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/openclaw/harness.py
RENAMED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
"""Run OpenClaw's Gateway-backed ACP agent against interception."""
|
|
2
2
|
|
|
3
|
-
import asyncio
|
|
4
3
|
import json
|
|
5
4
|
import logging
|
|
6
|
-
import secrets
|
|
7
5
|
|
|
8
6
|
from verifiers.v1.acp import ACPConfig, ACPHarness
|
|
9
7
|
from verifiers.v1.clients import ModelContext
|
|
@@ -130,22 +128,6 @@ class OpenClawHarness(ACPHarness[OpenClawHarnessConfig]):
|
|
|
130
128
|
SUPPORTS_SKILLS = True
|
|
131
129
|
|
|
132
130
|
async def setup(self, runtime: Runtime) -> None:
|
|
133
|
-
if not hasattr(self, "_staged_skills_dir"):
|
|
134
|
-
self._staged_skills_dir = (
|
|
135
|
-
f".vf-openclaw/staged-skills-{secrets.token_hex(8)}"
|
|
136
|
-
)
|
|
137
|
-
self._skills_setup_lock = asyncio.Lock()
|
|
138
|
-
if self.config.skills:
|
|
139
|
-
async with self._skills_setup_lock:
|
|
140
|
-
# A complete tree is immutable, so concurrent setups can safely reuse it.
|
|
141
|
-
ready_path = f"{self._staged_skills_dir}/.ready"
|
|
142
|
-
ready = await runtime.run(["test", "-f", ready_path], {})
|
|
143
|
-
if ready.exit_code != 0:
|
|
144
|
-
await remove_dir(
|
|
145
|
-
runtime, self._staged_skills_dir, "OpenClaw skills"
|
|
146
|
-
)
|
|
147
|
-
await self.install_skills(runtime, self._staged_skills_dir)
|
|
148
|
-
await runtime.write(ready_path, b"")
|
|
149
131
|
directory = OPENCLAW_DIR.format(version=self.config.version)
|
|
150
132
|
binary = OPENCLAW_BIN.format(version=self.config.version)
|
|
151
133
|
logger.info("openclaw: ensuring OpenClaw %s is installed", self.config.version)
|
|
@@ -233,14 +215,7 @@ class OpenClawHarness(ACPHarness[OpenClawHarnessConfig]):
|
|
|
233
215
|
# OpenClaw treats an empty allowlist as all; a no-match key disables the catalog.
|
|
234
216
|
config.setdefault("skills", {})["allowBundled"] = ["__none__"]
|
|
235
217
|
await runtime.write(config_path, json.dumps(config).encode())
|
|
236
|
-
|
|
237
|
-
copied = await runtime.run(
|
|
238
|
-
["cp", "-R", self._staged_skills_dir, skills_dir], {}
|
|
239
|
-
)
|
|
240
|
-
if copied.exit_code != 0:
|
|
241
|
-
raise RuntimeError(
|
|
242
|
-
f"failed to isolate OpenClaw skills: {copied.stderr.strip()[-500:]}"
|
|
243
|
-
)
|
|
218
|
+
await self.install_skills(runtime, skills_dir)
|
|
244
219
|
|
|
245
220
|
env = {
|
|
246
221
|
**self.config.resolved_env,
|
|
@@ -7,9 +7,9 @@ from typing import Literal
|
|
|
7
7
|
|
|
8
8
|
from verifiers.v1.acp import ACPConfig, ACPHarness
|
|
9
9
|
from verifiers.v1.clients import ModelContext
|
|
10
|
-
from verifiers.v1.configs.harness import HarnessConfig, PinnedVersion
|
|
10
|
+
from verifiers.v1.configs.harness import HarnessConfig, PinnedVersion, skill_destination
|
|
11
11
|
from verifiers.v1.harnesses.node import NODE_BIN_DIR, ensure_node
|
|
12
|
-
from verifiers.v1.harnesses.utils.install import ensure_installed
|
|
12
|
+
from verifiers.v1.harnesses.utils.install import ensure_installed, remove_dir
|
|
13
13
|
from verifiers.v1.runtimes import Runtime
|
|
14
14
|
from verifiers.v1.task import TaskData
|
|
15
15
|
from verifiers.v1.trace import Trace
|
|
@@ -21,7 +21,6 @@ KEY_VAR = "PI_INTERCEPT_KEY"
|
|
|
21
21
|
PI_DIR = "/var/tmp/vf-pi"
|
|
22
22
|
PACKAGES_DIR = f"{PI_DIR}/mcp"
|
|
23
23
|
PI_BIN = f"{PACKAGES_DIR}/node_modules/.bin/pi"
|
|
24
|
-
SKILLS_DIR = ".agents/skills"
|
|
25
24
|
MCP_VERSION = "2.28.0"
|
|
26
25
|
ACP_VERSION = "0.0.33"
|
|
27
26
|
MCP_ADAPTER = f"{PACKAGES_DIR}/node_modules/pi-mcp-adapter/index.ts"
|
|
@@ -61,7 +60,6 @@ class PiHarness(ACPHarness[PiHarnessConfig]):
|
|
|
61
60
|
SUPPORTS_SKILLS = True
|
|
62
61
|
|
|
63
62
|
async def setup(self, runtime: Runtime) -> None:
|
|
64
|
-
await self.install_skills(runtime, SKILLS_DIR)
|
|
65
63
|
await ensure_node(runtime)
|
|
66
64
|
logger.info(
|
|
67
65
|
"pi: ensuring Pi %s and pi-acp %s are installed",
|
|
@@ -93,6 +91,8 @@ class PiHarness(ACPHarness[PiHarnessConfig]):
|
|
|
93
91
|
) -> ACPConfig:
|
|
94
92
|
system_prompt, prompt = self.resolve_prompt(data)
|
|
95
93
|
agent_dir = f".vf-pi-agent-{trace.id}"
|
|
94
|
+
skills_dir = f"{agent_dir}/skills"
|
|
95
|
+
await self.install_skills(runtime, skills_dir)
|
|
96
96
|
reasoning = ctx.sampling.reasoning_effort not in (
|
|
97
97
|
None,
|
|
98
98
|
"none",
|
|
@@ -159,8 +159,7 @@ class PiHarness(ACPHarness[PiHarnessConfig]):
|
|
|
159
159
|
skill_args = [
|
|
160
160
|
arg
|
|
161
161
|
for skill in self.config.skills
|
|
162
|
-
|
|
163
|
-
for arg in ("--skill", f"{SKILLS_DIR}/{skill.resolve().name}")
|
|
162
|
+
for arg in ("--skill", skill_destination(skill, skills_dir))
|
|
164
163
|
]
|
|
165
164
|
pi_args = [
|
|
166
165
|
PI_BIN,
|
|
@@ -190,3 +189,6 @@ class PiHarness(ACPHarness[PiHarnessConfig]):
|
|
|
190
189
|
# Pi's extension owns the task-scoped MCP configuration.
|
|
191
190
|
mcp_urls={},
|
|
192
191
|
)
|
|
192
|
+
|
|
193
|
+
async def cleanup(self, trace: Trace, runtime: Runtime) -> None:
|
|
194
|
+
await remove_dir(runtime, f".vf-pi-agent-{trace.id}", "Pi state")
|
{verifiers-0.3.2.dev107 → verifiers-0.3.2.dev109}/verifiers/v1/harnesses/prime_agent/harness.py
RENAMED
|
@@ -7,7 +7,7 @@ from typing import Literal
|
|
|
7
7
|
|
|
8
8
|
from verifiers.v1.acp import ACPConfig, ACPHarness, ACPTurn
|
|
9
9
|
from verifiers.v1.clients import ModelContext
|
|
10
|
-
from verifiers.v1.configs.harness import HarnessConfig
|
|
10
|
+
from verifiers.v1.configs.harness import HarnessConfig, skill_destination
|
|
11
11
|
from verifiers.v1.harnesses.node import NODE_BIN_DIR, ensure_node
|
|
12
12
|
from verifiers.v1.harnesses.utils.install import ensure_installed, remove_dir
|
|
13
13
|
from verifiers.v1.runtimes import Runtime
|
|
@@ -25,7 +25,6 @@ PRIME_AGENT_COMMIT: Literal["81ae3cb34d27d38ee37f9e205a1e73694993b344"] = (
|
|
|
25
25
|
PRIME_AGENT_VERSION = "0.9.1"
|
|
26
26
|
PRIME_AGENT_DIR = "/var/tmp/vf-prime-agent"
|
|
27
27
|
STATE_ROOT = "/tmp/vf-prime-agent-runs"
|
|
28
|
-
SKILLS_DIR = ".agents/skills"
|
|
29
28
|
PROVIDER = "intercept"
|
|
30
29
|
LIFECYCLE_META_NAMESPACE = "ai.primeintellect.prime-agent"
|
|
31
30
|
KEY_VAR = "PRIME_AGENT_INTERCEPT_KEY"
|
|
@@ -155,7 +154,6 @@ class PrimeAgentHarness(ACPHarness[PrimeAgentHarnessConfig]):
|
|
|
155
154
|
statuses.append(status)
|
|
156
155
|
|
|
157
156
|
async def setup(self, runtime: Runtime) -> None:
|
|
158
|
-
await self.install_skills(runtime, SKILLS_DIR)
|
|
159
157
|
await ensure_node(runtime)
|
|
160
158
|
logger.info("prime-agent: ensuring commit %s is installed", self.config.commit)
|
|
161
159
|
await ensure_installed(
|
|
@@ -191,6 +189,7 @@ class PrimeAgentHarness(ACPHarness[PrimeAgentHarnessConfig]):
|
|
|
191
189
|
|
|
192
190
|
root = self._root(trace)
|
|
193
191
|
agent_dir = f"{root}/agent"
|
|
192
|
+
skills_dir = f"{agent_dir}/skills"
|
|
194
193
|
created = await runtime.run(
|
|
195
194
|
[
|
|
196
195
|
"mkdir",
|
|
@@ -207,6 +206,7 @@ class PrimeAgentHarness(ACPHarness[PrimeAgentHarnessConfig]):
|
|
|
207
206
|
raise RuntimeError(
|
|
208
207
|
f"prime-agent state directory failed: {created.stderr.strip()[-500:]}"
|
|
209
208
|
)
|
|
209
|
+
await self.install_skills(runtime, skills_dir)
|
|
210
210
|
reasoning = ctx.sampling.reasoning_effort not in (
|
|
211
211
|
None,
|
|
212
212
|
"none",
|
|
@@ -251,7 +251,7 @@ class PrimeAgentHarness(ACPHarness[PrimeAgentHarnessConfig]):
|
|
|
251
251
|
if self.config.autonomous:
|
|
252
252
|
args.append("--autonomous")
|
|
253
253
|
for skill in self.config.skills:
|
|
254
|
-
args += ["--skill",
|
|
254
|
+
args += ["--skill", skill_destination(skill, skills_dir)]
|
|
255
255
|
if system_prompt:
|
|
256
256
|
args += ["--append-system-prompt", system_prompt]
|
|
257
257
|
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import hashlib
|
|
4
4
|
import logging
|
|
5
|
+
import secrets
|
|
5
6
|
import shlex
|
|
6
7
|
from typing import Any, Literal
|
|
7
8
|
|
|
@@ -18,7 +19,7 @@ from pydantic_config import BaseConfig
|
|
|
18
19
|
from verifiers.v1.acp import ACPConfig, ACPHarness, ACPTurn, JsonObject
|
|
19
20
|
from verifiers.v1.clients import ModelContext
|
|
20
21
|
from verifiers.v1.configs.harness import HarnessConfig
|
|
21
|
-
from verifiers.v1.harnesses.utils.install import ensure_installed
|
|
22
|
+
from verifiers.v1.harnesses.utils.install import ensure_installed, remove_dir
|
|
22
23
|
from verifiers.v1.runtimes import Runtime
|
|
23
24
|
from verifiers.v1.task import TaskData
|
|
24
25
|
from verifiers.v1.trace import Trace
|
|
@@ -140,11 +141,15 @@ class RLMHarness(ACPHarness[RLMHarnessConfig]):
|
|
|
140
141
|
APPENDS_SYSTEM_PROMPT = True
|
|
141
142
|
SUPPORTS_MCP = True
|
|
142
143
|
SUPPORTS_SKILLS = True
|
|
144
|
+
_skills_install_dir: str | None = None
|
|
143
145
|
|
|
144
146
|
async def setup(self, runtime: Runtime) -> None:
|
|
145
|
-
|
|
146
|
-
|
|
147
|
+
if self.config.skills:
|
|
148
|
+
# Editable skill packages and uv's tool environment must belong to this run.
|
|
149
|
+
self._skills_install_dir = f"{RLM_CACHE_DIR}-skills-{secrets.token_hex(16)}"
|
|
147
150
|
directory = self._install_dir()
|
|
151
|
+
skills_dir = f"{directory}/skills" if self.config.skills else SKILLS_DIR
|
|
152
|
+
await self.install_skills(runtime, skills_dir)
|
|
148
153
|
binary = f"{directory}/bin/rlm"
|
|
149
154
|
checkout = f"{directory}/checkout"
|
|
150
155
|
ready = f"{directory}/.ready"
|
|
@@ -155,7 +160,9 @@ class RLMHarness(ACPHarness[RLMHarnessConfig]):
|
|
|
155
160
|
"{ apt-get update -qq && apt-get install -y -qq git; } && "
|
|
156
161
|
f"rm -rf {checkout} && git clone https://{RLM_REPO} {checkout} && "
|
|
157
162
|
f"git -C {checkout} checkout {shlex.quote(self.config.version)} && "
|
|
163
|
+
f"sed -i 's|/task/rlm-skills|{skills_dir}|g' {checkout}/install.sh && "
|
|
158
164
|
f"UV_INSTALL_DIR={directory}/bin UV_TOOL_BIN_DIR={directory}/bin "
|
|
165
|
+
f"UV_TOOL_DIR={directory}/tools "
|
|
159
166
|
f"RLM_CHECKOUT_PATH={checkout} bash {checkout}/install.sh && "
|
|
160
167
|
f"touch {ready})"
|
|
161
168
|
)
|
|
@@ -279,6 +286,10 @@ class RLMHarness(ACPHarness[RLMHarnessConfig]):
|
|
|
279
286
|
|
|
280
287
|
async def cleanup(self, trace: Trace, runtime: Runtime) -> None:
|
|
281
288
|
await runtime.run(["rm", "-rf", f"{RLM_STATE_DIR}/{trace.id}"], {})
|
|
289
|
+
if self._skills_install_dir is not None:
|
|
290
|
+
await remove_dir(
|
|
291
|
+
runtime, self._skills_install_dir, "RLM skill installation"
|
|
292
|
+
)
|
|
282
293
|
|
|
283
294
|
@staticmethod
|
|
284
295
|
def _home(trace: Trace) -> str:
|
|
@@ -286,4 +297,4 @@ class RLMHarness(ACPHarness[RLMHarnessConfig]):
|
|
|
286
297
|
|
|
287
298
|
def _install_dir(self) -> str:
|
|
288
299
|
cache_key = hashlib.sha256(self.config.version.encode()).hexdigest()
|
|
289
|
-
return f"{RLM_CACHE_DIR}-{cache_key}"
|
|
300
|
+
return self._skills_install_dir or f"{RLM_CACHE_DIR}-{cache_key}"
|
|
@@ -43,7 +43,7 @@ class RolloutTimeouts:
|
|
|
43
43
|
"""Per-stage rollout timeouts, each bounding one rollout stage."""
|
|
44
44
|
|
|
45
45
|
setup: float | None = None
|
|
46
|
-
"""Timeout (in seconds) for
|
|
46
|
+
"""Timeout (in seconds) for task/harness setup through session preparation."""
|
|
47
47
|
agent: float | None = None
|
|
48
48
|
"""Timeout (in seconds) for the agent's solve attempt."""
|
|
49
49
|
finalize: float | None = None
|
|
@@ -221,7 +221,7 @@ class Rollout:
|
|
|
221
221
|
self.trace.timing.boot.end = now
|
|
222
222
|
self.trace.timing.setup.start = now
|
|
223
223
|
self.trace.notify()
|
|
224
|
-
#
|
|
224
|
+
# Setup hooks and harness session preparation share one deadline.
|
|
225
225
|
setup_deadline = (
|
|
226
226
|
None
|
|
227
227
|
if self._timeouts.setup is None
|
|
@@ -271,7 +271,10 @@ class Rollout:
|
|
|
271
271
|
# Setup and service provisioning are complete. Apply the runtime's
|
|
272
272
|
# execution policy while preserving the framework routes the agent uses.
|
|
273
273
|
await runtime.prepare_execution([self._endpoint, *self._urls.values()])
|
|
274
|
-
async with
|
|
274
|
+
async with (
|
|
275
|
+
boundary(HarnessError, "opening harness session"),
|
|
276
|
+
asyncio.timeout_at(setup_deadline),
|
|
277
|
+
):
|
|
275
278
|
harness_data = self.trace.task.data
|
|
276
279
|
if (
|
|
277
280
|
self._session.request_interceptors
|