verifiers 0.2.1.dev21__tar.gz → 0.2.1.dev23__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 (418) hide show
  1. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/PKG-INFO +1 -1
  2. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/eval/runner.py +1 -1
  3. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/gepa.py +1 -1
  4. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/env.py +51 -23
  5. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/errors.py +1 -1
  6. verifiers-0.2.1.dev23/verifiers/v1/interception/__init__.py +94 -0
  7. verifiers-0.2.1.dev23/verifiers/v1/interception/base.py +68 -0
  8. verifiers-0.2.1.dev23/verifiers/v1/interception/pool.py +133 -0
  9. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/interception/server.py +76 -98
  10. verifiers-0.2.1.dev23/verifiers/v1/interception/tunnel/__init__.py +40 -0
  11. verifiers-0.2.1.dev23/verifiers/v1/interception/tunnel/base.py +50 -0
  12. verifiers-0.2.1.dev23/verifiers/v1/interception/tunnel/custom.py +42 -0
  13. verifiers-0.2.1.dev23/verifiers/v1/interception/tunnel/prime.py +56 -0
  14. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/mcp/launch.py +61 -41
  15. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/rollout.py +38 -37
  16. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/runtimes/__init__.py +1 -8
  17. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/runtimes/base.py +8 -96
  18. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/runtimes/docker.py +10 -0
  19. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/runtimes/limiters.py +0 -7
  20. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/runtimes/modal.py +2 -2
  21. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/runtimes/prime.py +2 -2
  22. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/serve/pool.py +1 -1
  23. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/serve/server.py +2 -2
  24. verifiers-0.2.1.dev23/verifiers/v1/session.py +100 -0
  25. verifiers-0.2.1.dev21/verifiers/v1/interception/__init__.py +0 -16
  26. verifiers-0.2.1.dev21/verifiers/v1/interception/pool.py +0 -94
  27. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/.gitignore +0 -0
  28. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/LICENSE +0 -0
  29. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/README.md +0 -0
  30. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/pyproject.toml +0 -0
  31. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/AGENTS.md +0 -0
  32. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/__init__.py +0 -0
  33. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/conftest.py +0 -0
  34. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_browser_env.py +0 -0
  35. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_build_script.py +0 -0
  36. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_cli_agent_env.py +0 -0
  37. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_client_auth_errors.py +0 -0
  38. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_client_config.py +0 -0
  39. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_client_multimodal_types.py +0 -0
  40. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_composable_env.py +0 -0
  41. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_context_token_metrics.py +0 -0
  42. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_decorator_ranks.py +0 -0
  43. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_endpoint_registry.py +0 -0
  44. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_env_group.py +0 -0
  45. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_env_server.py +0 -0
  46. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_environment.py +0 -0
  47. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_environment_extra.py +0 -0
  48. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_envs.py +0 -0
  49. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_error_chain.py +0 -0
  50. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_eval_display.py +0 -0
  51. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_eval_utils.py +0 -0
  52. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_gepa_cli.py +0 -0
  53. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_gepa_utils.py +0 -0
  54. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_gym_env.py +0 -0
  55. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_harbor_env_mcp.py +0 -0
  56. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_imports.py +0 -0
  57. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_init_script.py +0 -0
  58. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_install_utils.py +0 -0
  59. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_interception_utils.py +0 -0
  60. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_logging.py +0 -0
  61. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_math_rubric.py +0 -0
  62. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_maybe_think_parser.py +0 -0
  63. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_message_utils.py +0 -0
  64. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_message_utils_multimodal.py +0 -0
  65. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_multiturn_env.py +0 -0
  66. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_nemorl_client.py +0 -0
  67. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_openai_chat_completions_token_client.py +0 -0
  68. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_openai_responses_client.py +0 -0
  69. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_opencode_rlm_env.py +0 -0
  70. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_openenv_client.py +0 -0
  71. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_parser.py +0 -0
  72. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_path_utils.py +0 -0
  73. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_per_turn_timing.py +0 -0
  74. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_pricing_utils.py +0 -0
  75. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_prime_plugin.py +0 -0
  76. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_renderer_client.py +0 -0
  77. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_renderer_e2e.py +0 -0
  78. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_rlm_composable_env.py +0 -0
  79. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_rubric.py +0 -0
  80. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_rubric_group.py +0 -0
  81. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_sandbox_debug_env.py +0 -0
  82. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_sandbox_env.py +0 -0
  83. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_sandbox_mixin.py +0 -0
  84. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_save_utils.py +0 -0
  85. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_setup_script.py +0 -0
  86. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_singleturn_env.py +0 -0
  87. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_stateful_tool_env.py +0 -0
  88. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_think_parser.py +0 -0
  89. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_tool_env.py +0 -0
  90. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_tool_utils.py +0 -0
  91. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_trajectory_processing.py +0 -0
  92. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_tui_info_formatting.py +0 -0
  93. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_types.py +0 -0
  94. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_wordle_env.py +0 -0
  95. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_xml_parser.py +0 -0
  96. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/conftest.py +0 -0
  97. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  98. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  99. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  100. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  101. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  102. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/fixtures/echo_v0.py +0 -0
  103. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/fixtures/echo_v1.py +0 -0
  104. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/fixtures/pyproject.toml +0 -0
  105. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  106. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/test_color_codeword_tasks.py +0 -0
  107. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/test_configs.py +0 -0
  108. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/test_e2e.py +0 -0
  109. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/test_envs.py +0 -0
  110. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/test_graph.py +0 -0
  111. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/test_judges.py +0 -0
  112. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/test_legacy.py +0 -0
  113. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/test_scoring.py +0 -0
  114. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/test_taskset.py +0 -0
  115. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/test_trace.py +0 -0
  116. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/__init__.py +0 -0
  117. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/__init__.py +0 -0
  118. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/commands/__init__.py +0 -0
  119. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/commands/build.py +0 -0
  120. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/commands/eval.py +0 -0
  121. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/commands/gepa.py +0 -0
  122. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/commands/init.py +0 -0
  123. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/commands/install.py +0 -0
  124. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/commands/setup.py +0 -0
  125. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/plugins/__init__.py +0 -0
  126. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/plugins/prime.py +0 -0
  127. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/tui.py +0 -0
  128. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/clients/__init__.py +0 -0
  129. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/clients/anthropic_messages_client.py +0 -0
  130. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/clients/client.py +0 -0
  131. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  132. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/clients/openai_chat_completions_client.py +0 -0
  133. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  134. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/clients/openai_completions_client.py +0 -0
  135. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/clients/openai_responses_client.py +0 -0
  136. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/clients/renderer_client.py +0 -0
  137. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/decorators.py +0 -0
  138. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/AGENTS.md +0 -0
  139. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/__init__.py +0 -0
  140. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/env_group.py +0 -0
  141. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/environment.py +0 -0
  142. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/README.md +0 -0
  143. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/__init__.py +0 -0
  144. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  145. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/README.md +0 -0
  146. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/__init__.py +0 -0
  147. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/_filter.py +0 -0
  148. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  149. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/harness.py +0 -0
  150. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  151. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  152. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  153. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  154. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  155. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  156. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  157. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/task.py +0 -0
  158. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  159. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  160. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  161. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  162. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  163. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  164. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  165. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  166. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  167. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  168. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
  169. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
  170. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
  171. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
  172. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
  173. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
  174. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
  175. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
  176. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
  177. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
  178. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
  179. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
  180. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
  181. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
  182. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
  183. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
  184. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
  185. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
  186. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
  187. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
  188. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
  189. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
  190. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
  191. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
  192. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
  193. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
  194. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
  195. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
  196. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
  197. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  198. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  199. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  200. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  201. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  202. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  203. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  204. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  205. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  206. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  207. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  208. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  209. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  210. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  211. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  212. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  213. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  214. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  215. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  216. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  217. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  218. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  219. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  220. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  221. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/gym_env.py +0 -0
  222. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  223. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  224. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  225. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/mcp_env.py +0 -0
  226. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/opencode_env.py +0 -0
  227. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  228. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  229. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  230. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/utils/__init__.py +0 -0
  231. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  232. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  233. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/README.md +0 -0
  234. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/__init__.py +0 -0
  235. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/browser_env/README.md +0 -0
  236. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  237. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  238. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  239. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  240. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  241. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  242. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/openenv_env.py +0 -0
  243. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  244. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/textarena_env.py +0 -0
  245. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/multiturn_env.py +0 -0
  246. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/python_env.py +0 -0
  247. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/sandbox_env.py +0 -0
  248. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/singleturn_env.py +0 -0
  249. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/stateful_tool_env.py +0 -0
  250. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/tool_env.py +0 -0
  251. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/errors.py +0 -0
  252. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/gepa/__init__.py +0 -0
  253. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/gepa/adapter.py +0 -0
  254. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/gepa/config.py +0 -0
  255. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/gepa/display.py +0 -0
  256. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/gepa/gepa_utils.py +0 -0
  257. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/parsers/__init__.py +0 -0
  258. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/parsers/maybe_think_parser.py +0 -0
  259. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/parsers/parser.py +0 -0
  260. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/parsers/think_parser.py +0 -0
  261. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/parsers/xml_parser.py +0 -0
  262. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/rubrics/__init__.py +0 -0
  263. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  264. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/rubrics/judge_rubric.py +0 -0
  265. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/rubrics/math_rubric.py +0 -0
  266. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/rubrics/rubric.py +0 -0
  267. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/rubrics/rubric_group.py +0 -0
  268. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/scripts/__init__.py +0 -0
  269. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/scripts/build.py +0 -0
  270. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/scripts/eval.py +0 -0
  271. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/scripts/gepa.py +0 -0
  272. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/scripts/init.py +0 -0
  273. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/scripts/install.py +0 -0
  274. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/scripts/setup.py +0 -0
  275. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/scripts/tui.py +0 -0
  276. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/serve/__init__.py +0 -0
  277. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/serve/client/env_client.py +0 -0
  278. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/serve/client/zmq_env_client.py +0 -0
  279. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/serve/server/__init__.py +0 -0
  280. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/serve/server/env_router.py +0 -0
  281. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/serve/server/env_server.py +0 -0
  282. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/serve/server/env_worker.py +0 -0
  283. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/serve/server/zmq_env_server.py +0 -0
  284. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/serve/types.py +0 -0
  285. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/types.py +0 -0
  286. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/__init__.py +0 -0
  287. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/async_utils.py +0 -0
  288. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/client_utils.py +0 -0
  289. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/config_utils.py +0 -0
  290. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/data_utils.py +0 -0
  291. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/display_utils.py +0 -0
  292. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/env_config_utils.py +0 -0
  293. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/env_utils.py +0 -0
  294. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/error_utils.py +0 -0
  295. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/eval_display.py +0 -0
  296. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/eval_utils.py +0 -0
  297. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/heartbeat.py +0 -0
  298. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/import_utils.py +0 -0
  299. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/install_utils.py +0 -0
  300. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/interception_utils.py +0 -0
  301. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/logging_utils.py +0 -0
  302. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/message_utils.py +0 -0
  303. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/metric_utils.py +0 -0
  304. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/path_utils.py +0 -0
  305. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/pricing_utils.py +0 -0
  306. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/process_utils.py +0 -0
  307. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/response_utils.py +0 -0
  308. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/save_utils.py +0 -0
  309. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/serve_utils.py +0 -0
  310. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/thread_utils.py +0 -0
  311. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/threaded_sandbox_client.py +0 -0
  312. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/tool_utils.py +0 -0
  313. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/usage_utils.py +0 -0
  314. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/version_utils.py +0 -0
  315. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/__init__.py +0 -0
  316. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/__init__.py +0 -0
  317. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  318. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/dashboard/base.py +0 -0
  319. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/dashboard/eval.py +0 -0
  320. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/dashboard/replay.py +0 -0
  321. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/dashboard/validate.py +0 -0
  322. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/debug.py +0 -0
  323. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/eval/__init__.py +0 -0
  324. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/eval/main.py +0 -0
  325. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/eval/resume.py +0 -0
  326. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/init.py +0 -0
  327. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/output.py +0 -0
  328. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/replay.py +0 -0
  329. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/resolve.py +0 -0
  330. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/serve.py +0 -0
  331. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/validate.py +0 -0
  332. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/clients/__init__.py +0 -0
  333. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/clients/client.py +0 -0
  334. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/clients/config.py +0 -0
  335. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/clients/eval.py +0 -0
  336. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/clients/train.py +0 -0
  337. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/configs/__init__.py +0 -0
  338. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/configs/debug.py +0 -0
  339. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/configs/eval.py +0 -0
  340. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/configs/init.py +0 -0
  341. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/configs/replay.py +0 -0
  342. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/configs/serve.py +0 -0
  343. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/configs/validate.py +0 -0
  344. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/decorators.py +0 -0
  345. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/dialects/__init__.py +0 -0
  346. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/dialects/anthropic.py +0 -0
  347. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/dialects/base.py +0 -0
  348. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/dialects/chat.py +0 -0
  349. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/dialects/responses.py +0 -0
  350. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/episode.py +0 -0
  351. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/gepa/__init__.py +0 -0
  352. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/gepa/adapter.py +0 -0
  353. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/gepa/config.py +0 -0
  354. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/gepa/dataset.py +0 -0
  355. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/gepa/reflection.py +0 -0
  356. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/gepa/runner.py +0 -0
  357. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/graph.py +0 -0
  358. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harness.py +0 -0
  359. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/__init__.py +0 -0
  360. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  361. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/codex/harness.py +0 -0
  362. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/default/__init__.py +0 -0
  363. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/default/harness.py +0 -0
  364. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/default/program.py +0 -0
  365. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  366. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  367. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  368. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  369. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  370. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/null/__init__.py +0 -0
  371. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/null/harness.py +0 -0
  372. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/null/program.py +0 -0
  373. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  374. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  375. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  376. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  377. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  378. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/judge.py +0 -0
  379. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/judges/__init__.py +0 -0
  380. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/judges/reference.py +0 -0
  381. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/judges/reference.txt +0 -0
  382. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/judges/rubric.py +0 -0
  383. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/judges/rubric.txt +0 -0
  384. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/legacy.py +0 -0
  385. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/loaders.py +0 -0
  386. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/mcp/__init__.py +0 -0
  387. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/mcp/server.py +0 -0
  388. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/mcp/toolset.py +0 -0
  389. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/mcp/user.py +0 -0
  390. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/push.py +0 -0
  391. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/retries.py +0 -0
  392. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/runtimes/subprocess.py +0 -0
  393. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/scoring.py +0 -0
  394. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/serve/__init__.py +0 -0
  395. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/serve/client.py +0 -0
  396. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/serve/types.py +0 -0
  397. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/state.py +0 -0
  398. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/task.py +0 -0
  399. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/taskset.py +0 -0
  400. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/tasksets/__init__.py +0 -0
  401. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  402. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  403. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  404. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  405. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  406. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  407. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  408. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/trace.py +0 -0
  409. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/types.py +0 -0
  410. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/utils/__init__.py +0 -0
  411. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/utils/aio.py +0 -0
  412. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/utils/format.py +0 -0
  413. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/utils/generic.py +0 -0
  414. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/utils/install.py +0 -0
  415. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/utils/interrupt.py +0 -0
  416. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/utils/logging.py +0 -0
  417. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/utils/memory.py +0 -0
  418. {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/utils/sampling.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.2.1.dev21
3
+ Version: 0.2.1.dev23
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
@@ -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():
@@ -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
 
@@ -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
@@ -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."""
@@ -0,0 +1,133 @@
1
+ """Pools of shared interception servers, so N concurrent rollouts need ~N/multiplex
2
+ servers + tunnels rather than one each.
3
+
4
+ Behind a remote consumer each interception server needs a tunnel, and prime tunnel creation
5
+ is rate-capped per API token — so one-tunnel-per-rollout caps how wide a remote eval (or env
6
+ server) can fan out. Each shared `InterceptionServer` multiplexes rollouts behind one
7
+ tunnel; the harness is unchanged, authenticating with a per-rollout secret the server routes
8
+ by. Two shapes: `ElasticInterceptionPool` grows servers on demand (`multiplex` rollouts
9
+ each, always prime tunnels — the only kind the framework can mint) and fits both the bounded
10
+ eval runner and the env server's unbounded request load; `StaticInterceptionPool` is a fixed
11
+ set of servers (each with its own tunnel choice, e.g. bring-your-own endpoints), balanced
12
+ least-loaded.
13
+ """
14
+
15
+ import asyncio
16
+ import logging
17
+ from collections.abc import AsyncIterator
18
+ from contextlib import asynccontextmanager
19
+ from typing import Literal
20
+
21
+ from pydantic import Field
22
+
23
+ from verifiers.v1.interception.base import BaseInterceptionConfig, Interception, Slot
24
+ from verifiers.v1.interception.server import (
25
+ InterceptionServer,
26
+ InterceptionServerConfig,
27
+ )
28
+ from verifiers.v1.interception.tunnel import PrimeTunnelConfig
29
+ from verifiers.v1.session import RolloutSession
30
+
31
+ logger = logging.getLogger(__name__)
32
+
33
+
34
+ class StaticInterceptionPoolConfig(BaseInterceptionConfig):
35
+ """A fixed set of interception servers, each configured like a `server` type; rollouts
36
+ land on the least-loaded one. The shape for multiple bring-your-own endpoints (one
37
+ `custom` tunnel per server)."""
38
+
39
+ type: Literal["static"] = "static"
40
+ servers: list[InterceptionServerConfig] = Field(min_length=1)
41
+ """One entry per server, each with its own `tunnel` choice."""
42
+
43
+
44
+ class StaticInterceptionPool(Interception):
45
+ """A fixed set of interception servers, all started up front; `acquire` hands a rollout
46
+ a slot on the least-loaded one. No capacity cap — sizing the set to the load is the
47
+ operator's call (it's the shape for pre-provisioned/bring-your-own endpoints)."""
48
+
49
+ def __init__(
50
+ self, config: StaticInterceptionPoolConfig, requires_tunnel: bool = False
51
+ ) -> None:
52
+ super().__init__()
53
+ self.config = config
54
+ self.servers = [
55
+ InterceptionServer(server, requires_tunnel) for server in config.servers
56
+ ]
57
+
58
+ async def start(self) -> None:
59
+ for server in self.servers:
60
+ await self.stack.enter_async_context(server)
61
+
62
+ @asynccontextmanager
63
+ async def acquire(self, session: RolloutSession) -> AsyncIterator[Slot]:
64
+ # min + register have no await between them, so concurrent acquires can't all
65
+ # land on the same "least-loaded" server.
66
+ server = min(self.servers, key=lambda s: s.load)
67
+ secret = server.register(session)
68
+ try:
69
+ yield server.base_url, secret
70
+ finally:
71
+ server.unregister(secret)
72
+
73
+
74
+ class ElasticInterceptionPoolConfig(BaseInterceptionConfig):
75
+ """Interception servers grown on demand: `multiplex` rollouts share one server (and,
76
+ behind a remote consumer, one prime tunnel). The default."""
77
+
78
+ type: Literal["elastic"] = "elastic"
79
+ multiplex: int = Field(32, ge=1)
80
+ """Rollouts that share one interception server (and tunnel). N concurrent rollouts use
81
+ ~N/multiplex servers + tunnels instead of one each — key past the per-token tunnel cap.
82
+ 1 = a server (+ tunnel) per rollout."""
83
+
84
+
85
+ class ElasticInterceptionPool(Interception):
86
+ """Interception servers grown on demand: `multiplex` rollouts share one server (one
87
+ prime tunnel behind a remote consumer); `acquire` hands a rollout a slot on one,
88
+ bringing up a new server when all are at capacity."""
89
+
90
+ def __init__(
91
+ self,
92
+ config: ElasticInterceptionPoolConfig | None = None,
93
+ requires_tunnel: bool = False,
94
+ ) -> None:
95
+ super().__init__()
96
+ self.config = config or ElasticInterceptionPoolConfig()
97
+ self.requires_tunnel = requires_tunnel
98
+ self.servers: list[InterceptionServer] = []
99
+ self._lock = asyncio.Lock()
100
+
101
+ async def start(self) -> None:
102
+ pass # servers are brought up lazily in `acquire`, on `stack`
103
+
104
+ async def _server(self) -> InterceptionServer:
105
+ """A server with spare capacity — reuse one under `multiplex`, else bring up a new
106
+ one (its own tunnel, on `stack`, torn down with the pool). The caller holds
107
+ `_lock`."""
108
+ for server in self.servers:
109
+ if server.load < self.config.multiplex:
110
+ return server
111
+ # Pin prime explicitly — the only tunnel kind that can be minted on demand.
112
+ server = InterceptionServer(
113
+ InterceptionServerConfig(tunnel=PrimeTunnelConfig()), self.requires_tunnel
114
+ )
115
+ await self.stack.enter_async_context(server)
116
+ self.servers.append(server)
117
+ logger.info(
118
+ "interception pool: %d server(s), multiplex=%d",
119
+ len(self.servers),
120
+ self.config.multiplex,
121
+ )
122
+ return server
123
+
124
+ @asynccontextmanager
125
+ async def acquire(self, session: RolloutSession) -> AsyncIterator[Slot]:
126
+ # Register under the lock so concurrent acquires see each other's load.
127
+ async with self._lock:
128
+ server = await self._server()
129
+ secret = server.register(session)
130
+ try:
131
+ yield server.base_url, secret
132
+ finally:
133
+ server.unregister(secret)