verifiers 0.3.2.dev79__tar.gz → 0.3.2.dev81__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 (217) hide show
  1. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/PKG-INFO +1 -1
  2. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/tests/v1/conftest.py +1 -1
  3. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/tests/v1/test_e2e.py +9 -1
  4. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/runtimes/base.py +7 -5
  5. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/runtimes/modal.py +120 -2
  6. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/.gitignore +0 -0
  7. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/LICENSE +0 -0
  8. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/README.md +0 -0
  9. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/pyproject.toml +0 -0
  10. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  11. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/tests/v1/fixtures/duet_v1.py +0 -0
  12. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  13. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  14. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  15. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  16. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/tests/v1/fixtures/echo_v1.py +0 -0
  17. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/tests/v1/fixtures/pyproject.toml +0 -0
  18. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  19. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/tests/v1/test_color_codeword_tasks.py +0 -0
  20. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/tests/v1/test_configs.py +0 -0
  21. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/tests/v1/test_envs.py +0 -0
  22. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/tests/v1/test_graph.py +0 -0
  23. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/tests/v1/test_judges.py +0 -0
  24. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/tests/v1/test_platform_run.py +0 -0
  25. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/tests/v1/test_scoring.py +0 -0
  26. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/tests/v1/test_taskset.py +0 -0
  27. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/tests/v1/test_trace.py +0 -0
  28. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/__init__.py +0 -0
  29. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/cli/commands/init.py +0 -0
  30. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/__init__.py +0 -0
  31. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/acp/__init__.py +0 -0
  32. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/acp/runner.py +0 -0
  33. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/agent.py +0 -0
  34. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/cli/__init__.py +0 -0
  35. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  36. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/cli/dashboard/base.py +0 -0
  37. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/cli/dashboard/eval.py +0 -0
  38. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/cli/dashboard/replay.py +0 -0
  39. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/cli/dashboard/validate.py +0 -0
  40. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/cli/debug.py +0 -0
  41. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/cli/eval/__init__.py +0 -0
  42. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/cli/eval/main.py +0 -0
  43. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/cli/eval/resume.py +0 -0
  44. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/cli/eval/runner.py +0 -0
  45. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/cli/gepa.py +0 -0
  46. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/cli/init.py +0 -0
  47. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/cli/output.py +0 -0
  48. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/cli/replay.py +0 -0
  49. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/cli/resolve.py +0 -0
  50. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/cli/resume.py +0 -0
  51. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/cli/validate.py +0 -0
  52. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/clients/__init__.py +0 -0
  53. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/clients/base.py +0 -0
  54. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/clients/client.py +0 -0
  55. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/clients/eval.py +0 -0
  56. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/clients/train.py +0 -0
  57. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/configs/__init__.py +0 -0
  58. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/configs/agent.py +0 -0
  59. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/configs/cli/__init__.py +0 -0
  60. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/configs/cli/debug.py +0 -0
  61. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/configs/cli/env.py +0 -0
  62. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/configs/cli/eval.py +0 -0
  63. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/configs/cli/init.py +0 -0
  64. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/configs/cli/replay.py +0 -0
  65. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/configs/cli/validate.py +0 -0
  66. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/configs/client.py +0 -0
  67. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/configs/env.py +0 -0
  68. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/configs/harness.py +0 -0
  69. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/configs/judge.py +0 -0
  70. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/configs/retries.py +0 -0
  71. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/configs/runtime.py +0 -0
  72. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/configs/serve.py +0 -0
  73. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/configs/task.py +0 -0
  74. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/configs/taskset.py +0 -0
  75. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/dialects/__init__.py +0 -0
  76. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/dialects/anthropic.py +0 -0
  77. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/dialects/base.py +0 -0
  78. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/dialects/chat.py +0 -0
  79. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/dialects/responses.py +0 -0
  80. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/env.py +0 -0
  81. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/envs/__init__.py +0 -0
  82. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  83. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  84. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  85. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/envs/best_of_n/env.py +0 -0
  86. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/envs/isolated_verifier/__init__.py +0 -0
  87. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/envs/isolated_verifier/env.py +0 -0
  88. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
  89. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  90. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/envs/single_agent/env.py +0 -0
  91. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  92. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/envs/user_sim/env.py +0 -0
  93. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/episode.py +0 -0
  94. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/errors.py +0 -0
  95. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/gepa/__init__.py +0 -0
  96. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/gepa/adapter.py +0 -0
  97. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/gepa/config.py +0 -0
  98. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/gepa/dataset.py +0 -0
  99. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/gepa/reflection.py +0 -0
  100. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/gepa/runner.py +0 -0
  101. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/graph.py +0 -0
  102. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harness.py +0 -0
  103. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/__init__.py +0 -0
  104. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  105. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/bash/harness.py +0 -0
  106. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  107. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  108. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  109. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  110. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  111. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  112. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/codex/harness.py +0 -0
  113. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  114. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  115. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  116. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  117. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  118. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  119. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  120. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  121. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/node.py +0 -0
  122. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/null/__init__.py +0 -0
  123. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/null/harness.py +0 -0
  124. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  125. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  126. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  127. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/pi/harness.py +0 -0
  128. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  129. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/pool/harness.py +0 -0
  130. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
  131. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
  132. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  133. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  134. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  135. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  136. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  137. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/utils/__init__.py +0 -0
  138. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/utils/compaction.py +0 -0
  139. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/utils/core.py +0 -0
  140. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/utils/install.py +0 -0
  141. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/utils/launch.py +0 -0
  142. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/harnesses/utils/mcp.py +0 -0
  143. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/interception/__init__.py +0 -0
  144. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/interception/base.py +0 -0
  145. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/interception/pool.py +0 -0
  146. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/interception/server.py +0 -0
  147. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/interception/tool.py +0 -0
  148. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  149. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/interception/tunnel/base.py +0 -0
  150. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/interception/tunnel/custom.py +0 -0
  151. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/interception/tunnel/prime.py +0 -0
  152. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/judge.py +0 -0
  153. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/judges/__init__.py +0 -0
  154. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/judges/reference.py +0 -0
  155. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/judges/reference.txt +0 -0
  156. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/judges/rubric.py +0 -0
  157. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/judges/rubric.txt +0 -0
  158. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/mcp/__init__.py +0 -0
  159. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/mcp/launch.py +0 -0
  160. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/mcp/server.py +0 -0
  161. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/mcp/toolset.py +0 -0
  162. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/rollout.py +0 -0
  163. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/runtimes/__init__.py +0 -0
  164. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  165. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/runtimes/docker/egress.py +0 -0
  166. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/runtimes/limiters.py +0 -0
  167. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/runtimes/prime.py +0 -0
  168. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/runtimes/subprocess.py +0 -0
  169. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/semantic.py +0 -0
  170. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/serve/__init__.py +0 -0
  171. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/serve/client.py +0 -0
  172. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/serve/encoding.py +0 -0
  173. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/serve/pool.py +0 -0
  174. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/serve/server.py +0 -0
  175. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/serve/types.py +0 -0
  176. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/session.py +0 -0
  177. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/state.py +0 -0
  178. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/task.py +0 -0
  179. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/taskset.py +0 -0
  180. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/tasksets/__init__.py +0 -0
  181. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  182. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/tasksets/harbor/env.py +0 -0
  183. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  184. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
  185. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  186. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  187. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  188. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  189. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  190. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  191. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  192. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  193. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  194. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  195. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  196. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  197. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/trace.py +0 -0
  198. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/types.py +0 -0
  199. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/utils/__init__.py +0 -0
  200. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/utils/aio.py +0 -0
  201. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/utils/artifacts.py +0 -0
  202. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/utils/compile.py +0 -0
  203. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/utils/decorators.py +0 -0
  204. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/utils/format.py +0 -0
  205. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/utils/generic.py +0 -0
  206. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/utils/git.py +0 -0
  207. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/utils/image.py +0 -0
  208. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/utils/interrupt.py +0 -0
  209. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/utils/loaders.py +0 -0
  210. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/utils/logging.py +0 -0
  211. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/utils/memory.py +0 -0
  212. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/utils/paths.py +0 -0
  213. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/utils/platform.py +0 -0
  214. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/utils/prime.py +0 -0
  215. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/utils/retries.py +0 -0
  216. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/verifiers/v1/utils/score.py +0 -0
  217. {verifiers-0.3.2.dev79 → verifiers-0.3.2.dev81}/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.dev79
3
+ Version: 0.3.2.dev81
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
@@ -55,7 +55,7 @@ CI_MODEL = "openai/gpt-5.6-luna"
55
55
 
56
56
 
57
57
  @pytest.fixture
58
- def harness_runtime(request) -> str:
58
+ def harness_runtime(request) -> str | dict:
59
59
  return request.param
60
60
 
61
61
 
@@ -53,6 +53,12 @@ AGENTIC_PLACEMENTS = [
53
53
  pair("hermes-agent", "docker", "hermes-agent-harness-in-docker"),
54
54
  pair("bash", "prime", "bash-harness-in-prime"),
55
55
  pair("bash", "modal", "bash-harness-in-modal"),
56
+ pytest.param(
57
+ "bash",
58
+ {"type": "modal", "allow": []},
59
+ marks=[mark.bash, mark.modal],
60
+ id="bash-harness-in-modal-framework-only",
61
+ ),
56
62
  ]
57
63
 
58
64
  # The scripted user runs in the eval process itself (no placement axis); the harness
@@ -417,7 +423,9 @@ async def test_agentic(run_v1, harness, harness_runtime, tmp_path):
417
423
  (trace,) = await run_v1(
418
424
  "echo-agentic-v1",
419
425
  harness=harness,
420
- runtime={"type": harness_runtime},
426
+ runtime=harness_runtime
427
+ if isinstance(harness_runtime, dict)
428
+ else {"type": harness_runtime},
421
429
  output_dir=tmp_path,
422
430
  max_turns=10,
423
431
  max_tokens=8192,
@@ -24,10 +24,11 @@ from verifiers.v1.utils.aio import run_shielded
24
24
 
25
25
  logger = logging.getLogger(__name__)
26
26
 
27
- # Ensure the latest `uv` is available for our PEP 723 scripts: prefer pip on Python images,
28
- # then fall back to the standalone installer (curl/wget), installing curl + CA certs when a
29
- # bare image has no downloader. Both paths install to ~/.local/bin, which we prepend to PATH.
30
- # (Needs network + one of pip / curl / wget / apt-get / apk.)
27
+ # Ensure `uv` is available for our PEP 723 scripts: keep one already on PATH (an image that
28
+ # pre-installs it, or an earlier rollout's install on the same box); otherwise prefer pip on
29
+ # Python images, then fall back to the standalone installer (curl/wget), installing curl + CA
30
+ # certs when a bare image has no downloader. Both install paths land in ~/.local/bin, which we
31
+ # prepend to PATH first. (Installing needs network + one of pip / curl / wget / apt-get / apk.)
31
32
  _INSTALL_CURL = ( # only when the image has no downloader; needs a known package manager
32
33
  "{ command -v curl >/dev/null 2>&1 || command -v wget >/dev/null 2>&1; } "
33
34
  "|| { apt-get update -qq && apt-get install -y -qq curl ca-certificates; } "
@@ -39,7 +40,8 @@ _DOWNLOAD_UV = (
39
40
  )
40
41
  _ENSURE_UV = (
41
42
  'export PATH="$HOME/.local/bin:$PATH" UV_INSTALL_DIR="$HOME/.local/bin"; '
42
- "pip install -q -U --user uv 2>/dev/null "
43
+ "command -v uv >/dev/null 2>&1 "
44
+ "|| pip install -q -U --user uv 2>/dev/null "
43
45
  f"|| {{ {_INSTALL_CURL}; {_DOWNLOAD_UV}; }}"
44
46
  )
45
47
 
@@ -10,14 +10,18 @@ program in the sandbox reaching a host service) is the shared host-side `Tunnel`
10
10
  import asyncio
11
11
  import contextlib
12
12
  import logging
13
+ import re
13
14
  import shlex
14
15
  import uuid
15
16
  from collections.abc import AsyncIterator
17
+ from ipaddress import ip_address
16
18
  from pathlib import PurePosixPath
17
19
  from typing import ClassVar, Literal
20
+ from urllib.parse import urlsplit
18
21
 
19
- from pydantic_config import BaseConfig
22
+ from pydantic import model_validator
20
23
 
24
+ from verifiers.v1.configs.runtime import NetworkPolicyConfig
21
25
  from verifiers.v1.errors import SandboxError
22
26
  from verifiers.v1.runtimes.base import (
23
27
  SERVICE_PORT,
@@ -36,12 +40,49 @@ logger = logging.getLogger(__name__)
36
40
  _APP_NAME = "verifiers-v1"
37
41
 
38
42
 
39
- class ModalConfig(BaseConfig):
43
+ def _egress_domain(rule: str, *, framework: bool = False) -> str | None:
44
+ """Translate only domains Modal can filter without broadening the rule."""
45
+ parsed = urlsplit(rule if "://" in rule else f"//{rule}")
46
+ host = (parsed.hostname or "").lower().rstrip(".")
47
+ try:
48
+ address = ip_address(host)
49
+ except ValueError:
50
+ address = None
51
+ # Colocated tools are container-local; they need no external network grant.
52
+ if (
53
+ framework
54
+ and parsed.scheme in ("http", "https")
55
+ and (host == "localhost" or (address is not None and address.is_loopback))
56
+ ):
57
+ return None
58
+ if (
59
+ parsed.scheme not in (("https",) if framework else ("", "https"))
60
+ or parsed.port not in (None, 443)
61
+ or parsed.username is not None
62
+ or parsed.password is not None
63
+ or address is not None
64
+ or not re.fullmatch(
65
+ r"(?:\*\.)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*"
66
+ r"[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?",
67
+ host,
68
+ )
69
+ or (framework and "*" in host)
70
+ ):
71
+ raise ValueError(
72
+ f"Modal egress rule {rule!r} is unsupported; use DNS names or HTTPS "
73
+ "origins on port 443 (only a leading *. wildcard is supported)"
74
+ )
75
+ return host
76
+
77
+
78
+ class ModalConfig(NetworkPolicyConfig):
40
79
  type: Literal["modal"] = "modal"
41
80
  image: str = "python:3.11-slim"
42
81
  workdir: str | None = None
43
82
  """Working directory override; None uses the task's workdir, or /app."""
44
83
  network_access: bool = True
84
+ """Allow network access at creation. False blocks all egress, including setup;
85
+ it cannot be combined with execution-time allow/block policies."""
45
86
  region: str | None = None
46
87
  """Region to provision in (None = provider-chosen)."""
47
88
  # TaskData.resources uses these units; non-default runtime config values take precedence.
@@ -58,6 +99,22 @@ class ModalConfig(BaseConfig):
58
99
  """Pace sandbox creation to this many per second, enforced user-wide across every
59
100
  env-server worker process (None/<= 0 disables it)."""
60
101
 
102
+ @model_validator(mode="after")
103
+ def _validate_egress(self) -> "ModalConfig":
104
+ if not self.network_restricted:
105
+ return self
106
+ if not self.network_access:
107
+ raise ValueError(
108
+ "Modal allow/block policies require network_access=true for trusted setup"
109
+ )
110
+ if self.allow == ["*"]:
111
+ raise ValueError(
112
+ "Modal does not support egress deny lists; use an allowlist or allow=[]"
113
+ )
114
+ for rule in self.allow:
115
+ _egress_domain(rule)
116
+ return self
117
+
61
118
 
62
119
  class ModalRuntimeInfo(ModalConfig, BaseRuntimeInfo):
63
120
  pass
@@ -124,6 +181,14 @@ class ModalRuntime(Runtime):
124
181
  "ModalRuntime requires the Modal SDK; install `verifiers[modal]`."
125
182
  ) from e
126
183
 
184
+ if self.network_restricted and not hasattr(
185
+ modal.Sandbox, "_experimental_set_outbound_network_policy"
186
+ ):
187
+ raise SandboxError(
188
+ "Modal execution-time network policies require a Modal SDK with "
189
+ "_experimental_set_outbound_network_policy; upgrade verifiers[modal]"
190
+ )
191
+
127
192
  try:
128
193
  app = await modal.App.lookup.aio(_APP_NAME, create_if_missing=True)
129
194
  async with (
@@ -152,6 +217,16 @@ class ModalRuntime(Runtime):
152
217
  """
153
218
  import modal
154
219
 
220
+ # Modal requires both allowlist types at creation before they can be updated.
221
+ # Trusted setup runs open; prepare_execution removes the broad CIDR grant.
222
+ network = (
223
+ {
224
+ "outbound_domain_allowlist": ["*"],
225
+ "outbound_cidr_allowlist": ["0.0.0.0/0"],
226
+ }
227
+ if self.network_restricted
228
+ else {}
229
+ )
155
230
  self._sandbox = await modal.Sandbox.create.aio(
156
231
  "sleep",
157
232
  "infinity", # keep-alive entrypoint; the harness runs via `exec`
@@ -168,10 +243,53 @@ class ModalRuntime(Runtime):
168
243
  gpu=self.config.gpu,
169
244
  region=self.config.region,
170
245
  block_network=not self.config.network_access,
246
+ **network,
171
247
  timeout=24 * 60 * 60, # Maximum lifetime of any sandbox.
172
248
  encrypted_ports=[SERVICE_PORT],
173
249
  )
174
250
 
251
+ async def prepare_execution(self, routes: list[str] | None) -> None:
252
+ """Apply TLS domain filtering after setup, retaining framework endpoints.
253
+
254
+ Modal filters TLS SNI on port 443, not HTTP Host headers or URL paths.
255
+ This inherits Modal's domain-fronting limitations on shared TLS endpoints.
256
+ """
257
+ if not self.network_restricted:
258
+ return
259
+ try:
260
+ if routes is None:
261
+ domains, cidrs = ["*"], ["0.0.0.0/0"]
262
+ else:
263
+ domains = list(
264
+ dict.fromkeys(
265
+ domain
266
+ for domain in [
267
+ *(
268
+ _egress_domain(route, framework=True)
269
+ for route in routes
270
+ ),
271
+ *(_egress_domain(rule) for rule in self.config.allow),
272
+ ]
273
+ if domain is not None
274
+ )
275
+ )
276
+ cidrs = []
277
+ # Always send both lists: leaving the setup CIDR grant would bypass domains.
278
+ # The awaited RPC applies the policy and closes newly disallowed connections.
279
+ async with asyncio.timeout(60):
280
+ await self._sandbox._experimental_set_outbound_network_policy.aio(
281
+ outbound_domain_allowlist=domains,
282
+ outbound_cidr_allowlist=cidrs,
283
+ )
284
+ except Exception as e:
285
+ raise SandboxError(f"modal egress policy failed: {e}") from e
286
+ logger.info(
287
+ "modal: egress policy applied on sandbox %s (domains=%s cidrs=%s)",
288
+ self.info.id,
289
+ domains,
290
+ cidrs,
291
+ )
292
+
175
293
  async def expose(self, port: int) -> str | None:
176
294
  # Publish a server hosted IN the sandbox: Modal forwards `port` (named via
177
295
  # `encrypted_ports` at creation) to a public URL, read back from `sandbox.tunnels()`.
File without changes