verifiers 0.2.2.dev71__tar.gz → 0.2.2.dev73__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 (429) hide show
  1. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/PKG-INFO +1 -1
  2. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/conftest.py +9 -12
  3. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/test_e2e.py +1 -1
  4. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/agent.py +11 -27
  5. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/cli/eval/runner.py +4 -4
  6. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/clients/__init__.py +4 -5
  7. verifiers-0.2.2.dev73/verifiers/v1/clients/base.py +40 -0
  8. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/clients/client.py +23 -18
  9. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/clients/eval.py +19 -42
  10. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/clients/train.py +205 -93
  11. verifiers-0.2.2.dev71/verifiers/v1/clients/config.py → verifiers-0.2.2.dev73/verifiers/v1/configs/client.py +13 -37
  12. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/env.py +2 -17
  13. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/gepa/runner.py +5 -8
  14. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/claude_code/harness.py +0 -3
  15. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/interception/server.py +3 -3
  16. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/judge.py +1 -1
  17. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/legacy.py +9 -2
  18. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/rollout.py +13 -4
  19. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/serve/client.py +1 -1
  20. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/serve/server.py +6 -21
  21. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/serve/types.py +1 -1
  22. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/session.py +2 -1
  23. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/tasksets/harbor/taskset.py +33 -4
  24. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/.gitignore +0 -0
  25. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/LICENSE +0 -0
  26. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/README.md +0 -0
  27. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/pyproject.toml +0 -0
  28. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/__init__.py +0 -0
  29. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/conftest.py +0 -0
  30. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_browser_env.py +0 -0
  31. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_build_script.py +0 -0
  32. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_cli_agent_env.py +0 -0
  33. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_client_auth_errors.py +0 -0
  34. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_client_config.py +0 -0
  35. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_client_multimodal_types.py +0 -0
  36. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_composable_env.py +0 -0
  37. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_context_token_metrics.py +0 -0
  38. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_decorator_ranks.py +0 -0
  39. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_endpoint_registry.py +0 -0
  40. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_env_group.py +0 -0
  41. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_env_server.py +0 -0
  42. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_environment.py +0 -0
  43. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_environment_extra.py +0 -0
  44. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_error_chain.py +0 -0
  45. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_eval_display.py +0 -0
  46. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_eval_utils.py +0 -0
  47. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_gepa_cli.py +0 -0
  48. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_gepa_utils.py +0 -0
  49. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_gym_env.py +0 -0
  50. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_harbor_env_mcp.py +0 -0
  51. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_imports.py +0 -0
  52. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_init_script.py +0 -0
  53. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_install_utils.py +0 -0
  54. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_interception_utils.py +0 -0
  55. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_logging.py +0 -0
  56. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_math_rubric.py +0 -0
  57. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_maybe_think_parser.py +0 -0
  58. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_message_utils.py +0 -0
  59. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_message_utils_multimodal.py +0 -0
  60. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_multiturn_env.py +0 -0
  61. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_nemorl_client.py +0 -0
  62. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_openai_chat_completions_token_client.py +0 -0
  63. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_openai_responses_client.py +0 -0
  64. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_opencode_rlm_env.py +0 -0
  65. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_openenv_client.py +0 -0
  66. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_parser.py +0 -0
  67. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_path_utils.py +0 -0
  68. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_per_turn_timing.py +0 -0
  69. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_pricing_utils.py +0 -0
  70. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_prime_plugin.py +0 -0
  71. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_renderer_client.py +0 -0
  72. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_renderer_e2e.py +0 -0
  73. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_rlm_composable_env.py +0 -0
  74. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_rubric.py +0 -0
  75. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_rubric_group.py +0 -0
  76. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_sandbox_debug_env.py +0 -0
  77. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_sandbox_env.py +0 -0
  78. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_sandbox_mixin.py +0 -0
  79. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_save_utils.py +0 -0
  80. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_setup_script.py +0 -0
  81. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_singleturn_env.py +0 -0
  82. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_stateful_tool_env.py +0 -0
  83. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_think_parser.py +0 -0
  84. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_tool_env.py +0 -0
  85. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_tool_utils.py +0 -0
  86. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_trajectory_processing.py +0 -0
  87. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_tui_info_formatting.py +0 -0
  88. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_types.py +0 -0
  89. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/test_xml_parser.py +0 -0
  90. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  91. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/fixtures/duet_v1.py +0 -0
  92. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  93. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  94. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  95. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  96. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  97. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/fixtures/echo_v0.py +0 -0
  98. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/fixtures/echo_v1.py +0 -0
  99. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/fixtures/pyproject.toml +0 -0
  100. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  101. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/test_color_codeword_tasks.py +0 -0
  102. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/test_configs.py +0 -0
  103. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/test_envs.py +0 -0
  104. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/test_graph.py +0 -0
  105. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/test_judges.py +0 -0
  106. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/test_legacy.py +0 -0
  107. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/test_scoring.py +0 -0
  108. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/test_taskset.py +0 -0
  109. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/tests/v1/test_trace.py +0 -0
  110. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/__init__.py +0 -0
  111. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/cli/__init__.py +0 -0
  112. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/cli/commands/__init__.py +0 -0
  113. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/cli/commands/build.py +0 -0
  114. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/cli/commands/eval.py +0 -0
  115. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/cli/commands/gepa.py +0 -0
  116. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/cli/commands/init.py +0 -0
  117. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/cli/commands/install.py +0 -0
  118. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/cli/commands/setup.py +0 -0
  119. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/cli/plugins/__init__.py +0 -0
  120. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/cli/plugins/prime.py +0 -0
  121. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/cli/tui.py +0 -0
  122. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/clients/__init__.py +0 -0
  123. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/clients/anthropic_messages_client.py +0 -0
  124. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/clients/client.py +0 -0
  125. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  126. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/clients/openai_chat_completions_client.py +0 -0
  127. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  128. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/clients/openai_completions_client.py +0 -0
  129. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/clients/openai_responses_client.py +0 -0
  130. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/clients/renderer_client.py +0 -0
  131. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/decorators.py +0 -0
  132. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/__init__.py +0 -0
  133. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/env_group.py +0 -0
  134. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/environment.py +0 -0
  135. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/README.md +0 -0
  136. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/__init__.py +0 -0
  137. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  138. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/README.md +0 -0
  139. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/__init__.py +0 -0
  140. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/_filter.py +0 -0
  141. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  142. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/harness.py +0 -0
  143. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  144. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  145. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  146. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  147. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  148. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  149. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  150. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/task.py +0 -0
  151. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  152. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  153. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  154. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  155. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  156. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  157. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  158. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  159. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  160. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  161. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  162. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  163. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  164. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  165. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  166. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  167. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  168. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  169. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  170. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  171. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  172. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  173. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  174. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  175. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  176. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  177. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  178. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  179. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  180. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  181. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  182. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  183. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  184. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  185. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/gym_env.py +0 -0
  186. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  187. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  188. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  189. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/mcp_env.py +0 -0
  190. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/opencode_env.py +0 -0
  191. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  192. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  193. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  194. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/utils/__init__.py +0 -0
  195. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  196. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  197. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/integrations/README.md +0 -0
  198. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/integrations/__init__.py +0 -0
  199. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/integrations/browser_env/README.md +0 -0
  200. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  201. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  202. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  203. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  204. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  205. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  206. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/integrations/openenv_env.py +0 -0
  207. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  208. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/integrations/textarena_env.py +0 -0
  209. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/multiturn_env.py +0 -0
  210. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/python_env.py +0 -0
  211. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/sandbox_env.py +0 -0
  212. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/singleturn_env.py +0 -0
  213. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/stateful_tool_env.py +0 -0
  214. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/envs/tool_env.py +0 -0
  215. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/errors.py +0 -0
  216. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/gepa/__init__.py +0 -0
  217. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/gepa/adapter.py +0 -0
  218. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/gepa/config.py +0 -0
  219. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/gepa/display.py +0 -0
  220. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/gepa/gepa_utils.py +0 -0
  221. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/parsers/__init__.py +0 -0
  222. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/parsers/maybe_think_parser.py +0 -0
  223. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/parsers/parser.py +0 -0
  224. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/parsers/think_parser.py +0 -0
  225. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/parsers/xml_parser.py +0 -0
  226. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/rubrics/__init__.py +0 -0
  227. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  228. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/rubrics/judge_rubric.py +0 -0
  229. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/rubrics/math_rubric.py +0 -0
  230. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/rubrics/rubric.py +0 -0
  231. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/rubrics/rubric_group.py +0 -0
  232. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/scripts/__init__.py +0 -0
  233. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/scripts/build.py +0 -0
  234. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/scripts/eval.py +0 -0
  235. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/scripts/gepa.py +0 -0
  236. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/scripts/init.py +0 -0
  237. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/scripts/install.py +0 -0
  238. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/scripts/setup.py +0 -0
  239. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/scripts/tui.py +0 -0
  240. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/serve/__init__.py +0 -0
  241. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/serve/client/env_client.py +0 -0
  242. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/serve/client/zmq_env_client.py +0 -0
  243. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/serve/server/__init__.py +0 -0
  244. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/serve/server/env_router.py +0 -0
  245. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/serve/server/env_server.py +0 -0
  246. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/serve/server/env_worker.py +0 -0
  247. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/serve/server/zmq_env_server.py +0 -0
  248. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/serve/types.py +0 -0
  249. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/types.py +0 -0
  250. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/__init__.py +0 -0
  251. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/async_utils.py +0 -0
  252. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/client_utils.py +0 -0
  253. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/config_utils.py +0 -0
  254. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/data_utils.py +0 -0
  255. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/display_utils.py +0 -0
  256. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/env_config_utils.py +0 -0
  257. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/env_utils.py +0 -0
  258. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/error_utils.py +0 -0
  259. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/eval_display.py +0 -0
  260. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/eval_utils.py +0 -0
  261. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/heartbeat.py +0 -0
  262. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/import_utils.py +0 -0
  263. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/install_utils.py +0 -0
  264. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/interception_utils.py +0 -0
  265. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/logging_utils.py +0 -0
  266. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/message_utils.py +0 -0
  267. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/metric_utils.py +0 -0
  268. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/path_utils.py +0 -0
  269. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/pricing_utils.py +0 -0
  270. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/process_utils.py +0 -0
  271. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/response_utils.py +0 -0
  272. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/save_utils.py +0 -0
  273. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/serve_utils.py +0 -0
  274. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/thread_utils.py +0 -0
  275. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/threaded_sandbox_client.py +0 -0
  276. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/tool_utils.py +0 -0
  277. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/usage_utils.py +0 -0
  278. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/utils/version_utils.py +0 -0
  279. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/__init__.py +0 -0
  280. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/acp/__init__.py +0 -0
  281. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/acp/_runner.py +0 -0
  282. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/cli/__init__.py +0 -0
  283. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  284. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/cli/dashboard/base.py +0 -0
  285. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/cli/dashboard/eval.py +0 -0
  286. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/cli/dashboard/replay.py +0 -0
  287. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/cli/dashboard/validate.py +0 -0
  288. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/cli/debug.py +0 -0
  289. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/cli/eval/__init__.py +0 -0
  290. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/cli/eval/main.py +0 -0
  291. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/cli/eval/resume.py +0 -0
  292. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/cli/gepa.py +0 -0
  293. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/cli/init.py +0 -0
  294. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/cli/output.py +0 -0
  295. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/cli/replay.py +0 -0
  296. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/cli/resolve.py +0 -0
  297. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/cli/serve.py +0 -0
  298. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/cli/validate.py +0 -0
  299. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/configs/__init__.py +0 -0
  300. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/configs/agent.py +0 -0
  301. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/configs/cli/__init__.py +0 -0
  302. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/configs/cli/debug.py +0 -0
  303. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/configs/cli/env.py +0 -0
  304. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/configs/cli/eval.py +0 -0
  305. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/configs/cli/init.py +0 -0
  306. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/configs/cli/replay.py +0 -0
  307. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/configs/cli/serve.py +0 -0
  308. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/configs/cli/validate.py +0 -0
  309. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/configs/env.py +0 -0
  310. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/configs/harness.py +0 -0
  311. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/configs/judge.py +0 -0
  312. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/configs/legacy.py +0 -0
  313. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/configs/retries.py +0 -0
  314. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/configs/serve.py +0 -0
  315. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/configs/task.py +0 -0
  316. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/configs/taskset.py +0 -0
  317. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/dialects/__init__.py +0 -0
  318. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/dialects/anthropic.py +0 -0
  319. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/dialects/base.py +0 -0
  320. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/dialects/chat.py +0 -0
  321. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/dialects/responses.py +0 -0
  322. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/envs/__init__.py +0 -0
  323. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  324. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  325. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  326. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/envs/best_of_n/env.py +0 -0
  327. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  328. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/envs/single_agent/env.py +0 -0
  329. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  330. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/envs/user_sim/env.py +0 -0
  331. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/episode.py +0 -0
  332. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/errors.py +0 -0
  333. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/gepa/__init__.py +0 -0
  334. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/gepa/adapter.py +0 -0
  335. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/gepa/config.py +0 -0
  336. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/gepa/dataset.py +0 -0
  337. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/gepa/reflection.py +0 -0
  338. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/graph.py +0 -0
  339. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harness.py +0 -0
  340. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/__init__.py +0 -0
  341. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  342. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/bash/harness.py +0 -0
  343. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/bash/program.py +0 -0
  344. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  345. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  346. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  347. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  348. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  349. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/codex/harness.py +0 -0
  350. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  351. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  352. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  353. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  354. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  355. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  356. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  357. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  358. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/null/__init__.py +0 -0
  359. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/null/harness.py +0 -0
  360. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/null/program.py +0 -0
  361. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  362. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  363. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  364. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/pi/harness.py +0 -0
  365. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  366. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/pool/harness.py +0 -0
  367. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  368. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  369. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  370. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  371. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  372. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/interception/__init__.py +0 -0
  373. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/interception/base.py +0 -0
  374. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/interception/pool.py +0 -0
  375. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  376. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/interception/tunnel/base.py +0 -0
  377. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/interception/tunnel/custom.py +0 -0
  378. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/interception/tunnel/prime.py +0 -0
  379. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/judges/__init__.py +0 -0
  380. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/judges/reference.py +0 -0
  381. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/judges/reference.txt +0 -0
  382. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/judges/rubric.py +0 -0
  383. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/judges/rubric.txt +0 -0
  384. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/mcp/__init__.py +0 -0
  385. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/mcp/launch.py +0 -0
  386. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/mcp/server.py +0 -0
  387. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/mcp/toolset.py +0 -0
  388. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/runtimes/__init__.py +0 -0
  389. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/runtimes/base.py +0 -0
  390. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  391. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/runtimes/docker/egress.py +0 -0
  392. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/runtimes/limiters.py +0 -0
  393. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/runtimes/modal.py +0 -0
  394. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/runtimes/prime.py +0 -0
  395. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/runtimes/subprocess.py +0 -0
  396. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/serve/__init__.py +0 -0
  397. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/serve/pool.py +0 -0
  398. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/state.py +0 -0
  399. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/task.py +0 -0
  400. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/taskset.py +0 -0
  401. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/tasksets/__init__.py +0 -0
  402. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  403. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  404. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  405. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  406. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  407. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  408. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  409. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  410. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/trace.py +0 -0
  411. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/types.py +0 -0
  412. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/utils/__init__.py +0 -0
  413. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/utils/aio.py +0 -0
  414. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/utils/artifacts.py +0 -0
  415. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/utils/compile.py +0 -0
  416. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/utils/decorators.py +0 -0
  417. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/utils/format.py +0 -0
  418. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/utils/generic.py +0 -0
  419. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/utils/git.py +0 -0
  420. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/utils/image.py +0 -0
  421. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/utils/install.py +0 -0
  422. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/utils/interrupt.py +0 -0
  423. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/utils/loaders.py +0 -0
  424. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/utils/logging.py +0 -0
  425. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/utils/memory.py +0 -0
  426. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/utils/platform.py +0 -0
  427. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/utils/retries.py +0 -0
  428. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/utils/score.py +0 -0
  429. {verifiers-0.2.2.dev71 → verifiers-0.2.2.dev73}/verifiers/v1/utils/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.2.2.dev71
3
+ Version: 0.2.2.dev73
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
@@ -216,20 +216,17 @@ def run_v1_server():
216
216
 
217
217
  @pytest.fixture
218
218
  async def live_ctx():
219
- """A live `ModelContext` (the e2e default model + endpoint, provider-default
220
- sampling) for driving `Agent` directly — the agent-surface counterpart of `run_v1`."""
221
- from verifiers.v1.clients import EvalClientConfig, ModelContext, resolve_client
219
+ """The e2e `ModelContext` (default model + endpoint config, provider-default sampling)
220
+ for driving `Agent` directly — the agent-surface counterpart of `run_v1`."""
221
+ from verifiers.v1.clients import EvalClientConfig, ModelContext
222
222
  from verifiers.v1.types import SamplingConfig
223
223
 
224
- client = resolve_client(EvalClientConfig())
225
- try:
226
- yield ModelContext(
227
- model="deepseek/deepseek-v4-flash-0731",
228
- client=client,
229
- sampling=SamplingConfig(max_tokens=2048),
230
- )
231
- finally:
232
- await client.close()
224
+ # Endpoint config only — each rollout builds and closes its own client.
225
+ yield ModelContext(
226
+ model="deepseek/deepseek-v4-flash-0731",
227
+ client=EvalClientConfig(),
228
+ sampling=SamplingConfig(max_tokens=2048),
229
+ )
233
230
 
234
231
 
235
232
  @pytest.fixture
@@ -180,8 +180,8 @@ async def test_interaction(live_ctx):
180
180
  harness=NullHarnessConfig(id="null"),
181
181
  model=live_ctx.model,
182
182
  sampling=live_ctx.sampling,
183
+ client=live_ctx.client,
183
184
  ),
184
- client=live_ctx.client,
185
185
  )
186
186
  task = vf.Task(
187
187
  vf.TaskData(
@@ -15,10 +15,8 @@ from dataclasses import dataclass
15
15
  from typing import Self
16
16
 
17
17
  from verifiers.v1.clients import (
18
- Client,
19
18
  EvalClientConfig,
20
19
  ModelContext,
21
- resolve_client,
22
20
  )
23
21
  from verifiers.v1.configs.agent import AgentConfig, TimeoutConfig
24
22
  from verifiers.v1.dialects import parse_message
@@ -228,10 +226,10 @@ class Interaction:
228
226
  class Agent:
229
227
  """A configured harness + model + runtime policy, runnable on any task.
230
228
 
231
- Built from an `AgentConfig` alone; `client=`/`interception=` inject live
232
- resources to borrow — agents on one endpoint should share one `Client`, and a
233
- live `Interception`'s owner keeps its lifecycle. The config's `runtime` is a
234
- *policy*: each `run` provisions a fresh box from it, resolved
229
+ Built from an `AgentConfig` alone; `interception=` injects a live resource to
230
+ borrow — its owner keeps the lifecycle. The endpoint stays config: each rollout
231
+ builds and closes its own `Client`, so an agent holds no transport. The config's
232
+ `runtime` is a *policy*: each `run` provisions a fresh box from it, resolved
235
233
  per task; `run(runtime=...)` places the run into an existing box instead
236
234
  (borrowed boxes are never started or torn down by the run)."""
237
235
 
@@ -239,7 +237,6 @@ class Agent:
239
237
  self,
240
238
  config: AgentConfig,
241
239
  *,
242
- client: Client | None = None,
243
240
  interception: Interception | None = None,
244
241
  ) -> None:
245
242
  from verifiers.v1.utils.loaders import harness_config_type, load_harness
@@ -259,12 +256,9 @@ class Agent:
259
256
  config = config.model_copy(update={"sampling": Sampling()})
260
257
  self.config = config
261
258
  self.harness = load_harness(config.harness)
262
- self._owns_client = client is None
263
- if self._owns_client:
264
- client = resolve_client(config.client or EvalClientConfig())
265
259
  self.ctx = ModelContext(
266
260
  model=config.model,
267
- client=client,
261
+ client=config.client or EvalClientConfig(),
268
262
  sampling=config.sampling,
269
263
  )
270
264
  self._closed = False
@@ -306,22 +300,14 @@ class Agent:
306
300
  # A failed __aenter__ gets no __aexit__ from `async with`: unwind
307
301
  # here, or the agent stays "already entered" forever.
308
302
  self._entered, self._server = False, None
309
- if self._owns_client:
310
- self._closed = True
311
- await self.ctx.client.close()
312
303
  raise
313
304
  return self
314
305
 
315
306
  async def __aexit__(self, *exc) -> None:
316
307
  self._entered = False
317
308
  server, self._server = self._server, None
318
- try:
319
- if server is not None:
320
- await server.__aexit__(*exc)
321
- finally:
322
- if self._owns_client:
323
- self._closed = True
324
- await self.ctx.client.close()
309
+ if server is not None:
310
+ await server.__aexit__(*exc)
325
311
 
326
312
  def _interception_for(
327
313
  self, run_is_local: bool, task: Task, shared_tools: Mapping
@@ -584,7 +570,6 @@ class _EpisodeAgent(Agent):
584
570
  self,
585
571
  config: AgentConfig,
586
572
  *,
587
- client: Client,
588
573
  interception: Interception | None,
589
574
  name: str,
590
575
  shared_tools: Mapping[str, SharedToolServer],
@@ -595,7 +580,7 @@ class _EpisodeAgent(Agent):
595
580
  on_discard: Callable[[Trace], None] | None,
596
581
  warned_resources: set,
597
582
  ) -> None:
598
- super().__init__(config, client=client, interception=interception)
583
+ super().__init__(config, interception=interception)
599
584
  # Resource warnings dedupe env-wide, not per episode.
600
585
  self._warned_resources = warned_resources
601
586
  self._name = name
@@ -690,12 +675,11 @@ class _EpisodeAgent(Agent):
690
675
  def make_agent(
691
676
  config: AgentConfig,
692
677
  *,
693
- client: Client | None = None,
694
678
  interception: Interception | None = None,
695
679
  ) -> Agent:
696
- """The agent for a config; `client`/`interception` inject live resources to
697
- borrow, everything else comes from the config."""
698
- return Agent(config, client=client, interception=interception)
680
+ """The agent for a config; `interception` injects a live resource to borrow,
681
+ everything else comes from the config."""
682
+ return Agent(config, interception=interception)
699
683
 
700
684
 
701
685
  MakeAgent = Callable[[str, AgentConfig], Agent]
@@ -14,7 +14,7 @@ from verifiers.v1.cli.output import (
14
14
  output_path,
15
15
  save_config,
16
16
  )
17
- from verifiers.v1.clients import ModelContext, resolve_client
17
+ from verifiers.v1.clients import ModelContext
18
18
  from verifiers.v1.configs.cli.eval import EvalConfig
19
19
  from verifiers.v1.env import Env, RunSlot
20
20
  from verifiers.v1.episode import Episode
@@ -26,7 +26,6 @@ logger = logging.getLogger(__name__)
26
26
 
27
27
  async def run_eval(env: Env, config: EvalConfig) -> list[Episode]:
28
28
  logger.info("eval config:\n%s", config.model_dump_json(indent=2))
29
- client = resolve_client(config.client)
30
29
  taskset = env.taskset
31
30
  if config.num_tasks is None and taskset.INFINITE:
32
31
  raise ValueError(
@@ -36,7 +35,9 @@ async def run_eval(env: Env, config: EvalConfig) -> list[Episode]:
36
35
  if config.num_tasks is not None:
37
36
  selected = selected.head(config.num_tasks)
38
37
  tasks = list(selected)
39
- ctx = ModelContext(client=client, model=config.model, sampling=config.sampling)
38
+ ctx = ModelContext(
39
+ client=config.client, model=config.model, sampling=config.sampling
40
+ )
40
41
  semaphore = (
41
42
  asyncio.Semaphore(config.max_concurrent) if config.max_concurrent else None
42
43
  )
@@ -107,7 +108,6 @@ async def run_eval(env: Env, config: EvalConfig) -> list[Episode]:
107
108
 
108
109
  push_state.started = True
109
110
  await asyncio.to_thread(push_traces, episodes, config, push_state)
110
- await client.close()
111
111
  return episodes
112
112
 
113
113
 
@@ -1,13 +1,12 @@
1
- from verifiers.v1.clients.client import Client, ModelContext
2
- from verifiers.v1.clients.config import (
1
+ from verifiers.v1.clients.client import Client, ModelContext, resolve_client
2
+ from verifiers.v1.clients.eval import EvalClient
3
+ from verifiers.v1.clients.train import TrainClient
4
+ from verifiers.v1.configs.client import (
3
5
  BaseClientConfig,
4
6
  ClientConfig,
5
7
  EvalClientConfig,
6
8
  TrainClientConfig,
7
- resolve_client,
8
9
  )
9
- from verifiers.v1.clients.eval import EvalClient
10
- from verifiers.v1.clients.train import TrainClient
11
10
 
12
11
  __all__ = [
13
12
  "BaseClientConfig",
@@ -0,0 +1,40 @@
1
+ """Shared client plumbing: transport defaults and URL/key utilities."""
2
+
3
+ import re
4
+
5
+ import httpx
6
+ from openai import AsyncOpenAI
7
+
8
+ from verifiers.v1.configs.client import BaseClientConfig, resolve_api_key
9
+
10
+ # Mirrors the OAI SDK defaults
11
+ DEFAULT_TIMEOUT = httpx.Timeout(connect=5.0, read=600.0, write=600.0, pool=600.0)
12
+ DEFAULT_LIMITS = httpx.Limits(max_connections=1000, max_keepalive_connections=100)
13
+ MAX_RETRIES = 0
14
+ """No client-side retries: failures surface to the harness SDK and the trace instead of
15
+ being silently reattempted."""
16
+
17
+ # An API version path segment (`v1`, `v2`, ...) — the only kind `join_url` dedups.
18
+ VERSION_SEGMENT = re.compile(r"v\d+")
19
+
20
+
21
+ def build_async_openai(config: BaseClientConfig) -> AsyncOpenAI:
22
+ return AsyncOpenAI(
23
+ base_url=config.base_url,
24
+ api_key=resolve_api_key(config),
25
+ default_headers=config.headers or None,
26
+ timeout=DEFAULT_TIMEOUT,
27
+ max_retries=MAX_RETRIES,
28
+ http_client=httpx.AsyncClient(timeout=DEFAULT_TIMEOUT, limits=DEFAULT_LIMITS),
29
+ )
30
+
31
+
32
+ def join_url(base_url: str, path: str) -> str:
33
+ """Join `base_url` with a dialect path without repeating the API version segment:
34
+ `.../api/v1` + `/v1/messages` -> `.../api/v1/messages`. Only version-shaped segments
35
+ dedup, so a base ending in `/chat` doesn't swallow `/chat/completions`."""
36
+ head = path.split("/")[1] if path.startswith("/") else ""
37
+ base = base_url.rstrip("/")
38
+ if VERSION_SEGMENT.fullmatch(head) and base.endswith(f"/{head}"):
39
+ base = base[: -len(head) - 1]
40
+ return base + path
@@ -1,22 +1,21 @@
1
1
  """Client interfaces for model inference and relay."""
2
2
 
3
- import logging
4
3
  from abc import ABC, abstractmethod
5
4
  from collections.abc import AsyncIterator, Awaitable, Callable, Mapping
6
5
  from dataclasses import dataclass, field
7
6
 
7
+ from verifiers.v1.configs.client import (
8
+ BaseClientConfig,
9
+ ClientConfig,
10
+ TrainClientConfig,
11
+ )
8
12
  from verifiers.v1.dialects import Dialect
9
13
  from verifiers.v1.graph import PendingTurn
10
14
  from verifiers.v1.types import Response, Sampling, SamplingConfig
11
15
 
12
- logger = logging.getLogger(__name__)
13
-
14
16
  SESSION_ID_HEADER = "X-Session-ID"
15
- """Per-rollout routing header. Every turn of one rollout sends the same value (the trace id),
16
- so a session-affinity router (e.g. vLLM's ``consistent_hash`` policy keyed on its
17
- ``request_id_headers``) pins all of a rollout's turns to the same engine — keeping the
18
- growing cross-turn prefix warm in that engine's KV cache instead of re-prefilling it
19
- cold on a random shard each turn."""
17
+ """Per-rollout routing header (the trace id, same value every turn), so a session-affinity
18
+ router pins a rollout's turns to one engine and its growing prefix stays KV-cached."""
20
19
 
21
20
 
22
21
  @dataclass
@@ -40,14 +39,10 @@ class Client(ABC):
40
39
  turn: PendingTurn | None = None,
41
40
  headers: Mapping[str, str] | None = None,
42
41
  ) -> Response:
43
- """Run one completion -> a vf `Response`. The eval client forwards the native JSON and
44
- eligible end-to-end headers, then parses a copy via `dialect`; the train client derives
45
- the typed prompt from `body` and tokenizes it.
46
-
47
- `session_id` is the rollout's stable id (the trace id); when set, the client sends it
48
- as the `SESSION_ID_HEADER` so a session-affinity router keeps the rollout's turns on
49
- one engine for cross-turn prefix-cache reuse. `turn` is the graph-resolved prompt
50
- prefix; train clients may use it for renderer bridging, while relay clients ignore it."""
42
+ """Run one completion -> a vf `Response`. The eval client forwards the native JSON
43
+ and parses a copy via `dialect`; the train client renders `body` to token ids.
44
+ `session_id` is the rollout's trace id (sent as `SESSION_ID_HEADER`); `turn` is the
45
+ graph-resolved prompt prefix, used by train clients for renderer bridging."""
51
46
 
52
47
  async def relay(
53
48
  self,
@@ -78,10 +73,20 @@ class Client(ABC):
78
73
  pass
79
74
 
80
75
 
76
+ def resolve_client(config: BaseClientConfig) -> Client:
77
+ if isinstance(config, TrainClientConfig):
78
+ from verifiers.v1.clients.train import TrainClient
79
+
80
+ return TrainClient(config)
81
+ from verifiers.v1.clients.eval import EvalClient
82
+
83
+ return EvalClient(config)
84
+
85
+
81
86
  @dataclass(frozen=True)
82
87
  class ModelContext:
83
- """Client, model, and sampling settings for one rollout."""
88
+ """Model, endpoint config, and sampling for one rollout."""
84
89
 
85
90
  model: str
86
- client: Client
91
+ client: ClientConfig
87
92
  sampling: Sampling = field(default_factory=Sampling)
@@ -1,16 +1,4 @@
1
- """The eval client: relay the program's native request to the provider.
2
-
3
- `EvalClient` (the default) is a thin `httpx` forwarder: it sends the program's request body
4
- without a typed round-trip, mutating only what the eval owns (model + sampling, via the dialect's
5
- `apply_overrides`). Eligible end-to-end request headers are forwarded too; rollout auth, body
6
- framing, and connection headers are replaced. The provider response is parsed into a vf
7
- `Response` for the trace, while its full JSON object stays on `Response.raw` for the interception
8
- server to return.
9
-
10
- The transport is provider-agnostic: the dialect supplies the upstream path + auth headers, so a
11
- new wire format (incl. non-OpenAI providers like Anthropic) is just a new `Dialect` — no client
12
- change. Endpoint config (base url, api key, billing headers) comes from the client config.
13
- """
1
+ """The eval client: proxies harness-native request to the provider."""
14
2
 
15
3
  import re
16
4
  from collections.abc import Mapping
@@ -19,7 +7,9 @@ import httpx
19
7
  from pydantic import ValidationError
20
8
  from pydantic_core import from_json, to_json
21
9
 
10
+ from verifiers.v1.clients.base import DEFAULT_LIMITS, DEFAULT_TIMEOUT, join_url
22
11
  from verifiers.v1.clients.client import SESSION_ID_HEADER, Client, RelayReply
12
+ from verifiers.v1.configs.client import BaseClientConfig, resolve_api_key
23
13
  from verifiers.v1.dialects import Dialect
24
14
  from verifiers.v1.errors import model_error
25
15
  from verifiers.v1.graph import PendingTurn
@@ -57,6 +47,8 @@ _BLOCKED_REQUEST_HEADERS = frozenset(
57
47
  "signature-input",
58
48
  }
59
49
  )
50
+
51
+
60
52
  # Atomic so one CRLF cannot backtrack into two line endings and split an event mid-field.
61
53
  _SSE_EVENT_END = re.compile(rb"(?>\r\n|\r|\n){2}")
62
54
 
@@ -64,22 +56,13 @@ _SSE_EVENT_END = re.compile(rb"(?>\r\n|\r|\n){2}")
64
56
  class EvalClient(Client):
65
57
  """Relay native JSON to the provider and parse a copy for the trace."""
66
58
 
67
- def __init__(
68
- self, base_url: str, api_key: str, headers: dict[str, str] | None = None
69
- ) -> None:
70
- self.base_url = base_url.rstrip("/")
71
- self.api_key = api_key
59
+ def __init__(self, config: BaseClientConfig) -> None:
60
+ self.base_url = config.base_url
61
+ self.api_key = resolve_api_key(config)
72
62
  # Keep endpoint headers separate so they can override intercepted request headers before
73
63
  # the dialect's provider authentication is applied.
74
- self.headers = dict(headers or {})
75
- # No timeout: agentic completions are slow and the rollout timeout is the real backstop.
76
- # Build full URLs ourselves (base_url + dialect.upstream_path) rather than relying on
77
- # httpx base-url joining, which drops the base path for a leading-slash request path.
78
- # Match V1's default concurrency while retaining HTTPX's 20-idle keepalive bound.
79
- self.http = httpx.AsyncClient(
80
- timeout=None,
81
- limits=httpx.Limits(max_connections=128, max_keepalive_connections=20),
82
- )
64
+ self.headers = dict(config.headers or {})
65
+ self.client = httpx.AsyncClient(timeout=DEFAULT_TIMEOUT, limits=DEFAULT_LIMITS)
83
66
 
84
67
  async def get_response(
85
68
  self,
@@ -92,7 +75,7 @@ class EvalClient(Client):
92
75
  headers: Mapping[str, str] | None = None,
93
76
  ) -> Response:
94
77
  resp = await self._request(
95
- self.base_url + dialect.upstream_path,
78
+ join_url(self.base_url, dialect.upstream_path),
96
79
  dialect.apply_overrides(body, model, sampling_args),
97
80
  self._headers(dialect, headers, session_id),
98
81
  )
@@ -118,12 +101,9 @@ class EvalClient(Client):
118
101
  incoming: Mapping[str, str] | None,
119
102
  session_id: str | None,
120
103
  ) -> httpx.Headers:
121
- """Build provider headers from the intercepted request.
122
-
123
- Preserve provider feature headers such as `openai-beta` / `anthropic-beta`,
124
- discard localhost auth and transport framing, then apply endpoint-configured headers,
125
- session routing, and real provider auth.
126
- """
104
+ """Provider headers from the intercepted request: keep feature headers
105
+ (`openai-beta`, `anthropic-beta`), discard localhost auth and framing, then apply
106
+ endpoint headers, session routing, and real provider auth."""
127
107
  headers = httpx.Headers(incoming)
128
108
  connection = headers.pop("connection", "")
129
109
  for name in _BLOCKED_REQUEST_HEADERS | set(
@@ -145,14 +125,14 @@ class EvalClient(Client):
145
125
  stream: bool = False,
146
126
  ) -> httpx.Response:
147
127
  headers.setdefault("content-type", "application/json")
148
- request = self.http.build_request(
128
+ request = self.client.build_request(
149
129
  "POST",
150
130
  url,
151
131
  content=to_json(body, inf_nan_mode="null"),
152
132
  headers=headers,
153
133
  )
154
134
  try:
155
- response = await self.http.send(request, stream=stream)
135
+ response = await self.client.send(request, stream=stream)
156
136
  except httpx.TimeoutException as e:
157
137
  raise model_error(str(e), status_code=504) from e
158
138
  except httpx.HTTPError as e:
@@ -163,9 +143,6 @@ class EvalClient(Client):
163
143
  try:
164
144
  response.raise_for_status()
165
145
  except httpx.HTTPStatusError as e:
166
- # relay the provider's status (and body) so the harness SDK retries 5xx/429 and not
167
- # 4xx; an empty/HTML body (e.g. a 404 from a base_url missing `/v1`) would otherwise
168
- # make an information-free ProviderError
169
146
  raise model_error(
170
147
  f"upstream {e.response.status_code}: {e.response.text}",
171
148
  status_code=e.response.status_code,
@@ -193,7 +170,7 @@ class EvalClient(Client):
193
170
  # Relay complete SSE events so the interception server can safely insert keepalives
194
171
  # between them. Error responses are mapped before any event is handed back.
195
172
  resp = await self._request(
196
- self.base_url + dialect.upstream_path,
173
+ join_url(self.base_url, dialect.upstream_path),
197
174
  dialect.apply_overrides(body, model, sampling_args),
198
175
  self._headers(dialect, headers, session_id),
199
176
  stream=True,
@@ -228,11 +205,11 @@ class EvalClient(Client):
228
205
  ) -> dict:
229
206
  # A side request (e.g. count_tokens): relay its native JSON and return the provider JSON.
230
207
  resp = await self._request(
231
- self.base_url + route,
208
+ join_url(self.base_url, route),
232
209
  body,
233
210
  self._headers(dialect, headers, None),
234
211
  )
235
212
  return from_json(resp.content)
236
213
 
237
214
  async def close(self) -> None:
238
- await self.http.aclose()
215
+ await self.client.aclose()