verifiers 0.4.1.dev42__tar.gz → 0.4.1.dev46__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.dev42 → verifiers-0.4.1.dev46}/PKG-INFO +1 -1
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/conftest.py +2 -2
- verifiers-0.4.1.dev42/tests/integration/fixtures/agent_user_v1.py → verifiers-0.4.1.dev46/tests/integration/fixtures/agent_user.py +1 -1
- verifiers-0.4.1.dev42/tests/integration/fixtures/agent_user_harness_v1.py → verifiers-0.4.1.dev46/tests/integration/fixtures/agent_user_harness.py +1 -1
- verifiers-0.4.1.dev42/tests/integration/fixtures/duet_v1.py → verifiers-0.4.1.dev46/tests/integration/fixtures/duet.py +2 -2
- verifiers-0.4.1.dev42/tests/integration/fixtures/echo_v1.py → verifiers-0.4.1.dev46/tests/integration/fixtures/echo.py +1 -1
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/fixtures/echo_tool_compose/docker-compose.yaml +1 -1
- verifiers-0.4.1.dev42/tests/integration/fixtures/network_policy_v1.py → verifiers-0.4.1.dev46/tests/integration/fixtures/network_policy.py +1 -1
- verifiers-0.4.1.dev46/tests/integration/fixtures/parallel.py +84 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/fixtures/pyproject.toml +7 -7
- verifiers-0.4.1.dev42/tests/integration/fixtures/skill_codeword_v1.py → verifiers-0.4.1.dev46/tests/integration/fixtures/skill_codeword.py +1 -1
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/test_agent_user.py +5 -5
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/test_agentic_judge.py +2 -2
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/test_limits.py +4 -4
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/test_multi_agent.py +5 -5
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/test_multi_turn.py +2 -2
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/test_multi_turn_tool.py +3 -3
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/test_multimodal_tool.py +2 -2
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/test_network_policy.py +2 -2
- verifiers-0.4.1.dev46/tests/integration/test_parallel.py +36 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/test_resume_tool.py +2 -2
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/test_rubric_judge.py +1 -1
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/test_sampling.py +1 -1
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/test_single_turn.py +2 -2
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/test_skills.py +2 -2
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/test_stateful_tool.py +2 -2
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/test_tool_vms.py +1 -1
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/test_user_echo.py +2 -2
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/test_user_sim.py +2 -2
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/clients/train.py +4 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/graph.py +6 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/types.py +11 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/.gitignore +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/LICENSE +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/README.md +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/pyproject.toml +0 -0
- /verifiers-0.4.1.dev42/tests/integration/fixtures/counter_tool_v1.py → /verifiers-0.4.1.dev46/tests/integration/fixtures/counter_tool.py +0 -0
- /verifiers-0.4.1.dev42/tests/integration/fixtures/echo_acp_resume_v1.py → /verifiers-0.4.1.dev46/tests/integration/fixtures/echo_acp_resume.py +0 -0
- /verifiers-0.4.1.dev42/tests/integration/fixtures/echo_agentic_v1.py → /verifiers-0.4.1.dev46/tests/integration/fixtures/echo_agentic.py +0 -0
- /verifiers-0.4.1.dev42/tests/integration/fixtures/echo_tool_v1.py → /verifiers-0.4.1.dev46/tests/integration/fixtures/echo_tool.py +0 -0
- /verifiers-0.4.1.dev42/tests/integration/fixtures/echo_user_sim_v1.py → /verifiers-0.4.1.dev46/tests/integration/fixtures/echo_user_sim.py +0 -0
- /verifiers-0.4.1.dev42/tests/integration/fixtures/fetch_tool_v1.py → /verifiers-0.4.1.dev46/tests/integration/fixtures/fetch_tool.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/fixtures/skills/project-codeword/SKILL.md +0 -0
- /verifiers-0.4.1.dev42/tests/integration/fixtures/tool_response_image_v1.py → /verifiers-0.4.1.dev46/tests/integration/fixtures/tool_response_image.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/grid.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/test_compose_scoring.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/test_examples.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/integration/test_shared_tool.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/cli/test_replay.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/conftest.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/harnesses/test_core.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/harnesses/test_rlm.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/interception/test_tunnel.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/judges/conftest.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/judges/test_judge.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/judges/test_reference.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/judges/test_rubric.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/runtimes/test_e2b.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/runtimes/test_private_network.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/serve/test_client.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/serve/test_delta.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/serve/test_pool.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/test_agent.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/test_dialects.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/test_graph.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/test_semantic.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/test_task.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/test_taskset.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/test_trace.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/utils/test_compile.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/utils/test_loaders.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/utils/test_platform.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/tests/unit/utils/test_score.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/acp/runner.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/agent.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/cli/eval/hint.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/cli/resume.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/clients/base.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/configs/agent.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/configs/cli/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/configs/cli/debug.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/configs/cli/env.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/configs/cli/eval.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/configs/cli/replay.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/configs/cli/validate.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/configs/client.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/configs/harness.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/configs/judge.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/configs/retries.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/configs/runtime.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/configs/scoring.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/configs/select.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/configs/task.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/configs/taskset.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/env.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/envs/agentic_judge/env.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/envs/user_sim/env.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/episode.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/errors.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/grading.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harness.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/browser_use/program.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/codex/gate.mjs +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/deepseek/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/deepseek/gate.mjs +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/deepseek/harness.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/deepseek/usage.mjs +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/node.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/opencode/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/opencode/harness.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/opencode/mcp-ready.js +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/pi/gate.mjs +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/utils/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/utils/compaction.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/utils/core.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/utils/install.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/utils/launch.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/utils/mcp.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/harnesses/utils/replay.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/judge.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/judges/decision.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/runtimes/apptainer.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/runtimes/compose.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/runtimes/container.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/runtimes/deployment.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/runtimes/docker/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/runtimes/e2b.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/runtimes/private_network.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/runtimes/runtime.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/runtimes/strategies.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/semantic.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/serve/delta.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/serve/encoding.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/session.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/state.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/task.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/trace.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/artifacts.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/compile.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/decorators.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/env.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/eval.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/loaders.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/paths.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/platform.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/prime.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/retries.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/scope.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/score.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/verifiers/v1/utils/trace_store.py +0 -0
- {verifiers-0.4.1.dev42 → verifiers-0.4.1.dev46}/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.dev46
|
|
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
|
|
@@ -29,7 +29,7 @@ CI_REASONING_EFFORT = "low"
|
|
|
29
29
|
CI_JUDGE = {"model": CI_MODEL, "sampling": {"reasoning_effort": CI_REASONING_EFFORT}}
|
|
30
30
|
CI_DECISION_JUDGE = {"model": "cloudflare/clef"}
|
|
31
31
|
|
|
32
|
-
# Fixture tasksets (echo
|
|
32
|
+
# Fixture tasksets (echo, echo-agentic, ...) live in tests/integration/fixtures,
|
|
33
33
|
# added to the path via `pythonpath` in pyproject so the loader resolves them by id.
|
|
34
34
|
|
|
35
35
|
LIVE_FIXTURES = {"run", "live_ctx"}
|
|
@@ -70,7 +70,7 @@ def harness(request) -> HarnessConfig:
|
|
|
70
70
|
def pytest_configure(config) -> None:
|
|
71
71
|
"""Self-launching tool servers run `python -m <module>` in a fresh subprocess, which
|
|
72
72
|
inherits `PYTHONPATH` but not pytest's in-process `pythonpath`. Put the fixture dir on
|
|
73
|
-
`PYTHONPATH` so a fixture server module (e.g. `
|
|
73
|
+
`PYTHONPATH` so a fixture server module (e.g. `tool_response_image`)
|
|
74
74
|
resolves there too — an installed example package (e.g. `glossary`) already would."""
|
|
75
75
|
config.addinivalue_line(
|
|
76
76
|
"markers", "opencode: integration cells on the OpenCode harness"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""agent-user
|
|
1
|
+
"""agent-user: a scripted, model-free agent that runs as a non-root user and tries root actions.
|
|
2
2
|
|
|
3
3
|
Root setup creates the task's `agent_user`, plants a root-only secret, and prepares a uv
|
|
4
4
|
script; the workdir stays root-owned, like a typical image WORKDIR. The scripted harness runs
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""agent-user-harness
|
|
1
|
+
"""agent-user-harness: one turn of any harness running as a non-root agent user.
|
|
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.
|
|
@@ -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 integration suite (resolved by id `duet
|
|
3
|
+
The multi-agent fixture for the v1 integration suite (resolved by id `duet`): 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
|
|
@@ -9,7 +9,7 @@ should land one record carrying two role-stamped traces.
|
|
|
9
9
|
|
|
10
10
|
import asyncio
|
|
11
11
|
|
|
12
|
-
from
|
|
12
|
+
from echo import EchoTaskset, lenient_match
|
|
13
13
|
|
|
14
14
|
import verifiers.v1 as vf
|
|
15
15
|
|
|
@@ -3,7 +3,7 @@
|
|
|
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
5
|
the model's reply. It's a fixture taskset for the integration suite (in tests/integration/fixtures,
|
|
6
|
-
resolved by id `echo
|
|
6
|
+
resolved by id `echo` via pytest's `pythonpath`).
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
9
|
from pydantic import Field
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# echo-tool
|
|
1
|
+
# echo-tool with its tool server placed in a Compose service: the server runs in
|
|
2
2
|
# `tools`, beside the workspace (`main`, the runtime's image), and the harness reaches it
|
|
3
3
|
# over the Compose network by the service's name.
|
|
4
4
|
services:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""network-policy
|
|
1
|
+
"""network-policy: the agent runs an egress probe under the task's network policy.
|
|
2
2
|
|
|
3
3
|
One task per policy the task data can declare: `open` (the default), `off` (an empty
|
|
4
4
|
allowlist), `block` (blocks `example.com`) and `allow` (allows only `pypi.org`). Setup
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""parallel: one rollout whose harness sends `n` chat programs at the model at once,
|
|
2
|
+
so their requests overlap on one trace. With `same_prompt`, every copy sends the task
|
|
3
|
+
prompt; otherwise copy `i` appends its index, so the copies diverge after the system
|
|
4
|
+
prompt."""
|
|
5
|
+
|
|
6
|
+
import asyncio
|
|
7
|
+
|
|
8
|
+
from pydantic import PositiveInt
|
|
9
|
+
|
|
10
|
+
import verifiers.v1 as vf
|
|
11
|
+
from verifiers.v1.clients import ModelContext
|
|
12
|
+
from verifiers.v1.configs.harness import HarnessConfig
|
|
13
|
+
from verifiers.v1.harness import Harness
|
|
14
|
+
from verifiers.v1.harnesses.utils.launch import (
|
|
15
|
+
CHAT_PROGRAM_SOURCE,
|
|
16
|
+
launch_chat_program,
|
|
17
|
+
)
|
|
18
|
+
from verifiers.v1.runtimes import ProgramResult, Runtime
|
|
19
|
+
|
|
20
|
+
__all__ = ["ParallelHarness", "ParallelTaskset"]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ParallelHarnessConfig(HarnessConfig):
|
|
24
|
+
n: PositiveInt = 4
|
|
25
|
+
same_prompt: bool = True
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ParallelHarness(Harness[ParallelHarnessConfig]):
|
|
29
|
+
APPENDS_SYSTEM_PROMPT = True
|
|
30
|
+
EXECUTES_CODE = False
|
|
31
|
+
NEEDS_CONTAINER = False
|
|
32
|
+
|
|
33
|
+
async def setup(self, runtime: Runtime) -> None:
|
|
34
|
+
await runtime.prepare_uv_script(CHAT_PROGRAM_SOURCE, self.config.resolved_env)
|
|
35
|
+
|
|
36
|
+
async def launch(
|
|
37
|
+
self,
|
|
38
|
+
ctx: ModelContext,
|
|
39
|
+
trace: vf.Trace,
|
|
40
|
+
runtime: Runtime,
|
|
41
|
+
endpoint: str,
|
|
42
|
+
secret: str,
|
|
43
|
+
mcp_urls: dict[str, str],
|
|
44
|
+
data: vf.TaskData,
|
|
45
|
+
tool_interception_url: str | None = None,
|
|
46
|
+
) -> ProgramResult:
|
|
47
|
+
system_prompt, prompt = self.resolve_prompt(data)
|
|
48
|
+
|
|
49
|
+
def copy_prompt(i: int) -> str:
|
|
50
|
+
return prompt if self.config.same_prompt else f"{prompt} ({i})"
|
|
51
|
+
|
|
52
|
+
results = await asyncio.gather(
|
|
53
|
+
*(
|
|
54
|
+
launch_chat_program(
|
|
55
|
+
CHAT_PROGRAM_SOURCE,
|
|
56
|
+
self.config,
|
|
57
|
+
ctx,
|
|
58
|
+
trace,
|
|
59
|
+
runtime,
|
|
60
|
+
endpoint,
|
|
61
|
+
secret,
|
|
62
|
+
mcp_urls,
|
|
63
|
+
system_prompt,
|
|
64
|
+
copy_prompt(i),
|
|
65
|
+
)
|
|
66
|
+
for i in range(self.config.n)
|
|
67
|
+
)
|
|
68
|
+
)
|
|
69
|
+
return next((r for r in results if r.exit_code != 0), results[0])
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class ParallelTask(vf.Task):
|
|
73
|
+
@vf.reward(weight=1.0)
|
|
74
|
+
async def answered(self, trace: vf.Trace) -> float:
|
|
75
|
+
return float(trace.num_turns >= 1)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class ParallelTaskset(vf.Taskset[ParallelTask, vf.TasksetConfig]):
|
|
79
|
+
def load(self) -> list[ParallelTask]:
|
|
80
|
+
return [
|
|
81
|
+
ParallelTask(
|
|
82
|
+
vf.TaskData(idx=0, system_prompt="Be brief.", prompt="Reply with OK.")
|
|
83
|
+
)
|
|
84
|
+
]
|
|
@@ -10,15 +10,15 @@ requires = ["hatchling"]
|
|
|
10
10
|
build-backend = "hatchling.build"
|
|
11
11
|
|
|
12
12
|
# Flat fixture modules whose tool servers self-launch in a sandbox (docker/prime) and so must
|
|
13
|
-
# be importable there. The others (
|
|
13
|
+
# be importable there. The others (e.g. echo, echo_user_sim) have no server, so they
|
|
14
14
|
# never get installed.
|
|
15
15
|
[tool.hatch.build]
|
|
16
16
|
include = [
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
17
|
+
"agent_user.py",
|
|
18
|
+
"counter_tool.py",
|
|
19
|
+
"echo_acp_resume.py",
|
|
20
|
+
"echo_tool.py",
|
|
21
|
+
"fetch_tool.py",
|
|
22
|
+
"tool_response_image.py",
|
|
23
23
|
"pyproject.toml",
|
|
24
24
|
]
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""skill-codeword
|
|
1
|
+
"""skill-codeword: the answer lives only in a skill the task installs.
|
|
2
2
|
|
|
3
3
|
The task ships a `project-codeword` skill (fixtures/skills) whose SKILL.md holds a
|
|
4
4
|
codeword the prompt never reveals, so reward 1.0 proves the harness installed the skill
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""The task's non-root agent user: a scripted agent is denied root-only actions
|
|
2
|
-
(agent-user
|
|
3
|
-
upstream (agent-user-harness
|
|
2
|
+
(agent-user), and every harness installs and runs as that user against a scripted
|
|
3
|
+
upstream (agent-user-harness), on the runtimes that can switch users."""
|
|
4
4
|
|
|
5
5
|
import pytest
|
|
6
6
|
from grid import grid, runtimes_grid
|
|
@@ -18,8 +18,8 @@ async def test_agent_user_cannot_act_as_root(run, harness_runtime, preinstalled_
|
|
|
18
18
|
all act as the user. With `preinstalled_tools`, the tool's package was first installed
|
|
19
19
|
by the default user, as on a reused runtime."""
|
|
20
20
|
(episode,) = await run(
|
|
21
|
-
"agent-user
|
|
22
|
-
harness="agent-user
|
|
21
|
+
"agent-user",
|
|
22
|
+
harness="agent-user",
|
|
23
23
|
runtime=harness_runtime,
|
|
24
24
|
taskset_overrides={"preinstalled_tools": preinstalled_tools},
|
|
25
25
|
)
|
|
@@ -46,7 +46,7 @@ async def test_agent_user_harness(run, harness, harness_runtime, scripted_model)
|
|
|
46
46
|
"""Each harness installs and runs a turn as a non-root agent user against a scripted
|
|
47
47
|
upstream, so the run fails only if the harness can't set up or run without root."""
|
|
48
48
|
(episode,) = await run(
|
|
49
|
-
"agent-user-harness
|
|
49
|
+
"agent-user-harness",
|
|
50
50
|
harness=harness,
|
|
51
51
|
runtime=harness_runtime,
|
|
52
52
|
client=scripted_model,
|
|
@@ -7,7 +7,7 @@ async def test_agentic_judge_shared_verifier(run, tmp_path):
|
|
|
7
7
|
policy = tmp_path / "judge_policy.txt"
|
|
8
8
|
policy.write_text("Check EMPIRICALLY that the agent echoed the word back.")
|
|
9
9
|
(episode,) = await run(
|
|
10
|
-
"echo
|
|
10
|
+
"echo",
|
|
11
11
|
harness=None,
|
|
12
12
|
env={
|
|
13
13
|
"id": "agentic-judge",
|
|
@@ -53,7 +53,7 @@ async def test_env_id_agentic_judge(run, tmp_path):
|
|
|
53
53
|
"Check EMPIRICALLY that answer.txt contains exactly the requested phrase."
|
|
54
54
|
)
|
|
55
55
|
(episode,) = await run(
|
|
56
|
-
"echo-agentic
|
|
56
|
+
"echo-agentic",
|
|
57
57
|
harness=None,
|
|
58
58
|
env={
|
|
59
59
|
"id": "agentic-judge",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""The seat's caps stop a rollout that would run on: the counter task wants three tool
|
|
2
|
-
turns (counter-tool
|
|
2
|
+
turns (counter-tool), and each cap ends it after the first with its own stop
|
|
3
3
|
condition. The turn cap also runs across the harness x runtime grid, since each program
|
|
4
4
|
handles a refused request in its own way."""
|
|
5
5
|
|
|
@@ -17,7 +17,7 @@ CAPS = [
|
|
|
17
17
|
@pytest.mark.parametrize("cap,stop_condition", CAPS)
|
|
18
18
|
async def test_cap(run, cap, stop_condition):
|
|
19
19
|
(episode,) = await run(
|
|
20
|
-
"counter-tool
|
|
20
|
+
"counter-tool",
|
|
21
21
|
harness="null",
|
|
22
22
|
runtime={"type": "subprocess"},
|
|
23
23
|
env={"agent": cap},
|
|
@@ -31,7 +31,7 @@ async def test_cap(run, cap, stop_condition):
|
|
|
31
31
|
|
|
32
32
|
async def test_rollout_timeout(run):
|
|
33
33
|
(episode,) = await run(
|
|
34
|
-
"counter-tool
|
|
34
|
+
"counter-tool",
|
|
35
35
|
harness="null",
|
|
36
36
|
runtime={"type": "subprocess"},
|
|
37
37
|
rollout_timeout=1,
|
|
@@ -44,7 +44,7 @@ async def test_rollout_timeout(run):
|
|
|
44
44
|
@pytest.mark.parametrize("harness,harness_runtime", grid(needs=("mcp",)), indirect=True)
|
|
45
45
|
async def test_max_turns(run, harness, harness_runtime):
|
|
46
46
|
(episode,) = await run(
|
|
47
|
-
"counter-tool
|
|
47
|
+
"counter-tool",
|
|
48
48
|
harness=harness,
|
|
49
49
|
runtime=harness_runtime,
|
|
50
50
|
max_turns=1,
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
"""Multi-agent episodes: an `Env` with two roles (duet
|
|
1
|
+
"""Multi-agent episodes: an `Env` with two roles (duet), best-of-n over a plain
|
|
2
2
|
taskset, and turn-coupled self-play (kuhn-poker)."""
|
|
3
3
|
|
|
4
4
|
import json
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
async def test_multi_agent_env(run):
|
|
8
|
-
"""An `Env` subclass shipped with its taskset (duet
|
|
8
|
+
"""An `Env` subclass shipped with its taskset (duet): two roles run the
|
|
9
9
|
task, `score()` episodes a sibling-dependent metric, and one episode carries
|
|
10
10
|
two role-stamped traces."""
|
|
11
11
|
(episode,) = await run(
|
|
12
|
-
"duet
|
|
12
|
+
"duet",
|
|
13
13
|
harness=None, # both duet seats pin their own harness
|
|
14
14
|
max_turns=2,
|
|
15
15
|
)
|
|
@@ -26,7 +26,7 @@ async def test_multi_agent_env(run):
|
|
|
26
26
|
# The wire form (what traces.jsonl stores): one episode carrying both traces, each
|
|
27
27
|
# self-stamped on its agent info (completion order — the seats land in either order).
|
|
28
28
|
row = json.loads(episode.model_dump_json(exclude_none=True))
|
|
29
|
-
assert row["env"] == {"id": "duet
|
|
29
|
+
assert row["env"] == {"id": "duet"}
|
|
30
30
|
by_name = {t["agent"]["name"]: t for t in row["traces"]}
|
|
31
31
|
assert set(by_name) == {"a", "b"}
|
|
32
32
|
assert by_name["a"]["agent"]["trainable"] is True
|
|
@@ -37,7 +37,7 @@ async def test_env_id_best_of_n(run):
|
|
|
37
37
|
"""`--env.id` pairs a bundled env with an arbitrary taskset: best-of-n over the
|
|
38
38
|
plain echo taskset — n solver attempts in one episode, sibling-scored."""
|
|
39
39
|
(episode,) = await run(
|
|
40
|
-
"echo
|
|
40
|
+
"echo",
|
|
41
41
|
harness=None, # a multi-agent env refuses the run-level harness
|
|
42
42
|
env={"id": "best-of-n", "n": 2, "agent": {"harness": {"id": "null"}}},
|
|
43
43
|
max_turns=2,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""One task, many turns: the model completes a shell task (echo-agentic
|
|
1
|
+
"""One task, many turns: the model completes a shell task (echo-agentic: write a phrase
|
|
2
2
|
to a file, checked in the runtime) across the harness x runtime grid, and on prime over
|
|
3
3
|
every other `transport` a harness config can select. A turn the harness re-sends
|
|
4
4
|
differently, beyond what its `replay_view` declares, forks the trace."""
|
|
@@ -21,7 +21,7 @@ MULTI_TURN = [
|
|
|
21
21
|
@pytest.mark.parametrize("harness,harness_runtime", MULTI_TURN, indirect=True)
|
|
22
22
|
async def test_multi_turn(run, harness, harness_runtime):
|
|
23
23
|
(episode,) = await run(
|
|
24
|
-
"echo-agentic
|
|
24
|
+
"echo-agentic",
|
|
25
25
|
harness=harness,
|
|
26
26
|
runtime=harness_runtime,
|
|
27
27
|
max_turns=10,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""One task, one MCP tool: the model calls a tool whose output carries a stamp the prompt
|
|
2
|
-
never reveals (echo-tool
|
|
2
|
+
never reveals (echo-tool), so reward 1.0 proves the tool ran. Every MCP harness reaches
|
|
3
3
|
it colocated across the harness x runtime grid; the chat loop reaches it across its
|
|
4
4
|
placements (colocated in the harness's box, in a Compose service beside it, or its own
|
|
5
5
|
runtime) on the runtime x runtime grid."""
|
|
@@ -14,7 +14,7 @@ import verifiers.v1 as vf
|
|
|
14
14
|
async def test_tool(run, harness, harness_runtime):
|
|
15
15
|
"""Every MCP-capable harness reaches a tool colocated in its runtime."""
|
|
16
16
|
(episode,) = await run(
|
|
17
|
-
"echo-tool
|
|
17
|
+
"echo-tool",
|
|
18
18
|
harness=harness,
|
|
19
19
|
runtime=harness_runtime,
|
|
20
20
|
max_turns=6,
|
|
@@ -46,7 +46,7 @@ async def test_tool_placement(run, harness_runtime, tool_runtime):
|
|
|
46
46
|
on the chat loop. Eval-wide SHARED servers are a different scope (`Taskset.toolsets`),
|
|
47
47
|
covered by `test_shared_tool`."""
|
|
48
48
|
(episode,) = await run(
|
|
49
|
-
"echo-tool
|
|
49
|
+
"echo-tool",
|
|
50
50
|
harness="null",
|
|
51
51
|
runtime=harness_runtime,
|
|
52
52
|
max_turns=6,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"""A tool that returns an image: MCP image content from a tool result survives into the
|
|
2
|
-
trace (tool-response-image
|
|
2
|
+
trace (tool-response-image; needs a vision model)."""
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
async def test_multimodal_tool(run):
|
|
6
6
|
"""MCP image content from a tool result survives into the v1 trace (needs a vision model)."""
|
|
7
7
|
(episode,) = await run(
|
|
8
|
-
"tool-response-image
|
|
8
|
+
"tool-response-image",
|
|
9
9
|
harness="null",
|
|
10
10
|
runtime={"type": "subprocess"},
|
|
11
11
|
reasoning_effort="none",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""A task's network policy holds during execution, and the model is told about it: the
|
|
2
2
|
agent runs an egress probe under each policy the task data declares
|
|
3
|
-
(network-policy
|
|
3
|
+
(network-policy), with the agent's `network_notice` on or off, across every harness
|
|
4
4
|
on prime."""
|
|
5
5
|
|
|
6
6
|
import pytest
|
|
@@ -42,7 +42,7 @@ def prompt_text(trace) -> str:
|
|
|
42
42
|
)
|
|
43
43
|
async def test_network_policy(run, harness, harness_runtime, notice):
|
|
44
44
|
episodes = await run(
|
|
45
|
-
"network-policy
|
|
45
|
+
"network-policy",
|
|
46
46
|
harness=harness,
|
|
47
47
|
runtime=harness_runtime,
|
|
48
48
|
num_tasks=len(NOTICES),
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""Overlapping requests on one trace: a harness sends `n` chat programs at a scripted
|
|
2
|
+
upstream at once, and the trace graph keeps one branch per copy that shares exactly the
|
|
3
|
+
prefix the copies have in common."""
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
from parallel import ParallelHarnessConfig
|
|
7
|
+
|
|
8
|
+
N = 4
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@pytest.mark.parametrize("harness_runtime", ["subprocess"], indirect=True)
|
|
12
|
+
@pytest.mark.parametrize("same_prompt", [True, False], ids=["same", "distinct"])
|
|
13
|
+
async def test_parallel_requests(run, harness_runtime, scripted_model, same_prompt):
|
|
14
|
+
(episode,) = await run(
|
|
15
|
+
"parallel",
|
|
16
|
+
harness=ParallelHarnessConfig(id="parallel", n=N, same_prompt=same_prompt),
|
|
17
|
+
runtime=harness_runtime,
|
|
18
|
+
client=scripted_model,
|
|
19
|
+
)
|
|
20
|
+
(trace,) = episode.traces
|
|
21
|
+
assert trace.ok, [error.message for error in trace.errors]
|
|
22
|
+
assert trace.num_turns == trace.num_branches == len(trace.calls) == N
|
|
23
|
+
assert len({call.node for call in trace.calls}) == N
|
|
24
|
+
|
|
25
|
+
roles = [node.message.role for node in trace.nodes]
|
|
26
|
+
assert roles.count("system") == 1
|
|
27
|
+
users = [i for i, role in enumerate(roles) if role == "user"]
|
|
28
|
+
replies = [node for node in trace.nodes if node.message.role == "assistant"]
|
|
29
|
+
# The same prompt shares the system and user nodes; distinct prompts share only
|
|
30
|
+
# the system node.
|
|
31
|
+
assert len(users) == (1 if same_prompt else N)
|
|
32
|
+
assert len(trace.nodes) == 1 + len(users) + N
|
|
33
|
+
assert {trace.nodes[i].parent for i in users} == {0}
|
|
34
|
+
assert sorted(reply.parent for reply in replies) == sorted(
|
|
35
|
+
users * N if same_prompt else users
|
|
36
|
+
)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""One task, two segments: the harness preserves context and MCP access across a resumed
|
|
2
|
-
exchange (echo-acp-resume
|
|
2
|
+
exchange (echo-acp-resume), across the harness x runtime grid."""
|
|
3
3
|
|
|
4
4
|
import pytest
|
|
5
5
|
from grid import grid
|
|
@@ -11,7 +11,7 @@ from grid import grid
|
|
|
11
11
|
async def test_resume_tool(run, harness, harness_runtime):
|
|
12
12
|
"""Each harness preserves context and MCP access across two segments."""
|
|
13
13
|
(episode,) = await run(
|
|
14
|
-
"echo-acp-resume
|
|
14
|
+
"echo-acp-resume",
|
|
15
15
|
harness=harness,
|
|
16
16
|
runtime=harness_runtime,
|
|
17
17
|
max_turns=8,
|
|
@@ -24,7 +24,7 @@ async def test_rubric_judge(run, tmp_path, judge_id):
|
|
|
24
24
|
if judge_id == "rubric":
|
|
25
25
|
judge["path"] = str(rubric)
|
|
26
26
|
(episode,) = await run(
|
|
27
|
-
"echo
|
|
27
|
+
"echo",
|
|
28
28
|
harness="null",
|
|
29
29
|
runtime={"type": "subprocess"},
|
|
30
30
|
taskset_overrides={"task": {"judges": [judge]}},
|
|
@@ -13,7 +13,7 @@ SAMPLING = {"temperature": 0.3, "top_p": 0.9, "reasoning_effort": "high"}
|
|
|
13
13
|
)
|
|
14
14
|
async def test_sampling_overrides(run, harness, harness_runtime):
|
|
15
15
|
(episode,) = await run(
|
|
16
|
-
"echo
|
|
16
|
+
"echo",
|
|
17
17
|
harness=harness,
|
|
18
18
|
runtime=harness_runtime,
|
|
19
19
|
env={"agent": {"sampling": SAMPLING}},
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""One task, one reply: the model echoes a phrase back (echo
|
|
1
|
+
"""One task, one reply: the model echoes a phrase back (echo), across the harness x
|
|
2
2
|
runtime grid."""
|
|
3
3
|
|
|
4
4
|
import pytest
|
|
@@ -16,7 +16,7 @@ SINGLE_TURN = skip_harness(
|
|
|
16
16
|
@pytest.mark.parametrize("harness,harness_runtime", SINGLE_TURN, indirect=True)
|
|
17
17
|
async def test_single_turn(run, harness, harness_runtime):
|
|
18
18
|
(episode,) = await run(
|
|
19
|
-
"echo
|
|
19
|
+
"echo",
|
|
20
20
|
harness=harness,
|
|
21
21
|
runtime=harness_runtime,
|
|
22
22
|
env={"agent": {"sampling": {"temperature": 0.0}}},
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""A task's skill reaches the program: the answer lives only in a SKILL.md the task
|
|
2
|
-
installs (skill-codeword
|
|
2
|
+
installs (skill-codeword), across the harness x runtime grid."""
|
|
3
3
|
|
|
4
4
|
import pytest
|
|
5
5
|
from grid import grid
|
|
@@ -10,7 +10,7 @@ from grid import grid
|
|
|
10
10
|
)
|
|
11
11
|
async def test_skills(run, harness, harness_runtime):
|
|
12
12
|
(episode,) = await run(
|
|
13
|
-
"skill-codeword
|
|
13
|
+
"skill-codeword",
|
|
14
14
|
harness=harness,
|
|
15
15
|
runtime=harness_runtime,
|
|
16
16
|
max_turns=8,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""A tool that writes the rollout's state: a `@vf.tool` increments the typed `trace.state`
|
|
2
|
-
each call (counter-tool
|
|
2
|
+
each call (counter-tool) and the reward reads it back, across the tool server's
|
|
3
3
|
placements on the runtime x runtime grid."""
|
|
4
4
|
|
|
5
5
|
import pytest
|
|
@@ -13,7 +13,7 @@ async def test_tool_state(run, harness_runtime, tool_runtime):
|
|
|
13
13
|
1.0 proves tool writes reach the host's `trace.state`, colocated and own-runtime (a
|
|
14
14
|
SHARED server's per-rollout state channel is covered by `test_shared_tool`)."""
|
|
15
15
|
(episode,) = await run(
|
|
16
|
-
"counter-tool
|
|
16
|
+
"counter-tool",
|
|
17
17
|
harness="null",
|
|
18
18
|
runtime=harness_runtime,
|
|
19
19
|
max_turns=8,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""One task, a scripted user: the user speaks first and the harness resumes onto the
|
|
2
|
-
conversation each turn (echo-user-sim
|
|
2
|
+
conversation each turn (echo-user-sim), across the harness x runtime grid; and the
|
|
3
3
|
caller drives an agent turn by turn through `agent.interaction`."""
|
|
4
4
|
|
|
5
5
|
import pytest
|
|
@@ -18,7 +18,7 @@ async def test_user(run, harness, harness_runtime):
|
|
|
18
18
|
onto the conversation, and leaving the loop ends the exchange (`user_closed`).
|
|
19
19
|
The user runs in the eval process itself, so there is no placement axis."""
|
|
20
20
|
(episode,) = await run(
|
|
21
|
-
"echo-user-sim
|
|
21
|
+
"echo-user-sim",
|
|
22
22
|
harness=harness,
|
|
23
23
|
runtime=harness_runtime,
|
|
24
24
|
max_turns=6,
|
|
@@ -10,7 +10,7 @@ async def test_env_id_user_sim(run):
|
|
|
10
10
|
the conversation from the task's prompt-as-scenario; the assistant's trace is
|
|
11
11
|
judged by the task's own reward; both sides land agent-stamped on one episode."""
|
|
12
12
|
(episode,) = await run(
|
|
13
|
-
"echo
|
|
13
|
+
"echo",
|
|
14
14
|
harness=None, # multi-agent: each seat pins its own
|
|
15
15
|
env={"id": "user-sim", "assistant": {"harness": {"id": "null"}}},
|
|
16
16
|
max_turns=6,
|
|
@@ -44,7 +44,7 @@ async def test_env_id_user_sim_with_tools(run):
|
|
|
44
44
|
Reward 1.0 proves the tool actually ran mid-conversation: its token never
|
|
45
45
|
appears in any prompt."""
|
|
46
46
|
(episode,) = await run(
|
|
47
|
-
"echo-tool
|
|
47
|
+
"echo-tool",
|
|
48
48
|
harness=None, # multi-agent: each seat pins its own
|
|
49
49
|
env={"id": "user-sim", "assistant": {"harness": {"id": "null"}}},
|
|
50
50
|
max_turns=8,
|
|
@@ -30,6 +30,7 @@ from verifiers.v1.types import (
|
|
|
30
30
|
ToolCall,
|
|
31
31
|
TurnTokens,
|
|
32
32
|
Usage,
|
|
33
|
+
WeightVersionSpan,
|
|
33
34
|
)
|
|
34
35
|
|
|
35
36
|
logger = logging.getLogger(__name__)
|
|
@@ -181,6 +182,9 @@ def response_from_generate(
|
|
|
181
182
|
sampling_mask=SamplingMask.from_sampling_mask(mask)
|
|
182
183
|
if (mask := result.get("sampling_mask"))
|
|
183
184
|
else None,
|
|
185
|
+
weight_versions=[WeightVersionSpan(**span) for span in spans]
|
|
186
|
+
if (spans := result.get("weight_versions"))
|
|
187
|
+
else None,
|
|
184
188
|
),
|
|
185
189
|
)
|
|
186
190
|
|
|
@@ -49,6 +49,7 @@ from verifiers.v1.types import (
|
|
|
49
49
|
TextContentPart,
|
|
50
50
|
Tool,
|
|
51
51
|
ToolMessage,
|
|
52
|
+
WeightVersionSpan,
|
|
52
53
|
)
|
|
53
54
|
|
|
54
55
|
if TYPE_CHECKING:
|
|
@@ -164,6 +165,10 @@ class MessageNode(BaseModel):
|
|
|
164
165
|
`ids` stores the flat token ids and `counts` stores each token's row size. Assistant
|
|
165
166
|
nodes only. The arrays serialize as raw-byte `__nd__` dictionaries.
|
|
166
167
|
"""
|
|
168
|
+
weight_versions: list[WeightVersionSpan] | None = None
|
|
169
|
+
"""Engine weight-version spans over this node's sampled tokens (indexes into the
|
|
170
|
+
completion, as vLLM returns them). Assistant nodes only; None when the engine labels
|
|
171
|
+
none."""
|
|
167
172
|
|
|
168
173
|
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
169
174
|
|
|
@@ -997,6 +1002,7 @@ def _commit_turn(turn: PendingTurn, response: Response) -> int:
|
|
|
997
1002
|
else [],
|
|
998
1003
|
# TurnTokens is discarded after commit, so transfer its logprobs without copying.
|
|
999
1004
|
logprobs=tokens.completion_logprobs if tokens else [],
|
|
1005
|
+
weight_versions=tokens.weight_versions if tokens else None,
|
|
1000
1006
|
)
|
|
1001
1007
|
)
|
|
1002
1008
|
assistant_id = len(trace.nodes) - 1
|
|
@@ -201,6 +201,14 @@ class RoutedExperts(TypedDict):
|
|
|
201
201
|
start: int
|
|
202
202
|
|
|
203
203
|
|
|
204
|
+
class WeightVersionSpan(BaseModel):
|
|
205
|
+
"""Completion tokens `[start, end)` were sampled by the engine weights labelled `version`."""
|
|
206
|
+
|
|
207
|
+
version: str
|
|
208
|
+
start: int
|
|
209
|
+
end: int
|
|
210
|
+
|
|
211
|
+
|
|
204
212
|
@dataclass
|
|
205
213
|
class SamplingMask:
|
|
206
214
|
"""Sampling masks stored as flat int32 `ids` and `counts` arrays.
|
|
@@ -276,6 +284,9 @@ class TurnTokens(BaseModel):
|
|
|
276
284
|
# Transient carrier (excluded): per-completion-token sampling masks,
|
|
277
285
|
# attributed to the assistant node by the turn's `commit`, then dropped.
|
|
278
286
|
sampling_mask: SamplingMask | None = Field(default=None, exclude=True)
|
|
287
|
+
# Transient carrier (excluded): the engine's weight-version spans over the completion,
|
|
288
|
+
# attributed to the assistant node by the turn's `commit`, then dropped.
|
|
289
|
+
weight_versions: list[WeightVersionSpan] | None = Field(default=None, exclude=True)
|
|
279
290
|
|
|
280
291
|
|
|
281
292
|
class Response(BaseModel):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|