verifiers 0.3.2.dev156__tar.gz → 0.3.2.dev158__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.dev156 → verifiers-0.3.2.dev158}/PKG-INFO +1 -1
  2. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/__init__.py +2 -2
  3. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/cli/env.py +5 -30
  4. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/artifacts.py +61 -2
  5. verifiers-0.3.2.dev158/verifiers/v1/utils/generic.py +105 -0
  6. verifiers-0.3.2.dev156/verifiers/v1/utils/generic.py +0 -53
  7. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/.gitignore +0 -0
  8. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/LICENSE +0 -0
  9. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/README.md +0 -0
  10. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/pyproject.toml +0 -0
  11. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/conftest.py +0 -0
  12. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  13. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/fixtures/duet_v1.py +0 -0
  14. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  15. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  16. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  17. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  18. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/fixtures/echo_v1.py +0 -0
  19. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/fixtures/pyproject.toml +0 -0
  20. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  21. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_color_codeword_tasks.py +0 -0
  22. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_configs.py +0 -0
  23. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_e2e.py +0 -0
  24. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_envs.py +0 -0
  25. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_graph.py +0 -0
  26. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_judges.py +0 -0
  27. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_platform_run.py +0 -0
  28. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_scoring.py +0 -0
  29. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_serve_delta.py +0 -0
  30. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_taskset.py +0 -0
  31. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/tests/v1/test_trace.py +0 -0
  32. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/__init__.py +0 -0
  33. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/acp/__init__.py +0 -0
  34. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/acp/runner.py +0 -0
  35. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/agent.py +0 -0
  36. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/__init__.py +0 -0
  37. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  38. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/dashboard/base.py +0 -0
  39. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/dashboard/eval.py +0 -0
  40. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/dashboard/replay.py +0 -0
  41. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/dashboard/validate.py +0 -0
  42. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/debug.py +0 -0
  43. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/eval/__init__.py +0 -0
  44. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/eval/hint.py +0 -0
  45. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/eval/main.py +0 -0
  46. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/eval/resume.py +0 -0
  47. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/eval/runner.py +0 -0
  48. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/gepa.py +0 -0
  49. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/init.py +0 -0
  50. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/output.py +0 -0
  51. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/replay.py +0 -0
  52. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/resolve.py +0 -0
  53. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/resume.py +0 -0
  54. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/cli/validate.py +0 -0
  55. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/clients/__init__.py +0 -0
  56. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/clients/base.py +0 -0
  57. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/clients/client.py +0 -0
  58. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/clients/eval.py +0 -0
  59. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/clients/train.py +0 -0
  60. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/__init__.py +0 -0
  61. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/agent.py +0 -0
  62. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/cli/__init__.py +0 -0
  63. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/cli/debug.py +0 -0
  64. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/cli/eval.py +0 -0
  65. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/cli/init.py +0 -0
  66. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/cli/replay.py +0 -0
  67. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/cli/validate.py +0 -0
  68. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/client.py +0 -0
  69. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/env.py +0 -0
  70. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/harness.py +0 -0
  71. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/judge.py +0 -0
  72. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/retries.py +0 -0
  73. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/runtime.py +0 -0
  74. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/select.py +0 -0
  75. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/serve.py +0 -0
  76. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/task.py +0 -0
  77. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/configs/taskset.py +0 -0
  78. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/dialects/__init__.py +0 -0
  79. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/dialects/anthropic.py +0 -0
  80. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/dialects/base.py +0 -0
  81. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/dialects/chat.py +0 -0
  82. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/dialects/responses.py +0 -0
  83. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/env.py +0 -0
  84. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/__init__.py +0 -0
  85. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  86. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  87. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  88. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/best_of_n/env.py +0 -0
  89. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/isolated_verifier/__init__.py +0 -0
  90. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/isolated_verifier/env.py +0 -0
  91. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
  92. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  93. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/single_agent/env.py +0 -0
  94. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  95. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/envs/user_sim/env.py +0 -0
  96. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/episode.py +0 -0
  97. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/errors.py +0 -0
  98. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/gepa/__init__.py +0 -0
  99. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/gepa/adapter.py +0 -0
  100. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/gepa/config.py +0 -0
  101. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/gepa/dataset.py +0 -0
  102. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/gepa/reflection.py +0 -0
  103. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/gepa/runner.py +0 -0
  104. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/graph.py +0 -0
  105. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harness.py +0 -0
  106. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/__init__.py +0 -0
  107. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  108. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/bash/harness.py +0 -0
  109. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  110. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  111. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  112. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  113. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  114. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  115. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/codex/gate.mjs +0 -0
  116. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/codex/harness.py +0 -0
  117. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  118. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  119. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  120. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  121. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  122. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  123. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  124. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  125. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/node.py +0 -0
  126. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/null/__init__.py +0 -0
  127. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/null/harness.py +0 -0
  128. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  129. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  130. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  131. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/pi/gate.mjs +0 -0
  132. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/pi/harness.py +0 -0
  133. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
  134. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
  135. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  136. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  137. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  138. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  139. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  140. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/utils/__init__.py +0 -0
  141. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/utils/compaction.py +0 -0
  142. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/utils/core.py +0 -0
  143. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/utils/install.py +0 -0
  144. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/utils/launch.py +0 -0
  145. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/harnesses/utils/mcp.py +0 -0
  146. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/interception/__init__.py +0 -0
  147. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/interception/base.py +0 -0
  148. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/interception/pool.py +0 -0
  149. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/interception/server.py +0 -0
  150. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  151. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/interception/tunnel/base.py +0 -0
  152. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/interception/tunnel/custom.py +0 -0
  153. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/interception/tunnel/prime.py +0 -0
  154. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/judge.py +0 -0
  155. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/judges/__init__.py +0 -0
  156. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/judges/reference.py +0 -0
  157. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/judges/reference.txt +0 -0
  158. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/judges/rubric.py +0 -0
  159. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/judges/rubric.txt +0 -0
  160. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/mcp/__init__.py +0 -0
  161. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/mcp/launch.py +0 -0
  162. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/mcp/server.py +0 -0
  163. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/mcp/toolset.py +0 -0
  164. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/rollout.py +0 -0
  165. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/runtimes/__init__.py +0 -0
  166. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/runtimes/apptainer.py +0 -0
  167. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/runtimes/base.py +0 -0
  168. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/runtimes/container.py +0 -0
  169. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  170. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/runtimes/docker/egress.py +0 -0
  171. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/runtimes/limiters.py +0 -0
  172. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/runtimes/modal.py +0 -0
  173. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/runtimes/prime.py +0 -0
  174. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/runtimes/subprocess.py +0 -0
  175. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/semantic.py +0 -0
  176. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/serve/__init__.py +0 -0
  177. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/serve/client.py +0 -0
  178. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/serve/delta.py +0 -0
  179. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/serve/encoding.py +0 -0
  180. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/serve/pool.py +0 -0
  181. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/serve/server.py +0 -0
  182. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/serve/types.py +0 -0
  183. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/session.py +0 -0
  184. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/state.py +0 -0
  185. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/task.py +0 -0
  186. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/taskset.py +0 -0
  187. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/__init__.py +0 -0
  188. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  189. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/harbor/compose.py +0 -0
  190. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/harbor/env.py +0 -0
  191. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  192. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
  193. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  194. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  195. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  196. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  197. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  198. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  199. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  200. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  201. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  202. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/trace.py +0 -0
  203. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/types.py +0 -0
  204. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/__init__.py +0 -0
  205. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/aio.py +0 -0
  206. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/compile.py +0 -0
  207. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/decorators.py +0 -0
  208. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/format.py +0 -0
  209. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/git.py +0 -0
  210. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/image.py +0 -0
  211. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/interrupt.py +0 -0
  212. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/loaders.py +0 -0
  213. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/logging.py +0 -0
  214. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/memory.py +0 -0
  215. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/paths.py +0 -0
  216. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/platform.py +0 -0
  217. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/prime.py +0 -0
  218. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/retries.py +0 -0
  219. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/scope.py +0 -0
  220. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/score.py +0 -0
  221. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/verifiers/v1/utils/trace_store.py +0 -0
  222. {verifiers-0.3.2.dev156 → verifiers-0.3.2.dev158}/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.dev156
3
+ Version: 0.3.2.dev158
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
@@ -15,7 +15,6 @@ from verifiers.v1.clients import (
15
15
  )
16
16
  from verifiers.v1.configs.agent import AgentConfig
17
17
  from verifiers.v1.configs.cli.env import (
18
- merge_env_defaults,
19
18
  narrowed_env_annotation,
20
19
  resolve_env_field,
21
20
  )
@@ -153,6 +152,7 @@ from verifiers.v1.utils.decorators import (
153
152
  stop,
154
153
  tool,
155
154
  )
155
+ from verifiers.v1.utils.generic import merge_defaults
156
156
  from verifiers.v1.utils.git import (
157
157
  PATCH_CAP_BYTES as PATCH_CAP_BYTES,
158
158
  )
@@ -321,7 +321,7 @@ __all__ = [ # noqa: RUF022 - grouped by public API area
321
321
  "SharedEnvConfig",
322
322
  "ServeConfig",
323
323
  "resolve_env_field",
324
- "merge_env_defaults",
324
+ "merge_defaults",
325
325
  "narrowed_env_annotation",
326
326
  "SingleAgentEnvConfig",
327
327
  "AgentConfig",
@@ -1,5 +1,6 @@
1
1
  """Run-config plumbing around the `[env]` block: narrowing the `env` field of
2
- every config that owns one, and layering shared env defaults under it.
2
+ every config that owns one. `merge_defaults` (`utils/generic.py`) layers shared env
3
+ defaults under it.
3
4
 
4
5
  A run composes the blocks it needs — `[env]` (what runs, `configs/env.py`),
5
6
  `[serve]` (how it's hosted, `configs/serve.py`) — plus its own fields. Nothing here is a base class: the eval
@@ -10,11 +11,11 @@ single_agent_env_config)`. The `SerializeAsAny` is load-bearing: pydantic serial
10
11
  by declared type, so a plain `EnvConfig` silently drops a narrowed subclass's agents
11
12
  and knobs from `model_dump()` — the env-server wire's payload."""
12
13
 
13
- from pydantic import BaseModel, ValidationError
14
+ from pydantic import ValidationError
14
15
  from pydantic_config import BaseConfig
15
16
 
16
- from verifiers.v1.configs.env import EnvConfig, SharedEnvConfig
17
- from verifiers.v1.utils.generic import deep_merge, prefix_validation_error
17
+ from verifiers.v1.configs.env import EnvConfig
18
+ from verifiers.v1.utils.generic import prefix_validation_error
18
19
 
19
20
 
20
21
  def resolve_env_field(data: dict, narrowed: "type[EnvConfig] | None" = None) -> dict:
@@ -45,32 +46,6 @@ def resolve_env_field(data: dict, narrowed: "type[EnvConfig] | None" = None) ->
45
46
  return data
46
47
 
47
48
 
48
- def merge_env_defaults(defaults: SharedEnvConfig, env: dict | None) -> dict:
49
- """A raw `env` block over `defaults`, the knobs that several envs of one run share
50
- (e.g. the retries of every eval source). Only the fields set in `defaults` apply,
51
- and the env's own values win. A subtree whose `id`/`type` differs from the
52
- default's is the env's alone, so one plugin's knobs never leak into another's."""
53
- return deep_merge(_dump_set(defaults), env or {})
54
-
55
-
56
- def _dump_set(config: BaseModel) -> dict:
57
- """`config`'s set fields, including those set on a sub-config after construction
58
- (which leaves the parent's field unmarked). Each dumped sub-config keeps its
59
- `id`/`type` even at the default: `deep_merge` detects a plugin switch only when
60
- both sides name it."""
61
- dump = {}
62
- for name in type(config).model_fields:
63
- value = getattr(config, name)
64
- if isinstance(value, BaseModel):
65
- nested = _dump_set(value)
66
- if nested or name in config.model_fields_set:
67
- keys = [k for k in ("id", "type") if k in type(value).model_fields]
68
- dump[name] = {**{k: getattr(value, k) for k in keys}, **nested}
69
- elif name in config.model_fields_set:
70
- dump[name] = config.model_dump(include={name})[name]
71
- return dump
72
-
73
-
74
49
  def narrowed_env_annotation(cls) -> "type[EnvConfig] | None":
75
50
  """The env field's annotation when the CLI pre-narrowed it (`narrow_config`
76
51
  swaps in a concrete subclass). The base declaration reads as `EnvConfig` itself
@@ -141,7 +141,8 @@ async def restore(runtime: Runtime, collected: dict[str, bytes | None]) -> None:
141
141
 
142
142
  Archive bytes are untrusted: the agent controls both their source files and the
143
143
  runtime tooling that creates them. Every archive is therefore validated on the host
144
- before the grading runtime is changed. Only regular files and directories travel.
144
+ before the grading runtime is changed. Regular files, directories, and confined links
145
+ can travel; link chains and extraction through symlinks cannot.
145
146
  """
146
147
  if not collected:
147
148
  return
@@ -214,6 +215,9 @@ def _validate_restore(root: str, archive: bytes | None) -> None:
214
215
 
215
216
  try:
216
217
  with tarfile.open(fileobj=io.BytesIO(archive), mode="r:") as tar:
218
+ regular_files: set[PurePosixPath] = set()
219
+ members: set[PurePosixPath] = set()
220
+ symlinks: dict[PurePosixPath, str] = {}
217
221
  for member in tar:
218
222
  member_path = PurePosixPath(member.name)
219
223
  destination = PurePosixPath("/") / member_path
@@ -227,10 +231,65 @@ def _validate_restore(root: str, archive: bytes | None) -> None:
227
231
  f"artifact member {member.name!r} is outside declared root "
228
232
  f"{root!r}"
229
233
  )
230
- if not (member.isfile() or member.isdir()):
234
+ if member_path in members:
235
+ raise RuntimeError(f"duplicate artifact member {member.name!r}")
236
+ members.add(member_path)
237
+ if member.issym():
238
+ symlinks[member_path] = member.linkname
239
+ elif member.islnk():
240
+ # Tar deduplicates hard-linked build outputs (e.g. Cargo's build
241
+ # scripts). A target must already be a regular member of this
242
+ # archive, never a path supplied by the verifier image.
243
+ target = PurePosixPath(member.linkname)
244
+ if (
245
+ not member.linkname
246
+ or target.is_absolute()
247
+ or ".." in target.parts
248
+ or target not in regular_files
249
+ or target == member_path
250
+ ):
251
+ raise RuntimeError(
252
+ f"artifact hard link {member.name!r} has unsafe target "
253
+ f"{member.linkname!r}"
254
+ )
255
+ elif not (member.isfile() or member.isdir()):
231
256
  raise RuntimeError(
232
257
  f"artifact member {member.name!r} is a link or special file"
233
258
  )
259
+ if member.isfile():
260
+ regular_files.add(member_path)
261
+ # Check after reading the whole archive, so a later symlink cannot
262
+ # turn an earlier member's parent or a link target into a redirection.
263
+ for member_path in members:
264
+ if any(parent in symlinks for parent in member_path.parents):
265
+ raise RuntimeError(
266
+ f"artifact member {str(member_path)!r} traverses a symlink"
267
+ )
268
+ relative_root = root_path.relative_to("/")
269
+ for member_path, linkname in symlinks.items():
270
+ target = PurePosixPath(linkname)
271
+ if not linkname or target.is_absolute():
272
+ raise RuntimeError(
273
+ f"artifact symlink {str(member_path)!r} has unsafe target "
274
+ f"{linkname!r}"
275
+ )
276
+ resolved = member_path.parent
277
+ if not resolved.is_relative_to(relative_root):
278
+ raise RuntimeError(
279
+ f"artifact symlink {str(member_path)!r} has unsafe target "
280
+ f"{linkname!r}"
281
+ )
282
+ # Walk before normalizing '..': a/../b is unsafe if a is itself
283
+ # a symlink. Missing internal targets are safe (e.g. build outputs).
284
+ for part in target.parts:
285
+ resolved = resolved.parent if part == ".." else resolved / part
286
+ if not resolved.is_relative_to(relative_root) or any(
287
+ path in symlinks for path in (resolved, *resolved.parents)
288
+ ):
289
+ raise RuntimeError(
290
+ f"artifact symlink {str(member_path)!r} has unsafe target "
291
+ f"{linkname!r}"
292
+ )
234
293
  except tarfile.TarError as exc:
235
294
  raise RuntimeError(f"unreadable artifact archive for {root!r}: {exc}") from exc
236
295
 
@@ -0,0 +1,105 @@
1
+ """Generic helpers shared across v1 modules."""
2
+
3
+ from typing import TypeVar, get_args, get_origin
4
+
5
+ from pydantic import BaseModel, ValidationError
6
+
7
+ T = TypeVar("T")
8
+
9
+
10
+ def prefix_validation_error(e: ValidationError, prefix: tuple) -> ValidationError:
11
+ """`e` with `prefix` prepended to every error's loc. A sub-model validated
12
+ inside a `mode="before"` validator surfaces its errors at the validator's own
13
+ loc, so without re-raising prefixed the CLI renders a flag path missing the
14
+ segments the user actually typed."""
15
+ return ValidationError.from_exception_data(
16
+ e.title,
17
+ [
18
+ {**err, "loc": prefix + tuple(err["loc"])}
19
+ for err in e.errors(include_url=False)
20
+ ],
21
+ )
22
+
23
+
24
+ def deep_merge(base: dict, override: dict) -> dict:
25
+ """`override` onto `base`, recursing into dicts, so a partial nested override
26
+ keeps the untouched keys of the declared default. An override that switches a
27
+ subtree's discriminator (`id`/`type`) replaces the subtree wholesale — the old
28
+ plugin's fields must not leak into the new type's validation."""
29
+ merged = dict(base)
30
+ for key, value in override.items():
31
+ if isinstance(value, dict) and isinstance(merged.get(key), dict):
32
+ switched = any(
33
+ k in value and k in merged[key] and value[k] != merged[key][k]
34
+ for k in ("id", "type")
35
+ )
36
+ merged[key] = value if switched else deep_merge(merged[key], value)
37
+ else:
38
+ merged[key] = value
39
+ return merged
40
+
41
+
42
+ def merge_defaults(defaults: BaseModel, raw: dict | None) -> dict:
43
+ """Fill in a raw config block with the values that `defaults` sets, e.g. a
44
+ group's shared knobs under each member's own block.
45
+
46
+ - Only fields that were set on `defaults` are filled in; its plain defaults are not.
47
+ - Nested blocks are filled in key by key; a value already in `raw` is kept.
48
+ - If `raw` names a different `id`/`type` for a block (at any depth), that block is
49
+ taken from `raw` alone, so one plugin's fields never leak into another's.
50
+
51
+ For example, with `defaults` set to `algo = {type = "grpo", kl = 0.1}`:
52
+ `{}` becomes `{type = "grpo", kl = 0.1}`, `{kl = 0.5}` becomes
53
+ `{type = "grpo", kl = 0.5}`, and `{type = "max_rl"}` stays `{type = "max_rl"}`.
54
+ """
55
+ # `deep_merge` detects an `id`/`type` switch only on nested blocks, so wrap the
56
+ # block once to detect a switch of the block itself too.
57
+ identity = {
58
+ k: getattr(defaults, k)
59
+ for k in ("id", "type")
60
+ if k in type(defaults).model_fields
61
+ }
62
+ block = {**identity, **_dump_set(defaults)}
63
+ return deep_merge({"block": block}, {"block": raw or {}})["block"]
64
+
65
+
66
+ def _dump_set(config: BaseModel) -> dict:
67
+ """The fields set on `config`, including extra fields, as a nested dict. A
68
+ sub-config the parent did not set still counts when its own fields changed after
69
+ construction (pydantic then leaves the parent's field unmarked), but not when it
70
+ only matches the field's default, which may itself be built with arguments. A
71
+ dumped sub-config always includes its `id`/`type`, because `deep_merge` detects a
72
+ switch only when both sides name it."""
73
+ dump = {}
74
+ for name, field in type(config).model_fields.items():
75
+ value = getattr(config, name)
76
+ if isinstance(value, BaseModel):
77
+ nested = _dump_set(value)
78
+ if name not in config.model_fields_set:
79
+ default = field.get_default(
80
+ call_default_factory=True, validated_data=config.__dict__
81
+ )
82
+ if isinstance(default, BaseModel) and nested == _dump_set(default):
83
+ continue
84
+ if nested or name in config.model_fields_set:
85
+ keys = [k for k in ("id", "type") if k in type(value).model_fields]
86
+ dump[name] = {**{k: getattr(value, k) for k in keys}, **nested}
87
+ elif name in config.model_fields_set:
88
+ dump[name] = config.model_dump(include={name})[name]
89
+ # Extra fields of an `extra="allow"` model exist only because they were set.
90
+ dump.update(config.model_dump(include=set(config.model_extra or {})))
91
+ return dump
92
+
93
+
94
+ def concrete_type(
95
+ cls: type, bound: type[T], *, origin: type | None = None
96
+ ) -> type[T] | None:
97
+ """Find a concrete bounded type through `cls`'s MRO, most-derived first."""
98
+ for klass in cls.__mro__:
99
+ for base in getattr(klass, "__orig_bases__", ()):
100
+ if origin is not None and get_origin(base) is not origin:
101
+ continue
102
+ for arg in get_args(base):
103
+ if isinstance(arg, type) and issubclass(arg, bound):
104
+ return arg
105
+ return None
@@ -1,53 +0,0 @@
1
- """Generic helpers shared across v1 modules."""
2
-
3
- from typing import TypeVar, get_args, get_origin
4
-
5
- from pydantic import ValidationError
6
-
7
- T = TypeVar("T")
8
-
9
-
10
- def prefix_validation_error(e: ValidationError, prefix: tuple) -> ValidationError:
11
- """`e` with `prefix` prepended to every error's loc. A sub-model validated
12
- inside a `mode="before"` validator surfaces its errors at the validator's own
13
- loc, so without re-raising prefixed the CLI renders a flag path missing the
14
- segments the user actually typed."""
15
- return ValidationError.from_exception_data(
16
- e.title,
17
- [
18
- {**err, "loc": prefix + tuple(err["loc"])}
19
- for err in e.errors(include_url=False)
20
- ],
21
- )
22
-
23
-
24
- def deep_merge(base: dict, override: dict) -> dict:
25
- """`override` onto `base`, recursing into dicts, so a partial nested override
26
- keeps the untouched keys of the declared default. An override that switches a
27
- subtree's discriminator (`id`/`type`) replaces the subtree wholesale — the old
28
- plugin's fields must not leak into the new type's validation."""
29
- merged = dict(base)
30
- for key, value in override.items():
31
- if isinstance(value, dict) and isinstance(merged.get(key), dict):
32
- switched = any(
33
- k in value and k in merged[key] and value[k] != merged[key][k]
34
- for k in ("id", "type")
35
- )
36
- merged[key] = value if switched else deep_merge(merged[key], value)
37
- else:
38
- merged[key] = value
39
- return merged
40
-
41
-
42
- def concrete_type(
43
- cls: type, bound: type[T], *, origin: type | None = None
44
- ) -> type[T] | None:
45
- """Find a concrete bounded type through `cls`'s MRO, most-derived first."""
46
- for klass in cls.__mro__:
47
- for base in getattr(klass, "__orig_bases__", ()):
48
- if origin is not None and get_origin(base) is not origin:
49
- continue
50
- for arg in get_args(base):
51
- if isinstance(arg, type) and issubclass(arg, bound):
52
- return arg
53
- return None