verifiers 0.2.1.dev41__tar.gz → 0.2.1.dev43__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.

Potentially problematic release.


This version of verifiers might be problematic. Click here for more details.

Files changed (419) hide show
  1. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/PKG-INFO +1 -1
  2. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/default/program.py +3 -7
  3. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/null/program.py +8 -2
  4. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/interception/server.py +171 -97
  5. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/mcp/server.py +6 -2
  6. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/session.py +18 -0
  7. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/.gitignore +0 -0
  8. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/LICENSE +0 -0
  9. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/README.md +0 -0
  10. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/pyproject.toml +0 -0
  11. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/AGENTS.md +0 -0
  12. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/__init__.py +0 -0
  13. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/conftest.py +0 -0
  14. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_browser_env.py +0 -0
  15. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_build_script.py +0 -0
  16. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_cli_agent_env.py +0 -0
  17. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_client_auth_errors.py +0 -0
  18. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_client_config.py +0 -0
  19. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_client_multimodal_types.py +0 -0
  20. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_composable_env.py +0 -0
  21. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_context_token_metrics.py +0 -0
  22. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_decorator_ranks.py +0 -0
  23. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_endpoint_registry.py +0 -0
  24. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_env_group.py +0 -0
  25. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_env_server.py +0 -0
  26. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_environment.py +0 -0
  27. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_environment_extra.py +0 -0
  28. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_envs.py +0 -0
  29. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_error_chain.py +0 -0
  30. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_eval_display.py +0 -0
  31. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_eval_utils.py +0 -0
  32. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_gepa_cli.py +0 -0
  33. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_gepa_utils.py +0 -0
  34. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_gym_env.py +0 -0
  35. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_harbor_env_mcp.py +0 -0
  36. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_imports.py +0 -0
  37. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_init_script.py +0 -0
  38. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_install_utils.py +0 -0
  39. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_interception_utils.py +0 -0
  40. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_logging.py +0 -0
  41. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_math_rubric.py +0 -0
  42. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_maybe_think_parser.py +0 -0
  43. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_message_utils.py +0 -0
  44. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_message_utils_multimodal.py +0 -0
  45. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_multiturn_env.py +0 -0
  46. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_nemorl_client.py +0 -0
  47. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_openai_chat_completions_token_client.py +0 -0
  48. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_openai_responses_client.py +0 -0
  49. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_opencode_rlm_env.py +0 -0
  50. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_openenv_client.py +0 -0
  51. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_parser.py +0 -0
  52. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_path_utils.py +0 -0
  53. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_per_turn_timing.py +0 -0
  54. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_pricing_utils.py +0 -0
  55. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_prime_plugin.py +0 -0
  56. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_renderer_client.py +0 -0
  57. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_renderer_e2e.py +0 -0
  58. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_rlm_composable_env.py +0 -0
  59. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_rubric.py +0 -0
  60. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_rubric_group.py +0 -0
  61. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_sandbox_debug_env.py +0 -0
  62. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_sandbox_env.py +0 -0
  63. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_sandbox_mixin.py +0 -0
  64. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_save_utils.py +0 -0
  65. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_setup_script.py +0 -0
  66. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_singleturn_env.py +0 -0
  67. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_stateful_tool_env.py +0 -0
  68. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_think_parser.py +0 -0
  69. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_tool_env.py +0 -0
  70. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_tool_utils.py +0 -0
  71. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_trajectory_processing.py +0 -0
  72. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_tui_info_formatting.py +0 -0
  73. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_types.py +0 -0
  74. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_wordle_env.py +0 -0
  75. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_xml_parser.py +0 -0
  76. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/conftest.py +0 -0
  77. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  78. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  79. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  80. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  81. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  82. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/fixtures/echo_v0.py +0 -0
  83. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/fixtures/echo_v1.py +0 -0
  84. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/fixtures/pyproject.toml +0 -0
  85. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  86. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/test_color_codeword_tasks.py +0 -0
  87. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/test_configs.py +0 -0
  88. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/test_e2e.py +0 -0
  89. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/test_envs.py +0 -0
  90. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/test_graph.py +0 -0
  91. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/test_judges.py +0 -0
  92. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/test_legacy.py +0 -0
  93. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/test_scoring.py +0 -0
  94. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/test_taskset.py +0 -0
  95. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/test_trace.py +0 -0
  96. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/__init__.py +0 -0
  97. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/__init__.py +0 -0
  98. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/commands/__init__.py +0 -0
  99. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/commands/build.py +0 -0
  100. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/commands/eval.py +0 -0
  101. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/commands/gepa.py +0 -0
  102. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/commands/init.py +0 -0
  103. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/commands/install.py +0 -0
  104. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/commands/setup.py +0 -0
  105. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/plugins/__init__.py +0 -0
  106. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/plugins/prime.py +0 -0
  107. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/tui.py +0 -0
  108. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/clients/__init__.py +0 -0
  109. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/clients/anthropic_messages_client.py +0 -0
  110. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/clients/client.py +0 -0
  111. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  112. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/clients/openai_chat_completions_client.py +0 -0
  113. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  114. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/clients/openai_completions_client.py +0 -0
  115. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/clients/openai_responses_client.py +0 -0
  116. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/clients/renderer_client.py +0 -0
  117. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/decorators.py +0 -0
  118. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/AGENTS.md +0 -0
  119. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/__init__.py +0 -0
  120. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/env_group.py +0 -0
  121. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/environment.py +0 -0
  122. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/README.md +0 -0
  123. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/__init__.py +0 -0
  124. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  125. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/README.md +0 -0
  126. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/__init__.py +0 -0
  127. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/_filter.py +0 -0
  128. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  129. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/harness.py +0 -0
  130. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  131. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  132. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  133. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  134. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  135. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  136. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  137. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/task.py +0 -0
  138. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  139. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  140. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  141. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  142. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  143. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  144. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  145. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  146. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  147. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  148. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
  149. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
  150. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
  151. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
  152. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
  153. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
  154. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
  155. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
  156. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
  157. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
  158. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
  159. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
  160. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
  161. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
  162. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
  163. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
  164. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
  165. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
  166. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
  167. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
  168. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
  169. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
  170. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
  171. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
  172. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
  173. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
  174. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
  175. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
  176. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
  177. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  178. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  179. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  180. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  181. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  182. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  183. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  184. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  185. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  186. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  187. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  188. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  189. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  190. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  191. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  192. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  193. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  194. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  195. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  196. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  197. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  198. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  199. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  200. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  201. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/gym_env.py +0 -0
  202. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  203. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  204. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  205. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/mcp_env.py +0 -0
  206. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/opencode_env.py +0 -0
  207. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  208. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  209. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  210. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/utils/__init__.py +0 -0
  211. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  212. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  213. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/README.md +0 -0
  214. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/__init__.py +0 -0
  215. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/browser_env/README.md +0 -0
  216. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  217. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  218. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  219. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  220. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  221. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  222. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/openenv_env.py +0 -0
  223. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  224. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/textarena_env.py +0 -0
  225. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/multiturn_env.py +0 -0
  226. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/python_env.py +0 -0
  227. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/sandbox_env.py +0 -0
  228. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/singleturn_env.py +0 -0
  229. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/stateful_tool_env.py +0 -0
  230. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/tool_env.py +0 -0
  231. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/errors.py +0 -0
  232. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/gepa/__init__.py +0 -0
  233. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/gepa/adapter.py +0 -0
  234. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/gepa/config.py +0 -0
  235. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/gepa/display.py +0 -0
  236. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/gepa/gepa_utils.py +0 -0
  237. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/parsers/__init__.py +0 -0
  238. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/parsers/maybe_think_parser.py +0 -0
  239. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/parsers/parser.py +0 -0
  240. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/parsers/think_parser.py +0 -0
  241. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/parsers/xml_parser.py +0 -0
  242. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/rubrics/__init__.py +0 -0
  243. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  244. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/rubrics/judge_rubric.py +0 -0
  245. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/rubrics/math_rubric.py +0 -0
  246. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/rubrics/rubric.py +0 -0
  247. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/rubrics/rubric_group.py +0 -0
  248. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/scripts/__init__.py +0 -0
  249. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/scripts/build.py +0 -0
  250. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/scripts/eval.py +0 -0
  251. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/scripts/gepa.py +0 -0
  252. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/scripts/init.py +0 -0
  253. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/scripts/install.py +0 -0
  254. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/scripts/setup.py +0 -0
  255. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/scripts/tui.py +0 -0
  256. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/serve/__init__.py +0 -0
  257. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/serve/client/env_client.py +0 -0
  258. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/serve/client/zmq_env_client.py +0 -0
  259. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/serve/server/__init__.py +0 -0
  260. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/serve/server/env_router.py +0 -0
  261. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/serve/server/env_server.py +0 -0
  262. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/serve/server/env_worker.py +0 -0
  263. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/serve/server/zmq_env_server.py +0 -0
  264. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/serve/types.py +0 -0
  265. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/types.py +0 -0
  266. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/__init__.py +0 -0
  267. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/async_utils.py +0 -0
  268. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/client_utils.py +0 -0
  269. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/config_utils.py +0 -0
  270. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/data_utils.py +0 -0
  271. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/display_utils.py +0 -0
  272. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/env_config_utils.py +0 -0
  273. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/env_utils.py +0 -0
  274. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/error_utils.py +0 -0
  275. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/eval_display.py +0 -0
  276. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/eval_utils.py +0 -0
  277. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/heartbeat.py +0 -0
  278. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/import_utils.py +0 -0
  279. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/install_utils.py +0 -0
  280. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/interception_utils.py +0 -0
  281. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/logging_utils.py +0 -0
  282. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/message_utils.py +0 -0
  283. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/metric_utils.py +0 -0
  284. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/path_utils.py +0 -0
  285. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/pricing_utils.py +0 -0
  286. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/process_utils.py +0 -0
  287. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/response_utils.py +0 -0
  288. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/save_utils.py +0 -0
  289. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/serve_utils.py +0 -0
  290. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/thread_utils.py +0 -0
  291. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/threaded_sandbox_client.py +0 -0
  292. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/tool_utils.py +0 -0
  293. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/usage_utils.py +0 -0
  294. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/version_utils.py +0 -0
  295. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/__init__.py +0 -0
  296. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/__init__.py +0 -0
  297. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  298. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/dashboard/base.py +0 -0
  299. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/dashboard/eval.py +0 -0
  300. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/dashboard/replay.py +0 -0
  301. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/dashboard/validate.py +0 -0
  302. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/debug.py +0 -0
  303. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/eval/__init__.py +0 -0
  304. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/eval/main.py +0 -0
  305. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/eval/resume.py +0 -0
  306. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/eval/runner.py +0 -0
  307. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/gepa.py +0 -0
  308. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/init.py +0 -0
  309. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/output.py +0 -0
  310. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/replay.py +0 -0
  311. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/resolve.py +0 -0
  312. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/serve.py +0 -0
  313. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/validate.py +0 -0
  314. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/clients/__init__.py +0 -0
  315. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/clients/client.py +0 -0
  316. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/clients/config.py +0 -0
  317. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/clients/eval.py +0 -0
  318. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/clients/train.py +0 -0
  319. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/configs/__init__.py +0 -0
  320. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/configs/debug.py +0 -0
  321. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/configs/eval.py +0 -0
  322. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/configs/init.py +0 -0
  323. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/configs/replay.py +0 -0
  324. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/configs/serve.py +0 -0
  325. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/configs/validate.py +0 -0
  326. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/decorators.py +0 -0
  327. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/dialects/__init__.py +0 -0
  328. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/dialects/anthropic.py +0 -0
  329. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/dialects/base.py +0 -0
  330. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/dialects/chat.py +0 -0
  331. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/dialects/responses.py +0 -0
  332. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/env.py +0 -0
  333. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/episode.py +0 -0
  334. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/errors.py +0 -0
  335. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/gepa/__init__.py +0 -0
  336. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/gepa/adapter.py +0 -0
  337. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/gepa/config.py +0 -0
  338. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/gepa/dataset.py +0 -0
  339. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/gepa/reflection.py +0 -0
  340. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/gepa/runner.py +0 -0
  341. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/graph.py +0 -0
  342. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harness.py +0 -0
  343. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/__init__.py +0 -0
  344. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  345. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/codex/harness.py +0 -0
  346. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/default/__init__.py +0 -0
  347. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/default/harness.py +0 -0
  348. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  349. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  350. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  351. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  352. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  353. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/null/__init__.py +0 -0
  354. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/null/harness.py +0 -0
  355. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  356. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/pi/harness.py +0 -0
  357. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  358. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  359. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  360. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  361. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  362. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/interception/__init__.py +0 -0
  363. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/interception/base.py +0 -0
  364. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/interception/pool.py +0 -0
  365. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  366. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/interception/tunnel/base.py +0 -0
  367. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/interception/tunnel/custom.py +0 -0
  368. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/interception/tunnel/prime.py +0 -0
  369. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/judge.py +0 -0
  370. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/judges/__init__.py +0 -0
  371. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/judges/reference.py +0 -0
  372. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/judges/reference.txt +0 -0
  373. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/judges/rubric.py +0 -0
  374. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/judges/rubric.txt +0 -0
  375. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/legacy.py +0 -0
  376. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/loaders.py +0 -0
  377. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/mcp/__init__.py +0 -0
  378. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/mcp/launch.py +0 -0
  379. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/mcp/toolset.py +0 -0
  380. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/mcp/user.py +0 -0
  381. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/push.py +0 -0
  382. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/retries.py +0 -0
  383. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/rollout.py +0 -0
  384. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/runtimes/__init__.py +0 -0
  385. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/runtimes/base.py +0 -0
  386. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/runtimes/docker.py +0 -0
  387. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/runtimes/limiters.py +0 -0
  388. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/runtimes/modal.py +0 -0
  389. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/runtimes/prime.py +0 -0
  390. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/runtimes/subprocess.py +0 -0
  391. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/scoring.py +0 -0
  392. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/serve/__init__.py +0 -0
  393. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/serve/client.py +0 -0
  394. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/serve/pool.py +0 -0
  395. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/serve/server.py +0 -0
  396. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/serve/types.py +0 -0
  397. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/state.py +0 -0
  398. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/task.py +0 -0
  399. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/taskset.py +0 -0
  400. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/tasksets/__init__.py +0 -0
  401. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  402. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  403. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  404. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  405. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  406. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  407. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  408. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/trace.py +0 -0
  409. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/types.py +0 -0
  410. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/utils/__init__.py +0 -0
  411. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/utils/aio.py +0 -0
  412. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/utils/format.py +0 -0
  413. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/utils/generic.py +0 -0
  414. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/utils/image.py +0 -0
  415. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/utils/install.py +0 -0
  416. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/utils/interrupt.py +0 -0
  417. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/utils/logging.py +0 -0
  418. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/utils/memory.py +0 -0
  419. {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/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.dev41
3
+ Version: 0.2.1.dev43
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
@@ -198,7 +198,8 @@ async def connect_mcp(stack: AsyncExitStack, config: dict) -> tuple[list[dict],
198
198
  session = await stack.enter_async_context(ClientSession(read, write))
199
199
  await session.initialize()
200
200
  for tool in (await session.list_tools()).tools:
201
- full = f"{name}_{tool.name}"
201
+ # A server named "" (TOOL_PREFIX = None) advertises its tools bare.
202
+ full = f"{name}_{tool.name}" if name else tool.name
202
203
  tool_schemas.append(
203
204
  {
204
205
  "type": "function",
@@ -259,12 +260,7 @@ async def main() -> None:
259
260
  payload = path.read_bytes()
260
261
  path.unlink()
261
262
  initial = json.loads(payload)
262
- # No client-side retries: re-sending a request whose turn the interception already committed
263
- # re-samples it and forks the trace into an extra dead-end branch. A generous timeout lets a
264
- # slow turn finish instead of timing out and re-sending; genuine failures surface as error rows.
265
- client = AsyncOpenAI(
266
- base_url=args.base_url, api_key=args.api_key, timeout=1800.0, max_retries=0
267
- )
263
+ client = AsyncOpenAI(base_url=args.base_url, api_key=args.api_key)
268
264
  config = json.loads(args.mcp_config or "{}")
269
265
  async with AsyncExitStack() as stack:
270
266
  mcp_tools, dispatch = (
@@ -24,7 +24,9 @@ async def chat(
24
24
 
25
25
  async def connect_mcp(stack: AsyncExitStack, config: dict) -> tuple[list[dict], dict]:
26
26
  """Connect to each configured MCP server (a streamable-HTTP `url`); return
27
- (tool schemas, dispatch mapping `<server>_<tool>` -> (session, raw tool name))."""
27
+ (tool schemas, dispatch mapping advertised name -> (session, raw tool name)). Tools are
28
+ advertised as `<server>_<tool>`; a server named `""` (TOOL_PREFIX = None) advertises its
29
+ tools bare, so names must be unique across the rollout's servers."""
28
30
  from mcp import ClientSession
29
31
  from mcp.client.streamable_http import (
30
32
  create_mcp_http_client,
@@ -43,7 +45,11 @@ async def connect_mcp(stack: AsyncExitStack, config: dict) -> tuple[list[dict],
43
45
  session = await stack.enter_async_context(ClientSession(read, write))
44
46
  await session.initialize()
45
47
  for tool in (await session.list_tools()).tools:
46
- full = f"{name}_{tool.name}"
48
+ full = f"{name}_{tool.name}" if name else tool.name
49
+ if full in dispatch:
50
+ raise ValueError(
51
+ f"duplicate tool name {full!r} across servers; keep qualified names"
52
+ )
47
53
  tool_schemas.append(
48
54
  {
49
55
  "type": "function",
@@ -21,6 +21,7 @@ handled out-of-band (run by the harness).
21
21
 
22
22
  import asyncio
23
23
  import contextlib
24
+ import hashlib
24
25
  import json
25
26
  import logging
26
27
  import secrets
@@ -49,7 +50,7 @@ from verifiers.v1.interception.tunnel import (
49
50
  make_tunnel,
50
51
  )
51
52
  from verifiers.v1.session import RolloutSession
52
- from verifiers.v1.types import Messages, Tool
53
+ from verifiers.v1.types import Messages, Response, Tool
53
54
 
54
55
  logger = logging.getLogger(__name__)
55
56
 
@@ -61,6 +62,23 @@ logger = logging.getLogger(__name__)
61
62
  _MAX_REQUEST_BODY = 1024**3 # 1 GiB (aiohttp's default is 1 MiB)
62
63
  _KEEPALIVE_INTERVAL_SECONDS = 3
63
64
  _STREAM_QUEUE_MAXSIZE = 16
65
+ # blake2b saturates ~1.7 GB/s, so a body up to this size hashes inline in well under a
66
+ # millisecond; a larger one (bodies may reach `_MAX_REQUEST_BODY`) is hashed off the event
67
+ # loop instead — see `_request_digest`.
68
+ _HASH_INLINE_MAX = 1024**2 # 1 MiB
69
+
70
+
71
+ def _body_digest(raw: bytes) -> bytes:
72
+ return hashlib.blake2b(raw, digest_size=16).digest()
73
+
74
+
75
+ async def _request_digest(raw: bytes) -> bytes:
76
+ """Digest a request body for the retry-replay guard. Hash a small body inline; offload a
77
+ large one to a thread so it does not stall every multiplexed rollout on the event loop
78
+ (blake2b releases the GIL, so the thread runs the hash off the loop)."""
79
+ if len(raw) <= _HASH_INLINE_MAX:
80
+ return _body_digest(raw)
81
+ return await asyncio.to_thread(_body_digest, raw)
64
82
 
65
83
 
66
84
  def _completion_response(completion: dict | None) -> web.Response:
@@ -223,10 +241,38 @@ class InterceptionServer(Interception):
223
241
  body = from_json(raw)
224
242
  except ValueError:
225
243
  body = json.loads(raw)
244
+ req_hash = await _request_digest(raw)
226
245
  # Keep `read()` for aiohttp's size guard, then release its cache and our local
227
246
  # alias after parsing so the wire body does not survive model inference.
228
247
  request._read_bytes = None
229
248
  del raw
249
+ # Graph atomicity under retries. The harness SDK retries a transient failure by
250
+ # re-sending the byte-identical request; sampling it again would commit a second turn and
251
+ # fork the graph into a dead-end branch. Two cases, both resolved without re-sampling:
252
+ # 1. the first attempt already finished -> replay the recorded response;
253
+ # 2. the first attempt is still computing (a slow turn) -> await it and return its
254
+ # result, so a slow turn is safe without an inflated client timeout.
255
+ # A growing conversation never repeats a body, so these only ever match a real retry; a
256
+ # failed attempt caches nothing and re-runs normally.
257
+ if session.last_request == req_hash and session.last_response is not None:
258
+ logger.debug("intercept replay: id=%s (retried request)", session.trace.id)
259
+ return _completion_response(session.last_response)
260
+
261
+ async def coalesced(inflight: "asyncio.Future[dict | None]") -> web.Response:
262
+ # Await the first attempt instead of re-sampling. None means it produced no servable
263
+ # response (it errored/refused), so let the SDK retry afresh.
264
+ logger.debug(
265
+ "intercept coalesce: id=%s (retry of in-flight turn)", session.trace.id
266
+ )
267
+ completion = await inflight
268
+ if completion is None:
269
+ return web.json_response(
270
+ dialect.error_body("upstream attempt failed"), status=503
271
+ )
272
+ return _completion_response(completion)
273
+
274
+ if (inflight := session.inflight.get(req_hash)) is not None:
275
+ return await coalesced(inflight)
230
276
  logger.debug(
231
277
  "intercept %s: id=%s stream=%s",
232
278
  request.path,
@@ -256,112 +302,140 @@ class InterceptionServer(Interception):
256
302
  if dialect.streaming(body):
257
303
  return await self._stream(request, session, dialect, body, prompt, tools)
258
304
  headers = request.headers.copy()
305
+ # Claim the in-flight slot so a retry arriving mid-flight coalesces onto it (above) rather
306
+ # than starting a second inference. Re-check first: an identical request may have claimed
307
+ # it while we awaited the simulator opening. The get / create / assign below run with no
308
+ # await between them, so two concurrent identical requests can never both become owner.
309
+ if (inflight := session.inflight.get(req_hash)) is not None:
310
+ return await coalesced(inflight)
311
+ fut: asyncio.Future[dict | None] = asyncio.get_running_loop().create_future()
312
+ session.inflight[req_hash] = fut
313
+
314
+ def serve(response: Response) -> web.Response:
315
+ # Record the served turn and hand it to any coalesced retry, so a retried
316
+ # byte-identical request replays instead of re-sampling and forking the graph.
317
+ # `Response.raw` is the full native provider object (or the renderer's synthesized
318
+ # completion) that the server serializes back to the program.
319
+ session.last_request = req_hash
320
+ session.last_response = response.raw
321
+ if not fut.done():
322
+ fut.set_result(response.raw)
323
+ return _completion_response(response.raw)
324
+
259
325
  # A user simulator turns one program request into a multi-turn exchange: after each
260
326
  # model turn the simulator's reply is injected as a user turn and the model is
261
327
  # re-prompted, so a whole game plays out here and only the final assistant message
262
328
  # returns to the (simulator-unaware) program. Without a simulator the loop runs once.
263
- completion: dict | None = (
264
- None # the latest turn's response, returned to the program
329
+ response: Response | None = (
330
+ None # the latest committed turn (None until the first)
265
331
  )
266
- while True:
267
- try:
268
- refused = await session.refused()
269
- except RolloutError as e:
270
- return self._fail(session, dialect, e)
271
- except Exception as e:
272
- return self._fail(
273
- session,
274
- dialect,
275
- TaskError(f"@stop failed: {type(e).__name__}: {e}"),
276
- )
277
- if refused is not None:
278
- # Refuse the first model call to halt the harness; once a simulated
279
- # conversation is under way, just end it and return the last turn cleanly.
280
- if completion is None:
281
- return web.json_response(
282
- dialect.error_body(f"rollout stopped: {refused}"), status=400
332
+ try:
333
+ while True:
334
+ try:
335
+ refused = await session.refused()
336
+ except RolloutError as e:
337
+ return self._fail(session, dialect, e)
338
+ except Exception as e:
339
+ return self._fail(
340
+ session,
341
+ dialect,
342
+ TaskError(f"@stop failed: {type(e).__name__}: {e}"),
343
+ )
344
+ if refused is not None:
345
+ # Refuse the first model call to halt the harness; once a simulated
346
+ # conversation is under way, just end it and return the last turn cleanly.
347
+ if response is None:
348
+ return web.json_response(
349
+ dialect.error_body(f"rollout stopped: {refused}"),
350
+ status=400,
351
+ )
352
+ return serve(response)
353
+ turn = graph.prepare_turn(session.trace, prompt)
354
+ session.error = None
355
+ try:
356
+ response = await session.ctx.client.get_response(
357
+ dialect,
358
+ body,
359
+ session.ctx.model,
360
+ session.ctx.sampling,
361
+ headers=headers,
362
+ session_id=session.trace.id,
363
+ turn=turn,
364
+ )
365
+ except OverlongPromptError:
366
+ # An overlong prompt is a budget limit, not a crash: end the rollout cleanly
367
+ # as a truncation — return the last turn if there is one, else refuse to halt
368
+ # the harness (same shape as `refused` above).
369
+ session.trace.stop("context_length")
370
+ logger.debug("prompt too long: id=%s", session.trace.id)
371
+ if response is None:
372
+ return web.json_response(
373
+ dialect.error_body("rollout stopped: context_length"),
374
+ status=400,
375
+ )
376
+ return serve(response)
377
+ except RolloutError as e:
378
+ # Stash the real cause; the rollout re-raises it after the harness returns.
379
+ # Relay the provider's status so the harness SDK retries 5xx/429 and not 4xx.
380
+ session.error = e
381
+ logger.warning(
382
+ "model call failed: id=%s %s: %s",
383
+ session.trace.id,
384
+ type(e).__name__,
385
+ e,
283
386
  )
284
- return _completion_response(completion)
285
- turn = graph.prepare_turn(session.trace, prompt)
286
- session.error = None
287
- try:
288
- response = await session.ctx.client.get_response(
289
- dialect,
290
- body,
291
- session.ctx.model,
292
- session.ctx.sampling,
293
- headers=headers,
294
- session_id=session.trace.id,
295
- turn=turn,
296
- )
297
- except OverlongPromptError:
298
- # An overlong prompt is a budget limit, not a crash: end the rollout cleanly
299
- # as a truncation — return the last turn if there is one, else refuse to halt
300
- # the harness (same shape as `refused` above).
301
- session.trace.stop("context_length")
302
- logger.debug("prompt too long: id=%s", session.trace.id)
303
- if completion is None:
304
387
  return web.json_response(
305
- dialect.error_body("rollout stopped: context_length"),
306
- status=400,
388
+ dialect.error_body(str(e)),
389
+ status=getattr(e, "status_code", 502),
307
390
  )
308
- return _completion_response(completion)
309
- except RolloutError as e:
310
- # Stash the real cause; the rollout re-raises it after the harness returns. Relay
311
- # the provider's status so the harness SDK retries 5xx/429 and not 4xx.
312
- session.error = e
313
- logger.warning(
314
- "model call failed: id=%s %s: %s",
315
- session.trace.id,
316
- type(e).__name__,
317
- e,
318
- )
319
- return web.json_response(
320
- dialect.error_body(str(e)), status=getattr(e, "status_code", 502)
321
- )
322
- except Exception as e: # surface to the program as an API error
323
- logger.warning(
324
- "model call failed: id=%s %s: %s",
391
+ except Exception as e: # surface to the program as an API error
392
+ logger.warning(
393
+ "model call failed: id=%s %s: %s",
394
+ session.trace.id,
395
+ type(e).__name__,
396
+ e,
397
+ )
398
+ return web.json_response(dialect.error_body(str(e)), status=502)
399
+ logger.debug(
400
+ "intercept turn: id=%s tools=%d",
325
401
  session.trace.id,
326
- type(e).__name__,
327
- e,
328
- )
329
- return web.json_response(dialect.error_body(str(e)), status=502)
330
- # `Response.raw` is the full native provider object, or the renderer's synthesized
331
- # completion object, that the server serializes for the program.
332
- completion = response.raw
333
- logger.debug(
334
- "intercept turn: id=%s tools=%d",
335
- session.trace.id,
336
- len(response.message.tool_calls or []),
337
- )
338
- turn.commit(response, tools) # one node per new message;
339
- # branches fall out of walking the graph (see Trace.branches / verifiers.v1.graph)
340
- # Hand back to the program when the model wants a tool (the program runs it) or
341
- # when there's no user simulator to keep the conversation going.
342
- if response.message.tool_calls or session.user is None:
343
- return _completion_response(completion)
344
- try:
345
- user_messages = await session.user(response.message.content or "")
346
- except RolloutError as e:
347
- return self._fail(session, dialect, e)
348
- except Exception as e:
349
- return self._fail(
350
- session,
351
- dialect,
352
- UserError(f"user simulator failed: {type(e).__name__}: {e}"),
402
+ len(response.message.tool_calls or []),
353
403
  )
354
- # Inject the model turn + the simulator's user turn(s): into the wire request for the
355
- # next model call (`dialect.extend`, which keeps the model turn verbatim so reasoning
356
- # survives) and into the typed prompt for the trace. The simulator ends the trajectory
357
- # through its task's `@stop` (e.g. a `user_finished` flag it set on `self.state`),
358
- # caught by `refused()` at the top of the next iteration — the interception server holds
359
- # no opinion about the state's contents.
360
- body = dialect.extend(body, completion, user_messages)
361
- prompt = [*prompt, response.message, *user_messages]
362
- # The simulator changed the payload, so this is a new operation rather than a retry.
363
- headers.popall("idempotency-key", None)
364
- headers.popall("x-idempotency-key", None)
404
+ turn.commit(response, tools) # one node per new message;
405
+ # branches fall out of walking the graph (see Trace.branches / verifiers.v1.graph)
406
+ # Hand back to the program when the model wants a tool (the program runs it) or
407
+ # when there's no user simulator to keep the conversation going.
408
+ if response.message.tool_calls or session.user is None:
409
+ return serve(response)
410
+ try:
411
+ user_messages = await session.user(response.message.content or "")
412
+ except RolloutError as e:
413
+ return self._fail(session, dialect, e)
414
+ except Exception as e:
415
+ return self._fail(
416
+ session,
417
+ dialect,
418
+ UserError(f"user simulator failed: {type(e).__name__}: {e}"),
419
+ )
420
+ # Inject the model turn + the simulator's user turn(s): into the wire request for
421
+ # the next model call (`dialect.extend`, which keeps the model turn verbatim so
422
+ # reasoning survives) and into the typed prompt for the trace. The simulator ends
423
+ # the trajectory through its task's `@stop` (e.g. a `user_finished` flag it set on
424
+ # `self.state`), caught by `refused()` at the top of the next iteration — the
425
+ # interception server holds no opinion about the state's contents.
426
+ body = dialect.extend(body, response.raw, user_messages)
427
+ prompt = [*prompt, response.message, *user_messages]
428
+ # The simulator changed the payload, so this is a new operation not a retry.
429
+ headers.popall("idempotency-key", None)
430
+ headers.popall("x-idempotency-key", None)
431
+ finally:
432
+ # Free the in-flight slot and unblock any coalesced retry; None signals "no servable
433
+ # response" (an error/refuse return above), so the waiter surfaces a retryable error.
434
+ # Only clear our own entry — never one a later owner may have installed.
435
+ if session.inflight.get(req_hash) is fut:
436
+ session.inflight.pop(req_hash, None)
437
+ if not fut.done():
438
+ fut.set_result(None)
365
439
 
366
440
  async def _stream(
367
441
  self,
@@ -113,8 +113,10 @@ def _import_ref(ref: str) -> object:
113
113
 
114
114
 
115
115
  class ServerBase(Generic[ConfigT, StateT]):
116
- # The empty value falls back to the snake-cased class name.
117
- TOOL_PREFIX: ClassVar[str] = ""
116
+ TOOL_PREFIX: ClassVar[str | None] = ""
117
+ """The empty value falls back to the snake-cased class name. None advertises the server's
118
+ tools bare (no `<server>_` prefix); name collisions across servers are then the taskset
119
+ author's concern."""
118
120
 
119
121
  EXTRAS: ClassVar[tuple[str, ...]] = ()
120
122
  """Package extras the server's module needs, applied at sandbox install."""
@@ -214,6 +216,8 @@ class ServerBase(Generic[ConfigT, StateT]):
214
216
 
215
217
  @property
216
218
  def server_name(self) -> str:
219
+ if self.TOOL_PREFIX is None:
220
+ return ""
217
221
  return self.TOOL_PREFIX or "".join(
218
222
  ("_" + c.lower() if c.isupper() else c) for c in type(self).__name__
219
223
  ).lstrip("_")
@@ -8,6 +8,7 @@ injects the user simulator's replies, and stashes the real failure on `error`.
8
8
  turns.
9
9
  """
10
10
 
11
+ import asyncio
11
12
  import logging
12
13
  from collections.abc import Awaitable, Callable
13
14
  from dataclasses import dataclass, field
@@ -81,6 +82,23 @@ class RolloutSession:
81
82
  (and may swallow it, or exit non-zero), so the rollout re-raises this original error once the
82
83
  harness returns — recording the real `ProviderError` instead of a secondary `HarnessError`.
83
84
  Reset before each model turn, so a successful retry clears it."""
85
+ last_request: bytes | None = None
86
+ """Digest of the most recently served request body; with `last_response`, the replay cache
87
+ that keeps the message graph atomic under harness-SDK retries. A retry re-sends the
88
+ byte-identical request; when it matches, the interception server replays the recorded
89
+ response instead of re-sampling and committing a second turn — which would fork the graph
90
+ into a dead-end branch. Only a fully served request is cached, so a genuinely failed attempt
91
+ still re-runs. Turns are issued sequentially (one outstanding request at a time), so a retry
92
+ is always of the most recent request — keeping only the last one is sufficient and bounded."""
93
+ last_response: dict | None = None
94
+ """The response returned for `last_request`, replayed verbatim on a retry."""
95
+ inflight: dict[bytes, "asyncio.Future[dict | None]"] = field(default_factory=dict)
96
+ """Body digest -> the future of the attempt currently computing it. A retry that arrives
97
+ while the first attempt is still in flight (a slow turn) awaits this future instead of
98
+ starting a second inference — the other half of retry atomicity (with `last_response`, which
99
+ covers a retry after the attempt finished). Because a slow turn is coalesced rather than
100
+ re-sampled, retries stay safe without an inflated client timeout. The future resolves to the
101
+ served response, or to None if the attempt produced no servable response (error/refuse)."""
84
102
 
85
103
  async def refused(self) -> str | None:
86
104
  """The framework's limits (turns / token budget) and `@stop` checks, run before each
File without changes