verifiers 0.3.2.dev80__tar.gz → 0.3.2.dev82__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.dev80 → verifiers-0.3.2.dev82}/PKG-INFO +1 -1
  2. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/tests/v1/conftest.py +1 -1
  3. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/tests/v1/test_e2e.py +9 -1
  4. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/utils/core.py +1 -9
  5. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/runtimes/modal.py +120 -2
  6. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/.gitignore +0 -0
  7. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/LICENSE +0 -0
  8. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/README.md +0 -0
  9. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/pyproject.toml +0 -0
  10. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  11. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/tests/v1/fixtures/duet_v1.py +0 -0
  12. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  13. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  14. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  15. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  16. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/tests/v1/fixtures/echo_v1.py +0 -0
  17. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/tests/v1/fixtures/pyproject.toml +0 -0
  18. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  19. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/tests/v1/test_color_codeword_tasks.py +0 -0
  20. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/tests/v1/test_configs.py +0 -0
  21. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/tests/v1/test_envs.py +0 -0
  22. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/tests/v1/test_graph.py +0 -0
  23. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/tests/v1/test_judges.py +0 -0
  24. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/tests/v1/test_platform_run.py +0 -0
  25. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/tests/v1/test_scoring.py +0 -0
  26. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/tests/v1/test_taskset.py +0 -0
  27. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/tests/v1/test_trace.py +0 -0
  28. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/__init__.py +0 -0
  29. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/cli/commands/init.py +0 -0
  30. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/__init__.py +0 -0
  31. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/acp/__init__.py +0 -0
  32. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/acp/runner.py +0 -0
  33. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/agent.py +0 -0
  34. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/cli/__init__.py +0 -0
  35. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  36. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/cli/dashboard/base.py +0 -0
  37. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/cli/dashboard/eval.py +0 -0
  38. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/cli/dashboard/replay.py +0 -0
  39. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/cli/dashboard/validate.py +0 -0
  40. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/cli/debug.py +0 -0
  41. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/cli/eval/__init__.py +0 -0
  42. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/cli/eval/main.py +0 -0
  43. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/cli/eval/resume.py +0 -0
  44. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/cli/eval/runner.py +0 -0
  45. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/cli/gepa.py +0 -0
  46. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/cli/init.py +0 -0
  47. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/cli/output.py +0 -0
  48. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/cli/replay.py +0 -0
  49. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/cli/resolve.py +0 -0
  50. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/cli/resume.py +0 -0
  51. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/cli/validate.py +0 -0
  52. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/clients/__init__.py +0 -0
  53. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/clients/base.py +0 -0
  54. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/clients/client.py +0 -0
  55. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/clients/eval.py +0 -0
  56. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/clients/train.py +0 -0
  57. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/configs/__init__.py +0 -0
  58. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/configs/agent.py +0 -0
  59. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/configs/cli/__init__.py +0 -0
  60. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/configs/cli/debug.py +0 -0
  61. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/configs/cli/env.py +0 -0
  62. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/configs/cli/eval.py +0 -0
  63. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/configs/cli/init.py +0 -0
  64. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/configs/cli/replay.py +0 -0
  65. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/configs/cli/validate.py +0 -0
  66. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/configs/client.py +0 -0
  67. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/configs/env.py +0 -0
  68. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/configs/harness.py +0 -0
  69. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/configs/judge.py +0 -0
  70. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/configs/retries.py +0 -0
  71. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/configs/runtime.py +0 -0
  72. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/configs/serve.py +0 -0
  73. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/configs/task.py +0 -0
  74. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/configs/taskset.py +0 -0
  75. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/dialects/__init__.py +0 -0
  76. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/dialects/anthropic.py +0 -0
  77. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/dialects/base.py +0 -0
  78. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/dialects/chat.py +0 -0
  79. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/dialects/responses.py +0 -0
  80. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/env.py +0 -0
  81. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/envs/__init__.py +0 -0
  82. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  83. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  84. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  85. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/envs/best_of_n/env.py +0 -0
  86. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/envs/isolated_verifier/__init__.py +0 -0
  87. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/envs/isolated_verifier/env.py +0 -0
  88. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
  89. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  90. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/envs/single_agent/env.py +0 -0
  91. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  92. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/envs/user_sim/env.py +0 -0
  93. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/episode.py +0 -0
  94. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/errors.py +0 -0
  95. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/gepa/__init__.py +0 -0
  96. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/gepa/adapter.py +0 -0
  97. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/gepa/config.py +0 -0
  98. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/gepa/dataset.py +0 -0
  99. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/gepa/reflection.py +0 -0
  100. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/gepa/runner.py +0 -0
  101. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/graph.py +0 -0
  102. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harness.py +0 -0
  103. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/__init__.py +0 -0
  104. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  105. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/bash/harness.py +0 -0
  106. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  107. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  108. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  109. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  110. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  111. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  112. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/codex/harness.py +0 -0
  113. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  114. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  115. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  116. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  117. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  118. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  119. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  120. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  121. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/node.py +0 -0
  122. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/null/__init__.py +0 -0
  123. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/null/harness.py +0 -0
  124. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  125. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  126. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  127. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/pi/harness.py +0 -0
  128. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  129. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/pool/harness.py +0 -0
  130. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
  131. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
  132. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  133. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  134. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  135. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  136. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  137. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/utils/__init__.py +0 -0
  138. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/utils/compaction.py +0 -0
  139. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/utils/install.py +0 -0
  140. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/utils/launch.py +0 -0
  141. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/harnesses/utils/mcp.py +0 -0
  142. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/interception/__init__.py +0 -0
  143. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/interception/base.py +0 -0
  144. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/interception/pool.py +0 -0
  145. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/interception/server.py +0 -0
  146. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/interception/tool.py +0 -0
  147. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  148. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/interception/tunnel/base.py +0 -0
  149. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/interception/tunnel/custom.py +0 -0
  150. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/interception/tunnel/prime.py +0 -0
  151. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/judge.py +0 -0
  152. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/judges/__init__.py +0 -0
  153. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/judges/reference.py +0 -0
  154. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/judges/reference.txt +0 -0
  155. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/judges/rubric.py +0 -0
  156. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/judges/rubric.txt +0 -0
  157. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/mcp/__init__.py +0 -0
  158. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/mcp/launch.py +0 -0
  159. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/mcp/server.py +0 -0
  160. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/mcp/toolset.py +0 -0
  161. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/rollout.py +0 -0
  162. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/runtimes/__init__.py +0 -0
  163. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/runtimes/base.py +0 -0
  164. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  165. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/runtimes/docker/egress.py +0 -0
  166. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/runtimes/limiters.py +0 -0
  167. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/runtimes/prime.py +0 -0
  168. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/runtimes/subprocess.py +0 -0
  169. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/semantic.py +0 -0
  170. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/serve/__init__.py +0 -0
  171. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/serve/client.py +0 -0
  172. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/serve/encoding.py +0 -0
  173. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/serve/pool.py +0 -0
  174. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/serve/server.py +0 -0
  175. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/serve/types.py +0 -0
  176. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/session.py +0 -0
  177. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/state.py +0 -0
  178. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/task.py +0 -0
  179. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/taskset.py +0 -0
  180. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/tasksets/__init__.py +0 -0
  181. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  182. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/tasksets/harbor/env.py +0 -0
  183. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  184. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
  185. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  186. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  187. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  188. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  189. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  190. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  191. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  192. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  193. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  194. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  195. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  196. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  197. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/trace.py +0 -0
  198. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/types.py +0 -0
  199. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/utils/__init__.py +0 -0
  200. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/utils/aio.py +0 -0
  201. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/utils/artifacts.py +0 -0
  202. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/utils/compile.py +0 -0
  203. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/utils/decorators.py +0 -0
  204. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/utils/format.py +0 -0
  205. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/utils/generic.py +0 -0
  206. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/utils/git.py +0 -0
  207. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/utils/image.py +0 -0
  208. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/utils/interrupt.py +0 -0
  209. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/utils/loaders.py +0 -0
  210. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/utils/logging.py +0 -0
  211. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/utils/memory.py +0 -0
  212. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/utils/paths.py +0 -0
  213. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/utils/platform.py +0 -0
  214. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/utils/prime.py +0 -0
  215. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/utils/retries.py +0 -0
  216. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/verifiers/v1/utils/score.py +0 -0
  217. {verifiers-0.3.2.dev80 → verifiers-0.3.2.dev82}/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.dev80
3
+ Version: 0.3.2.dev82
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,
@@ -14,7 +14,6 @@ from openai import APIStatusError, AsyncOpenAI
14
14
  if TYPE_CHECKING:
15
15
  # The harness bundles this module into the generated script before execution.
16
16
  from verifiers.v1.harnesses.utils.compaction import ( # noqa: TC004
17
- CompactionFailed,
18
17
  Compactor,
19
18
  bound_tool_message,
20
19
  compactable,
@@ -226,10 +225,6 @@ async def run_chat_loop(
226
225
  while True:
227
226
  try:
228
227
  completion, messages = await compactor.complete(messages)
229
- except CompactionFailed:
230
- # The context is exhausted and could not be summarized: end the run
231
- # cleanly with what the conversation holds - still a trainable sample.
232
- return
233
228
  except APIStatusError as error:
234
229
  # Null cannot compact, so context exhaustion ends it with the transcript so far.
235
230
  if args.bash or not is_context_overflow(error):
@@ -310,10 +305,7 @@ async def run_chat_loop(
310
305
  messages.append(tool_message)
311
306
  tool_result_tokens += estimated_tokens(str(tool_message["content"]))
312
307
  if compactor.reached(completion, tool_result_tokens) and compactable(messages):
313
- try:
314
- messages = await compactor.compact(messages)
315
- except CompactionFailed:
316
- return
308
+ messages = await compactor.compact(messages)
317
309
 
318
310
 
319
311
  def parse_args() -> argparse.Namespace:
@@ -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