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.
Files changed (222) hide show
  1. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/PKG-INFO +1 -1
  2. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/conftest.py +5 -2
  3. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/__init__.py +2 -1
  4. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/agent.py +9 -5
  5. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/clients/base.py +8 -5
  6. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/clients/eval.py +2 -2
  7. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/client.py +17 -1
  8. verifiers-0.3.2.dev165/verifiers/v1/configs/retries.py +48 -0
  9. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/env.py +4 -1
  10. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/retries.py +56 -39
  11. verifiers-0.3.2.dev163/verifiers/v1/configs/retries.py +0 -17
  12. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/.gitignore +0 -0
  13. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/LICENSE +0 -0
  14. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/README.md +0 -0
  15. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/pyproject.toml +0 -0
  16. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  17. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/fixtures/duet_v1.py +0 -0
  18. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  19. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  20. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  21. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  22. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/fixtures/echo_v1.py +0 -0
  23. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/fixtures/pyproject.toml +0 -0
  24. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  25. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_color_codeword_tasks.py +0 -0
  26. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_configs.py +0 -0
  27. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_e2e.py +0 -0
  28. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_envs.py +0 -0
  29. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_graph.py +0 -0
  30. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_judges.py +0 -0
  31. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_platform_run.py +0 -0
  32. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_scoring.py +0 -0
  33. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_serve_delta.py +0 -0
  34. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_taskset.py +0 -0
  35. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/tests/v1/test_trace.py +0 -0
  36. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/__init__.py +0 -0
  37. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/acp/__init__.py +0 -0
  38. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/acp/runner.py +0 -0
  39. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/__init__.py +0 -0
  40. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  41. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/dashboard/base.py +0 -0
  42. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/dashboard/eval.py +0 -0
  43. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/dashboard/replay.py +0 -0
  44. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/dashboard/validate.py +0 -0
  45. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/debug.py +0 -0
  46. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/eval/__init__.py +0 -0
  47. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/eval/hint.py +0 -0
  48. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/eval/main.py +0 -0
  49. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/eval/resume.py +0 -0
  50. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/eval/runner.py +0 -0
  51. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/gepa.py +0 -0
  52. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/init.py +0 -0
  53. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/output.py +0 -0
  54. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/replay.py +0 -0
  55. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/resolve.py +0 -0
  56. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/resume.py +0 -0
  57. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/cli/validate.py +0 -0
  58. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/clients/__init__.py +0 -0
  59. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/clients/client.py +0 -0
  60. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/clients/train.py +0 -0
  61. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/__init__.py +0 -0
  62. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/agent.py +0 -0
  63. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/cli/__init__.py +0 -0
  64. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/cli/debug.py +0 -0
  65. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/cli/env.py +0 -0
  66. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/cli/eval.py +0 -0
  67. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/cli/init.py +0 -0
  68. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/cli/replay.py +0 -0
  69. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/cli/validate.py +0 -0
  70. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/env.py +0 -0
  71. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/harness.py +0 -0
  72. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/judge.py +0 -0
  73. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/runtime.py +0 -0
  74. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/select.py +0 -0
  75. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/serve.py +0 -0
  76. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/task.py +0 -0
  77. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/configs/taskset.py +0 -0
  78. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/dialects/__init__.py +0 -0
  79. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/dialects/anthropic.py +0 -0
  80. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/dialects/base.py +0 -0
  81. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/dialects/chat.py +0 -0
  82. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/dialects/responses.py +0 -0
  83. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/__init__.py +0 -0
  84. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  85. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  86. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  87. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/best_of_n/env.py +0 -0
  88. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/isolated_verifier/__init__.py +0 -0
  89. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/isolated_verifier/env.py +0 -0
  90. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
  91. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  92. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/single_agent/env.py +0 -0
  93. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  94. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/envs/user_sim/env.py +0 -0
  95. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/episode.py +0 -0
  96. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/errors.py +0 -0
  97. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/gepa/__init__.py +0 -0
  98. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/gepa/adapter.py +0 -0
  99. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/gepa/config.py +0 -0
  100. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/gepa/dataset.py +0 -0
  101. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/gepa/reflection.py +0 -0
  102. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/gepa/runner.py +0 -0
  103. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/graph.py +0 -0
  104. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harness.py +0 -0
  105. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/__init__.py +0 -0
  106. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  107. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/bash/harness.py +0 -0
  108. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  109. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  110. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  111. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  112. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  113. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  114. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/codex/gate.mjs +0 -0
  115. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/codex/harness.py +0 -0
  116. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  117. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  118. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  119. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  120. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  121. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  122. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  123. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  124. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/node.py +0 -0
  125. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/null/__init__.py +0 -0
  126. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/null/harness.py +0 -0
  127. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  128. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  129. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  130. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/pi/gate.mjs +0 -0
  131. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/pi/harness.py +0 -0
  132. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
  133. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
  134. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  135. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  136. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  137. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  138. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  139. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/utils/__init__.py +0 -0
  140. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/utils/compaction.py +0 -0
  141. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/utils/core.py +0 -0
  142. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/utils/install.py +0 -0
  143. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/utils/launch.py +0 -0
  144. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/harnesses/utils/mcp.py +0 -0
  145. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/interception/__init__.py +0 -0
  146. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/interception/base.py +0 -0
  147. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/interception/pool.py +0 -0
  148. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/interception/server.py +0 -0
  149. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  150. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/interception/tunnel/base.py +0 -0
  151. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/interception/tunnel/custom.py +0 -0
  152. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/interception/tunnel/prime.py +0 -0
  153. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/judge.py +0 -0
  154. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/judges/__init__.py +0 -0
  155. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/judges/reference.py +0 -0
  156. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/judges/reference.txt +0 -0
  157. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/judges/rubric.py +0 -0
  158. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/judges/rubric.txt +0 -0
  159. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/mcp/__init__.py +0 -0
  160. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/mcp/launch.py +0 -0
  161. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/mcp/server.py +0 -0
  162. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/mcp/toolset.py +0 -0
  163. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/rollout.py +0 -0
  164. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/runtimes/__init__.py +0 -0
  165. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/runtimes/apptainer.py +0 -0
  166. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/runtimes/base.py +0 -0
  167. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/runtimes/container.py +0 -0
  168. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  169. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/runtimes/docker/egress.py +0 -0
  170. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/runtimes/limiters.py +0 -0
  171. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/runtimes/modal.py +0 -0
  172. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/runtimes/prime.py +0 -0
  173. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/runtimes/subprocess.py +0 -0
  174. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/semantic.py +0 -0
  175. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/serve/__init__.py +0 -0
  176. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/serve/client.py +0 -0
  177. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/serve/delta.py +0 -0
  178. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/serve/encoding.py +0 -0
  179. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/serve/pool.py +0 -0
  180. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/serve/server.py +0 -0
  181. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/serve/types.py +0 -0
  182. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/session.py +0 -0
  183. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/state.py +0 -0
  184. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/task.py +0 -0
  185. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/taskset.py +0 -0
  186. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/__init__.py +0 -0
  187. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  188. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/harbor/compose.py +0 -0
  189. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/harbor/env.py +0 -0
  190. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  191. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
  192. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  193. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  194. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  195. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  196. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  197. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  198. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  199. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  200. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  201. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/trace.py +0 -0
  202. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/types.py +0 -0
  203. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/__init__.py +0 -0
  204. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/aio.py +0 -0
  205. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/artifacts.py +0 -0
  206. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/compile.py +0 -0
  207. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/decorators.py +0 -0
  208. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/format.py +0 -0
  209. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/generic.py +0 -0
  210. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/git.py +0 -0
  211. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/image.py +0 -0
  212. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/interrupt.py +0 -0
  213. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/loaders.py +0 -0
  214. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/logging.py +0 -0
  215. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/memory.py +0 -0
  216. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/paths.py +0 -0
  217. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/platform.py +0 -0
  218. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/prime.py +0 -0
  219. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/scope.py +0 -0
  220. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/score.py +0 -0
  221. {verifiers-0.3.2.dev163 → verifiers-0.3.2.dev165}/verifiers/v1/utils/trace_store.py +0 -0
  222. {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.dev163
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": 2,
160
- "include": ["ProviderError", "InterceptionError", "HarnessError"],
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 backoff, trace_should_retry
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(retry.max_retries + 1):
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 == retry.max_retries or not trace_should_retry(trace, retry):
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
- retry.max_retries,
425
+ retry_state.max_retries,
422
426
  delay,
423
- trace.last_error.type if trace.last_error else "?",
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=httpx.AsyncClient(timeout=DEFAULT_TIMEOUT, limits=DEFAULT_LIMITS),
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 DEFAULT_LIMITS, DEFAULT_TIMEOUT, join_url
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 = httpx.AsyncClient(timeout=DEFAULT_TIMEOUT, limits=DEFAULT_LIMITS)
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 ids + logprobs. Needs a running vLLM engine."""
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__, message=str(e), traceback=traceback.format_exc()
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 match by exception type name;
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
- from collections.abc import Awaitable, Callable
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
- def _retryable(error: Error | None, retry: RetryConfig) -> bool:
77
- """Whether `error` matches the retry policy: its exception type is included (and
78
- not excluded)."""
79
- if error is None:
80
- return False
81
- if error.type in retry.exclude:
82
- return False
83
- if retry.include:
84
- return error.type in retry.include
85
- return True
86
-
87
-
88
- def trace_should_retry(trace, retry: RetryConfig) -> bool:
89
- """Whether a finished agent rollout should be retried: any captured error on
90
- its trace is retryable (all captures count, not just the most recent)."""
91
- return any(_retryable(e, retry) for e in trace.errors)
92
-
93
-
94
- def episode_should_retry(episode: Episode, retry: RetryConfig) -> bool:
95
- """Whether a finished episode should be retried: any LIVE captured error —
96
- episode-level, or on a trace that ended not-`ok` — is retryable. An `ok` trace's
97
- errors are history its own per-agent retry already recovered from, never
98
- grounds to re-run the episode. All of a failed trace's captures count, not just
99
- the most recent: a retryable failure followed by a teardown error would
100
- otherwise never retry. Episode-atomic — a half-played sibling context isn't
101
- reproducible."""
102
- return any(_retryable(e, retry) for e in episode.errors) or any(
103
- _retryable(e, retry) for t in episode.traces if not t.ok for e in t.errors
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
- for attempt in range(retry.max_retries + 1):
129
+ state = RetryState(retry)
130
+ for attempt in range(state.max_retries + 1):
117
131
  final = await run()
118
- if attempt == retry.max_retries or not episode_should_retry(final, retry):
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
- retry.max_retries,
148
+ state.max_retries,
132
149
  delay,
133
- cause.type if cause else "?",
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`)."""