verifiers 0.4.1.dev18__tar.gz → 0.4.1.dev20__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.dev18 → verifiers-0.4.1.dev20}/PKG-INFO +1 -1
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/conftest.py +8 -4
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/network_policy_v1.py +4 -2
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/grid.py +11 -1
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_examples.py +26 -5
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_resume_tool.py +0 -4
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_rubric_judge.py +5 -1
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/serve/client.py +24 -18
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/.gitignore +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/LICENSE +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/README.md +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/pyproject.toml +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/agent_user_harness_v1.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/agent_user_v1.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/duet_v1.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/echo_acp_resume_v1.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/echo_v1.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/pyproject.toml +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/skill_codeword_v1.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/skills/project-codeword/SKILL.md +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_agent_user.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_agentic_judge.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_compose_scoring.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_limits.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_multi_agent.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_multi_turn.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_multi_turn_tool.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_multimodal_tool.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_network_policy.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_shared_tool.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_single_turn.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_skills.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_stateful_tool.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_user_echo.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/test_user_sim.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/cli/test_replay.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/conftest.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/harnesses/test_core.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/harnesses/test_rlm.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/interception/test_tunnel.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/judges/conftest.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/judges/test_judge.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/judges/test_reference.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/judges/test_rubric.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/runtimes/test_e2b.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/serve/test_client.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/serve/test_delta.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/serve/test_pool.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/test_agent.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/test_graph.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/test_semantic.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/test_task.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/test_taskset.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/test_trace.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/utils/test_compile.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/utils/test_loaders.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/utils/test_platform.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/unit/utils/test_score.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/acp/runner.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/agent.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/eval/hint.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/resume.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/clients/base.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/agent.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/cli/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/cli/debug.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/cli/env.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/cli/eval.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/cli/replay.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/cli/validate.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/client.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/harness.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/judge.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/retries.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/runtime.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/scoring.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/select.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/task.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/configs/taskset.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/env.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/envs/agentic_judge/env.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/envs/user_sim/env.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/episode.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/errors.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/grading.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/graph.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harness.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/browser_use/program.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/codex/gate.mjs +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/node.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/pi/gate.mjs +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/utils/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/utils/compaction.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/utils/core.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/utils/install.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/utils/launch.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/harnesses/utils/mcp.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/judge.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/judges/decision.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/apptainer.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/compose.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/container.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/deployment.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/docker/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/e2b.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/runtime.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/strategies.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/semantic.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/serve/delta.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/serve/encoding.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/session.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/state.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/task.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/trace.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/types.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/artifacts.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/compile.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/decorators.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/env.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/eval.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/loaders.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/paths.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/platform.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/prime.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/retries.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/scope.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/score.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/verifiers/v1/utils/trace_store.py +0 -0
- {verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/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.dev20
|
|
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
|
|
@@ -23,7 +23,10 @@ from verifiers.v1.episode import Episode
|
|
|
23
23
|
from verifiers.v1.types import SamplingConfig
|
|
24
24
|
from verifiers.v1.utils.loaders import harness_config_type, load_environment
|
|
25
25
|
|
|
26
|
-
CI_MODEL = "
|
|
26
|
+
CI_MODEL = "internal/deepseek-v4.1-flash"
|
|
27
|
+
CI_REASONING_EFFORT = "low"
|
|
28
|
+
# Judge config fields that keep config-plugged judges on the CI model and effort.
|
|
29
|
+
CI_JUDGE = {"model": CI_MODEL, "sampling": {"reasoning_effort": CI_REASONING_EFFORT}}
|
|
27
30
|
|
|
28
31
|
# Fixture tasksets (echo-v1, echo-agentic-v1, ...) live in tests/integration/fixtures,
|
|
29
32
|
# added to the path via `pythonpath` in pyproject so the loader resolves them by id.
|
|
@@ -104,7 +107,8 @@ def _eval_config(
|
|
|
104
107
|
taskset_overrides: dict | None = None,
|
|
105
108
|
runtime: dict | None = None,
|
|
106
109
|
env: dict | None = None,
|
|
107
|
-
reasoning_effort: str | None =
|
|
110
|
+
reasoning_effort: str | None = CI_REASONING_EFFORT,
|
|
111
|
+
model: str = CI_MODEL,
|
|
108
112
|
client: dict | None = None,
|
|
109
113
|
) -> EvalConfig:
|
|
110
114
|
"""Build the smallest `EvalConfig` that still exercises the path, used by the `run`
|
|
@@ -156,7 +160,7 @@ def _eval_config(
|
|
|
156
160
|
"max_tokens": max_tokens,
|
|
157
161
|
"reasoning_effort": reasoning_effort,
|
|
158
162
|
},
|
|
159
|
-
model=
|
|
163
|
+
model=model,
|
|
160
164
|
**({"client": client} if client else {}),
|
|
161
165
|
)
|
|
162
166
|
|
|
@@ -196,7 +200,7 @@ async def live_ctx():
|
|
|
196
200
|
yield ModelContext(
|
|
197
201
|
model=CI_MODEL,
|
|
198
202
|
client=EvalClientConfig(),
|
|
199
|
-
sampling=SamplingConfig(max_tokens=2048),
|
|
203
|
+
sampling=SamplingConfig(max_tokens=2048, reasoning_effort=CI_REASONING_EFFORT),
|
|
200
204
|
)
|
|
201
205
|
|
|
202
206
|
|
{verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/network_policy_v1.py
RENAMED
|
@@ -68,8 +68,10 @@ class NetworkPolicyTaskset(vf.Taskset[NetworkPolicyTask, vf.TasksetConfig]):
|
|
|
68
68
|
"allow": {"network_allow": [ALLOWED]},
|
|
69
69
|
}
|
|
70
70
|
prompt = (
|
|
71
|
-
f"
|
|
72
|
-
"
|
|
71
|
+
f"Your only task: run the command `python3 {PROBE_PATH}` once in your "
|
|
72
|
+
"shell, then reply with exactly what it printed. Any network policy is "
|
|
73
|
+
"already enforced, so do not inspect, configure, or change the network or "
|
|
74
|
+
"firewall, and do not run any other command."
|
|
73
75
|
)
|
|
74
76
|
return [
|
|
75
77
|
NetworkPolicyTask(
|
|
@@ -59,6 +59,13 @@ RUNTIMES = ["subprocess", "docker", "podman", "apptainer", "prime", "modal", "e2
|
|
|
59
59
|
ENGINES = ("podman", "apptainer")
|
|
60
60
|
HARNESS_RUNTIMES = [runtime for runtime in RUNTIMES if runtime not in ENGINES]
|
|
61
61
|
|
|
62
|
+
# Harnesses that cannot run against the CI model yet.
|
|
63
|
+
# TODO: drop each entry once its fix lands.
|
|
64
|
+
CI_MODEL_GAPS = {
|
|
65
|
+
"kimi-code": "Prime chat completions rejects kimi-code's prompt_cache_key",
|
|
66
|
+
"openclaw": "openclaw cannot load the custom `internal/` model provider",
|
|
67
|
+
}
|
|
68
|
+
|
|
62
69
|
|
|
63
70
|
def agent_seats(taskset: str, env_id: str = "") -> list[str]:
|
|
64
71
|
"""The agent seats the env declares for `taskset`: `agent` for a plain taskset, its
|
|
@@ -164,7 +171,10 @@ def grid(
|
|
|
164
171
|
for harness in harnesses:
|
|
165
172
|
for runtime in runtimes:
|
|
166
173
|
marks = [mark(harness_id(harness)), mark(runtime)]
|
|
167
|
-
|
|
174
|
+
reason = unsupported(harness, runtime, needs) or CI_MODEL_GAPS.get(
|
|
175
|
+
harness_id(harness)
|
|
176
|
+
)
|
|
177
|
+
if reason:
|
|
168
178
|
marks.append(pytest.mark.skip(reason=reason))
|
|
169
179
|
cells.append(
|
|
170
180
|
pytest.param(
|
|
@@ -11,14 +11,33 @@ import subprocess
|
|
|
11
11
|
from pathlib import Path
|
|
12
12
|
|
|
13
13
|
import pytest
|
|
14
|
+
from conftest import CI_JUDGE, CI_MODEL, CI_REASONING_EFFORT
|
|
14
15
|
from grid import agent_seats
|
|
15
16
|
|
|
16
17
|
EVAL_TIMEOUT = 600 # 10 minutes for a capped eval (-n 1 -r 1)
|
|
17
18
|
|
|
18
19
|
ENVIRONMENTS = Path(__file__).parent.parent.parent / "environments"
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
SKIP_EVAL = {
|
|
22
|
+
"nemo_gym_weather": "not part of the default CI install",
|
|
23
|
+
# TODO: drop once the CI model's proposer reliably finishes within the caps.
|
|
24
|
+
"proposer_solver": "the CI model's proposer reasons past the token cap",
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
# Point each bundled judge at the CI model and effort.
|
|
28
|
+
JUDGE_OVERRIDES = {
|
|
29
|
+
"interception": [
|
|
30
|
+
"--env.taskset.task.judge.model",
|
|
31
|
+
CI_MODEL,
|
|
32
|
+
"--env.taskset.task.judge.sampling.reasoning-effort",
|
|
33
|
+
CI_REASONING_EFFORT,
|
|
34
|
+
],
|
|
35
|
+
"wiki_search": [
|
|
36
|
+
"--env.taskset.task.judges",
|
|
37
|
+
# The list replaces the default entry, so restate its `question_field`.
|
|
38
|
+
json.dumps([{"id": "wiki-search", "question_field": "question", **CI_JUDGE}]),
|
|
39
|
+
],
|
|
40
|
+
}
|
|
22
41
|
|
|
23
42
|
|
|
24
43
|
def v1_tasksets() -> list[str]:
|
|
@@ -35,13 +54,15 @@ def v1_tasksets() -> list[str]:
|
|
|
35
54
|
def test_eval(taskset: str, tmp_path: Path):
|
|
36
55
|
"""Run one capped rollout of `taskset` and require every episode to finish ok; a
|
|
37
56
|
taskset that bundles a harness uses it by default."""
|
|
38
|
-
if
|
|
39
|
-
pytest.skip(
|
|
57
|
+
if reason := SKIP_EVAL.get(taskset):
|
|
58
|
+
pytest.skip(reason)
|
|
40
59
|
if os.getenv("PRIME_API_KEY"):
|
|
41
60
|
model = [
|
|
42
|
-
"-m",
|
|
61
|
+
"-m", CI_MODEL,
|
|
62
|
+
"--sampling.reasoning-effort", CI_REASONING_EFFORT,
|
|
43
63
|
"--client.base-url", "https://api.pinference.ai/api/v1",
|
|
44
64
|
"--client.api-key-var", "PRIME_API_KEY",
|
|
65
|
+
*JUDGE_OVERRIDES.get(taskset, []),
|
|
45
66
|
] # fmt: skip
|
|
46
67
|
elif os.getenv("OPENAI_API_KEY"):
|
|
47
68
|
model = [
|
|
@@ -27,10 +27,6 @@ async def test_resume_tool(run, harness, harness_runtime):
|
|
|
27
27
|
assert segments[0]["terminated"] is False
|
|
28
28
|
assert segments[1]["terminated"] is False
|
|
29
29
|
assert trace.last_reply == segments[1]["last_reply"]
|
|
30
|
-
# Kimi Code's resumed requests replay history that differs from the turns it
|
|
31
|
-
# sampled (seen on prime), so its graph forks instead of extending one branch.
|
|
32
|
-
if harness.id != "kimi-code":
|
|
33
|
-
assert trace.num_branches == 1
|
|
34
30
|
assert "tool" in segments[1]["roles"]
|
|
35
31
|
assert segments[1]["tool_outputs"]
|
|
36
32
|
if harness.id == "pi":
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"""A config-plugged rubric judge scores the rollout on top of the task's own reward."""
|
|
2
2
|
|
|
3
|
+
from conftest import CI_JUDGE
|
|
4
|
+
|
|
3
5
|
|
|
4
6
|
async def test_rubric_judge(run, tmp_path):
|
|
5
7
|
"""A config-plugged rubric judge scores the rollout on top of the taskset's own reward.
|
|
@@ -17,7 +19,9 @@ async def test_rubric_judge(run, tmp_path):
|
|
|
17
19
|
"echo-v1",
|
|
18
20
|
harness="null",
|
|
19
21
|
runtime={"type": "subprocess"},
|
|
20
|
-
taskset_overrides={
|
|
22
|
+
taskset_overrides={
|
|
23
|
+
"task": {"judges": [{"id": "rubric", "path": str(rubric), **CI_JUDGE}]}
|
|
24
|
+
},
|
|
21
25
|
max_turns=2,
|
|
22
26
|
)
|
|
23
27
|
(trace,) = episode.traces
|
|
@@ -39,9 +39,12 @@ from verifiers.v1.types import SamplingConfig
|
|
|
39
39
|
logger = logging.getLogger(__name__)
|
|
40
40
|
|
|
41
41
|
ResponseT = TypeVar("ResponseT", bound=BaseResponse)
|
|
42
|
+
DecodedT = TypeVar("DecodedT")
|
|
42
43
|
|
|
43
44
|
|
|
44
45
|
class EnvClient:
|
|
46
|
+
"""Receive streamed episodes with bounded worker decoding."""
|
|
47
|
+
|
|
45
48
|
def __init__(self, address: str = "tcp://127.0.0.1:5000") -> None:
|
|
46
49
|
self.address = address
|
|
47
50
|
self.ctx = zmq.asyncio.Context()
|
|
@@ -51,7 +54,7 @@ class EnvClient:
|
|
|
51
54
|
self.socket.setsockopt(zmq.RCVHWM, 0)
|
|
52
55
|
self.socket.connect(address)
|
|
53
56
|
self._pending: dict[str, asyncio.Future[bytes]] = {}
|
|
54
|
-
self._deltas: dict[str, Callable[[
|
|
57
|
+
self._deltas: dict[str, Callable[[dict], None]] = {}
|
|
55
58
|
# Strong refs to in-flight fire-and-forget cancels: the loop only
|
|
56
59
|
# holds weak references to tasks, so an unreferenced one can be
|
|
57
60
|
# garbage-collected before it ever sends
|
|
@@ -68,7 +71,7 @@ class EnvClient:
|
|
|
68
71
|
# handler that raises is logged and skipped rather than allowed to end the loop.
|
|
69
72
|
while True:
|
|
70
73
|
try:
|
|
71
|
-
frames = await self.socket.recv_multipart()
|
|
74
|
+
frames = await self.socket.recv_multipart(copy=False)
|
|
72
75
|
except asyncio.CancelledError:
|
|
73
76
|
break
|
|
74
77
|
try:
|
|
@@ -77,16 +80,23 @@ class EnvClient:
|
|
|
77
80
|
f"expected [request_id, kind, data], got {len(frames)} frames - "
|
|
78
81
|
"is the env server speaking the same serve protocol?"
|
|
79
82
|
)
|
|
80
|
-
|
|
81
|
-
request_id =
|
|
83
|
+
request_id_frame, kind_frame, data_frame = frames
|
|
84
|
+
request_id = request_id_frame.bytes.decode()
|
|
85
|
+
kind = kind_frame.bytes
|
|
82
86
|
if kind == b"delta":
|
|
83
87
|
on_delta = self._deltas.get(request_id)
|
|
84
88
|
if on_delta is not None:
|
|
85
|
-
|
|
89
|
+
# The view retains its ZMQ frame while a cancelled worker finishes.
|
|
90
|
+
delta = await self._decode(
|
|
91
|
+
unpack, data_frame.buffer.toreadonly()
|
|
92
|
+
)
|
|
93
|
+
# Cancellation may remove the handler while the worker decodes.
|
|
94
|
+
if self._deltas.get(request_id) is on_delta:
|
|
95
|
+
on_delta(delta)
|
|
86
96
|
continue
|
|
87
97
|
future = self._pending.pop(request_id, None)
|
|
88
98
|
if future is not None and not future.done():
|
|
89
|
-
future.set_result(
|
|
99
|
+
future.set_result(data_frame.bytes)
|
|
90
100
|
except Exception: # keep receiving for the other requests
|
|
91
101
|
logger.warning("dropping a malformed env-server frame", exc_info=True)
|
|
92
102
|
|
|
@@ -95,11 +105,11 @@ class EnvClient:
|
|
|
95
105
|
request: BaseRequest,
|
|
96
106
|
response_type: type[ResponseT],
|
|
97
107
|
timeout: float | None = None,
|
|
98
|
-
on_delta: Callable[[
|
|
108
|
+
on_delta: Callable[[dict], None] | None = None,
|
|
99
109
|
) -> ResponseT:
|
|
100
110
|
"""Send a typed request and validate the reply into `response_type`. A
|
|
101
111
|
`timeout` is only used for health polling — rollouts run untimed. `on_delta`
|
|
102
|
-
receives each `delta`
|
|
112
|
+
receives each decoded `delta` the request streams before its reply."""
|
|
103
113
|
self._ensure_receiver()
|
|
104
114
|
request_id = uuid.uuid4().hex
|
|
105
115
|
future: asyncio.Future[bytes] = asyncio.get_running_loop().create_future()
|
|
@@ -134,13 +144,10 @@ class EnvClient:
|
|
|
134
144
|
raise RuntimeError(response.error or "env server request failed")
|
|
135
145
|
return response
|
|
136
146
|
|
|
137
|
-
async def
|
|
138
|
-
"""
|
|
139
|
-
trace is a lot of token spans to validate."""
|
|
147
|
+
async def _decode(self, decode: Callable[..., DecodedT], *args: object) -> DecodedT:
|
|
148
|
+
"""Decode off the loop, sharing one slot with final episode validation."""
|
|
140
149
|
await self._decode_slots.acquire()
|
|
141
|
-
decoding = asyncio.create_task(
|
|
142
|
-
asyncio.to_thread(WireEpisode.model_validate, record)
|
|
143
|
-
)
|
|
150
|
+
decoding = asyncio.create_task(asyncio.to_thread(decode, *args))
|
|
144
151
|
# Hold the slot until the worker finishes so cancellation cannot overlap decodes.
|
|
145
152
|
decoding.add_done_callback(lambda _: self._decode_slots.release())
|
|
146
153
|
try:
|
|
@@ -199,8 +206,7 @@ class EnvClient:
|
|
|
199
206
|
episode returned is assembled from the same deltas."""
|
|
200
207
|
assembly = EpisodeAssembly()
|
|
201
208
|
|
|
202
|
-
def apply(
|
|
203
|
-
delta = unpack(data)
|
|
209
|
+
def apply(delta: dict) -> None:
|
|
204
210
|
assembly.apply(delta)
|
|
205
211
|
if on_delta is not None:
|
|
206
212
|
on_delta(delta)
|
|
@@ -216,8 +222,8 @@ class EnvClient:
|
|
|
216
222
|
on_delta=apply,
|
|
217
223
|
)
|
|
218
224
|
assert response.head is not None
|
|
219
|
-
return await self.
|
|
220
|
-
assembly.finish(response.head, response.traces)
|
|
225
|
+
return await self._decode(
|
|
226
|
+
WireEpisode.model_validate, assembly.finish(response.head, response.traces)
|
|
221
227
|
)
|
|
222
228
|
|
|
223
229
|
async def close(self) -> None:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/agent_user_harness_v1.py
RENAMED
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/counter_tool_v1.py
RENAMED
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/echo_acp_resume_v1.py
RENAMED
|
File without changes
|
{verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/echo_agentic_v1.py
RENAMED
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/echo_user_sim_v1.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/skill_codeword_v1.py
RENAMED
|
File without changes
|
|
File without changes
|
{verifiers-0.4.1.dev18 → verifiers-0.4.1.dev20}/tests/integration/fixtures/tool_response_image_v1.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|