verifiers 0.4.1.dev2__tar.gz → 0.4.1.dev4__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.dev2 → verifiers-0.4.1.dev4}/PKG-INFO +29 -1
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/README.md +28 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/pyproject.toml +22 -43
- {verifiers-0.4.1.dev2/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/conftest.py +54 -138
- {verifiers-0.4.1.dev2/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/agent_user_harness_v1.py +1 -1
- {verifiers-0.4.1.dev2/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/duet_v1.py +1 -1
- {verifiers-0.4.1.dev2/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/echo_agentic_v1.py +1 -1
- {verifiers-0.4.1.dev2/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/echo_tool_v1.py +1 -1
- {verifiers-0.4.1.dev2/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/echo_user_sim_v1.py +13 -9
- {verifiers-0.4.1.dev2/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/echo_v1.py +2 -5
- verifiers-0.4.1.dev4/tests/integration/fixtures/network_policy_v1.py +88 -0
- {verifiers-0.4.1.dev2/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/pyproject.toml +1 -1
- verifiers-0.4.1.dev4/tests/integration/fixtures/skill_codeword_v1.py +39 -0
- verifiers-0.4.1.dev4/tests/integration/fixtures/skills/project-codeword/SKILL.md +8 -0
- verifiers-0.4.1.dev4/tests/integration/grid.py +235 -0
- verifiers-0.4.1.dev4/tests/integration/test_agent_user.py +56 -0
- verifiers-0.4.1.dev4/tests/integration/test_agentic_judge.py +90 -0
- verifiers-0.4.1.dev2/tests/v1/test_envs.py → verifiers-0.4.1.dev4/tests/integration/test_examples.py +23 -17
- verifiers-0.4.1.dev4/tests/integration/test_limits.py +54 -0
- verifiers-0.4.1.dev4/tests/integration/test_multi_agent.py +79 -0
- verifiers-0.4.1.dev4/tests/integration/test_multi_turn.py +30 -0
- verifiers-0.4.1.dev4/tests/integration/test_multi_turn_tool.py +51 -0
- verifiers-0.4.1.dev4/tests/integration/test_multimodal_tool.py +17 -0
- verifiers-0.4.1.dev4/tests/integration/test_network_policy.py +28 -0
- verifiers-0.4.1.dev4/tests/integration/test_resume_tool.py +65 -0
- verifiers-0.4.1.dev4/tests/integration/test_rubric_judge.py +27 -0
- verifiers-0.4.1.dev4/tests/integration/test_shared_tool.py +29 -0
- verifiers-0.4.1.dev4/tests/integration/test_single_turn.py +41 -0
- verifiers-0.4.1.dev4/tests/integration/test_skills.py +30 -0
- verifiers-0.4.1.dev4/tests/integration/test_stateful_tool.py +25 -0
- verifiers-0.4.1.dev4/tests/integration/test_user_echo.py +69 -0
- verifiers-0.4.1.dev4/tests/integration/test_user_sim.py +64 -0
- verifiers-0.4.1.dev4/tests/unit/cli/test_replay.py +97 -0
- verifiers-0.4.1.dev4/tests/unit/configs/test_eval.py +17 -0
- verifiers-0.4.1.dev4/tests/unit/conftest.py +94 -0
- verifiers-0.4.1.dev4/tests/unit/harnesses/test_core.py +110 -0
- verifiers-0.4.1.dev4/tests/unit/harnesses/test_rlm.py +45 -0
- verifiers-0.4.1.dev2/tests/v1/test_tunnel_watchdog.py → verifiers-0.4.1.dev4/tests/unit/interception/test_tunnel.py +0 -2
- verifiers-0.4.1.dev4/tests/unit/judges/conftest.py +65 -0
- verifiers-0.4.1.dev4/tests/unit/judges/test_judge.py +243 -0
- verifiers-0.4.1.dev4/tests/unit/judges/test_reference.py +163 -0
- verifiers-0.4.1.dev4/tests/unit/judges/test_rubric.py +169 -0
- verifiers-0.4.1.dev2/tests/v1/test_configs.py → verifiers-0.4.1.dev4/tests/unit/runtimes/test_e2b.py +1 -17
- verifiers-0.4.1.dev4/tests/unit/serve/test_client.py +34 -0
- verifiers-0.4.1.dev4/tests/unit/serve/test_pool.py +28 -0
- verifiers-0.4.1.dev4/tests/unit/test_agent.py +67 -0
- verifiers-0.4.1.dev2/tests/v1/test_trace.py → verifiers-0.4.1.dev4/tests/unit/test_semantic.py +2 -326
- verifiers-0.4.1.dev2/tests/v1/test_scoring.py → verifiers-0.4.1.dev4/tests/unit/test_task.py +2 -62
- verifiers-0.4.1.dev4/tests/unit/test_trace.py +243 -0
- verifiers-0.4.1.dev4/tests/unit/utils/test_compile.py +50 -0
- verifiers-0.4.1.dev4/tests/unit/utils/test_loaders.py +64 -0
- verifiers-0.4.1.dev4/tests/unit/utils/test_score.py +65 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/base.py +3 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/prime.py +1 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/loaders.py +13 -3
- verifiers-0.4.1.dev2/tests/v1/fixtures/delivery_behaviors.py +0 -196
- verifiers-0.4.1.dev2/tests/v1/test_color_codeword_tasks.py +0 -16
- verifiers-0.4.1.dev2/tests/v1/test_delivery_behaviors.py +0 -288
- verifiers-0.4.1.dev2/tests/v1/test_e2e.py +0 -1031
- verifiers-0.4.1.dev2/tests/v1/test_judges.py +0 -720
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/.gitignore +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/LICENSE +0 -0
- {verifiers-0.4.1.dev2/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/agent_user_v1.py +0 -0
- {verifiers-0.4.1.dev2/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.4.1.dev2/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/echo_acp_resume_v1.py +0 -0
- {verifiers-0.4.1.dev2/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/tool_response_image_v1.py +0 -0
- /verifiers-0.4.1.dev2/tests/v1/test_serve_delta.py → /verifiers-0.4.1.dev4/tests/unit/serve/test_delta.py +0 -0
- {verifiers-0.4.1.dev2/tests/v1 → verifiers-0.4.1.dev4/tests/unit}/test_graph.py +0 -0
- {verifiers-0.4.1.dev2/tests/v1 → verifiers-0.4.1.dev4/tests/unit}/test_taskset.py +0 -0
- /verifiers-0.4.1.dev2/tests/v1/test_platform_run.py → /verifiers-0.4.1.dev4/tests/unit/utils/test_platform.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/acp/runner.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/agent.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/cli/eval/hint.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/cli/resume.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/clients/base.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/configs/agent.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/configs/cli/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/configs/cli/debug.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/configs/cli/env.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/configs/cli/eval.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/configs/cli/init.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/configs/cli/replay.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/configs/cli/validate.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/configs/client.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/configs/harness.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/configs/judge.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/configs/retries.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/configs/runtime.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/configs/select.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/configs/task.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/configs/taskset.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/env.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/envs/agentic_judge/env.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/envs/isolated_verifier/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/envs/isolated_verifier/env.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/envs/user_sim/env.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/episode.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/errors.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/graph.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harness.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/browser_use/program.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/codex/gate.mjs +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/node.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/pi/gate.mjs +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/utils/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/utils/compaction.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/utils/core.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/utils/install.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/utils/launch.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/utils/mcp.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/judge.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/judges/decision.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/apptainer.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/container.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/docker/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/e2b.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/semantic.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/serve/delta.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/serve/encoding.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/session.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/state.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/task.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/harbor/compose.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/harbor/env.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/trace.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/types.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/artifacts.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/compile.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/decorators.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/eval.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/paths.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/platform.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/prime.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/retries.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/scope.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/score.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/verifiers/v1/utils/trace_store.py +0 -0
- {verifiers-0.4.1.dev2 → verifiers-0.4.1.dev4}/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.dev4
|
|
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
|
|
@@ -91,6 +91,34 @@ uv tool install prime
|
|
|
91
91
|
- The [docs](docs/) contain short, human-written guides and overviews about the architecture.
|
|
92
92
|
- The [AGENTS.md](AGENTS.md) and [skills](skills/) are for coding agents and go into more details.
|
|
93
93
|
|
|
94
|
+
## Contributing
|
|
95
|
+
|
|
96
|
+
We welcome community contributions. We use [issues](https://github.com/PrimeIntellect-ai/verifiers/issues) to track bugs and feature requests. If you hit a bug, a pain point, or have an idea for a feature, please open an issue.
|
|
97
|
+
|
|
98
|
+
Contributions are welcome via PR. Please follow these guidelines:
|
|
99
|
+
|
|
100
|
+
1. Install the [pre-commit hooks](#pre-commit-hooks) so your code is formatted and type-checked.
|
|
101
|
+
2. Keep your PR in "Draft" until it is ready for review.
|
|
102
|
+
3. If your PR resolves an issue, link the issue in the PR description.
|
|
103
|
+
4. Run the [tests](#tests) for the areas you touched.
|
|
104
|
+
|
|
105
|
+
### Pre-commit hooks
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
uv run pre-commit install
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Tests
|
|
112
|
+
|
|
113
|
+
Unit tests run one component in isolation, with no network, and mirror the `verifiers/v1` layout. Integration tests run real evals: they need `PRIME_API_KEY` and skip without it.
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
uv run pytest tests/unit -n auto # unit
|
|
117
|
+
uv run pytest tests/integration -n 8 # integration
|
|
118
|
+
uv run pytest tests/integration/test_single_turn.py # one behavior
|
|
119
|
+
uv run pytest tests/integration -m "docker and codex" # one runtime and harness
|
|
120
|
+
```
|
|
121
|
+
|
|
94
122
|
## Citation
|
|
95
123
|
|
|
96
124
|
Originally created by Will Brown ([@willccbb](https://github.com/willccbb)).
|
|
@@ -30,6 +30,34 @@ uv tool install prime
|
|
|
30
30
|
- The [docs](docs/) contain short, human-written guides and overviews about the architecture.
|
|
31
31
|
- The [AGENTS.md](AGENTS.md) and [skills](skills/) are for coding agents and go into more details.
|
|
32
32
|
|
|
33
|
+
## Contributing
|
|
34
|
+
|
|
35
|
+
We welcome community contributions. We use [issues](https://github.com/PrimeIntellect-ai/verifiers/issues) to track bugs and feature requests. If you hit a bug, a pain point, or have an idea for a feature, please open an issue.
|
|
36
|
+
|
|
37
|
+
Contributions are welcome via PR. Please follow these guidelines:
|
|
38
|
+
|
|
39
|
+
1. Install the [pre-commit hooks](#pre-commit-hooks) so your code is formatted and type-checked.
|
|
40
|
+
2. Keep your PR in "Draft" until it is ready for review.
|
|
41
|
+
3. If your PR resolves an issue, link the issue in the PR description.
|
|
42
|
+
4. Run the [tests](#tests) for the areas you touched.
|
|
43
|
+
|
|
44
|
+
### Pre-commit hooks
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
uv run pre-commit install
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Tests
|
|
51
|
+
|
|
52
|
+
Unit tests run one component in isolation, with no network, and mirror the `verifiers/v1` layout. Integration tests run real evals: they need `PRIME_API_KEY` and skip without it.
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
uv run pytest tests/unit -n auto # unit
|
|
56
|
+
uv run pytest tests/integration -n 8 # integration
|
|
57
|
+
uv run pytest tests/integration/test_single_turn.py # one behavior
|
|
58
|
+
uv run pytest tests/integration -m "docker and codex" # one runtime and harness
|
|
59
|
+
```
|
|
60
|
+
|
|
33
61
|
## Citation
|
|
34
62
|
|
|
35
63
|
Originally created by Will Brown ([@willccbb](https://github.com/willccbb)).
|
|
@@ -61,7 +61,6 @@ dev = [
|
|
|
61
61
|
"ty>=0.0.63",
|
|
62
62
|
"pytest>=7.0.0,<9.1.0",
|
|
63
63
|
"pytest-asyncio>=0.21.0",
|
|
64
|
-
"pytest-cov>=4.0.0",
|
|
65
64
|
"pytest-xdist>=3.8.0",
|
|
66
65
|
]
|
|
67
66
|
# V1 examples and support packages, resolved from their local sources below.
|
|
@@ -213,7 +212,7 @@ known-first-party = ["verifiers"]
|
|
|
213
212
|
[tool.pytest.ini_options]
|
|
214
213
|
minversion = "7.0"
|
|
215
214
|
testpaths = ["tests"]
|
|
216
|
-
pythonpath = ["tests/
|
|
215
|
+
pythonpath = ["tests/integration", "tests/integration/fixtures"]
|
|
217
216
|
python_files = ["test_*.py"]
|
|
218
217
|
python_classes = ["Test*"]
|
|
219
218
|
python_functions = ["test_*"]
|
|
@@ -224,27 +223,27 @@ addopts = [
|
|
|
224
223
|
"--quiet",
|
|
225
224
|
]
|
|
226
225
|
markers = [
|
|
227
|
-
|
|
228
|
-
#
|
|
229
|
-
|
|
230
|
-
"
|
|
231
|
-
"
|
|
232
|
-
"
|
|
233
|
-
"
|
|
234
|
-
"
|
|
235
|
-
"
|
|
236
|
-
"
|
|
237
|
-
"
|
|
238
|
-
"
|
|
239
|
-
"
|
|
240
|
-
"
|
|
241
|
-
"
|
|
242
|
-
"
|
|
243
|
-
"
|
|
244
|
-
"
|
|
245
|
-
"
|
|
246
|
-
"
|
|
247
|
-
"
|
|
226
|
+
# Integration grid axes — select subsets with `-m` (see tests/integration/grid.py). A mark
|
|
227
|
+
# is applied per axis, so it matches every cell touching that value on any axis.
|
|
228
|
+
"subprocess: integration cells touching the subprocess (host) runtime",
|
|
229
|
+
"docker: integration cells touching the docker runtime",
|
|
230
|
+
"podman: integration cells touching the podman runtime (needs the engine on the host; local-only)",
|
|
231
|
+
"apptainer: integration cells touching the apptainer runtime (needs the engine on the host; local-only)",
|
|
232
|
+
"prime: integration cells touching the prime runtime (real sandbox + tunnel)",
|
|
233
|
+
"modal: integration cells touching the modal runtime (external sandbox; local-only, excluded in CI)",
|
|
234
|
+
"e2b: integration cells touching the e2b runtime (external sandbox; local-only, excluded in CI)",
|
|
235
|
+
"colocated: integration cells with a tool server colocated in the harness runtime",
|
|
236
|
+
"null: integration cells on the null harness",
|
|
237
|
+
"bash: integration cells on the bash harness",
|
|
238
|
+
"claude_code: integration cells on the claude-code harness",
|
|
239
|
+
"openclaw: integration cells on the OpenClaw harness",
|
|
240
|
+
"hermes_agent: integration cells on the hermes-agent harness",
|
|
241
|
+
"rlm: integration cells on the rlm harness",
|
|
242
|
+
"kimi_code: integration cells on the kimi-code harness",
|
|
243
|
+
"pi: integration cells on the pi harness",
|
|
244
|
+
"codex: integration cells on the codex harness",
|
|
245
|
+
"mini_swe_agent: integration cells on the mini-swe-agent harness",
|
|
246
|
+
"prime_agent: integration cells on the prime-agent harness",
|
|
248
247
|
"asyncio: marks tests as async tests",
|
|
249
248
|
]
|
|
250
249
|
filterwarnings = [
|
|
@@ -268,23 +267,3 @@ redundant-cast = "ignore"
|
|
|
268
267
|
# verifiers/v1 is vendored (heavily typed upstream for a different checker); it is not part
|
|
269
268
|
# of verifiers' ty gate. environments/ are user-authored envs, also out of scope.
|
|
270
269
|
exclude = ["environments", "verifiers/v1"]
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
[tool.coverage.run]
|
|
274
|
-
source = ["verifiers"]
|
|
275
|
-
omit = [
|
|
276
|
-
"*/tests/*",
|
|
277
|
-
"*/__pycache__/*",
|
|
278
|
-
"*/site-packages/*",
|
|
279
|
-
]
|
|
280
|
-
|
|
281
|
-
[tool.coverage.report]
|
|
282
|
-
exclude_lines = [
|
|
283
|
-
"pragma: no cover",
|
|
284
|
-
"def __repr__",
|
|
285
|
-
"if self.debug:",
|
|
286
|
-
"raise AssertionError",
|
|
287
|
-
"raise NotImplementedError",
|
|
288
|
-
"if __name__ == .__main__.:",
|
|
289
|
-
"if TYPE_CHECKING:",
|
|
290
|
-
]
|
|
@@ -1,37 +1,12 @@
|
|
|
1
|
-
"""Shared fixtures
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
server runtime) is PAIRWISE, not a full cross product: each test carries a curated list of
|
|
11
|
-
combinations (in test_e2e.py) that hits every axis value and the cross-boundary pairs with
|
|
12
|
-
distinct networking. The full cross bought flake exposure and CI minutes, not coverage — add
|
|
13
|
-
a combination to a test's list when it exercises a genuinely new reachability pair. The
|
|
14
|
-
placement fixtures below are indirect-only: they translate a parametrized value, and using
|
|
15
|
-
one without `indirect=True` fails loudly.
|
|
16
|
-
|
|
17
|
-
Every combination carries its axes' pytest marks, so subsets select with `-m`:
|
|
18
|
-
|
|
19
|
-
uv run pytest tests/v1 -n auto # everything (needs remote setup)
|
|
20
|
-
uv run pytest tests/v1 -n auto -m "not e2e" # deterministic CI matrix
|
|
21
|
-
uv run pytest tests/v1 -n auto -m "e2e and not prime and not modal and not e2b" # live CI job
|
|
22
|
-
uv run pytest tests/v1 -n auto -m docker # any case touching the docker runtime
|
|
23
|
-
uv run pytest tests/v1 -n auto -m bash # only the bash harness
|
|
24
|
-
uv run pytest tests/v1 -n auto -m prime # only prime (real sandboxes; local)
|
|
25
|
-
uv run pytest tests/v1 -n auto -m modal # only modal (needs local setup)
|
|
26
|
-
uv run pytest tests/v1 -n auto -m e2b # only e2b (real sandboxes; local)
|
|
27
|
-
|
|
28
|
-
Marks: runtimes `subprocess` / `docker` / `podman` / `apptainer` / `prime` / `modal` / `e2b`, placement `colocated`,
|
|
29
|
-
harnesses `null` / `bash` / `rlm` / `kimi_code` / `pi` / `openclaw` / `codex` /
|
|
30
|
-
`claude_code` / `hermes_agent`.
|
|
31
|
-
A mark is applied per axis, so it selects every case touching that value on ANY axis; for one exact
|
|
32
|
-
combination use `-k` on the test id (e.g. `-k "harness-in-docker-with-tool-in-subprocess"`).
|
|
33
|
-
prime/modal/e2b provision real remote sandboxes (slow, infra-flaky, need setup), so they're local-only.
|
|
34
|
-
CI runs deterministic tests across the Python matrix and the remaining live E2Es once.
|
|
1
|
+
"""Shared fixtures for the integration suite: REAL eval runs (a live model endpoint, real
|
|
2
|
+
runtimes) with the smallest settings that still exercise the path, asserting on the
|
|
3
|
+
resulting `Trace`(s). They need a model API key (`PRIME_API_KEY`); without one the
|
|
4
|
+
model-driven tests skip.
|
|
5
|
+
|
|
6
|
+
Each behavior module fixes one task and fans it across the harness x runtime grid in
|
|
7
|
+
`grid.py`, which also says why a cell is skipped. `run` drives the `Env` API in-process,
|
|
8
|
+
the calls the eval CLI makes. The placement fixtures below are indirect-only: they translate a parametrized value, and using one without
|
|
9
|
+
`indirect=True` fails loudly.
|
|
35
10
|
"""
|
|
36
11
|
|
|
37
12
|
import asyncio
|
|
@@ -39,27 +14,29 @@ import os
|
|
|
39
14
|
from pathlib import Path
|
|
40
15
|
|
|
41
16
|
import pytest
|
|
17
|
+
from grid import agent_seats, runtime_config
|
|
42
18
|
|
|
43
|
-
|
|
44
|
-
from verifiers.v1.cli.eval.runner import run_eval
|
|
19
|
+
from verifiers.v1.clients import EvalClientConfig, ModelContext
|
|
45
20
|
from verifiers.v1.configs.cli.eval import EvalConfig
|
|
46
21
|
from verifiers.v1.configs.harness import HarnessConfig
|
|
47
|
-
from verifiers.v1.
|
|
48
|
-
from verifiers.v1.
|
|
22
|
+
from verifiers.v1.episode import Episode
|
|
23
|
+
from verifiers.v1.types import SamplingConfig
|
|
24
|
+
from verifiers.v1.utils.loaders import harness_config_type, load_environment
|
|
49
25
|
|
|
50
26
|
CI_MODEL = "openai/gpt-5.6-luna"
|
|
51
27
|
|
|
52
|
-
# Fixture tasksets (echo-v1, echo-agentic-v1) live in tests/
|
|
53
|
-
# path via `pythonpath` in pyproject so the loader resolves them by id
|
|
28
|
+
# Fixture tasksets (echo-v1, echo-agentic-v1, ...) live in tests/integration/fixtures,
|
|
29
|
+
# added to the path via `pythonpath` in pyproject so the loader resolves them by id.
|
|
54
30
|
|
|
55
|
-
|
|
56
|
-
# the tests (`indirect=True`), so coverage is a visible, curated list — never an implicit
|
|
57
|
-
# cross product.
|
|
31
|
+
LIVE_FIXTURES = {"run", "live_ctx"}
|
|
58
32
|
|
|
59
33
|
|
|
60
34
|
@pytest.fixture
|
|
61
|
-
def harness_runtime(request) ->
|
|
62
|
-
|
|
35
|
+
def harness_runtime(request) -> dict:
|
|
36
|
+
"""The runtime config placing the harness: a config built by the grid, or a
|
|
37
|
+
runtime type from a runtime-only grid."""
|
|
38
|
+
param = request.param
|
|
39
|
+
return dict(param) if isinstance(param, dict) else runtime_config(param)
|
|
63
40
|
|
|
64
41
|
|
|
65
42
|
@pytest.fixture
|
|
@@ -68,15 +45,13 @@ def tool_runtime(request) -> dict:
|
|
|
68
45
|
runtime) or its own runtime, by type."""
|
|
69
46
|
if request.param == "colocated":
|
|
70
47
|
return {"colocated": True}
|
|
71
|
-
if request.param == "docker":
|
|
72
|
-
return {"runtime": {"type": "docker", "allow": ["*"]}}
|
|
73
48
|
return {"runtime": {"type": request.param}}
|
|
74
49
|
|
|
75
50
|
|
|
76
51
|
# Built-in harnesses are bundled in the `harnesses` package; the agent CLIs (`rlm` /
|
|
77
52
|
# `kimi-code` / `openclaw` / `codex` / `claude-code` / `hermes-agent`) install their
|
|
78
53
|
# dependencies at rollout.
|
|
79
|
-
# `compact` (an example harness) and `terminus-2` (drives the host tmux) are
|
|
54
|
+
# `compact` (an example harness) and `terminus-2` (drives the host tmux) are outside the grid.
|
|
80
55
|
@pytest.fixture
|
|
81
56
|
def harness(request) -> HarnessConfig:
|
|
82
57
|
config = {"id": request.param} if isinstance(request.param, str) else request.param
|
|
@@ -97,33 +72,29 @@ def pytest_configure(config) -> None:
|
|
|
97
72
|
|
|
98
73
|
|
|
99
74
|
def pytest_collection_modifyitems(config, items) -> None:
|
|
100
|
-
"""Skip the
|
|
101
|
-
|
|
75
|
+
"""Skip the model-driven tests when no model endpoint is configured; the rest
|
|
76
|
+
(scripted harness behaviors, the examples' own key check) decide for themselves."""
|
|
102
77
|
if os.environ.get("PRIME_API_KEY"):
|
|
103
78
|
return
|
|
104
79
|
skip = pytest.mark.skip(reason="needs PRIME_API_KEY")
|
|
105
80
|
for item in items:
|
|
106
|
-
if "
|
|
81
|
+
if LIVE_FIXTURES & set(getattr(item, "fixturenames", ())):
|
|
107
82
|
item.add_marker(skip)
|
|
108
83
|
|
|
109
84
|
|
|
110
|
-
def
|
|
111
|
-
"""
|
|
112
|
-
|
|
85
|
+
def _label_prime_runtimes(config: dict) -> None:
|
|
86
|
+
"""Tag every prime runtime config (nested: harness / tool) with a `vf-ci` label, so
|
|
87
|
+
leftover sandboxes can be found and cleaned up."""
|
|
113
88
|
if isinstance(config, dict):
|
|
114
89
|
if config.get("type") == "prime":
|
|
115
90
|
config.setdefault("labels", ["vf-ci"])
|
|
116
|
-
# `us` is required for prime's port exposure, which a tool server hosted in a
|
|
117
|
-
# sandbox needs to be reachable from outside it.
|
|
118
|
-
config.setdefault("region", "us")
|
|
119
91
|
for value in config.values():
|
|
120
|
-
|
|
92
|
+
_label_prime_runtimes(value)
|
|
121
93
|
|
|
122
94
|
|
|
123
95
|
def _eval_config(
|
|
124
96
|
taskset: str,
|
|
125
97
|
*,
|
|
126
|
-
output_dir: Path,
|
|
127
98
|
harness: str | HarnessConfig | None = "null",
|
|
128
99
|
n: int = 1,
|
|
129
100
|
num_tasks: int = 1,
|
|
@@ -136,8 +107,8 @@ def _eval_config(
|
|
|
136
107
|
reasoning_effort: str | None = None,
|
|
137
108
|
client: dict | None = None,
|
|
138
109
|
) -> EvalConfig:
|
|
139
|
-
"""Build the smallest `EvalConfig` that still exercises the path,
|
|
140
|
-
|
|
110
|
+
"""Build the smallest `EvalConfig` that still exercises the path, used by the `run`
|
|
111
|
+
fixture. `taskset_overrides` merges onto the
|
|
141
112
|
`{id: ...}` config; `runtime` places the `agent` seat's harness (an agent field, not a
|
|
142
113
|
harness one).
|
|
143
114
|
|
|
@@ -146,7 +117,7 @@ def _eval_config(
|
|
|
146
117
|
seat and a multi-agent test pins its seats through `env` role fields instead."""
|
|
147
118
|
taskset_cfg = {"id": taskset, **(taskset_overrides or {})}
|
|
148
119
|
env_cfg = dict(env or {})
|
|
149
|
-
|
|
120
|
+
_label_prime_runtimes(taskset_cfg)
|
|
150
121
|
if harness:
|
|
151
122
|
env_cfg.setdefault("agent", {})["harness"] = (
|
|
152
123
|
harness_config_type(harness)(id=harness)
|
|
@@ -155,7 +126,7 @@ def _eval_config(
|
|
|
155
126
|
)
|
|
156
127
|
if runtime:
|
|
157
128
|
runtime_cfg = dict(runtime)
|
|
158
|
-
|
|
129
|
+
_label_prime_runtimes(runtime_cfg)
|
|
159
130
|
env_cfg.setdefault("agent", {})["runtime"] = runtime_cfg
|
|
160
131
|
retries = {
|
|
161
132
|
"max_retries": 0,
|
|
@@ -165,15 +136,9 @@ def _eval_config(
|
|
|
165
136
|
],
|
|
166
137
|
}
|
|
167
138
|
env_cfg.setdefault("retries", retries)
|
|
168
|
-
# Per-run caps live on the seats:
|
|
169
|
-
#
|
|
170
|
-
|
|
171
|
-
seats = [
|
|
172
|
-
name
|
|
173
|
-
for name, field in config_cls.model_fields.items()
|
|
174
|
-
if isinstance(field.default, vf.AgentConfig)
|
|
175
|
-
]
|
|
176
|
-
for seat in seats:
|
|
139
|
+
# Per-run caps live on the seats: cap each role the env declares (a test's own
|
|
140
|
+
# seat dict wins over the shared defaults).
|
|
141
|
+
for seat in agent_seats(taskset, env_cfg.get("id", "")):
|
|
177
142
|
seat_cfg = env_cfg.setdefault(seat, {})
|
|
178
143
|
seat_cfg.setdefault("max_turns", max_turns)
|
|
179
144
|
seat_cfg.setdefault("max_output_tokens", max_tokens)
|
|
@@ -191,91 +156,42 @@ def _eval_config(
|
|
|
191
156
|
"max_tokens": max_tokens,
|
|
192
157
|
"reasoning_effort": reasoning_effort,
|
|
193
158
|
},
|
|
194
|
-
rich=None,
|
|
195
|
-
output_dir=output_dir.parent,
|
|
196
|
-
run={"dir": output_dir.name},
|
|
197
159
|
model=CI_MODEL,
|
|
198
|
-
push=False,
|
|
199
160
|
**({"client": client} if client else {}),
|
|
200
161
|
)
|
|
201
162
|
|
|
202
163
|
|
|
203
164
|
@pytest.fixture
|
|
204
|
-
def
|
|
205
|
-
"""Run a
|
|
165
|
+
def run():
|
|
166
|
+
"""Run a taskset's episodes in-process through the `Env` API: the calls `vf-eval`
|
|
167
|
+
makes (`serving`, `slots`, `run_slot`, retries included), without its run
|
|
168
|
+
directory, platform push, or dashboard. The Examples job covers that CLI layer."""
|
|
206
169
|
|
|
207
|
-
async def _run(taskset: str, **kwargs) -> list[
|
|
170
|
+
async def _run(taskset: str, **kwargs) -> list[Episode]:
|
|
208
171
|
config = _eval_config(taskset, **kwargs)
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
return _run
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
@pytest.fixture
|
|
217
|
-
def run_v1_server():
|
|
218
|
-
"""Run a v1 taskset through an env-server worker pool — the path prime-rl trains
|
|
219
|
-
through. Spawns the broker + a worker, so it's the only fixture that exercises
|
|
220
|
-
serving resources (shared tool servers, interception pool) being stood up by the
|
|
221
|
-
*server* rather than the in-process runner. Pinned to a single static worker for
|
|
222
|
-
determinism."""
|
|
223
|
-
import multiprocessing as mp
|
|
224
|
-
|
|
225
|
-
from verifiers.v1.serve import EnvClient, env_config_data, serve_env
|
|
226
|
-
from verifiers.v1.utils.loaders import load_taskset
|
|
227
|
-
|
|
228
|
-
async def _run(taskset: str, **kwargs) -> list[Trace]:
|
|
229
|
-
config = _eval_config(taskset, **kwargs)
|
|
230
|
-
tasks = list(load_taskset(config.env.taskset).select(config.select))
|
|
231
|
-
mpctx = mp.get_context("spawn")
|
|
232
|
-
address_queue: mp.Queue = mpctx.Queue()
|
|
233
|
-
proc = mpctx.Process(
|
|
234
|
-
target=serve_env,
|
|
235
|
-
kwargs={
|
|
236
|
-
"max_workers": 1,
|
|
237
|
-
"elastic": False,
|
|
238
|
-
"address": "tcp://127.0.0.1:0",
|
|
239
|
-
"address_queue": address_queue,
|
|
240
|
-
"config_data": env_config_data(config.env),
|
|
241
|
-
"max_concurrent": config.max_concurrent,
|
|
242
|
-
},
|
|
172
|
+
env = load_environment(config.env)
|
|
173
|
+
tasks = list(env.taskset.select(config.select))
|
|
174
|
+
ctx = ModelContext(
|
|
175
|
+
client=config.client, model=config.model, sampling=config.sampling
|
|
243
176
|
)
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
client = EnvClient(address=address)
|
|
248
|
-
try:
|
|
249
|
-
await client.wait_for_server_startup(timeout=600)
|
|
250
|
-
episodes = await asyncio.gather(
|
|
177
|
+
async with env.serving():
|
|
178
|
+
return list(
|
|
179
|
+
await asyncio.gather(
|
|
251
180
|
*(
|
|
252
|
-
|
|
253
|
-
client=config.client,
|
|
254
|
-
model=config.model,
|
|
255
|
-
sampling=config.sampling,
|
|
256
|
-
task_data=task.data.model_dump(mode="json"),
|
|
257
|
-
)
|
|
181
|
+
env.run_slot(slot, ctx)
|
|
258
182
|
for task in tasks
|
|
259
|
-
for
|
|
183
|
+
for slot in env.slots(task, config.num_rollouts)
|
|
260
184
|
)
|
|
261
185
|
)
|
|
262
|
-
|
|
263
|
-
await client.close()
|
|
264
|
-
finally:
|
|
265
|
-
proc.terminate()
|
|
266
|
-
await asyncio.to_thread(proc.join, 10)
|
|
267
|
-
return [t for e in episodes for t in e.traces]
|
|
186
|
+
)
|
|
268
187
|
|
|
269
188
|
return _run
|
|
270
189
|
|
|
271
190
|
|
|
272
191
|
@pytest.fixture
|
|
273
192
|
async def live_ctx():
|
|
274
|
-
"""The
|
|
275
|
-
for driving `Agent` directly — the agent-surface counterpart of `
|
|
276
|
-
from verifiers.v1.clients import EvalClientConfig, ModelContext
|
|
277
|
-
from verifiers.v1.types import SamplingConfig
|
|
278
|
-
|
|
193
|
+
"""The live `ModelContext` (default model + endpoint config, provider-default sampling)
|
|
194
|
+
for driving `Agent` directly — the agent-surface counterpart of `run`."""
|
|
279
195
|
# Endpoint config only — each rollout builds and closes its own client.
|
|
280
196
|
yield ModelContext(
|
|
281
197
|
model=CI_MODEL,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Root setup creates the task's `agent_user` (images normally ship one) and hands it the
|
|
4
4
|
workdir; the harness then installs, launches as that user, and answers a one-line prompt.
|
|
5
|
-
With the
|
|
5
|
+
With the integration suite's scripted upstream answering, the run is deterministic: it fails only if
|
|
6
6
|
the harness can't set up or run without root.
|
|
7
7
|
"""
|
|
8
8
|
|
{verifiers-0.4.1.dev2/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/duet_v1.py
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""duet: the smallest multi-agent environment — two roles echo the same phrase.
|
|
2
2
|
|
|
3
|
-
The multi-agent fixture for the v1
|
|
3
|
+
The multi-agent fixture for the v1 integration suite (resolved by id `duet-v1`): an
|
|
4
4
|
`Env` subclass exported alongside its taskset, with two roles ("a", a trainable
|
|
5
5
|
seat on the run's model; "b", pinned untrainable), a `run()` that fans both out on
|
|
6
6
|
the task, and a `finalize()` that records a sibling-dependent signal. One episode
|
{verifiers-0.4.1.dev2/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/echo_agentic_v1.py
RENAMED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Like harbor's hello-world but with no Dockerfile to build — it runs on the runtime's default
|
|
4
4
|
image, so the whole agentic loop works end to end: the model issues bash commands and the
|
|
5
5
|
reward reads the file back out of the runtime (`runtime.read`, runtime-opaque like harbor's
|
|
6
|
-
verifier). The minimal reward-1 agentic task for the
|
|
6
|
+
verifier). The minimal reward-1 agentic task for the integration suite. Needs an agentic (shell) harness,
|
|
7
7
|
e.g. `bash`.
|
|
8
8
|
"""
|
|
9
9
|
|
{verifiers-0.4.1.dev2/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/echo_tool_v1.py
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""echo (v1, MCP tool): retrieve a stamped echo from a `vf.Toolset`, then report it.
|
|
2
2
|
|
|
3
|
-
The v1 tool fixture for the
|
|
3
|
+
The v1 tool fixture for the integration grid. The task constructs an `EchoToolset`
|
|
4
4
|
(`vf.Toolset`) in `Task.toolsets`, with one `@vf.tool` method whose placement is
|
|
5
5
|
CLI-tunable (`--taskset.task.tools.colocated`, `--taskset.task.tools.runtime.type`):
|
|
6
6
|
it runs colocated in the harness's runtime or in its own runtime, and the harness
|
|
@@ -9,7 +9,6 @@ closes the interaction (the trace stops as `user_closed`).
|
|
|
9
9
|
import verifiers.v1 as vf
|
|
10
10
|
|
|
11
11
|
PHRASES = ["hello world", "goodbye world"]
|
|
12
|
-
SYSTEM = "Repeat the user's message back to them exactly, with no extra words."
|
|
13
12
|
|
|
14
13
|
|
|
15
14
|
def _key(text: str) -> str:
|
|
@@ -27,12 +26,14 @@ class EchoUserSimData(vf.TaskData):
|
|
|
27
26
|
class EchoUserSimTask(vf.Task[EchoUserSimData, vf.State, vf.TaskConfig]):
|
|
28
27
|
@vf.reward(weight=1.0)
|
|
29
28
|
async def echoed(self, trace: vf.Trace) -> float:
|
|
30
|
-
|
|
31
|
-
phrases
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
# Match each phrase to a later reply, in order: a harness may spend turns on
|
|
30
|
+
# tool calls, so replies and phrases need not pair up one to one.
|
|
31
|
+
replies = iter(_key(m.content or "") for m in trace.assistant_messages)
|
|
32
|
+
matched = sum(
|
|
33
|
+
any(_key(phrase) in reply for reply in replies)
|
|
34
|
+
for phrase in self.data.phrases
|
|
35
|
+
)
|
|
36
|
+
return matched / len(self.data.phrases)
|
|
36
37
|
|
|
37
38
|
|
|
38
39
|
class EchoUserSimEnv(vf.SingleAgentEnv):
|
|
@@ -43,7 +44,11 @@ class EchoUserSimEnv(vf.SingleAgentEnv):
|
|
|
43
44
|
# first turn opens the conversation.
|
|
44
45
|
async with agents.agent.interaction(task) as interaction:
|
|
45
46
|
for phrase in task.data.phrases:
|
|
46
|
-
|
|
47
|
+
instruction = (
|
|
48
|
+
"Answer directly without using tools or running code. Your "
|
|
49
|
+
f"reply must contain this exact phrase: {phrase}"
|
|
50
|
+
)
|
|
51
|
+
if (await interaction.turn(instruction)).terminated:
|
|
47
52
|
break
|
|
48
53
|
|
|
49
54
|
|
|
@@ -55,7 +60,6 @@ class EchoUserSimTaskset(vf.Taskset[EchoUserSimTask, EchoUserSimConfig]):
|
|
|
55
60
|
idx=0,
|
|
56
61
|
# No prompt: the scripted user opens the conversation.
|
|
57
62
|
prompt=None,
|
|
58
|
-
system_prompt=SYSTEM,
|
|
59
63
|
phrases=self.config.phrases,
|
|
60
64
|
)
|
|
61
65
|
)
|
{verifiers-0.4.1.dev2/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/echo_v1.py
RENAMED
|
@@ -2,16 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
The smallest possible reward-1 taskset — no dataset, no tools, no reasoning required — so an
|
|
4
4
|
end-to-end eval run is fast and deterministic. The reward is 1.0 when the phrase appears in
|
|
5
|
-
the model's reply. It's a fixture taskset for the
|
|
6
|
-
by id `echo-v1` via pytest's `pythonpath`).
|
|
5
|
+
the model's reply. It's a fixture taskset for the integration suite (in tests/integration/fixtures,
|
|
6
|
+
resolved by id `echo-v1` via pytest's `pythonpath`).
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
9
|
from pydantic import Field
|
|
10
10
|
|
|
11
11
|
import verifiers.v1 as vf
|
|
12
12
|
|
|
13
|
-
SYSTEM = "Repeat the user's message back to them exactly, with no extra words."
|
|
14
|
-
|
|
15
13
|
|
|
16
14
|
def _key(text: str) -> str:
|
|
17
15
|
"""Lenient comparison key: lowercase, alphanumerics only."""
|
|
@@ -64,7 +62,6 @@ class EchoTaskset(vf.Taskset[EchoTask, EchoConfig]):
|
|
|
64
62
|
"Answer directly without using tools or running code. Your reply "
|
|
65
63
|
f"must contain this exact phrase: {phrase}"
|
|
66
64
|
),
|
|
67
|
-
system_prompt=SYSTEM,
|
|
68
65
|
answer=phrase,
|
|
69
66
|
),
|
|
70
67
|
self.config.task,
|