verifiers 0.3.2.dev163__tar.gz → 0.3.2.dev165__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/PKG-INFO +1 -1
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/conftest.py +5 -2
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/__init__.py +2 -1
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/agent.py +9 -5
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/clients/base.py +8 -5
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/clients/eval.py +2 -2
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/client.py +17 -1
- verifiers-0.3.2.dev165/verifiers/v1/configs/retries.py +48 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/env.py +4 -1
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/retries.py +56 -39
- verifiers-0.3.2.dev163/verifiers/v1/configs/retries.py +0 -17
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/.gitignore +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/LICENSE +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/README.md +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/pyproject.toml +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/fixtures/duet_v1.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_configs.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_envs.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_graph.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_judges.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_platform_run.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_serve_delta.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_taskset.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_trace.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/acp/runner.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/eval/hint.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/resume.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/agent.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/cli/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/cli/debug.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/cli/env.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/cli/eval.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/cli/init.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/cli/replay.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/cli/validate.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/harness.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/judge.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/runtime.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/select.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/task.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/taskset.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/agentic_judge/env.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/isolated_verifier/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/isolated_verifier/env.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/user_sim/env.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/episode.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/errors.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/graph.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harness.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/browser_use/program.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/codex/gate.mjs +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/node.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/pi/gate.mjs +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/utils/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/utils/compaction.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/utils/core.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/utils/install.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/utils/launch.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/utils/mcp.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/judge.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/runtimes/apptainer.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/runtimes/container.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/runtimes/docker/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/semantic.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/serve/delta.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/serve/encoding.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/session.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/state.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/task.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/harbor/compose.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/harbor/env.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/trace.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/types.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/artifacts.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/compile.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/decorators.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/loaders.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/paths.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/platform.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/prime.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/scope.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/score.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/trace_store.py +0 -0
- {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.3.2.
|
|
3
|
+
Version: 0.3.2.dev165
|
|
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
|
|
@@ -156,8 +156,11 @@ def _eval_config(
|
|
|
156
156
|
_configure_prime_runtimes(runtime_cfg)
|
|
157
157
|
env_cfg.setdefault("agent", {})["runtime"] = runtime_cfg
|
|
158
158
|
retries = {
|
|
159
|
-
"max_retries":
|
|
160
|
-
"
|
|
159
|
+
"max_retries": 0,
|
|
160
|
+
"rules": [
|
|
161
|
+
{"type": error_type, "max_retries": 2}
|
|
162
|
+
for error_type in ("ProviderError", "InterceptionError", "HarnessError")
|
|
163
|
+
],
|
|
161
164
|
}
|
|
162
165
|
env_cfg.setdefault("retries", retries)
|
|
163
166
|
# Per-run caps live on the seats: resolve the env's declared roles and cap
|
|
@@ -21,7 +21,7 @@ from verifiers.v1.configs.cli.env import (
|
|
|
21
21
|
from verifiers.v1.configs.env import EnvConfig, SharedEnvConfig, default_agent_harness
|
|
22
22
|
from verifiers.v1.configs.harness import HarnessConfig
|
|
23
23
|
from verifiers.v1.configs.judge import JudgeConfig, Judges
|
|
24
|
-
from verifiers.v1.configs.retries import RetryConfig
|
|
24
|
+
from verifiers.v1.configs.retries import RetryConfig, RetryRule
|
|
25
25
|
from verifiers.v1.configs.select import SelectCLIConfig, SelectConfig, TaskMatchConfig
|
|
26
26
|
from verifiers.v1.configs.serve import (
|
|
27
27
|
ElasticPoolConfig,
|
|
@@ -330,6 +330,7 @@ __all__ = [ # noqa: RUF022 - grouped by public API area
|
|
|
330
330
|
"default_agent_harness",
|
|
331
331
|
"pool_serve_kwargs",
|
|
332
332
|
"RetryConfig",
|
|
333
|
+
"RetryRule",
|
|
333
334
|
# agent
|
|
334
335
|
"Agent",
|
|
335
336
|
"Agents",
|
|
@@ -50,7 +50,7 @@ from verifiers.v1.utils.compile import (
|
|
|
50
50
|
resolve_runtime_config,
|
|
51
51
|
validate_pairing,
|
|
52
52
|
)
|
|
53
|
-
from verifiers.v1.utils.retries import
|
|
53
|
+
from verifiers.v1.utils.retries import RetryState, backoff
|
|
54
54
|
|
|
55
55
|
__all__ = ["Agent", "AgentConfig", "Agents", "TimeoutConfig", "make_agent"]
|
|
56
56
|
|
|
@@ -400,12 +400,13 @@ class Agent:
|
|
|
400
400
|
if self._closed:
|
|
401
401
|
raise RuntimeError("Agent is closed; create a new agent")
|
|
402
402
|
retry = self.config.retries
|
|
403
|
+
retry_state = RetryState(retry)
|
|
403
404
|
history: list = []
|
|
404
|
-
for attempt in range(
|
|
405
|
+
for attempt in range(retry_state.max_retries + 1):
|
|
405
406
|
trace = await self._run_once(
|
|
406
407
|
task, runtime, tools, on_trace, collect_artifacts
|
|
407
408
|
)
|
|
408
|
-
if attempt ==
|
|
409
|
+
if attempt == retry_state.max_retries or trace.ok:
|
|
409
410
|
break
|
|
410
411
|
if runtime is not None:
|
|
411
412
|
logger.warning(
|
|
@@ -413,14 +414,17 @@ class Agent:
|
|
|
413
414
|
"longer the task's start state); the error stands"
|
|
414
415
|
)
|
|
415
416
|
break
|
|
417
|
+
cause = retry_state.next_error(trace.errors)
|
|
418
|
+
if cause is None:
|
|
419
|
+
break
|
|
416
420
|
history.extend(trace.errors)
|
|
417
421
|
delay = backoff(attempt)
|
|
418
422
|
logger.warning(
|
|
419
423
|
"retrying agent rollout (retry %d/%d) in %.1fs after error: %s",
|
|
420
424
|
attempt + 1,
|
|
421
|
-
|
|
425
|
+
retry_state.max_retries,
|
|
422
426
|
delay,
|
|
423
|
-
|
|
427
|
+
cause.type,
|
|
424
428
|
)
|
|
425
429
|
await asyncio.sleep(delay)
|
|
426
430
|
if history:
|
|
@@ -7,9 +7,6 @@ from openai import AsyncOpenAI
|
|
|
7
7
|
|
|
8
8
|
from verifiers.v1.configs.client import BaseClientConfig, resolve_api_key
|
|
9
9
|
|
|
10
|
-
# No read timeout: agentic completions are slow and the rollout timeout is the real
|
|
11
|
-
# backstop. The connect bound stays so an unreachable endpoint still fails fast.
|
|
12
|
-
DEFAULT_TIMEOUT = httpx.Timeout(connect=5.0, read=None, write=None, pool=None)
|
|
13
10
|
DEFAULT_LIMITS = httpx.Limits(max_connections=1000, max_keepalive_connections=100)
|
|
14
11
|
MAX_RETRIES = 0
|
|
15
12
|
"""No client-side retries: failures surface to the harness SDK and the trace instead of
|
|
@@ -19,14 +16,20 @@ being silently reattempted."""
|
|
|
19
16
|
VERSION_SEGMENT = re.compile(r"v\d+")
|
|
20
17
|
|
|
21
18
|
|
|
19
|
+
def build_async_httpx(config: BaseClientConfig) -> httpx.AsyncClient:
|
|
20
|
+
return httpx.AsyncClient(
|
|
21
|
+
timeout=httpx.Timeout(**config.timeout.model_dump()), limits=DEFAULT_LIMITS
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
22
25
|
def build_async_openai(config: BaseClientConfig) -> AsyncOpenAI:
|
|
26
|
+
# The SDK adopts the http client's timeout, so it is configured in one place.
|
|
23
27
|
return AsyncOpenAI(
|
|
24
28
|
base_url=config.base_url,
|
|
25
29
|
api_key=resolve_api_key(config),
|
|
26
30
|
default_headers=config.headers or None,
|
|
27
|
-
timeout=DEFAULT_TIMEOUT,
|
|
28
31
|
max_retries=MAX_RETRIES,
|
|
29
|
-
http_client=
|
|
32
|
+
http_client=build_async_httpx(config),
|
|
30
33
|
)
|
|
31
34
|
|
|
32
35
|
|
|
@@ -7,7 +7,7 @@ import httpx
|
|
|
7
7
|
from pydantic import ValidationError
|
|
8
8
|
from pydantic_core import from_json, to_json
|
|
9
9
|
|
|
10
|
-
from verifiers.v1.clients.base import
|
|
10
|
+
from verifiers.v1.clients.base import build_async_httpx, join_url
|
|
11
11
|
from verifiers.v1.clients.client import SESSION_ID_HEADER, Client, RelayReply
|
|
12
12
|
from verifiers.v1.configs.client import BaseClientConfig, resolve_api_key
|
|
13
13
|
from verifiers.v1.dialects import Dialect
|
|
@@ -68,7 +68,7 @@ class EvalClient(Client):
|
|
|
68
68
|
# Keep endpoint headers separate so they can override intercepted request headers before
|
|
69
69
|
# the dialect's provider authentication is applied.
|
|
70
70
|
self.headers = dict(config.headers or {})
|
|
71
|
-
self.client =
|
|
71
|
+
self.client = build_async_httpx(config)
|
|
72
72
|
|
|
73
73
|
async def get_response(
|
|
74
74
|
self,
|
|
@@ -26,6 +26,21 @@ PRIME_INFERENCE_HOST = "pinference.ai"
|
|
|
26
26
|
PRIME_TEAM_ID_HEADER = "X-Prime-Team-ID"
|
|
27
27
|
|
|
28
28
|
|
|
29
|
+
class ClientTimeoutConfig(BaseConfig):
|
|
30
|
+
"""Timeouts (in seconds) for each phase of an HTTP request to the endpoint; `None`
|
|
31
|
+
waits indefinitely. Distinct from the agent's stage timeouts, which bound a rollout."""
|
|
32
|
+
|
|
33
|
+
connect: float | None = Field(30.0, gt=0)
|
|
34
|
+
"""Time to establish a connection, so an unreachable endpoint still fails fast."""
|
|
35
|
+
read: float | None = Field(None, gt=0)
|
|
36
|
+
"""Time between received bytes. Unbounded by default: agentic completions are slow
|
|
37
|
+
and the rollout timeout is the real backstop."""
|
|
38
|
+
write: float | None = Field(None, gt=0)
|
|
39
|
+
"""Time between sent bytes."""
|
|
40
|
+
pool: float | None = Field(None, gt=0)
|
|
41
|
+
"""Time to acquire a connection from the pool."""
|
|
42
|
+
|
|
43
|
+
|
|
29
44
|
class BaseClientConfig(BaseConfig):
|
|
30
45
|
"""An OpenAI-compatible endpoint. The API key is read from an env var."""
|
|
31
46
|
|
|
@@ -33,6 +48,7 @@ class BaseClientConfig(BaseConfig):
|
|
|
33
48
|
api_key_var: str = "PRIME_API_KEY"
|
|
34
49
|
headers: dict[str, str] = Field(default_factory=dict)
|
|
35
50
|
"""Extra HTTP headers sent on every request."""
|
|
51
|
+
timeout: ClientTimeoutConfig = ClientTimeoutConfig()
|
|
36
52
|
|
|
37
53
|
@model_validator(mode="after")
|
|
38
54
|
def apply_prime_config(self) -> "BaseClientConfig":
|
|
@@ -65,7 +81,7 @@ class EvalClientConfig(BaseClientConfig):
|
|
|
65
81
|
|
|
66
82
|
class TrainClientConfig(BaseClientConfig):
|
|
67
83
|
"""Training: a vLLM `/inference/v1/generate` endpoint with client-side tokenization (via
|
|
68
|
-
`TrainClient`), so responses carry token
|
|
84
|
+
`TrainClient`), so responses carry token IDs and logprobs. Needs a running vLLM engine."""
|
|
69
85
|
|
|
70
86
|
type: Literal["train"] = "train"
|
|
71
87
|
renderer: RendererConfig | None = None
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"""Whole-rollout retry rules — each agent's own and the env's episode fallback."""
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from typing import Annotated, Literal
|
|
5
|
+
|
|
6
|
+
from pydantic import Field, StrictInt, field_validator
|
|
7
|
+
from pydantic_config import BaseConfig
|
|
8
|
+
|
|
9
|
+
StatusCode = (
|
|
10
|
+
Annotated[StrictInt, Field(ge=100, le=599)]
|
|
11
|
+
| Literal["1xx", "2xx", "3xx", "4xx", "5xx"]
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class RetryRule(BaseConfig):
|
|
16
|
+
"""Match all specified fields. First matching rule wins for each error."""
|
|
17
|
+
|
|
18
|
+
type: str | None = None
|
|
19
|
+
"""Exact recorded exception class name, e.g. ``ProviderError``."""
|
|
20
|
+
status_code: list[StatusCode] | None = None
|
|
21
|
+
"""Match any listed HTTP status or status class; absent status never matches."""
|
|
22
|
+
message: str | None = None
|
|
23
|
+
"""Regex search of the error message; plain text matches a substring."""
|
|
24
|
+
max_retries: int = Field(ge=0)
|
|
25
|
+
"""Required retry budget across the run. Explicit zero excludes matching errors."""
|
|
26
|
+
|
|
27
|
+
@field_validator("message")
|
|
28
|
+
@classmethod
|
|
29
|
+
def validate_message(cls, value: str | None) -> str | None:
|
|
30
|
+
if value is not None:
|
|
31
|
+
try:
|
|
32
|
+
re.compile(value)
|
|
33
|
+
except re.error as exc:
|
|
34
|
+
raise ValueError(f"Invalid message regex: {exc}") from exc
|
|
35
|
+
return value
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class RetryConfig(BaseConfig):
|
|
39
|
+
"""Ordered rules for opt-in whole-rollout retries.
|
|
40
|
+
|
|
41
|
+
Fields within a rule are ANDed. An exhausted rule never falls through to a
|
|
42
|
+
later rule for that error; another captured error can still trigger a retry.
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
max_retries: int = Field(0, ge=0)
|
|
46
|
+
"""Default budget for errors that match no rule. Matching rules override it."""
|
|
47
|
+
rules: list[RetryRule] = Field(default_factory=list)
|
|
48
|
+
"""Ordered overrides; a matching rule may enable retries or deny them with zero."""
|
|
@@ -43,7 +43,10 @@ def _as_error(e: Exception) -> Error:
|
|
|
43
43
|
"""`e` as an episode-level `Error`. Call inside the `except` handling `e` — the
|
|
44
44
|
traceback comes from the active exception context."""
|
|
45
45
|
return Error(
|
|
46
|
-
type=type(e).__name__,
|
|
46
|
+
type=type(e).__name__,
|
|
47
|
+
message=str(e),
|
|
48
|
+
status_code=getattr(e, "status_code", None),
|
|
49
|
+
traceback=traceback.format_exc(),
|
|
47
50
|
)
|
|
48
51
|
|
|
49
52
|
|
|
@@ -6,7 +6,7 @@ Two opt-in whole-run retry atoms sit above that: `Agent.run` reruns ITS OWN roll
|
|
|
6
6
|
while the trace ends with a retryable error (`--env.<agent>.retries` — a flaky
|
|
7
7
|
grader retries without re-burning the solver), and `run_episode_with_retry` reruns
|
|
8
8
|
the entire episode (`--env.retries`) — the coarse fallback for faults no agent
|
|
9
|
-
owns: the env's own hooks, cross-agent state. Both
|
|
9
|
+
owns: the env's own hooks, cross-agent state. Both use ordered retry rules;
|
|
10
10
|
both off by default.
|
|
11
11
|
"""
|
|
12
12
|
|
|
@@ -15,7 +15,8 @@ from __future__ import annotations
|
|
|
15
15
|
import asyncio
|
|
16
16
|
import logging
|
|
17
17
|
import random
|
|
18
|
-
|
|
18
|
+
import re
|
|
19
|
+
from collections.abc import Awaitable, Callable, Iterable
|
|
19
20
|
from typing import TYPE_CHECKING
|
|
20
21
|
|
|
21
22
|
from tenacity import (
|
|
@@ -27,7 +28,7 @@ from tenacity import (
|
|
|
27
28
|
wait_exponential_jitter,
|
|
28
29
|
)
|
|
29
30
|
|
|
30
|
-
from verifiers.v1.configs.retries import RetryConfig
|
|
31
|
+
from verifiers.v1.configs.retries import RetryConfig, RetryRule
|
|
31
32
|
|
|
32
33
|
if TYPE_CHECKING:
|
|
33
34
|
from verifiers.v1.episode import Episode
|
|
@@ -73,35 +74,47 @@ def retrying(
|
|
|
73
74
|
)
|
|
74
75
|
|
|
75
76
|
|
|
76
|
-
|
|
77
|
-
"""
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
77
|
+
class RetryState:
|
|
78
|
+
"""Per-run budgets, shared across attempts but never across concurrent runs."""
|
|
79
|
+
|
|
80
|
+
def __init__(self, config: RetryConfig) -> None:
|
|
81
|
+
self.rules = [*config.rules, RetryRule(max_retries=config.max_retries)]
|
|
82
|
+
# Each retry consumes one finite budget, so their sum bounds the run.
|
|
83
|
+
self.max_retries = sum(rule.max_retries for rule in self.rules)
|
|
84
|
+
self.used = [0] * len(self.rules)
|
|
85
|
+
self.patterns = [
|
|
86
|
+
re.compile(rule.message) if rule.message is not None else None
|
|
87
|
+
for rule in self.rules
|
|
88
|
+
]
|
|
89
|
+
|
|
90
|
+
def next_error(self, errors: Iterable[Error]) -> Error | None:
|
|
91
|
+
"""Consume one retry for the first eligible error in capture order.
|
|
92
|
+
|
|
93
|
+
A denied/exhausted first match shadows later rules for that error only.
|
|
94
|
+
Return the triggering error so logs identify the actual retry cause.
|
|
95
|
+
"""
|
|
96
|
+
for error in errors:
|
|
97
|
+
for index, rule in enumerate(self.rules):
|
|
98
|
+
if rule.type is not None and error.type != rule.type:
|
|
99
|
+
continue
|
|
100
|
+
if rule.status_code is not None and (
|
|
101
|
+
error.status_code is None
|
|
102
|
+
or not any(
|
|
103
|
+
error.status_code == status
|
|
104
|
+
if isinstance(status, int)
|
|
105
|
+
else error.status_code // 100 == int(status[0])
|
|
106
|
+
for status in rule.status_code
|
|
107
|
+
)
|
|
108
|
+
):
|
|
109
|
+
continue
|
|
110
|
+
pattern = self.patterns[index]
|
|
111
|
+
if pattern is not None and pattern.search(error.message) is None:
|
|
112
|
+
continue
|
|
113
|
+
if self.used[index] < rule.max_retries:
|
|
114
|
+
self.used[index] += 1
|
|
115
|
+
return error
|
|
116
|
+
break
|
|
117
|
+
return None
|
|
105
118
|
|
|
106
119
|
|
|
107
120
|
async def run_episode_with_retry(
|
|
@@ -113,13 +126,17 @@ async def run_episode_with_retry(
|
|
|
113
126
|
attempts' errors are prepended so the episode shows the full history; a final
|
|
114
127
|
good attempt returns clean."""
|
|
115
128
|
history: list = []
|
|
116
|
-
|
|
129
|
+
state = RetryState(retry)
|
|
130
|
+
for attempt in range(state.max_retries + 1):
|
|
117
131
|
final = await run()
|
|
118
|
-
if attempt ==
|
|
132
|
+
if attempt == state.max_retries or final.ok:
|
|
133
|
+
break
|
|
134
|
+
# Successful traces may contain recovered failures from agent retries.
|
|
135
|
+
errors = list(final.errors)
|
|
136
|
+
errors.extend(e for trace in final.traces if not trace.ok for e in trace.errors)
|
|
137
|
+
cause = state.next_error(errors)
|
|
138
|
+
if cause is None:
|
|
119
139
|
break
|
|
120
|
-
cause = final.last_error or next(
|
|
121
|
-
(t.last_error for t in final.traces if t.last_error), None
|
|
122
|
-
)
|
|
123
140
|
history.extend(final.errors)
|
|
124
141
|
for trace in final.traces:
|
|
125
142
|
history.extend(trace.errors)
|
|
@@ -128,9 +145,9 @@ async def run_episode_with_retry(
|
|
|
128
145
|
"retrying episode %s (retry %d/%d) in %.1fs after error: %s",
|
|
129
146
|
final.id,
|
|
130
147
|
attempt + 1,
|
|
131
|
-
|
|
148
|
+
state.max_retries,
|
|
132
149
|
delay,
|
|
133
|
-
cause.type
|
|
150
|
+
cause.type,
|
|
134
151
|
)
|
|
135
152
|
await asyncio.sleep(delay)
|
|
136
153
|
if history:
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
"""Whole-rollout retry policy — each agent's own and the env's episode fallback."""
|
|
2
|
-
|
|
3
|
-
from pydantic import Field
|
|
4
|
-
from pydantic_config import BaseConfig
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class RetryConfig(BaseConfig):
|
|
8
|
-
"""Retry a whole rollout when it ends with a captured error. `include`/`exclude`
|
|
9
|
-
name exception classes (e.g. ``ProviderError``, ``SandboxError``)."""
|
|
10
|
-
|
|
11
|
-
max_retries: int = Field(0, ge=0)
|
|
12
|
-
"""Whole-rollout retries beyond the first attempt. Off by default — the SDKs
|
|
13
|
-
already retry transient per-call faults; rerunning a whole trajectory is opt-in."""
|
|
14
|
-
include: list[str] = Field(default_factory=list)
|
|
15
|
-
"""Only retry errors whose type is listed. Empty = retry anything not excluded."""
|
|
16
|
-
exclude: list[str] = Field(default_factory=list)
|
|
17
|
-
"""Never retry errors whose type is listed (wins over `include`)."""
|
|
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
|
{verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/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
|
{verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/agentic_judge/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/isolated_verifier/__init__.py
RENAMED
|
File without changes
|
{verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/isolated_verifier/env.py
RENAMED
|
File without changes
|
{verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/shared_agentic_judge/__init__.py
RENAMED
|
File without changes
|
{verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/single_agent/__init__.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
|