verifiers 0.3.2.dev59__tar.gz → 0.3.2.dev60__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 (215) hide show
  1. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/PKG-INFO +1 -1
  2. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/runtimes/base.py +22 -12
  3. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/runtimes/docker/__init__.py +12 -3
  4. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/runtimes/modal.py +3 -1
  5. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/runtimes/prime.py +3 -1
  6. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/runtimes/subprocess.py +24 -2
  7. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/.gitignore +0 -0
  8. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/LICENSE +0 -0
  9. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/README.md +0 -0
  10. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/pyproject.toml +0 -0
  11. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/tests/v1/conftest.py +0 -0
  12. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  13. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/tests/v1/fixtures/duet_v1.py +0 -0
  14. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  15. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  16. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  17. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  18. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/tests/v1/fixtures/echo_v1.py +0 -0
  19. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/tests/v1/fixtures/pyproject.toml +0 -0
  20. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  21. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/tests/v1/test_color_codeword_tasks.py +0 -0
  22. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/tests/v1/test_configs.py +0 -0
  23. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/tests/v1/test_e2e.py +0 -0
  24. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/tests/v1/test_envs.py +0 -0
  25. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/tests/v1/test_graph.py +0 -0
  26. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/tests/v1/test_judges.py +0 -0
  27. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/tests/v1/test_scoring.py +0 -0
  28. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/tests/v1/test_taskset.py +0 -0
  29. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/tests/v1/test_trace.py +0 -0
  30. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/__init__.py +0 -0
  31. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/cli/commands/init.py +0 -0
  32. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/__init__.py +0 -0
  33. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/acp/__init__.py +0 -0
  34. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/acp/runner.py +0 -0
  35. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/agent.py +0 -0
  36. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/cli/__init__.py +0 -0
  37. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  38. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/cli/dashboard/base.py +0 -0
  39. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/cli/dashboard/eval.py +0 -0
  40. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/cli/dashboard/replay.py +0 -0
  41. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/cli/dashboard/validate.py +0 -0
  42. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/cli/debug.py +0 -0
  43. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/cli/eval/__init__.py +0 -0
  44. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/cli/eval/main.py +0 -0
  45. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/cli/eval/resume.py +0 -0
  46. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/cli/eval/runner.py +0 -0
  47. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/cli/gepa.py +0 -0
  48. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/cli/init.py +0 -0
  49. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/cli/output.py +0 -0
  50. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/cli/replay.py +0 -0
  51. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/cli/resolve.py +0 -0
  52. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/cli/resume.py +0 -0
  53. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/cli/validate.py +0 -0
  54. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/clients/__init__.py +0 -0
  55. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/clients/base.py +0 -0
  56. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/clients/client.py +0 -0
  57. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/clients/eval.py +0 -0
  58. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/clients/train.py +0 -0
  59. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/configs/__init__.py +0 -0
  60. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/configs/agent.py +0 -0
  61. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/configs/cli/__init__.py +0 -0
  62. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/configs/cli/debug.py +0 -0
  63. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/configs/cli/env.py +0 -0
  64. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/configs/cli/eval.py +0 -0
  65. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/configs/cli/init.py +0 -0
  66. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/configs/cli/replay.py +0 -0
  67. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/configs/cli/validate.py +0 -0
  68. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/configs/client.py +0 -0
  69. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/configs/env.py +0 -0
  70. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/configs/harness.py +0 -0
  71. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/configs/judge.py +0 -0
  72. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/configs/retries.py +0 -0
  73. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/configs/runtime.py +0 -0
  74. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/configs/serve.py +0 -0
  75. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/configs/task.py +0 -0
  76. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/configs/taskset.py +0 -0
  77. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/dialects/__init__.py +0 -0
  78. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/dialects/anthropic.py +0 -0
  79. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/dialects/base.py +0 -0
  80. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/dialects/chat.py +0 -0
  81. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/dialects/responses.py +0 -0
  82. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/env.py +0 -0
  83. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/envs/__init__.py +0 -0
  84. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  85. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  86. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  87. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/envs/best_of_n/env.py +0 -0
  88. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/envs/isolated_verifier/__init__.py +0 -0
  89. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/envs/isolated_verifier/env.py +0 -0
  90. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
  91. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  92. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/envs/single_agent/env.py +0 -0
  93. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  94. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/envs/user_sim/env.py +0 -0
  95. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/episode.py +0 -0
  96. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/errors.py +0 -0
  97. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/gepa/__init__.py +0 -0
  98. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/gepa/adapter.py +0 -0
  99. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/gepa/config.py +0 -0
  100. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/gepa/dataset.py +0 -0
  101. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/gepa/reflection.py +0 -0
  102. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/gepa/runner.py +0 -0
  103. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/graph.py +0 -0
  104. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harness.py +0 -0
  105. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/__init__.py +0 -0
  106. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  107. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/bash/harness.py +0 -0
  108. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  109. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  110. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  111. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  112. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  113. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  114. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/codex/harness.py +0 -0
  115. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  116. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  117. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  118. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  119. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  120. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  121. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  122. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  123. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/node.py +0 -0
  124. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/null/__init__.py +0 -0
  125. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/null/harness.py +0 -0
  126. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  127. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  128. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  129. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/pi/harness.py +0 -0
  130. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  131. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/pool/harness.py +0 -0
  132. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
  133. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
  134. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  135. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  136. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  137. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  138. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  139. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/utils/__init__.py +0 -0
  140. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/utils/compaction.py +0 -0
  141. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/utils/core.py +0 -0
  142. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/utils/install.py +0 -0
  143. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/utils/launch.py +0 -0
  144. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/harnesses/utils/mcp.py +0 -0
  145. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/interception/__init__.py +0 -0
  146. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/interception/base.py +0 -0
  147. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/interception/pool.py +0 -0
  148. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/interception/server.py +0 -0
  149. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/interception/tool.py +0 -0
  150. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  151. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/interception/tunnel/base.py +0 -0
  152. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/interception/tunnel/custom.py +0 -0
  153. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/interception/tunnel/prime.py +0 -0
  154. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/judge.py +0 -0
  155. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/judges/__init__.py +0 -0
  156. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/judges/reference.py +0 -0
  157. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/judges/reference.txt +0 -0
  158. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/judges/rubric.py +0 -0
  159. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/judges/rubric.txt +0 -0
  160. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/mcp/__init__.py +0 -0
  161. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/mcp/launch.py +0 -0
  162. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/mcp/server.py +0 -0
  163. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/mcp/toolset.py +0 -0
  164. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/rollout.py +0 -0
  165. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/runtimes/__init__.py +0 -0
  166. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/runtimes/docker/egress.py +0 -0
  167. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/runtimes/limiters.py +0 -0
  168. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/semantic.py +0 -0
  169. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/serve/__init__.py +0 -0
  170. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/serve/client.py +0 -0
  171. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/serve/encoding.py +0 -0
  172. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/serve/pool.py +0 -0
  173. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/serve/server.py +0 -0
  174. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/serve/types.py +0 -0
  175. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/session.py +0 -0
  176. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/state.py +0 -0
  177. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/task.py +0 -0
  178. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/taskset.py +0 -0
  179. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/tasksets/__init__.py +0 -0
  180. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  181. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/tasksets/harbor/env.py +0 -0
  182. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  183. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  184. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  185. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  186. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  187. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  188. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  189. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  190. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  191. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  192. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  193. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  194. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  195. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/trace.py +0 -0
  196. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/types.py +0 -0
  197. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/utils/__init__.py +0 -0
  198. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/utils/aio.py +0 -0
  199. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/utils/artifacts.py +0 -0
  200. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/utils/compile.py +0 -0
  201. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/utils/decorators.py +0 -0
  202. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/utils/format.py +0 -0
  203. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/utils/generic.py +0 -0
  204. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/utils/git.py +0 -0
  205. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/utils/image.py +0 -0
  206. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/utils/interrupt.py +0 -0
  207. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/utils/loaders.py +0 -0
  208. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/utils/logging.py +0 -0
  209. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/utils/memory.py +0 -0
  210. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/utils/paths.py +0 -0
  211. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/utils/platform.py +0 -0
  212. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/utils/prime.py +0 -0
  213. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/utils/retries.py +0 -0
  214. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/verifiers/v1/utils/score.py +0 -0
  215. {verifiers-0.3.2.dev59 → verifiers-0.3.2.dev60}/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.dev59
3
+ Version: 0.3.2.dev60
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
@@ -316,13 +316,30 @@ class Runtime(ABC):
316
316
  """Read `path` into host memory. `max_bytes` caps the transfer, raising past
317
317
  the cap — for a file written by something we don't control, whose size we
318
318
  can't assume. The cap is enforced inside the box rather than after the
319
- transfer, and base64 because `run` returns decoded text. Framework method —
320
- override `_read`, not this."""
319
+ transfer. Framework method — override `_read`, not this."""
321
320
  if max_bytes is None:
322
321
  return await self._read(path)
322
+ if max_bytes < 0:
323
+ raise ValueError("max_bytes must be non-negative")
324
+ # One extra byte distinguishes an exact fit from a truncated file.
325
+ data = await self._read(path, max_bytes=max_bytes + 1)
326
+ if len(data) > max_bytes:
327
+ raise SandboxError(f"read {path!r}: over the {max_bytes} byte limit")
328
+ return data
329
+
330
+ @abstractmethod
331
+ async def _read(self, path: str, max_bytes: int | None = None) -> bytes:
332
+ """Read at most `max_bytes` bytes at the source, or the whole file if None.
333
+
334
+ Overrides must accept `max_bytes` and enforce it before transferring data.
335
+ The public `read` method checks for overflow using one extra byte.
336
+ Runtimes without bounded binary reads delegate capped reads here, using
337
+ base64 because `run` returns decoded text.
338
+ """
339
+ assert max_bytes is not None
323
340
  # Through a temp file, not a pipe: `head | base64` exits with base64's 0
324
341
  # even when the path is missing, and a missing file must raise here just
325
- # as it does from `_read`.
342
+ # as it does from a native binary read.
326
343
  result = await self.run(
327
344
  [
328
345
  "sh",
@@ -333,21 +350,14 @@ class Runtime(ABC):
333
350
  'base64 < "$t"; rc=$?; rm -f "$t"; exit $rc'
334
351
  ),
335
352
  "sh",
336
- str(max_bytes + 1),
353
+ str(max_bytes),
337
354
  path,
338
355
  ],
339
356
  {},
340
357
  )
341
358
  if result.exit_code:
342
359
  raise SandboxError(f"read {path!r}: {result.stderr.strip()[-500:]}")
343
- data = base64.b64decode(result.stdout)
344
- if len(data) > max_bytes:
345
- raise SandboxError(f"read {path!r}: over the {max_bytes} byte limit")
346
- return data
347
-
348
- @abstractmethod
349
- async def _read(self, path: str) -> bytes:
350
- """Read the whole file at `path`; `read` adds the optional transfer cap."""
360
+ return base64.b64decode(result.stdout)
351
361
 
352
362
  @abstractmethod
353
363
  async def write(self, path: str, data: bytes) -> None:
@@ -506,19 +506,28 @@ class DockerRuntime(Runtime):
506
506
  if run.exit_code != 0:
507
507
  raise SandboxError(f"docker exec -d failed: {run.stderr.strip()}")
508
508
 
509
- async def _read(self, path: str) -> bytes:
509
+ async def _read(self, path: str, max_bytes: int | None = None) -> bytes:
510
+ argv = ["cat"] if max_bytes is None else ["head", "-c", str(max_bytes)]
510
511
  proc = await asyncio.create_subprocess_exec(
511
512
  "docker",
512
513
  "exec",
513
514
  "--workdir",
514
515
  self.config.workdir,
515
516
  self._container,
516
- "cat",
517
+ *argv,
518
+ "--",
517
519
  path,
518
520
  stdout=asyncio.subprocess.PIPE,
519
521
  stderr=asyncio.subprocess.PIPE,
520
522
  )
521
- stdout, stderr = await proc.communicate()
523
+ try:
524
+ stdout, stderr = await proc.communicate()
525
+ except BaseException:
526
+ if proc.returncode is None:
527
+ with contextlib.suppress(ProcessLookupError):
528
+ proc.kill()
529
+ await run_shielded(proc.communicate())
530
+ raise
522
531
  if proc.returncode != 0:
523
532
  raise SandboxError(
524
533
  f"read {path!r}: {stderr.decode(errors='replace').strip()}"
@@ -279,7 +279,9 @@ class ModalRuntime(Runtime):
279
279
  return path
280
280
  return f"{self.config.workdir.rstrip('/')}/{path}"
281
281
 
282
- async def _read(self, path: str) -> bytes:
282
+ async def _read(self, path: str, max_bytes: int | None = None) -> bytes:
283
+ if max_bytes is not None:
284
+ return await super()._read(path, max_bytes)
283
285
  try:
284
286
  return await self._sandbox.filesystem.read_bytes.aio(self._abs(path))
285
287
  except Exception as e:
@@ -365,7 +365,9 @@ class PrimeRuntime(Runtime):
365
365
  except Exception as e:
366
366
  raise SandboxError(f"prime background launch failed: {e}") from e
367
367
 
368
- async def _read(self, path: str) -> bytes:
368
+ async def _read(self, path: str, max_bytes: int | None = None) -> bytes:
369
+ if max_bytes is not None:
370
+ return await super()._read(path, max_bytes)
369
371
  # Avoid background-job log limits and base64 overhead by downloading binary data directly.
370
372
  # The temporary file is removed on every exit, and its byte read stays off the event loop.
371
373
  target = (
@@ -5,12 +5,14 @@ import contextlib
5
5
  import os
6
6
  import shutil
7
7
  import signal
8
+ import stat
8
9
  from collections.abc import AsyncIterator
9
10
  from pathlib import Path
10
11
  from typing import ClassVar, Literal
11
12
 
12
13
  from pydantic_config import BaseConfig
13
14
 
15
+ from verifiers.v1.errors import SandboxError
14
16
  from verifiers.v1.runtimes.base import (
15
17
  BaseRuntimeInfo,
16
18
  ProgramResult,
@@ -161,8 +163,28 @@ class SubprocessRuntime(Runtime):
161
163
  proc
162
164
  ) # killed in stop() — a host process won't die on its own
163
165
 
164
- async def _read(self, path: str) -> bytes:
165
- return await asyncio.to_thread((self.workdir / path).read_bytes)
166
+ async def _read(self, path: str, max_bytes: int | None = None) -> bytes:
167
+ if max_bytes is None:
168
+ return await asyncio.to_thread((self.workdir / path).read_bytes)
169
+
170
+ # Leave special files to the cancellable shell path without opening a
171
+ # FIFO and waking its writer. A nonblocking open and descriptor check
172
+ # also cover a regular path being replaced by a FIFO after the stat.
173
+ def read() -> bytes | None:
174
+ target = self.workdir / path
175
+ if not stat.S_ISREG(target.stat().st_mode):
176
+ return None
177
+ fd = os.open(target, os.O_RDONLY | os.O_NONBLOCK)
178
+ with os.fdopen(fd, "rb") as file:
179
+ if not stat.S_ISREG(os.fstat(file.fileno()).st_mode):
180
+ return None
181
+ return file.read(max_bytes)
182
+
183
+ try:
184
+ data = await asyncio.to_thread(read)
185
+ except OSError as exc:
186
+ raise SandboxError(f"read {path!r}: {exc}") from exc
187
+ return data if data is not None else await super()._read(path, max_bytes)
166
188
 
167
189
  async def write(self, path: str, data: bytes) -> None:
168
190
  target = self.workdir / path
File without changes