verifiers 0.3.1.dev53__tar.gz → 0.3.1.dev55__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 (436) hide show
  1. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/PKG-INFO +1 -1
  2. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/acp/__init__.py +0 -2
  3. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/acp/runner.py +2 -24
  4. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/openclaw/harness.py +0 -2
  5. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/pi/harness.py +0 -2
  6. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/runtimes/prime.py +21 -11
  7. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/serve/client.py +34 -1
  8. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/serve/pool.py +30 -1
  9. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/serve/server.py +26 -1
  10. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/serve/types.py +13 -0
  11. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/.gitignore +0 -0
  12. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/LICENSE +0 -0
  13. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/README.md +0 -0
  14. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/pyproject.toml +0 -0
  15. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/__init__.py +0 -0
  16. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/conftest.py +0 -0
  17. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_browser_env.py +0 -0
  18. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_build_script.py +0 -0
  19. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_cli_agent_env.py +0 -0
  20. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_client_auth_errors.py +0 -0
  21. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_client_config.py +0 -0
  22. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_client_multimodal_types.py +0 -0
  23. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_composable_env.py +0 -0
  24. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_context_token_metrics.py +0 -0
  25. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_decorator_ranks.py +0 -0
  26. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_endpoint_registry.py +0 -0
  27. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_env_group.py +0 -0
  28. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_env_server.py +0 -0
  29. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_environment.py +0 -0
  30. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_environment_extra.py +0 -0
  31. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_error_chain.py +0 -0
  32. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_eval_display.py +0 -0
  33. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_eval_utils.py +0 -0
  34. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_gepa_cli.py +0 -0
  35. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_gepa_utils.py +0 -0
  36. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_gym_env.py +0 -0
  37. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_harbor_env_mcp.py +0 -0
  38. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_imports.py +0 -0
  39. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_init_script.py +0 -0
  40. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_install_utils.py +0 -0
  41. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_interception_utils.py +0 -0
  42. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_logging.py +0 -0
  43. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_math_rubric.py +0 -0
  44. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_maybe_think_parser.py +0 -0
  45. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_message_utils.py +0 -0
  46. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_message_utils_multimodal.py +0 -0
  47. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_multiturn_env.py +0 -0
  48. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_nemorl_client.py +0 -0
  49. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_openai_chat_completions_token_client.py +0 -0
  50. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_openai_responses_client.py +0 -0
  51. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_opencode_rlm_env.py +0 -0
  52. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_openenv_client.py +0 -0
  53. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_parser.py +0 -0
  54. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_path_utils.py +0 -0
  55. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_per_turn_timing.py +0 -0
  56. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_pricing_utils.py +0 -0
  57. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_prime_plugin.py +0 -0
  58. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_renderer_client.py +0 -0
  59. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_renderer_e2e.py +0 -0
  60. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_rlm_composable_env.py +0 -0
  61. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_rubric.py +0 -0
  62. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_rubric_group.py +0 -0
  63. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_sandbox_debug_env.py +0 -0
  64. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_sandbox_env.py +0 -0
  65. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_sandbox_mixin.py +0 -0
  66. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_save_utils.py +0 -0
  67. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_setup_script.py +0 -0
  68. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_singleturn_env.py +0 -0
  69. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_stateful_tool_env.py +0 -0
  70. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_think_parser.py +0 -0
  71. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_tool_env.py +0 -0
  72. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_tool_utils.py +0 -0
  73. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_trajectory_processing.py +0 -0
  74. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_tui_info_formatting.py +0 -0
  75. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_types.py +0 -0
  76. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/test_xml_parser.py +0 -0
  77. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/v1/conftest.py +0 -0
  78. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  79. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/v1/fixtures/duet_v1.py +0 -0
  80. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  81. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  82. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  83. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  84. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/v1/fixtures/echo_v1.py +0 -0
  85. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/v1/fixtures/pyproject.toml +0 -0
  86. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  87. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/v1/test_color_codeword_tasks.py +0 -0
  88. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/v1/test_configs.py +0 -0
  89. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/v1/test_e2e.py +0 -0
  90. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/v1/test_envs.py +0 -0
  91. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/v1/test_graph.py +0 -0
  92. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/v1/test_judges.py +0 -0
  93. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/v1/test_scoring.py +0 -0
  94. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/v1/test_taskset.py +0 -0
  95. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/tests/v1/test_trace.py +0 -0
  96. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/__init__.py +0 -0
  97. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/cli/__init__.py +0 -0
  98. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/cli/commands/__init__.py +0 -0
  99. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/cli/commands/build.py +0 -0
  100. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/cli/commands/eval.py +0 -0
  101. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/cli/commands/gepa.py +0 -0
  102. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/cli/commands/init.py +0 -0
  103. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/cli/commands/install.py +0 -0
  104. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/cli/commands/setup.py +0 -0
  105. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/cli/plugins/__init__.py +0 -0
  106. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/cli/plugins/prime.py +0 -0
  107. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/cli/tui.py +0 -0
  108. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/__init__.py +0 -0
  109. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/clients/__init__.py +0 -0
  110. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/clients/anthropic_messages_client.py +0 -0
  111. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/clients/client.py +0 -0
  112. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/clients/nemorl_chat_completions_client.py +0 -0
  113. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/clients/openai_chat_completions_client.py +0 -0
  114. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/clients/openai_chat_completions_token_client.py +0 -0
  115. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/clients/openai_completions_client.py +0 -0
  116. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/clients/openai_responses_client.py +0 -0
  117. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/clients/renderer_client.py +0 -0
  118. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/decorators.py +0 -0
  119. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/__init__.py +0 -0
  120. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/env_group.py +0 -0
  121. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/environment.py +0 -0
  122. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/README.md +0 -0
  123. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/__init__.py +0 -0
  124. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/cli_agent_env.py +0 -0
  125. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/README.md +0 -0
  126. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/__init__.py +0 -0
  127. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/_filter.py +0 -0
  128. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/composable_env.py +0 -0
  129. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/harness.py +0 -0
  130. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/harnesses/__init__.py +0 -0
  131. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  132. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/harnesses/opencode.py +0 -0
  133. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/harnesses/prompt.txt +0 -0
  134. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/harnesses/rlm.py +0 -0
  135. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/sandbox_debug_env.py +0 -0
  136. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/swe_debug_env.py +0 -0
  137. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/task.py +0 -0
  138. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/__init__.py +0 -0
  139. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  140. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  141. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  142. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  143. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  144. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  145. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  146. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  147. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  148. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/README.md +0 -0
  149. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  150. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  151. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  152. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  153. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  154. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  155. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  156. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  157. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  158. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  159. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  160. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  161. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  162. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  163. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  164. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  165. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  166. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  167. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  168. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  169. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  170. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  171. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  172. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/gym_env.py +0 -0
  173. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/harbor_env/__init__.py +0 -0
  174. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/harbor_env/env.py +0 -0
  175. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/harbor_env/mcp.py +0 -0
  176. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/mcp_env.py +0 -0
  177. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/opencode_env.py +0 -0
  178. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/opencode_qa_env.py +0 -0
  179. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/opencode_rlm_env.py +0 -0
  180. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/sandbox_mixin.py +0 -0
  181. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/utils/__init__.py +0 -0
  182. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/utils/file_locks.py +0 -0
  183. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/experimental/utils/git_checkout_cache.py +0 -0
  184. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/integrations/README.md +0 -0
  185. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/integrations/__init__.py +0 -0
  186. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/integrations/browser_env/README.md +0 -0
  187. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/integrations/browser_env/__init__.py +0 -0
  188. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/integrations/browser_env/browser_env.py +0 -0
  189. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/integrations/browser_env/modes/__init__.py +0 -0
  190. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/integrations/browser_env/modes/base.py +0 -0
  191. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  192. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  193. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/integrations/openenv_env.py +0 -0
  194. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/integrations/reasoninggym_env.py +0 -0
  195. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/integrations/textarena_env.py +0 -0
  196. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/multiturn_env.py +0 -0
  197. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/python_env.py +0 -0
  198. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/sandbox_env.py +0 -0
  199. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/singleturn_env.py +0 -0
  200. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/stateful_tool_env.py +0 -0
  201. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/envs/tool_env.py +0 -0
  202. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/errors.py +0 -0
  203. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/gepa/__init__.py +0 -0
  204. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/gepa/adapter.py +0 -0
  205. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/gepa/config.py +0 -0
  206. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/gepa/display.py +0 -0
  207. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/gepa/gepa_utils.py +0 -0
  208. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/parsers/__init__.py +0 -0
  209. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/parsers/maybe_think_parser.py +0 -0
  210. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/parsers/parser.py +0 -0
  211. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/parsers/think_parser.py +0 -0
  212. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/parsers/xml_parser.py +0 -0
  213. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/rubrics/__init__.py +0 -0
  214. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/rubrics/experimental/hybrid_math_rubric.py +0 -0
  215. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/rubrics/judge_rubric.py +0 -0
  216. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/rubrics/math_rubric.py +0 -0
  217. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/rubrics/rubric.py +0 -0
  218. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/rubrics/rubric_group.py +0 -0
  219. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/scripts/__init__.py +0 -0
  220. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/scripts/build.py +0 -0
  221. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/scripts/eval.py +0 -0
  222. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/scripts/gepa.py +0 -0
  223. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/scripts/init.py +0 -0
  224. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/scripts/install.py +0 -0
  225. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/scripts/setup.py +0 -0
  226. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/scripts/tui.py +0 -0
  227. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/serve/__init__.py +0 -0
  228. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/serve/client/env_client.py +0 -0
  229. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/serve/client/zmq_env_client.py +0 -0
  230. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/serve/server/__init__.py +0 -0
  231. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/serve/server/env_router.py +0 -0
  232. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/serve/server/env_server.py +0 -0
  233. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/serve/server/env_worker.py +0 -0
  234. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/serve/server/zmq_env_server.py +0 -0
  235. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/serve/types.py +0 -0
  236. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/types.py +0 -0
  237. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/__init__.py +0 -0
  238. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/async_utils.py +0 -0
  239. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/client_utils.py +0 -0
  240. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/config_utils.py +0 -0
  241. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/data_utils.py +0 -0
  242. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/display_utils.py +0 -0
  243. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/env_config_utils.py +0 -0
  244. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/env_utils.py +0 -0
  245. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/error_utils.py +0 -0
  246. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/eval_display.py +0 -0
  247. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/eval_utils.py +0 -0
  248. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/heartbeat.py +0 -0
  249. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/import_utils.py +0 -0
  250. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/install_utils.py +0 -0
  251. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/interception_utils.py +0 -0
  252. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/logging_utils.py +0 -0
  253. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/message_utils.py +0 -0
  254. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/metric_utils.py +0 -0
  255. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/path_utils.py +0 -0
  256. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/pricing_utils.py +0 -0
  257. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/process_utils.py +0 -0
  258. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/response_utils.py +0 -0
  259. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/save_utils.py +0 -0
  260. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/serve_utils.py +0 -0
  261. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/thread_utils.py +0 -0
  262. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/threaded_sandbox_client.py +0 -0
  263. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/tool_utils.py +0 -0
  264. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/usage_utils.py +0 -0
  265. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/legacy/utils/version_utils.py +0 -0
  266. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/__init__.py +0 -0
  267. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/agent.py +0 -0
  268. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/cli/__init__.py +0 -0
  269. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  270. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/cli/dashboard/base.py +0 -0
  271. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/cli/dashboard/eval.py +0 -0
  272. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/cli/dashboard/replay.py +0 -0
  273. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/cli/dashboard/validate.py +0 -0
  274. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/cli/debug.py +0 -0
  275. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/cli/eval/__init__.py +0 -0
  276. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/cli/eval/main.py +0 -0
  277. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/cli/eval/resume.py +0 -0
  278. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/cli/eval/runner.py +0 -0
  279. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/cli/gepa.py +0 -0
  280. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/cli/init.py +0 -0
  281. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/cli/output.py +0 -0
  282. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/cli/replay.py +0 -0
  283. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/cli/resolve.py +0 -0
  284. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/cli/resume.py +0 -0
  285. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/cli/validate.py +0 -0
  286. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/clients/__init__.py +0 -0
  287. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/clients/base.py +0 -0
  288. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/clients/client.py +0 -0
  289. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/clients/eval.py +0 -0
  290. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/clients/train.py +0 -0
  291. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/configs/__init__.py +0 -0
  292. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/configs/agent.py +0 -0
  293. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/configs/cli/__init__.py +0 -0
  294. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/configs/cli/debug.py +0 -0
  295. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/configs/cli/env.py +0 -0
  296. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/configs/cli/eval.py +0 -0
  297. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/configs/cli/init.py +0 -0
  298. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/configs/cli/replay.py +0 -0
  299. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/configs/cli/validate.py +0 -0
  300. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/configs/client.py +0 -0
  301. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/configs/env.py +0 -0
  302. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/configs/harness.py +0 -0
  303. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/configs/judge.py +0 -0
  304. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/configs/retries.py +0 -0
  305. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/configs/runtime.py +0 -0
  306. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/configs/serve.py +0 -0
  307. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/configs/task.py +0 -0
  308. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/configs/taskset.py +0 -0
  309. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/dialects/__init__.py +0 -0
  310. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/dialects/anthropic.py +0 -0
  311. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/dialects/base.py +0 -0
  312. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/dialects/chat.py +0 -0
  313. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/dialects/responses.py +0 -0
  314. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/env.py +0 -0
  315. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/envs/__init__.py +0 -0
  316. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  317. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  318. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  319. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/envs/best_of_n/env.py +0 -0
  320. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
  321. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  322. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/envs/single_agent/env.py +0 -0
  323. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  324. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/envs/user_sim/env.py +0 -0
  325. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/episode.py +0 -0
  326. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/errors.py +0 -0
  327. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/gepa/__init__.py +0 -0
  328. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/gepa/adapter.py +0 -0
  329. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/gepa/config.py +0 -0
  330. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/gepa/dataset.py +0 -0
  331. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/gepa/reflection.py +0 -0
  332. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/gepa/runner.py +0 -0
  333. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/graph.py +0 -0
  334. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harness.py +0 -0
  335. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/__init__.py +0 -0
  336. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  337. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/bash/harness.py +0 -0
  338. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/bash/program.py +0 -0
  339. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  340. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  341. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  342. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  343. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  344. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  345. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/codex/harness.py +0 -0
  346. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  347. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  348. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  349. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  350. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  351. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  352. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  353. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  354. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/node.py +0 -0
  355. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/null/__init__.py +0 -0
  356. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/null/harness.py +0 -0
  357. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/null/program.py +0 -0
  358. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  359. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  360. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  361. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/pool/harness.py +0 -0
  362. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  363. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  364. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  365. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  366. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  367. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/interception/__init__.py +0 -0
  368. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/interception/base.py +0 -0
  369. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/interception/pool.py +0 -0
  370. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/interception/server.py +0 -0
  371. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/interception/tool.py +0 -0
  372. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  373. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/interception/tunnel/base.py +0 -0
  374. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/interception/tunnel/custom.py +0 -0
  375. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/interception/tunnel/prime.py +0 -0
  376. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/judge.py +0 -0
  377. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/judges/__init__.py +0 -0
  378. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/judges/reference.py +0 -0
  379. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/judges/reference.txt +0 -0
  380. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/judges/rubric.py +0 -0
  381. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/judges/rubric.txt +0 -0
  382. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/mcp/__init__.py +0 -0
  383. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/mcp/launch.py +0 -0
  384. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/mcp/server.py +0 -0
  385. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/mcp/toolset.py +0 -0
  386. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/rollout.py +0 -0
  387. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/runtimes/__init__.py +0 -0
  388. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/runtimes/base.py +0 -0
  389. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  390. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/runtimes/docker/egress.py +0 -0
  391. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/runtimes/limiters.py +0 -0
  392. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/runtimes/modal.py +0 -0
  393. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/runtimes/subprocess.py +0 -0
  394. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/serve/__init__.py +0 -0
  395. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/serve/encoding.py +0 -0
  396. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/session.py +0 -0
  397. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/state.py +0 -0
  398. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/task.py +0 -0
  399. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/taskset.py +0 -0
  400. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/tasksets/__init__.py +0 -0
  401. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  402. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/tasksets/harbor/env.py +0 -0
  403. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  404. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  405. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  406. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  407. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  408. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  409. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  410. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  411. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  412. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  413. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  414. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  415. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  416. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/trace.py +0 -0
  417. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/types.py +0 -0
  418. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/utils/__init__.py +0 -0
  419. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/utils/aio.py +0 -0
  420. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/utils/artifacts.py +0 -0
  421. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/utils/compile.py +0 -0
  422. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/utils/decorators.py +0 -0
  423. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/utils/format.py +0 -0
  424. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/utils/generic.py +0 -0
  425. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/utils/git.py +0 -0
  426. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/utils/image.py +0 -0
  427. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/utils/interrupt.py +0 -0
  428. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/utils/loaders.py +0 -0
  429. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/utils/logging.py +0 -0
  430. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/utils/memory.py +0 -0
  431. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/utils/paths.py +0 -0
  432. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/utils/platform.py +0 -0
  433. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/utils/prime.py +0 -0
  434. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/utils/retries.py +0 -0
  435. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/utils/score.py +0 -0
  436. {verifiers-0.3.1.dev53 → verifiers-0.3.1.dev55}/verifiers/v1/utils/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: verifiers
3
- Version: 0.3.1.dev53
3
+ Version: 0.3.1.dev55
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
@@ -41,7 +41,6 @@ class ACPConfig:
41
41
  mcp_urls: dict[str, str] | None = None
42
42
  system_prompt: str | None = None
43
43
  session_meta: JsonObject | None = None
44
- allow_empty_tool_reply: bool = False
45
44
 
46
45
 
47
46
  class ACPHarness(Harness[ConfigT]):
@@ -215,7 +214,6 @@ class ACPHarnessSession(HarnessSession):
215
214
  "mcp_urls": self.mcp_urls,
216
215
  "system_prompt": self.config.system_prompt or "",
217
216
  "session_meta": self.config.session_meta or {},
218
- "allow_empty_tool_reply": self.config.allow_empty_tool_reply,
219
217
  }
220
218
  async with self._lock:
221
219
  if self._closed:
@@ -30,8 +30,6 @@ from acp.schema import (
30
30
  PermissionOption,
31
31
  RequestPermissionResponse,
32
32
  TextContentBlock,
33
- ToolCall,
34
- ToolCallUpdate,
35
33
  )
36
34
 
37
35
  MAX_PACKET_BYTES = 128 * 1024 * 1024
@@ -41,20 +39,13 @@ class VerifiersACPClient(Client):
41
39
  def __init__(self) -> None:
42
40
  self.visible_reply = ""
43
41
  self.message_id: str | None = None
44
- self.tool_calls: dict[str, str] = {}
45
42
 
46
43
  def reset(self) -> None:
47
44
  self.visible_reply = ""
48
45
  self.message_id = None
49
- self.tool_calls = {}
50
46
 
51
47
  async def session_update(self, session_id: str, update: Any, **kwargs: Any) -> None:
52
- if isinstance(update, ToolCall):
53
- self.tool_calls[update.tool_call_id] = update.status or "pending"
54
- elif isinstance(update, ToolCallUpdate):
55
- if update.status:
56
- self.tool_calls[update.tool_call_id] = update.status
57
- elif isinstance(update, AgentMessageChunk) and isinstance(
48
+ if isinstance(update, AgentMessageChunk) and isinstance(
58
49
  update.content, TextContentBlock
59
50
  ):
60
51
  message_id = getattr(update, "message_id", None)
@@ -137,23 +128,10 @@ async def prompt(
137
128
  raise ValueError("ACP prompt has no content")
138
129
  client.reset()
139
130
  try:
140
- response = await connection.prompt(session_id=session_id, prompt=blocks)
131
+ await connection.prompt(session_id=session_id, prompt=blocks)
141
132
  except RequestError as error:
142
133
  detail = error.data.get("details") if isinstance(error.data, dict) else None
143
134
  raise RuntimeError(detail or str(error)) from error
144
-
145
- tool_statuses = list(client.tool_calls.values())
146
- completed_tool_turn = (
147
- config.get("allow_empty_tool_reply", False)
148
- and response.stop_reason == "end_turn"
149
- and bool(tool_statuses)
150
- and all(status in ("completed", "failed") for status in tool_statuses)
151
- )
152
- if not client.visible_reply.strip() and not completed_tool_turn:
153
- raise RuntimeError(
154
- "ACP agent produced no visible reply "
155
- f"(stop_reason={response.stop_reason}, tool_statuses={tool_statuses})"
156
- )
157
135
  return client.visible_reply
158
136
 
159
137
 
@@ -229,8 +229,6 @@ class OpenClawHarness(ACPHarness[OpenClawHarnessConfig]):
229
229
  prompt=prompt,
230
230
  mcp_urls={},
231
231
  system_prompt=system_prompt,
232
- # OpenClaw can end after its final tool completes without a text message.
233
- allow_empty_tool_reply=True,
234
232
  )
235
233
 
236
234
  async def cleanup(self, trace: Trace, runtime: Runtime) -> None:
@@ -200,6 +200,4 @@ class PiHarness(ACPHarness[PiHarnessConfig]):
200
200
  prompt=prompt,
201
201
  # Pi's extension owns the task-scoped MCP configuration.
202
202
  mcp_urls={},
203
- # Pi can end after its final tool completes without a text message.
204
- allow_empty_tool_reply=True,
205
203
  )
@@ -31,6 +31,7 @@ from verifiers.v1.runtimes.base import (
31
31
  parse_gpu,
32
32
  )
33
33
  from verifiers.v1.runtimes.limiters import creation_limiter
34
+ from verifiers.v1.utils.aio import run_shielded
34
35
  from verifiers.v1.utils.prime import ensure_prime_auth
35
36
 
36
37
  logger = logging.getLogger(__name__)
@@ -183,18 +184,27 @@ class PrimeRuntime(Runtime):
183
184
  )
184
185
  or contextlib.nullcontext()
185
186
  ):
186
- sandbox = await self._client.create(
187
- CreateSandboxRequest(
188
- name=self.name,
189
- labels=list(dict.fromkeys([*BASE_LABELS, *self.config.labels])),
190
- docker_image=self.config.image,
191
- vm=self.config.vm,
192
- guaranteed=self.config.guaranteed,
193
- environment_vars=self.env,
194
- **{k: v for k, v in options.items() if v is not None},
187
+ # Shielded through the id capture: a cancel that aborts the POST
188
+ # mid-flight leaves the platform creating a sandbox this side
189
+ # never learned the id of — teardown() then cannot delete it
190
+ async def create_and_capture_id():
191
+ sandbox = await self._client.create(
192
+ CreateSandboxRequest(
193
+ name=self.name,
194
+ labels=list(
195
+ dict.fromkeys([*BASE_LABELS, *self.config.labels])
196
+ ),
197
+ docker_image=self.config.image,
198
+ vm=self.config.vm,
199
+ guaranteed=self.config.guaranteed,
200
+ environment_vars=self.env,
201
+ **{k: v for k, v in options.items() if v is not None},
202
+ )
195
203
  )
196
- )
197
- self.info.id = sandbox.id
204
+ self.info.id = sandbox.id
205
+ return sandbox
206
+
207
+ sandbox = await run_shielded(create_and_capture_id())
198
208
  # The create response says whether the platform already has the image:
199
209
  # `pending_image_build_id` set means a first-use auto-build is running and the
200
210
  # sandbox stays PENDING until it finishes (`wait_for_creation` gives that phase
@@ -24,6 +24,7 @@ from verifiers.v1.episode import WireEpisode
24
24
  from verifiers.v1.serve.types import (
25
25
  BaseRequest,
26
26
  BaseResponse,
27
+ CancelRequest,
27
28
  HealthRequest,
28
29
  HealthResponse,
29
30
  RunRequest,
@@ -46,6 +47,10 @@ class EnvClient:
46
47
  self.socket.setsockopt(zmq.RCVHWM, 0)
47
48
  self.socket.connect(address)
48
49
  self._pending: dict[str, asyncio.Future[bytes]] = {}
50
+ # Strong refs to in-flight fire-and-forget cancels: the loop only
51
+ # holds weak references to tasks, so an unreferenced one can be
52
+ # garbage-collected before it ever sends
53
+ self._cancel_tasks: set[asyncio.Task] = set()
49
54
  self._receiver: asyncio.Task | None = None
50
55
  self._decode_slots = asyncio.BoundedSemaphore(1)
51
56
 
@@ -81,8 +86,20 @@ class EnvClient:
81
86
  )
82
87
  try:
83
88
  data = await asyncio.wait_for(future, timeout)
84
- except (TimeoutError, asyncio.CancelledError):
89
+ except TimeoutError:
90
+ self._pending.pop(request_id, None)
91
+ raise
92
+ except asyncio.CancelledError:
85
93
  self._pending.pop(request_id, None)
94
+ if request.method == RunRequest.method:
95
+ # Fire-and-forget: tell the server to abort the rollout so the
96
+ # episode stops consuming inference and env-runtime resources.
97
+ # A task on the loop outlives this (cancelled) caller.
98
+ task = asyncio.get_running_loop().create_task(
99
+ self._send_cancel(request_id)
100
+ )
101
+ self._cancel_tasks.add(task)
102
+ task.add_done_callback(self._cancel_tasks.discard)
86
103
  raise
87
104
  if response_type is HealthResponse:
88
105
  response = response_type.model_validate(msgpack.unpackb(data, raw=False))
@@ -109,6 +126,17 @@ class EnvClient:
109
126
  raise RuntimeError(response.error or "env server request failed")
110
127
  return response
111
128
 
129
+ async def _send_cancel(self, run_request_id: str) -> None:
130
+ """Best-effort server-side abort of an abandoned run."""
131
+ with contextlib.suppress(Exception):
132
+ payload = msgpack.packb(
133
+ CancelRequest(request_id=run_request_id).model_dump(mode="json"),
134
+ use_bin_type=True,
135
+ )
136
+ await self.socket.send_multipart(
137
+ [uuid.uuid4().hex.encode(), CancelRequest.method.encode(), payload]
138
+ )
139
+
112
140
  async def health(self, timeout: float = 2.0) -> bool:
113
141
  try:
114
142
  return (
@@ -157,5 +185,10 @@ class EnvClient:
157
185
  with contextlib.suppress(asyncio.CancelledError):
158
186
  await self._receiver
159
187
  self._receiver = None
188
+ # Let scheduled fire-and-forget cancels reach the socket first, or a
189
+ # run cancelled right before close() leaves its server-side rollout
190
+ # running. Loop: awaiting one wave can schedule another
191
+ while self._cancel_tasks:
192
+ await asyncio.gather(*list(self._cancel_tasks), return_exceptions=True)
160
193
  self.socket.close()
161
194
  self.ctx.term()
@@ -36,11 +36,14 @@ import zmq.asyncio
36
36
 
37
37
  from verifiers.v1.configs.env import EnvConfig
38
38
  from verifiers.v1.serve.server import EnvServer
39
- from verifiers.v1.serve.types import HealthResponse
39
+ from verifiers.v1.serve.types import CancelResponse, HealthResponse
40
40
 
41
41
  logger = logging.getLogger(__name__)
42
42
 
43
43
  _HEALTH = msgpack.packb(HealthResponse().model_dump(mode="json"), use_bin_type=True)
44
+ _CANCEL_MISS = msgpack.packb(
45
+ CancelResponse(cancelled=False).model_dump(mode="json"), use_bin_type=True
46
+ )
44
47
 
45
48
 
46
49
  def _arm_teardown(death_pipe=None) -> None:
@@ -192,6 +195,32 @@ class EnvServerPool:
192
195
  await self.frontend.send_multipart(
193
196
  [client_id, request_id, _HEALTH]
194
197
  )
198
+ elif method == b"cancel":
199
+ # Route the cancel to the worker holding the target run;
200
+ # an unknown/finished target (or an unparseable payload
201
+ # — one bad frame must not tear down the broker) is
202
+ # answered inline
203
+ try:
204
+ body = msgpack.unpackb(payload, raw=False)
205
+ target = str(body.get("request_id", "")).encode()
206
+ except Exception: # noqa: BLE001 - one bad frame must not kill the broker
207
+ target = b""
208
+ target_entry = pending.get(target)
209
+ if target_entry is None:
210
+ await self.frontend.send_multipart(
211
+ [client_id, request_id, _CANCEL_MISS]
212
+ )
213
+ else:
214
+ worker = target_entry["worker"]
215
+ worker["active"] += 1
216
+ pending[request_id] = {
217
+ "client_id": client_id,
218
+ "worker": worker,
219
+ }
220
+ in_flight += 1
221
+ await worker["dealer"].send_multipart(
222
+ [request_id, method, payload]
223
+ )
195
224
  else:
196
225
  worker = min(self.workers, key=lambda w: w["active"])
197
226
  worker["active"] += 1
@@ -11,6 +11,8 @@ from verifiers.v1.configs.env import EnvConfig
11
11
  from verifiers.v1.serve.encoding import msgpack_encoder
12
12
  from verifiers.v1.serve.types import (
13
13
  BaseResponse,
14
+ CancelRequest,
15
+ CancelResponse,
14
16
  HealthResponse,
15
17
  RunRequest,
16
18
  RunResponse,
@@ -47,6 +49,8 @@ class EnvServer:
47
49
  )
48
50
  # This worker's episode bound (`--max-concurrent`), spanning requests.
49
51
  self._gate = asyncio.Semaphore(max_concurrent) if max_concurrent else None
52
+ # In-flight run tasks by wire request_id, so a `cancel` can abort them
53
+ self._running: dict[str, asyncio.Task] = {}
50
54
  self.ctx = zmq.asyncio.Context()
51
55
  self.frontend = self.ctx.socket(zmq.ROUTER)
52
56
  self.frontend.setsockopt(zmq.ROUTER_MANDATORY, 1)
@@ -107,11 +111,26 @@ class EnvServer:
107
111
  if route == "health":
108
112
  response: BaseResponse = HealthResponse()
109
113
  elif route == "run":
110
- response = await self._run(RunRequest.model_validate(raw))
114
+ # Registered in the dispatch loop, before this task first runs
115
+ try:
116
+ response = await self._run(RunRequest.model_validate(raw))
117
+ finally:
118
+ self._running.pop(request_id.decode(), None)
119
+ elif route == "cancel":
120
+ target = CancelRequest.model_validate(raw).request_id
121
+ running = self._running.get(target)
122
+ if running is not None:
123
+ running.cancel()
124
+ logger.info("cancelled run %s on client request", target)
125
+ response = CancelResponse(cancelled=running is not None)
111
126
  else:
112
127
  response = BaseResponse(
113
128
  success=False, error=f"unknown method {route!r}"
114
129
  )
130
+ except asyncio.CancelledError:
131
+ # An aborted run still replies so broker/client accounting stays
132
+ # exact; the requesting client has already given up on the result
133
+ response = BaseResponse(success=False, error="Cancelled: rollout aborted")
115
134
  except (
116
135
  Exception
117
136
  ) as e: # a failed request is data, not a crash — report and keep serving
@@ -156,6 +175,12 @@ class EnvServer:
156
175
  task = asyncio.create_task(
157
176
  self._handle(client_id, request_id, method, payload)
158
177
  )
178
+ if method == b"run":
179
+ # Register at dispatch, not handler start: a cancel
180
+ # processed ahead of the run's handler task must still
181
+ # find its target (ZMQ preserves per-client frame
182
+ # order, so the run always arrives first)
183
+ self._running[request_id.decode()] = task
159
184
  tasks.add(task)
160
185
  task.add_done_callback(tasks.discard)
161
186
  except (asyncio.CancelledError, KeyboardInterrupt):
@@ -26,6 +26,19 @@ class HealthResponse(BaseResponse):
26
26
  pass
27
27
 
28
28
 
29
+ class CancelRequest(BaseRequest):
30
+ """Abort an in-flight run by its wire ``request_id``. Idempotent — a
31
+ finished or unknown run cancels successfully with ``cancelled=False``."""
32
+
33
+ method: ClassVar[str] = "cancel"
34
+ request_id: str
35
+
36
+
37
+ class CancelResponse(BaseResponse):
38
+ cancelled: bool = False
39
+ """Whether a live run was found and aborted."""
40
+
41
+
29
42
  class RunRequest(BaseRequest):
30
43
  """One env-rollout, shipping the task itself: `task_data` is the dumped
31
44
  `TaskData` the server validates into the taskset's declared type."""
File without changes