verifiers 0.2.1.dev20__tar.gz → 0.2.1.dev22__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 (419) hide show
  1. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/PKG-INFO +1 -1
  2. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/test_color_codeword_tasks.py +3 -3
  3. verifiers-0.2.1.dev22/tests/v1/test_taskset.py +71 -0
  4. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/debug.py +1 -2
  5. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/eval/runner.py +16 -3
  6. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/gepa.py +1 -1
  7. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/validate.py +1 -2
  8. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/configs/debug.py +1 -0
  9. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/configs/eval.py +1 -0
  10. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/configs/validate.py +1 -0
  11. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/env.py +51 -23
  12. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/errors.py +1 -1
  13. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/gepa/config.py +1 -1
  14. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/gepa/dataset.py +8 -12
  15. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/gepa/runner.py +2 -4
  16. verifiers-0.2.1.dev22/verifiers/v1/interception/__init__.py +94 -0
  17. verifiers-0.2.1.dev22/verifiers/v1/interception/base.py +68 -0
  18. verifiers-0.2.1.dev22/verifiers/v1/interception/pool.py +133 -0
  19. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/interception/server.py +76 -98
  20. verifiers-0.2.1.dev22/verifiers/v1/interception/tunnel/__init__.py +40 -0
  21. verifiers-0.2.1.dev22/verifiers/v1/interception/tunnel/base.py +50 -0
  22. verifiers-0.2.1.dev22/verifiers/v1/interception/tunnel/custom.py +42 -0
  23. verifiers-0.2.1.dev22/verifiers/v1/interception/tunnel/prime.py +56 -0
  24. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/legacy.py +1 -1
  25. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/mcp/launch.py +56 -41
  26. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/rollout.py +38 -37
  27. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/runtimes/__init__.py +1 -8
  28. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/runtimes/base.py +4 -96
  29. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/runtimes/limiters.py +0 -7
  30. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/runtimes/modal.py +2 -2
  31. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/runtimes/prime.py +2 -2
  32. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/serve/pool.py +1 -1
  33. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/serve/server.py +42 -10
  34. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/serve/types.py +5 -4
  35. verifiers-0.2.1.dev22/verifiers/v1/session.py +100 -0
  36. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/taskset.py +46 -4
  37. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/tasksets/textarena/taskset.py +7 -6
  38. verifiers-0.2.1.dev22/verifiers/v1/utils/sampling.py +25 -0
  39. verifiers-0.2.1.dev20/verifiers/v1/interception/__init__.py +0 -16
  40. verifiers-0.2.1.dev20/verifiers/v1/interception/pool.py +0 -94
  41. verifiers-0.2.1.dev20/verifiers/v1/utils/sampling.py +0 -26
  42. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/.gitignore +0 -0
  43. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/LICENSE +0 -0
  44. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/README.md +0 -0
  45. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/pyproject.toml +0 -0
  46. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/AGENTS.md +0 -0
  47. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/__init__.py +0 -0
  48. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/conftest.py +0 -0
  49. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_browser_env.py +0 -0
  50. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_build_script.py +0 -0
  51. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_cli_agent_env.py +0 -0
  52. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_client_auth_errors.py +0 -0
  53. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_client_config.py +0 -0
  54. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_client_multimodal_types.py +0 -0
  55. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_composable_env.py +0 -0
  56. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_context_token_metrics.py +0 -0
  57. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_decorator_ranks.py +0 -0
  58. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_endpoint_registry.py +0 -0
  59. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_env_group.py +0 -0
  60. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_env_server.py +0 -0
  61. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_environment.py +0 -0
  62. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_environment_extra.py +0 -0
  63. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_envs.py +0 -0
  64. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_error_chain.py +0 -0
  65. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_eval_display.py +0 -0
  66. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_eval_utils.py +0 -0
  67. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_gepa_cli.py +0 -0
  68. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_gepa_utils.py +0 -0
  69. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_gym_env.py +0 -0
  70. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_harbor_env_mcp.py +0 -0
  71. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_imports.py +0 -0
  72. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_init_script.py +0 -0
  73. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_install_utils.py +0 -0
  74. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_interception_utils.py +0 -0
  75. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_logging.py +0 -0
  76. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_math_rubric.py +0 -0
  77. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_maybe_think_parser.py +0 -0
  78. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_message_utils.py +0 -0
  79. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_message_utils_multimodal.py +0 -0
  80. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_multiturn_env.py +0 -0
  81. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_nemorl_client.py +0 -0
  82. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_openai_chat_completions_token_client.py +0 -0
  83. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_openai_responses_client.py +0 -0
  84. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_opencode_rlm_env.py +0 -0
  85. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_openenv_client.py +0 -0
  86. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_parser.py +0 -0
  87. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_path_utils.py +0 -0
  88. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_per_turn_timing.py +0 -0
  89. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_pricing_utils.py +0 -0
  90. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_prime_plugin.py +0 -0
  91. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_renderer_client.py +0 -0
  92. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_renderer_e2e.py +0 -0
  93. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_rlm_composable_env.py +0 -0
  94. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_rubric.py +0 -0
  95. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_rubric_group.py +0 -0
  96. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_sandbox_debug_env.py +0 -0
  97. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_sandbox_env.py +0 -0
  98. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_sandbox_mixin.py +0 -0
  99. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_save_utils.py +0 -0
  100. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_setup_script.py +0 -0
  101. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_singleturn_env.py +0 -0
  102. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_stateful_tool_env.py +0 -0
  103. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_think_parser.py +0 -0
  104. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_tool_env.py +0 -0
  105. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_tool_utils.py +0 -0
  106. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_trajectory_processing.py +0 -0
  107. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_tui_info_formatting.py +0 -0
  108. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_types.py +0 -0
  109. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_wordle_env.py +0 -0
  110. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_xml_parser.py +0 -0
  111. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/conftest.py +0 -0
  112. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  113. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  114. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  115. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  116. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  117. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/fixtures/echo_v0.py +0 -0
  118. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/fixtures/echo_v1.py +0 -0
  119. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/fixtures/pyproject.toml +0 -0
  120. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  121. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/test_configs.py +0 -0
  122. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/test_e2e.py +0 -0
  123. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/test_envs.py +0 -0
  124. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/test_graph.py +0 -0
  125. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/test_judges.py +0 -0
  126. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/test_legacy.py +0 -0
  127. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/test_scoring.py +0 -0
  128. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/test_trace.py +0 -0
  129. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/__init__.py +0 -0
  130. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/__init__.py +0 -0
  131. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/commands/__init__.py +0 -0
  132. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/commands/build.py +0 -0
  133. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/commands/eval.py +0 -0
  134. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/commands/gepa.py +0 -0
  135. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/commands/init.py +0 -0
  136. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/commands/install.py +0 -0
  137. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/commands/setup.py +0 -0
  138. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/plugins/__init__.py +0 -0
  139. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/plugins/prime.py +0 -0
  140. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/tui.py +0 -0
  141. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/clients/__init__.py +0 -0
  142. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/clients/anthropic_messages_client.py +0 -0
  143. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/clients/client.py +0 -0
  144. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  145. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/clients/openai_chat_completions_client.py +0 -0
  146. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  147. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/clients/openai_completions_client.py +0 -0
  148. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/clients/openai_responses_client.py +0 -0
  149. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/clients/renderer_client.py +0 -0
  150. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/decorators.py +0 -0
  151. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/AGENTS.md +0 -0
  152. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/__init__.py +0 -0
  153. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/env_group.py +0 -0
  154. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/environment.py +0 -0
  155. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/README.md +0 -0
  156. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/__init__.py +0 -0
  157. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  158. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/README.md +0 -0
  159. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/__init__.py +0 -0
  160. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/_filter.py +0 -0
  161. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  162. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/harness.py +0 -0
  163. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  164. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  165. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  166. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  167. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  168. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  169. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  170. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/task.py +0 -0
  171. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  172. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  173. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  174. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  175. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  176. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  177. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  178. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  179. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  180. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  181. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
  182. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
  183. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
  184. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
  185. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
  186. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
  187. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
  188. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
  189. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
  190. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
  191. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
  192. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
  193. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
  194. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
  195. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
  196. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
  197. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
  198. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
  199. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
  200. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
  201. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
  202. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
  203. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
  204. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
  205. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
  206. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
  207. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
  208. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
  209. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
  210. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  211. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  212. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  213. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  214. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  215. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  216. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  217. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  218. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  219. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  220. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  221. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  222. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  223. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  224. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  225. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  226. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  227. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  228. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  229. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  230. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  231. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  232. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  233. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  234. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/gym_env.py +0 -0
  235. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  236. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  237. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  238. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/mcp_env.py +0 -0
  239. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/opencode_env.py +0 -0
  240. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  241. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  242. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  243. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/utils/__init__.py +0 -0
  244. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  245. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  246. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/README.md +0 -0
  247. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/__init__.py +0 -0
  248. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/browser_env/README.md +0 -0
  249. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  250. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  251. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  252. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  253. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  254. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  255. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/openenv_env.py +0 -0
  256. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  257. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/textarena_env.py +0 -0
  258. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/multiturn_env.py +0 -0
  259. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/python_env.py +0 -0
  260. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/sandbox_env.py +0 -0
  261. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/singleturn_env.py +0 -0
  262. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/stateful_tool_env.py +0 -0
  263. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/tool_env.py +0 -0
  264. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/errors.py +0 -0
  265. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/gepa/__init__.py +0 -0
  266. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/gepa/adapter.py +0 -0
  267. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/gepa/config.py +0 -0
  268. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/gepa/display.py +0 -0
  269. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/gepa/gepa_utils.py +0 -0
  270. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/parsers/__init__.py +0 -0
  271. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/parsers/maybe_think_parser.py +0 -0
  272. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/parsers/parser.py +0 -0
  273. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/parsers/think_parser.py +0 -0
  274. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/parsers/xml_parser.py +0 -0
  275. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/rubrics/__init__.py +0 -0
  276. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  277. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/rubrics/judge_rubric.py +0 -0
  278. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/rubrics/math_rubric.py +0 -0
  279. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/rubrics/rubric.py +0 -0
  280. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/rubrics/rubric_group.py +0 -0
  281. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/scripts/__init__.py +0 -0
  282. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/scripts/build.py +0 -0
  283. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/scripts/eval.py +0 -0
  284. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/scripts/gepa.py +0 -0
  285. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/scripts/init.py +0 -0
  286. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/scripts/install.py +0 -0
  287. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/scripts/setup.py +0 -0
  288. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/scripts/tui.py +0 -0
  289. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/serve/__init__.py +0 -0
  290. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/serve/client/env_client.py +0 -0
  291. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/serve/client/zmq_env_client.py +0 -0
  292. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/serve/server/__init__.py +0 -0
  293. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/serve/server/env_router.py +0 -0
  294. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/serve/server/env_server.py +0 -0
  295. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/serve/server/env_worker.py +0 -0
  296. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/serve/server/zmq_env_server.py +0 -0
  297. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/serve/types.py +0 -0
  298. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/types.py +0 -0
  299. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/__init__.py +0 -0
  300. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/async_utils.py +0 -0
  301. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/client_utils.py +0 -0
  302. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/config_utils.py +0 -0
  303. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/data_utils.py +0 -0
  304. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/display_utils.py +0 -0
  305. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/env_config_utils.py +0 -0
  306. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/env_utils.py +0 -0
  307. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/error_utils.py +0 -0
  308. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/eval_display.py +0 -0
  309. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/eval_utils.py +0 -0
  310. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/heartbeat.py +0 -0
  311. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/import_utils.py +0 -0
  312. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/install_utils.py +0 -0
  313. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/interception_utils.py +0 -0
  314. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/logging_utils.py +0 -0
  315. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/message_utils.py +0 -0
  316. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/metric_utils.py +0 -0
  317. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/path_utils.py +0 -0
  318. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/pricing_utils.py +0 -0
  319. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/process_utils.py +0 -0
  320. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/response_utils.py +0 -0
  321. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/save_utils.py +0 -0
  322. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/serve_utils.py +0 -0
  323. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/thread_utils.py +0 -0
  324. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/threaded_sandbox_client.py +0 -0
  325. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/tool_utils.py +0 -0
  326. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/usage_utils.py +0 -0
  327. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/version_utils.py +0 -0
  328. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/__init__.py +0 -0
  329. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/__init__.py +0 -0
  330. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  331. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/dashboard/base.py +0 -0
  332. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/dashboard/eval.py +0 -0
  333. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/dashboard/replay.py +0 -0
  334. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/dashboard/validate.py +0 -0
  335. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/eval/__init__.py +0 -0
  336. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/eval/main.py +0 -0
  337. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/eval/resume.py +0 -0
  338. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/init.py +0 -0
  339. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/output.py +0 -0
  340. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/replay.py +0 -0
  341. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/resolve.py +0 -0
  342. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/serve.py +0 -0
  343. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/clients/__init__.py +0 -0
  344. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/clients/client.py +0 -0
  345. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/clients/config.py +0 -0
  346. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/clients/eval.py +0 -0
  347. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/clients/train.py +0 -0
  348. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/configs/__init__.py +0 -0
  349. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/configs/init.py +0 -0
  350. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/configs/replay.py +0 -0
  351. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/configs/serve.py +0 -0
  352. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/decorators.py +0 -0
  353. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/dialects/__init__.py +0 -0
  354. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/dialects/anthropic.py +0 -0
  355. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/dialects/base.py +0 -0
  356. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/dialects/chat.py +0 -0
  357. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/dialects/responses.py +0 -0
  358. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/episode.py +0 -0
  359. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/gepa/__init__.py +0 -0
  360. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/gepa/adapter.py +0 -0
  361. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/gepa/reflection.py +0 -0
  362. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/graph.py +0 -0
  363. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harness.py +0 -0
  364. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/__init__.py +0 -0
  365. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  366. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/codex/harness.py +0 -0
  367. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/default/__init__.py +0 -0
  368. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/default/harness.py +0 -0
  369. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/default/program.py +0 -0
  370. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  371. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  372. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  373. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  374. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  375. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/null/__init__.py +0 -0
  376. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/null/harness.py +0 -0
  377. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/null/program.py +0 -0
  378. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  379. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  380. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  381. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  382. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  383. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/judge.py +0 -0
  384. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/judges/__init__.py +0 -0
  385. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/judges/reference.py +0 -0
  386. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/judges/reference.txt +0 -0
  387. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/judges/rubric.py +0 -0
  388. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/judges/rubric.txt +0 -0
  389. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/loaders.py +0 -0
  390. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/mcp/__init__.py +0 -0
  391. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/mcp/server.py +0 -0
  392. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/mcp/toolset.py +0 -0
  393. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/mcp/user.py +0 -0
  394. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/push.py +0 -0
  395. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/retries.py +0 -0
  396. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/runtimes/docker.py +0 -0
  397. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/runtimes/subprocess.py +0 -0
  398. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/scoring.py +0 -0
  399. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/serve/__init__.py +0 -0
  400. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/serve/client.py +0 -0
  401. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/state.py +0 -0
  402. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/task.py +0 -0
  403. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/tasksets/__init__.py +0 -0
  404. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  405. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  406. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  407. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  408. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  409. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  410. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/trace.py +0 -0
  411. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/types.py +0 -0
  412. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/utils/__init__.py +0 -0
  413. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/utils/aio.py +0 -0
  414. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/utils/format.py +0 -0
  415. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/utils/generic.py +0 -0
  416. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/utils/install.py +0 -0
  417. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/utils/interrupt.py +0 -0
  418. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/utils/logging.py +0 -0
  419. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/utils/memory.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.2.1.dev20
3
+ Version: 0.2.1.dev22
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
@@ -10,9 +10,9 @@ def test_color_images_are_rendered_once(monkeypatch) -> None:
10
10
  return render(color, size)
11
11
 
12
12
  monkeypatch.setattr(taskset, "color_data_url", counted)
13
- tasks = taskset.ColorCodewordTaskset(
14
- taskset.ColorCodewordConfig(num_examples=100)
15
- ).load()
13
+ tasks = taskset.ColorCodewordTaskset(taskset.ColorCodewordConfig()).select(
14
+ num_tasks=100
15
+ )
16
16
 
17
17
  assert len(tasks) == 100
18
18
  assert calls == list(taskset.COLOR_MAP)
@@ -0,0 +1,71 @@
1
+ """`Taskset.select` over list, generator, and `INFINITE` `load` implementations."""
2
+
3
+ import itertools
4
+
5
+ import pytest
6
+
7
+ import verifiers.v1 as vf
8
+
9
+
10
+ class CountTask(vf.Task[vf.TaskData]):
11
+ pass
12
+
13
+
14
+ class InfiniteTaskset(vf.Taskset[CountTask, vf.TasksetConfig]):
15
+ INFINITE = True
16
+
17
+ def load(self):
18
+ for i in itertools.count():
19
+ yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
20
+
21
+
22
+ class FiniteTaskset(vf.Taskset[CountTask, vf.TasksetConfig]):
23
+ def load(self):
24
+ for i in range(10):
25
+ yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
26
+
27
+
28
+ def idxs(tasks: list[CountTask]) -> list[int]:
29
+ return [task.data.idx for task in tasks]
30
+
31
+
32
+ def test_select_bounds_an_infinite_taskset() -> None:
33
+ tasks = InfiniteTaskset(vf.TasksetConfig()).select(num_tasks=5)
34
+ assert idxs(tasks) == [0, 1, 2, 3, 4]
35
+
36
+
37
+ def test_select_infinite_requires_num_tasks() -> None:
38
+ with pytest.raises(ValueError, match="infinite"):
39
+ InfiniteTaskset(vf.TasksetConfig()).select()
40
+
41
+
42
+ def test_select_infinite_ignores_shuffle() -> None:
43
+ tasks = InfiniteTaskset(vf.TasksetConfig()).select(num_tasks=3, shuffle=True)
44
+ assert idxs(tasks) == [0, 1, 2]
45
+
46
+
47
+ def test_select_finite() -> None:
48
+ taskset = FiniteTaskset(vf.TasksetConfig())
49
+ assert len(taskset.select()) == 10
50
+ assert idxs(taskset.select(num_tasks=4)) == [0, 1, 2, 3]
51
+
52
+
53
+ def test_select_shuffle_samples_the_whole_taskset_reproducibly() -> None:
54
+ taskset = FiniteTaskset(vf.TasksetConfig())
55
+ first = idxs(taskset.select(num_tasks=5, shuffle=True))
56
+ assert first == idxs(taskset.select(num_tasks=5, shuffle=True))
57
+ assert len(first) == 5 and set(first) <= set(range(10))
58
+ assert first != [0, 1, 2, 3, 4] # sampled from the whole set, not the head
59
+
60
+
61
+ def test_select_only_builds_what_the_run_takes() -> None:
62
+ built: list[int] = []
63
+
64
+ class RecordingTaskset(InfiniteTaskset):
65
+ def load(self):
66
+ for i in itertools.count():
67
+ built.append(i)
68
+ yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
69
+
70
+ RecordingTaskset(vf.TasksetConfig()).select(num_tasks=3)
71
+ assert built == [0, 1, 2]
@@ -30,7 +30,6 @@ from verifiers.v1.task import Task
30
30
  from verifiers.v1.trace import Error, Trace, TraceTask
31
31
  from verifiers.v1.utils.interrupt import install_interrupt
32
32
  from verifiers.v1.utils.logging import setup_logging
33
- from verifiers.v1.utils.sampling import sample
34
33
 
35
34
  logger = logging.getLogger(__name__)
36
35
 
@@ -274,7 +273,7 @@ async def debug_task(task: Task, config: DebugConfig) -> tuple[Trace, bool]:
274
273
 
275
274
  async def run_debug(config: DebugConfig) -> list[Trace]:
276
275
  taskset = vf.load_taskset(config.taskset)
277
- tasks = sample(taskset.load(), config.shuffle, config.num_tasks)
276
+ tasks = taskset.select(config.num_tasks, config.shuffle)
278
277
  if isinstance(config.runtime, vf.SubprocessConfig) and any(
279
278
  type(t).NEEDS_CONTAINER or t.data.image for t in tasks
280
279
  ):
@@ -21,7 +21,7 @@ logger = logging.getLogger(__name__)
21
21
  async def run_eval(env: Environment, config: EvalConfig) -> list[Trace]:
22
22
  logger.info("eval config:\n%s", config.model_dump_json(indent=2))
23
23
  client = resolve_client(config.client)
24
- tasks = sample(env.taskset.load(), config.shuffle, config.num_tasks)
24
+ tasks = env.taskset.select(config.num_tasks, config.shuffle)
25
25
  ctx = ModelContext(client=client, model=config.model, sampling=config.sampling)
26
26
  # One episode of `num_rollouts` rollouts per task; the shared semaphore bounds total
27
27
  # concurrent rollouts (across episodes), so group rewards still see their whole episode.
@@ -70,7 +70,7 @@ async def run_eval(env: Environment, config: EvalConfig) -> list[Trace]:
70
70
  await append_trace(out, trace, write_lock)
71
71
 
72
72
  # Shared tool servers (if any) come up once here and their URLs flow into every rollout
73
- # (non-shared ones start per rollout inside the episodes); the interception pool comes up
73
+ # (non-shared ones start per rollout inside the episodes); the interception comes up
74
74
  # here too, so concurrent rollouts share its servers + tunnels rather than one each. Build
75
75
  # episodes inside `serving` so each rollout is wired to those resources at construction.
76
76
  async with env.serving():
@@ -162,7 +162,20 @@ async def run_eval_server(config: EvalConfig) -> list[Trace]:
162
162
  await client.wait_for_server_startup(timeout=600)
163
163
  info = await client.info()
164
164
  group_scored = info.requires_group_scoring
165
- idxs = sample(list(range(info.num_tasks)), config.shuffle, config.num_tasks)
165
+ if info.num_tasks is None: # infinite taskset - the run must be bounded
166
+ if config.num_tasks is None:
167
+ raise ValueError(
168
+ f"{config.env_id} is infinite - bound the run with -n/--num-tasks"
169
+ )
170
+ if config.shuffle:
171
+ logger.warning(
172
+ "shuffle is a no-op on an infinite taskset - "
173
+ "taking the first %d generated tasks",
174
+ config.num_tasks,
175
+ )
176
+ idxs = list(range(config.num_tasks))
177
+ else:
178
+ idxs = sample(list(range(info.num_tasks)), config.shuffle, config.num_tasks)
166
179
  out = output_path(config)
167
180
  finished: list[Trace] = []
168
181
  if config.resume is not None:
@@ -60,7 +60,7 @@ def main(argv: list[str] | None = None) -> None:
60
60
  return
61
61
 
62
62
  # First Ctrl-C / SIGTERM warns and raises KeyboardInterrupt so a killed/timed-out run still
63
- # runs the runner's `serving()` teardown (interception pool / tool-server runtimes); further
63
+ # runs the runner's `serving()` teardown (interception / tool-server runtimes); further
64
64
  # signals during that cleanup are swallowed so an impatient second Ctrl-C can't orphan them.
65
65
  install_interrupt()
66
66
 
@@ -26,7 +26,6 @@ from verifiers.v1.task import Task
26
26
  from verifiers.v1.trace import Trace, TraceTask
27
27
  from verifiers.v1.utils.interrupt import install_interrupt
28
28
  from verifiers.v1.utils.logging import setup_logging
29
- from verifiers.v1.utils.sampling import sample
30
29
 
31
30
  logger = logging.getLogger(__name__)
32
31
 
@@ -198,7 +197,7 @@ async def _validate_task(task: Task, config: ValidateConfig) -> ResultRow:
198
197
 
199
198
  async def run_validate(config: ValidateConfig) -> list[dict]:
200
199
  taskset = vf.load_taskset(config.taskset)
201
- tasks = sample(taskset.load(), config.shuffle, config.num_tasks)
200
+ tasks = taskset.select(config.num_tasks, config.shuffle)
202
201
  if isinstance(config.runtime, vf.SubprocessConfig) and any(
203
202
  type(t).NEEDS_CONTAINER or t.data.image for t in tasks
204
203
  ):
@@ -28,6 +28,7 @@ class DebugConfig(BaseConfig):
28
28
  for the debug command/script."""
29
29
  num_tasks: int | None = Field(
30
30
  None,
31
+ ge=1,
31
32
  validation_alias=AliasChoices("num_tasks", "n", "num_examples", "batch_size"),
32
33
  )
33
34
  """How many tasks to debug (None = all)."""
@@ -22,6 +22,7 @@ class EvalConfig(EnvServerConfig):
22
22
  sampling: SamplingConfig = SamplingConfig()
23
23
  num_tasks: int | None = Field(
24
24
  None,
25
+ ge=1,
25
26
  validation_alias=AliasChoices("batch_size", "num_examples", "num_tasks", "n"),
26
27
  )
27
28
  """How many tasks to evaluate (None = all)."""
@@ -26,6 +26,7 @@ class ValidateConfig(BaseConfig):
26
26
  """Run only `Task.setup` and `Task.validate`."""
27
27
  num_tasks: int | None = Field(
28
28
  None,
29
+ ge=1,
29
30
  validation_alias=AliasChoices("num_tasks", "n", "num_examples", "batch_size"),
30
31
  )
31
32
  """How many tasks to validate (None = all)."""
@@ -12,7 +12,14 @@ from verifiers.v1.clients import ModelContext
12
12
  from verifiers.v1.decorators import discover_decorated
13
13
  from verifiers.v1.episode import Episode
14
14
  from verifiers.v1.types import ID
15
- from verifiers.v1.interception import InterceptionPool, RolloutLimits
15
+ from verifiers.v1.interception import (
16
+ ElasticInterceptionPoolConfig,
17
+ Interception,
18
+ InterceptionConfig,
19
+ make_interception,
20
+ requires_tunnel,
21
+ )
22
+ from verifiers.v1.session import RolloutLimits
16
23
  from verifiers.v1.retries import RetryConfig
17
24
  from verifiers.v1.rollout import Rollout
18
25
  from verifiers.v1.runtimes import (
@@ -20,7 +27,7 @@ from verifiers.v1.runtimes import (
20
27
  SubprocessConfig,
21
28
  runtime_is_local,
22
29
  )
23
- from verifiers.v1.task import Task
30
+ from verifiers.v1.task import Task, resolve_server_config
24
31
  from verifiers.v1.taskset import Taskset, TasksetConfig
25
32
  from verifiers.v1.utils.generic import generic_type
26
33
  from verifiers.v1.mcp import SharedToolServer, serve_shared
@@ -100,10 +107,11 @@ class EnvConfig(BaseConfig):
100
107
  max_total_tokens: int | None = None
101
108
  """Max total (prompt + completion) tokens per rollout (None = no limit). Caps the
102
109
  trace's `num_total_tokens`; framework-enforced between turns."""
103
- multiplex: int = Field(32, ge=1)
104
- """Rollouts that share one interception server (and, behind a remote runtime, one
105
- tunnel). N concurrent rollouts use ~N/multiplex servers + tunnels instead of one each —
106
- key past the per-token tunnel cap. 1 = a server (+ tunnel) per rollout."""
110
+ interception: InterceptionConfig = ElasticInterceptionPoolConfig()
111
+ """The interception shape (see `verifiers.v1.interception`): `elastic` (the
112
+ default servers grown on demand, `multiplex` rollouts each), `server` (one server,
113
+ with a tunnel choice incl. a bring-your-own endpoint), or `static` (a fixed list of
114
+ such servers)."""
107
115
  # --- legacy (v0) backwards-compat -----------------------------------------
108
116
  id: ID | None = None
109
117
  """Classic (v0) env id (`name`, `org/name`, or `org/name@version` — installed from the
@@ -274,9 +282,9 @@ class Environment:
274
282
  )
275
283
  self._warned_resources: set[tuple[str, str]] = set()
276
284
  self._shared_tools: dict[str, SharedToolServer] = {}
277
- self._interception: InterceptionPool | None = None
285
+ self._interception: Interception | None = None
278
286
  """Eval-level serving resources, live only inside `serving()`: shared tool servers
279
- ({name: SharedToolServer}) and the interception pool. `episode()` injects them into every rollout
287
+ ({name: SharedToolServer}) and the interception. `episode()` injects them into every rollout
280
288
  so neither runner has to thread them through `Episode.run`/`Rollout.run`."""
281
289
 
282
290
  def runtime_for(self, task: Task) -> RuntimeConfig:
@@ -358,24 +366,44 @@ class Environment:
358
366
  @contextlib.asynccontextmanager
359
367
  async def serving(self):
360
368
  """Hold the env-level serving resources for the duration of an eval: the shared tool
361
- servers (built once, see `shared_tools`) and the interception pool. Stash them so
369
+ servers (built once, see `shared_tools`) and the interception. Stash them so
362
370
  every `episode()` built inside this context injects them into its rollouts — that's
363
371
  what keeps both eval runners (in-process and env-server) on one serving path. Build
364
372
  episodes inside this context; the resources are torn down on exit."""
365
- async with (
366
- self.shared_tools() as shared,
367
- self.interception_pool() as interception,
368
- ):
369
- self._shared_tools = shared
370
- self._interception = interception
371
- try:
372
- yield
373
- finally:
374
- self._shared_tools = {}
375
- self._interception = None
376
-
377
- def interception_pool(self) -> InterceptionPool:
378
- return InterceptionPool(self.harness.config.runtime, self.config.multiplex)
373
+ async with self.shared_tools() as shared:
374
+ interception = make_interception(
375
+ self.config.interception, requires_tunnel=self._requires_tunnel(shared)
376
+ )
377
+ async with interception:
378
+ self._shared_tools = shared
379
+ self._interception = interception
380
+ try:
381
+ yield
382
+ finally:
383
+ self._shared_tools = {}
384
+ self._interception = None
385
+
386
+ def _requires_tunnel(self, shared: dict[str, SharedToolServer]) -> bool:
387
+ """`requires_tunnel` over the consumers known before any rollout: the harness
388
+ runtime (by config), the live `shared` servers, and the task class's tool/user
389
+ servers — read class-level (like `validate_pairing`) with their configs resolved
390
+ the way `Task.server_config` resolves them. A task that *overrides* that pairing
391
+ isn't statically knowable, so it conservatively counts as remote (the tunnel then
392
+ reaches everything; a wrongly-assumed localhost would reach nothing remote)."""
393
+ task_cls = generic_type(type(self.taskset), Task, origin=Taskset) or Task
394
+ server_classes = [*task_cls.tools, *([task_cls.user] if task_cls.user else [])]
395
+ if server_classes and task_cls.server_config is not Task.server_config:
396
+ return True
397
+ sole = len({*task_cls.tools} | ({task_cls.user} - {None})) == 1
398
+ configs = [
399
+ resolve_server_config(
400
+ task_cls.__name__, self.taskset.config.task, server_cls, sole=sole
401
+ )
402
+ for server_cls in server_classes
403
+ ]
404
+ return requires_tunnel(
405
+ runtime_is_local(self.harness.config.runtime), configs, shared.values()
406
+ )
379
407
 
380
408
  @contextlib.asynccontextmanager
381
409
  async def shared_tools(self):
@@ -10,7 +10,7 @@ Four mechanisms, each in one place:
10
10
  raises plain Python errors — it never constructs a `vf` error type; `boundary` classifies them.
11
11
  Infra that fails raises its type at the source (`runtimes` → `SandboxError`, `clients` →
12
12
  `ProviderError`, tunnels → `TunnelError`); an already-typed `RolloutError` passes through unchanged.
13
- 3. Surfacing (`interception.RolloutSession.error`): a model/tool/user call fails behind the harness
13
+ 3. Surfacing (`session.RolloutSession.error`): a model/tool/user call fails behind the harness
14
14
  subprocess and comes back as HTTP, so the interception server stashes the real error there and
15
15
  the rollout re-raises it once the harness returns — not a secondary `HarnessError`.
16
16
  4. Capture (`Rollout.run`, mirrored by the env-server): the one place that records a failure (typed
@@ -42,7 +42,7 @@ class GEPAConfig(EnvConfig):
42
42
  """Tasks held out to score each candidate system prompt for the pareto frontier."""
43
43
  shuffle: bool = Field(True, validation_alias=AliasChoices("shuffle", "s"))
44
44
  """Shuffle tasks before splitting into train/val — v1 tasksets have no generic train/val
45
- split, so GEPA carves one out of `taskset.load()` the way `run_eval` samples (fixed
45
+ split, so GEPA carves one out of `Taskset.select` the way `run_eval` samples (fixed
46
46
  seed, so the split is reproducible across runs)."""
47
47
  seed: int = 0
48
48
  """Seed for GEPA's optimizer (candidate selection / minibatch sampling). Task shuffling
@@ -1,14 +1,13 @@
1
1
  """Train/val split and upfront validation for a GEPA run.
2
2
 
3
3
  v1 tasksets have no generic train/val split concept (`TasksetConfig` has no `split` field;
4
- individual tasksets define ad hoc ones inconsistently), so GEPA carves one out of
5
- `taskset.load()` itself: the shared fixed-seed shuffle (`verifiers.v1.utils.sampling.sample`,
6
- reproducible across runs like every other entrypoint), then two disjoint slices.
4
+ individual tasksets define ad hoc ones inconsistently), so GEPA carves one out of the tasks
5
+ `Taskset.select` hands it (the shared fixed-seed shuffle, reproducible across runs like every
6
+ other entrypoint): two disjoint slices.
7
7
  """
8
8
 
9
9
  from verifiers.v1.decorators import discover_decorated
10
10
  from verifiers.v1.task import Task
11
- from verifiers.v1.utils.sampling import sample
12
11
 
13
12
 
14
13
  def reject_group_reward_tasksets(tasks: list[Task]) -> None:
@@ -26,19 +25,16 @@ def reject_group_reward_tasksets(tasks: list[Task]) -> None:
26
25
 
27
26
 
28
27
  def split_tasks(
29
- tasks: list[Task], num_train: int, num_val: int, shuffle: bool
28
+ tasks: list[Task], num_train: int, num_val: int
30
29
  ) -> tuple[list[Task], list[Task]]:
31
- """The taskset's tasks, split into disjoint `(train, val)` slices (`train` feeds reflection
30
+ """The selected tasks, split into disjoint `(train, val)` slices (`train` feeds reflection
32
31
  minibatches; `val` scores each candidate for the pareto frontier)."""
33
- pool = sample(
34
- tasks, shuffle
35
- ) # shared fixed-seed shuffle; GEPA does its own slicing below
36
- if num_train + num_val > len(pool):
32
+ if num_train + num_val > len(tasks):
37
33
  raise ValueError(
38
34
  f"requested {num_train} train + {num_val} val tasks, but the taskset only "
39
- f"loaded {len(pool)}"
35
+ f"loaded {len(tasks)}"
40
36
  )
41
- return pool[:num_train], pool[num_train : num_train + num_val]
37
+ return tasks[:num_train], tasks[num_train : num_train + num_val]
42
38
 
43
39
 
44
40
  def resolve_gepa_seed_prompt(tasks: list[Task], initial_prompt: str | None) -> str:
@@ -38,10 +38,8 @@ class _GEPALog:
38
38
 
39
39
  def run_gepa(env: Environment, config: GEPAConfig) -> GEPAResult:
40
40
  logger.info("gepa config:\n%s", config.model_dump_json(indent=2))
41
- all_tasks = env.taskset.load()
42
- train_tasks, val_tasks = split_tasks(
43
- all_tasks, config.num_train, config.num_val, config.shuffle
44
- )
41
+ all_tasks = env.taskset.select(config.num_train + config.num_val, config.shuffle)
42
+ train_tasks, val_tasks = split_tasks(all_tasks, config.num_train, config.num_val)
45
43
  selected_tasks = [*train_tasks, *val_tasks]
46
44
  reject_group_reward_tasksets(
47
45
  selected_tasks
@@ -0,0 +1,94 @@
1
+ """The interception layer.
2
+
3
+ `server` catches a harness's model calls and proxies them to the client, multiplexing many
4
+ rollouts on one server keyed by their secret — and is itself the single-server
5
+ `Interception`. `pool` composes such servers, statically (a fixed set, e.g. bring-your-own
6
+ endpoints) or elastically (grown on demand). `tunnel` makes a server reachable from remote
7
+ consumers; `requires_tunnel` decides whether that's needed. `make_interception` picks the
8
+ shape from the `InterceptionConfig` type.
9
+ """
10
+
11
+ from collections.abc import Iterable
12
+ from typing import TYPE_CHECKING, Annotated
13
+
14
+ from pydantic import Field
15
+ from pydantic_config import BaseConfig
16
+
17
+ from verifiers.v1.interception.base import BaseInterceptionConfig, Interception, Slot
18
+ from verifiers.v1.interception.pool import (
19
+ ElasticInterceptionPool,
20
+ ElasticInterceptionPoolConfig,
21
+ StaticInterceptionPool,
22
+ StaticInterceptionPoolConfig,
23
+ )
24
+ from verifiers.v1.interception.server import (
25
+ InterceptionServer,
26
+ InterceptionServerConfig,
27
+ )
28
+ from verifiers.v1.runtimes import runtime_is_local
29
+
30
+ if TYPE_CHECKING:
31
+ from verifiers.v1.mcp import SharedToolServer
32
+
33
+ # Discriminated on `type` so the CLI selects with `--interception.type server|static|elastic`.
34
+ InterceptionConfig = Annotated[
35
+ InterceptionServerConfig
36
+ | StaticInterceptionPoolConfig
37
+ | ElasticInterceptionPoolConfig,
38
+ Field(discriminator="type"),
39
+ ]
40
+
41
+
42
+ def requires_tunnel(
43
+ harness_is_local: bool,
44
+ server_configs: Iterable[BaseConfig] = (),
45
+ shared: "Iterable[SharedToolServer]" = (),
46
+ ) -> bool:
47
+ """Whether the interception must be exposed via a tunnel — some consumer is off the
48
+ host network: the harness itself, a live `shared` server in a remote runtime, or a
49
+ tool/user server config placing one there (each reaches the `/state` channel from
50
+ its own runtime). Skipped as non-consumers: a `colocated` server (shares the
51
+ harness's runtime, covered by `harness_is_local`), a config-`url` server (external —
52
+ it connects out), and an `external` shared server (outside the state machinery
53
+ entirely). False means every consumer reaches the server at localhost."""
54
+ if not harness_is_local:
55
+ return True
56
+ if any(not s.external and not s.local for s in shared):
57
+ return True
58
+ for config in server_configs:
59
+ if getattr(config, "url", None) or config.colocated:
60
+ continue
61
+ if not runtime_is_local(config.runtime):
62
+ return True
63
+ return False
64
+
65
+
66
+ def make_interception(
67
+ config: InterceptionConfig, *, requires_tunnel: bool
68
+ ) -> Interception:
69
+ """The interception for a config, picked by type (the host-side counterpart to
70
+ `make_runtime`). With `requires_tunnel` (some consumer is off the host network — see
71
+ the `requires_tunnel` util) each server is exposed via its configured tunnel; without
72
+ it they get none and are reached at localhost. The caller computes it (see
73
+ `Environment._requires_tunnel`)."""
74
+ if isinstance(config, InterceptionServerConfig):
75
+ return InterceptionServer(config, requires_tunnel)
76
+ if isinstance(config, StaticInterceptionPoolConfig):
77
+ return StaticInterceptionPool(config, requires_tunnel)
78
+ return ElasticInterceptionPool(config, requires_tunnel)
79
+
80
+
81
+ __all__ = [
82
+ "Interception",
83
+ "Slot",
84
+ "make_interception",
85
+ "requires_tunnel",
86
+ "InterceptionServer",
87
+ "StaticInterceptionPool",
88
+ "ElasticInterceptionPool",
89
+ "BaseInterceptionConfig",
90
+ "InterceptionConfig",
91
+ "InterceptionServerConfig",
92
+ "StaticInterceptionPoolConfig",
93
+ "ElasticInterceptionPoolConfig",
94
+ ]
@@ -0,0 +1,68 @@
1
+ """The interception contract: hand each rollout a slot on a host interception server.
2
+
3
+ Three shapes, picked by `InterceptionConfig` type (see `make_interception`): a single
4
+ `InterceptionServer`, a fixed `StaticInterceptionPool`, or an on-demand
5
+ `ElasticInterceptionPool`. From the outside they behave the same: start/stop (or the async
6
+ context manager wrapping them) bound the lifecycle — one eval, one topology run, or one
7
+ agent `.run` — and each rollout `acquire`s a slot and frees it. An `Interception` can be
8
+ shared: whoever entered it owns the lifecycle; borrowers only `acquire`.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ from abc import ABC, abstractmethod
14
+ from contextlib import AbstractAsyncContextManager, AsyncExitStack
15
+ from typing import TYPE_CHECKING, Self
16
+
17
+ from pydantic_config import BaseConfig
18
+
19
+ if TYPE_CHECKING:
20
+ from verifiers.v1.session import RolloutSession
21
+
22
+
23
+ class BaseInterceptionConfig(BaseConfig):
24
+ """Base for the interception types — the discriminated union's common type. Per-type
25
+ fields live on the subclasses (server's `tunnel`, static's `servers`, elastic's
26
+ `multiplex`)."""
27
+
28
+
29
+ # (base_url, secret): the interception server's reachable base URL for this rollout, and the
30
+ # bearer the harness/tool/user servers authenticate with. The harness reaches the model at
31
+ # `{base_url}/v1`; tool/user servers reach this rollout's shared state at `{base_url}/state`
32
+ # + `/task`. `base_url` is universally reachable — the interception is exposed (tunnel)
33
+ # whenever any consumer is remote.
34
+ Slot = tuple[str, str]
35
+
36
+
37
+ class Interception(ABC):
38
+ """How rollouts reach the host interception server. `start` brings the servers up (or
39
+ arms lazy growth), `stop` tears every server (+ its tunnel) down via `stack` — LIFO,
40
+ even if one teardown fails; `async with` wraps the two. Each rollout `acquire`s a slot
41
+ and frees it on exit."""
42
+
43
+ def __init__(self) -> None:
44
+ self.stack = AsyncExitStack()
45
+
46
+ @abstractmethod
47
+ async def start(self) -> None:
48
+ """Bring the interception up; resources land on `stack` so `stop` frees them."""
49
+
50
+ async def stop(self) -> None:
51
+ await self.stack.aclose()
52
+
53
+ async def __aenter__(self) -> Self:
54
+ try:
55
+ await self.start()
56
+ except BaseException:
57
+ # unwind whatever `start` already put on the stack
58
+ await self.stop()
59
+ raise
60
+ return self
61
+
62
+ async def __aexit__(self, *exc) -> None:
63
+ await self.stop()
64
+
65
+ @abstractmethod
66
+ def acquire(self, session: RolloutSession) -> AbstractAsyncContextManager[Slot]:
67
+ """Register `session` on a server (bringing one up if needed) and yield its `Slot`;
68
+ free it on exit."""