verifiers 0.1.15.dev360__tar.gz → 0.1.15.dev366__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 (402) hide show
  1. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/PKG-INFO +1 -1
  2. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/eval/resume.py +46 -26
  3. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/dialects/anthropic.py +36 -25
  4. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/dialects/base.py +40 -14
  5. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/dialects/chat.py +26 -9
  6. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/graph.py +10 -8
  7. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/interception/server.py +35 -11
  8. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/runtimes/base.py +11 -1
  9. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/runtimes/prime.py +18 -6
  10. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/.gitignore +0 -0
  11. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/LICENSE +0 -0
  12. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/README.md +0 -0
  13. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/pyproject.toml +0 -0
  14. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/AGENTS.md +0 -0
  15. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/README.md +0 -0
  16. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/__init__.py +0 -0
  17. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/conftest.py +0 -0
  18. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_browser_env.py +0 -0
  19. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_build_script.py +0 -0
  20. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_cli_agent_env.py +0 -0
  21. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_client_auth_errors.py +0 -0
  22. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_client_config.py +0 -0
  23. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_client_multimodal_types.py +0 -0
  24. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_composable_env.py +0 -0
  25. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_context_token_metrics.py +0 -0
  26. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_decorator_ranks.py +0 -0
  27. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_endpoint_registry.py +0 -0
  28. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_env_group.py +0 -0
  29. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_env_server.py +0 -0
  30. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_environment.py +0 -0
  31. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_environment_extra.py +0 -0
  32. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_envs.py +0 -0
  33. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_error_chain.py +0 -0
  34. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_eval_display.py +0 -0
  35. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_eval_utils.py +0 -0
  36. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_gepa_cli.py +0 -0
  37. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_gepa_utils.py +0 -0
  38. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_gym_env.py +0 -0
  39. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_harbor_env_mcp.py +0 -0
  40. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_imports.py +0 -0
  41. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_init_script.py +0 -0
  42. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_install_utils.py +0 -0
  43. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_interception_utils.py +0 -0
  44. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_lean_task.py +0 -0
  45. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_logging.py +0 -0
  46. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_math_rubric.py +0 -0
  47. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_maybe_think_parser.py +0 -0
  48. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_message_utils.py +0 -0
  49. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_message_utils_multimodal.py +0 -0
  50. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_multiturn_env.py +0 -0
  51. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_nemorl_client.py +0 -0
  52. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_openai_chat_completions_token_client.py +0 -0
  53. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_openai_responses_client.py +0 -0
  54. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_opencode_rlm_env.py +0 -0
  55. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_openenv_client.py +0 -0
  56. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_parser.py +0 -0
  57. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_path_utils.py +0 -0
  58. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_per_turn_timing.py +0 -0
  59. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_pricing_utils.py +0 -0
  60. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_prime_plugin.py +0 -0
  61. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_renderer_client.py +0 -0
  62. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_renderer_e2e.py +0 -0
  63. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_rlm_composable_env.py +0 -0
  64. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_rubric.py +0 -0
  65. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_rubric_group.py +0 -0
  66. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_sandbox_debug_env.py +0 -0
  67. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_sandbox_env.py +0 -0
  68. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_sandbox_mixin.py +0 -0
  69. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_save_utils.py +0 -0
  70. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_setup_script.py +0 -0
  71. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_singleturn_env.py +0 -0
  72. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_stateful_tool_env.py +0 -0
  73. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_think_parser.py +0 -0
  74. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_tool_env.py +0 -0
  75. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_tool_utils.py +0 -0
  76. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_trajectory_processing.py +0 -0
  77. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_tui_info_formatting.py +0 -0
  78. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_types.py +0 -0
  79. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_wordle_env.py +0 -0
  80. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_xml_parser.py +0 -0
  81. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/conftest.py +0 -0
  82. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  83. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  84. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  85. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  86. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  87. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/fixtures/echo_v0.py +0 -0
  88. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/fixtures/echo_v1.py +0 -0
  89. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/fixtures/pyproject.toml +0 -0
  90. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  91. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/test_color_codeword_tasks.py +0 -0
  92. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/test_configs.py +0 -0
  93. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/test_e2e.py +0 -0
  94. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/test_envs.py +0 -0
  95. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/test_graph.py +0 -0
  96. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/test_legacy.py +0 -0
  97. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/test_trace.py +0 -0
  98. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/AGENTS.md +0 -0
  99. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/__init__.py +0 -0
  100. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/__init__.py +0 -0
  101. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/commands/__init__.py +0 -0
  102. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/commands/build.py +0 -0
  103. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/commands/eval.py +0 -0
  104. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/commands/gepa.py +0 -0
  105. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/commands/init.py +0 -0
  106. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/commands/install.py +0 -0
  107. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/commands/setup.py +0 -0
  108. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/plugins/__init__.py +0 -0
  109. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/plugins/prime.py +0 -0
  110. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/tui.py +0 -0
  111. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/clients/__init__.py +0 -0
  112. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/clients/anthropic_messages_client.py +0 -0
  113. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/clients/client.py +0 -0
  114. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  115. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/clients/openai_chat_completions_client.py +0 -0
  116. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  117. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/clients/openai_completions_client.py +0 -0
  118. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/clients/openai_responses_client.py +0 -0
  119. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/clients/renderer_client.py +0 -0
  120. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/decorators.py +0 -0
  121. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/AGENTS.md +0 -0
  122. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/__init__.py +0 -0
  123. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/env_group.py +0 -0
  124. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/environment.py +0 -0
  125. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/README.md +0 -0
  126. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/__init__.py +0 -0
  127. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  128. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/README.md +0 -0
  129. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/__init__.py +0 -0
  130. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/_filter.py +0 -0
  131. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  132. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/harness.py +0 -0
  133. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  134. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  135. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  136. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  137. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  138. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  139. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  140. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/task.py +0 -0
  141. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  142. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  143. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  144. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  145. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  146. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  147. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  148. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  149. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/lean/__init__.py +0 -0
  150. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/lean/lean_task.py +0 -0
  151. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  152. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  153. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
  154. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
  155. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
  156. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
  157. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
  158. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
  159. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
  160. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
  161. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
  162. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
  163. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
  164. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
  165. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
  166. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
  167. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
  168. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
  169. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
  170. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
  171. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
  172. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
  173. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
  174. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
  175. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
  176. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
  177. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
  178. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
  179. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
  180. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
  181. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
  182. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  183. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  184. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  185. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  186. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  187. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  188. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  189. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  190. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  191. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  192. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  193. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  194. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  195. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  196. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  197. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  198. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  199. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  200. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  201. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  202. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  203. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  204. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  205. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  206. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/gym_env.py +0 -0
  207. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  208. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  209. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  210. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/mcp_env.py +0 -0
  211. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/opencode_env.py +0 -0
  212. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  213. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  214. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  215. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/utils/__init__.py +0 -0
  216. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  217. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  218. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/README.md +0 -0
  219. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/__init__.py +0 -0
  220. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/browser_env/README.md +0 -0
  221. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  222. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  223. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  224. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  225. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  226. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  227. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/openenv_env.py +0 -0
  228. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  229. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/textarena_env.py +0 -0
  230. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/multiturn_env.py +0 -0
  231. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/python_env.py +0 -0
  232. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/sandbox_env.py +0 -0
  233. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/singleturn_env.py +0 -0
  234. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/stateful_tool_env.py +0 -0
  235. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/tool_env.py +0 -0
  236. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/errors.py +0 -0
  237. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/gepa/__init__.py +0 -0
  238. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/gepa/adapter.py +0 -0
  239. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/gepa/config.py +0 -0
  240. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/gepa/display.py +0 -0
  241. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/gepa/gepa_utils.py +0 -0
  242. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/parsers/__init__.py +0 -0
  243. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/parsers/maybe_think_parser.py +0 -0
  244. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/parsers/parser.py +0 -0
  245. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/parsers/think_parser.py +0 -0
  246. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/parsers/xml_parser.py +0 -0
  247. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rl/README.md +0 -0
  248. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rl/__init__.py +0 -0
  249. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rl/inference/__init__.py +0 -0
  250. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rl/inference/client.py +0 -0
  251. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rl/inference/server.py +0 -0
  252. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rl/trainer/__init__.py +0 -0
  253. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rl/trainer/config.py +0 -0
  254. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rl/trainer/orchestrator.py +0 -0
  255. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rl/trainer/trainer.py +0 -0
  256. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rl/trainer/utils.py +0 -0
  257. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rubrics/__init__.py +0 -0
  258. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  259. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rubrics/judge_rubric.py +0 -0
  260. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rubrics/math_rubric.py +0 -0
  261. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rubrics/rubric.py +0 -0
  262. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rubrics/rubric_group.py +0 -0
  263. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/__init__.py +0 -0
  264. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/build.py +0 -0
  265. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/eval.py +0 -0
  266. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/gepa.py +0 -0
  267. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/init.py +0 -0
  268. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/install.py +0 -0
  269. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/rl.py +0 -0
  270. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/setup.py +0 -0
  271. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/train.py +0 -0
  272. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/tui.py +0 -0
  273. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/vllm.py +0 -0
  274. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/serve/__init__.py +0 -0
  275. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/serve/client/env_client.py +0 -0
  276. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/serve/client/zmq_env_client.py +0 -0
  277. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/serve/server/__init__.py +0 -0
  278. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/serve/server/env_router.py +0 -0
  279. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/serve/server/env_server.py +0 -0
  280. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/serve/server/env_worker.py +0 -0
  281. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/serve/server/zmq_env_server.py +0 -0
  282. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/serve/types.py +0 -0
  283. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/types.py +0 -0
  284. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/__init__.py +0 -0
  285. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/async_utils.py +0 -0
  286. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/client_utils.py +0 -0
  287. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/config_utils.py +0 -0
  288. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/data_utils.py +0 -0
  289. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/display_utils.py +0 -0
  290. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/env_config_utils.py +0 -0
  291. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/env_utils.py +0 -0
  292. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/error_utils.py +0 -0
  293. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/eval_display.py +0 -0
  294. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/eval_utils.py +0 -0
  295. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/heartbeat.py +0 -0
  296. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/import_utils.py +0 -0
  297. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/install_utils.py +0 -0
  298. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/interception_utils.py +0 -0
  299. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/logging_utils.py +0 -0
  300. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/message_utils.py +0 -0
  301. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/metric_utils.py +0 -0
  302. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/path_utils.py +0 -0
  303. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/pricing_utils.py +0 -0
  304. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/process_utils.py +0 -0
  305. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/response_utils.py +0 -0
  306. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/save_utils.py +0 -0
  307. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/serve_utils.py +0 -0
  308. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/thread_utils.py +0 -0
  309. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/threaded_sandbox_client.py +0 -0
  310. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/tool_utils.py +0 -0
  311. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/usage_utils.py +0 -0
  312. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/version_utils.py +0 -0
  313. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/ARCHITECTURE.md +0 -0
  314. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/GUIDE.md +0 -0
  315. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/README.md +0 -0
  316. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/__init__.py +0 -0
  317. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/__init__.py +0 -0
  318. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  319. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/dashboard/base.py +0 -0
  320. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/dashboard/eval.py +0 -0
  321. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/dashboard/validate.py +0 -0
  322. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/eval/__init__.py +0 -0
  323. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/eval/main.py +0 -0
  324. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/eval/runner.py +0 -0
  325. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/init.py +0 -0
  326. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/output.py +0 -0
  327. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/resolve.py +0 -0
  328. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/serve.py +0 -0
  329. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/validate.py +0 -0
  330. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/clients/__init__.py +0 -0
  331. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/clients/client.py +0 -0
  332. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/clients/config.py +0 -0
  333. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/clients/eval.py +0 -0
  334. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/clients/train.py +0 -0
  335. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/configs/__init__.py +0 -0
  336. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/configs/eval.py +0 -0
  337. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/configs/init.py +0 -0
  338. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/configs/serve.py +0 -0
  339. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/configs/validate.py +0 -0
  340. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/decorators.py +0 -0
  341. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/dialects/__init__.py +0 -0
  342. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/dialects/responses.py +0 -0
  343. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/env.py +0 -0
  344. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/episode.py +0 -0
  345. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/errors.py +0 -0
  346. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harness.py +0 -0
  347. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/__init__.py +0 -0
  348. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  349. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/bash/harness.py +0 -0
  350. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/bash/program.py +0 -0
  351. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  352. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/codex/harness.py +0 -0
  353. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/default/__init__.py +0 -0
  354. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/default/harness.py +0 -0
  355. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/default/program.py +0 -0
  356. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  357. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  358. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  359. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  360. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  361. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  362. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  363. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  364. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  365. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  366. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/interception/__init__.py +0 -0
  367. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/interception/pool.py +0 -0
  368. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/legacy.py +0 -0
  369. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/loaders.py +0 -0
  370. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/mcp/__init__.py +0 -0
  371. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/mcp/launch.py +0 -0
  372. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/mcp/multiplex.py +0 -0
  373. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/mcp/server.py +0 -0
  374. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/mcp/toolset.py +0 -0
  375. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/mcp/user.py +0 -0
  376. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/retries.py +0 -0
  377. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/rollout.py +0 -0
  378. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/runtimes/__init__.py +0 -0
  379. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/runtimes/docker.py +0 -0
  380. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/runtimes/limiters.py +0 -0
  381. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/runtimes/modal.py +0 -0
  382. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/runtimes/subprocess.py +0 -0
  383. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/serve/__init__.py +0 -0
  384. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/serve/client.py +0 -0
  385. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/serve/pool.py +0 -0
  386. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/serve/server.py +0 -0
  387. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/serve/types.py +0 -0
  388. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/state.py +0 -0
  389. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/task.py +0 -0
  390. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/taskset.py +0 -0
  391. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/tasksets/__init__.py +0 -0
  392. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/tasksets/harbor_v1/__init__.py +0 -0
  393. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/tasksets/harbor_v1/taskset.py +0 -0
  394. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/tasksets/textarena_v1/__init__.py +0 -0
  395. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/tasksets/textarena_v1/taskset.py +0 -0
  396. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/trace.py +0 -0
  397. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/types.py +0 -0
  398. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/utils/__init__.py +0 -0
  399. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/utils/format.py +0 -0
  400. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/utils/install.py +0 -0
  401. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/utils/logging.py +0 -0
  402. {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/utils/memory.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.1.15.dev360
3
+ Version: 0.1.15.dev366
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
@@ -11,8 +11,11 @@ together), so any task that isn't fully complete is redone from scratch.
11
11
  import json
12
12
  import tomllib
13
13
  from collections import defaultdict
14
+ from collections.abc import Iterator
14
15
  from pathlib import Path
15
16
 
17
+ from pydantic_core import from_json
18
+
16
19
  from verifiers.v1.configs.eval import EvalConfig
17
20
 
18
21
 
@@ -45,54 +48,71 @@ def load_resume_config(resume_dir: Path) -> EvalConfig:
45
48
  return config
46
49
 
47
50
 
48
- def _read_results(results_path: Path) -> list[dict]:
49
- """The previous run's traces as raw dicts. The on-disk dump carries computed fields a
50
- strict `Trace` can't re-validate, so we read the JSON directly — resume only needs each
51
- trace's `task.idx` and whether it `errors`ed."""
51
+ def _read_results(results_path: Path) -> Iterator[tuple[int, int, bool]]:
52
+ """Stream `(file reference, task idx, errored)` without retaining decoded traces."""
52
53
  if not results_path.exists():
53
- return []
54
- return [
55
- json.loads(line)
56
- for line in results_path.read_text().split("\n")
57
- if line.strip()
58
- ]
54
+ return
55
+ with results_path.open("rb") as results:
56
+ while True:
57
+ offset = results.tell()
58
+ line = results.readline()
59
+ if not line:
60
+ break
61
+ if line.strip():
62
+ try:
63
+ row = from_json(line)
64
+ except ValueError:
65
+ row = json.loads(line)
66
+ yield offset, row["task"]["idx"], bool(row.get("errors"))
59
67
 
60
68
 
61
69
  def plan(
62
70
  resume_dir: Path, selected_idxs: list[int], num_rollouts: int, group: bool
63
- ) -> tuple[list[dict], dict[int, int]]:
71
+ ) -> tuple[list[int], dict[int, int]]:
64
72
  """Diff the saved results against the run's target (`num_rollouts` per selected task).
65
- Returns (rows to keep in `results.jsonl`, rollouts owed per task idx). An errored trace is
66
- dropped and re-run; a group-scored task is kept only if fully complete, else its whole
67
- group is redone."""
68
- by_idx: dict[int, list[dict]] = defaultdict(list)
69
- for row in _read_results(resume_dir / "results.jsonl"):
70
- by_idx[row["task"]["idx"]].append(row)
71
- keep: list[dict] = []
73
+ Returns (byte offsets of rows to keep, rollouts owed per task idx). An errored trace is
74
+ dropped and re-run; a group-scored task is kept only if fully complete, else its whole group
75
+ is redone."""
76
+ # Retain only the offsets resume can reuse; trace payloads stay on disk.
77
+ selected = set(selected_idxs)
78
+ by_idx: dict[int, list[int]] = defaultdict(list)
79
+ for offset, idx, errored in _read_results(resume_dir / "results.jsonl"):
80
+ if idx in selected and not errored and len(by_idx[idx]) < num_rollouts:
81
+ by_idx[idx].append(offset)
82
+ keep: list[int] = []
72
83
  owed: dict[int, int] = {}
73
84
  for idx in selected_idxs:
74
- good = [row for row in by_idx.get(idx, []) if not row.get("errors")]
85
+ good = by_idx.get(idx, [])
75
86
  if group:
76
87
  if len(good) >= num_rollouts:
77
- keep.extend(good[:num_rollouts])
88
+ keep.extend(good)
78
89
  else:
79
90
  owed[idx] = num_rollouts # re-run the whole group; keep none of it
80
91
  else:
81
- keep.extend(good[:num_rollouts])
82
- missing = num_rollouts - min(len(good), num_rollouts)
92
+ keep.extend(good)
93
+ missing = num_rollouts - len(good)
83
94
  if missing:
84
95
  owed[idx] = missing
85
96
  return keep, owed
86
97
 
87
98
 
88
- def rewrite_results(resume_dir: Path, keep: list[dict]) -> None:
99
+ def rewrite_results(resume_dir: Path, keep: list[int]) -> None:
89
100
  """Replace `results.jsonl` with just the kept (good) traces; resumed rollouts append. Via a
90
101
  temp file + atomic rename, so an interrupted resume can't corrupt the prior good results."""
91
102
  path = resume_dir / "results.jsonl"
92
103
  tmp = path.with_suffix(".jsonl.tmp")
93
- with tmp.open("w") as f:
94
- for row in keep:
95
- f.write(json.dumps(row) + "\n")
104
+ if not keep:
105
+ tmp.write_bytes(b"")
106
+ tmp.replace(path)
107
+ return
108
+ # Re-read retained rows by offset while building the atomic replacement.
109
+ with path.open("rb") as results, tmp.open("wb") as output:
110
+ for offset in keep:
111
+ results.seek(offset)
112
+ raw = results.readline()
113
+ output.write(raw)
114
+ if not raw.endswith(b"\n"):
115
+ output.write(b"\n")
96
116
  tmp.replace(path)
97
117
 
98
118
 
@@ -122,15 +122,15 @@ def response_from_wire(message: AnthropicMessage) -> Response:
122
122
  data = message.model_dump()
123
123
  blocks = data.get("content") or []
124
124
  state = [block for block in blocks if block["type"] in THINKING]
125
- content = ""
126
- reasoning = ""
125
+ content: list[str] = []
126
+ reasoning: list[str] = []
127
127
  calls: list[ToolCall] = []
128
128
  for block in blocks:
129
129
  kind = block.get("type")
130
130
  if kind == "text":
131
- content += block.get("text", "")
131
+ content.append(block.get("text", ""))
132
132
  elif kind == "thinking":
133
- reasoning += block.get("thinking", "")
133
+ reasoning.append(block.get("thinking", ""))
134
134
  elif kind == "tool_use":
135
135
  calls.append(
136
136
  ToolCall(
@@ -161,8 +161,8 @@ def response_from_wire(message: AnthropicMessage) -> Response:
161
161
  created=0,
162
162
  model=data.get("model", ""),
163
163
  message=AssistantMessage(
164
- content=content or None,
165
- reasoning_content=reasoning or None,
164
+ content="".join(content) or None,
165
+ reasoning_content="".join(reasoning) or None,
166
166
  tool_calls=calls or None,
167
167
  provider_state=state or None,
168
168
  ),
@@ -220,30 +220,38 @@ class AnthropicDialect(Dialect[dict, AnthropicMessage]):
220
220
  message, then parse it."""
221
221
  message: dict = {}
222
222
  blocks: dict[int, dict] = {}
223
- partial_json: dict[int, str] = {}
223
+ block_parts: dict[int, dict[str, list[str]]] = {}
224
+ partial_json: dict[int, list[str]] = {}
224
225
  for event in iter_sse(raw):
225
226
  kind = event.get("type")
226
227
  if kind == "message_start":
227
228
  message = event.get("message") or {}
228
229
  elif kind == "content_block_start":
229
- blocks[event["index"]] = dict(event.get("content_block") or {})
230
+ index = event["index"]
231
+ blocks[index] = dict(event.get("content_block") or {})
232
+ block_parts.pop(index, None)
230
233
  elif kind == "content_block_delta":
231
- block = blocks.setdefault(event["index"], {"type": "text", "text": ""})
234
+ index = event["index"]
235
+ block = blocks.setdefault(index, {"type": "text", "text": ""})
232
236
  delta = event.get("delta") or {}
233
- if delta.get("type") == "text_delta":
234
- block["text"] = block.get("text", "") + delta.get("text", "")
235
- elif delta.get("type") == "thinking_delta":
236
- block["thinking"] = block.get("thinking", "") + delta.get(
237
- "thinking", ""
238
- )
239
- elif delta.get("type") == "signature_delta":
240
- block["signature"] = block.get("signature", "") + delta.get(
241
- "signature", ""
242
- )
243
- elif delta.get("type") == "input_json_delta":
244
- partial_json[event["index"]] = partial_json.get(
245
- event["index"], ""
246
- ) + delta.get("partial_json", "")
237
+ delta_type = delta.get("type")
238
+ if delta_type in ("text_delta", "thinking_delta", "signature_delta"):
239
+ field = delta_type.removesuffix("_delta")
240
+ fields = block_parts.get(index)
241
+ if fields is None:
242
+ fields = {}
243
+ block_parts[index] = fields
244
+ parts = fields.get(field)
245
+ if parts is None:
246
+ parts = [block.get(field, "")]
247
+ fields[field] = parts
248
+ parts.append(delta.get(field, ""))
249
+ elif delta_type == "input_json_delta":
250
+ parts = partial_json.get(index)
251
+ if parts is None:
252
+ parts = []
253
+ partial_json[index] = parts
254
+ parts.append(delta.get("partial_json", ""))
247
255
  elif kind == "message_delta":
248
256
  message.update(
249
257
  {
@@ -256,8 +264,11 @@ class AnthropicDialect(Dialect[dict, AnthropicMessage]):
256
264
  **(message.get("usage") or {}),
257
265
  **(event.get("usage") or {}),
258
266
  }
259
- for index, partial in partial_json.items():
260
- blocks[index]["input"] = json.loads(partial or "{}")
267
+ for index, fields in block_parts.items():
268
+ for field, parts in fields.items():
269
+ blocks[index][field] = "".join(parts)
270
+ for index, parts in partial_json.items():
271
+ blocks[index]["input"] = json.loads("".join(parts) or "{}")
261
272
  message["content"] = [blocks[i] for i in sorted(blocks)]
262
273
  return response_from_wire(self.validate_response(message))
263
274
 
@@ -13,37 +13,63 @@ the eval's model + sampling in this format's shape) and `extend` (chat-only user
13
13
  """
14
14
 
15
15
  import json
16
+ import logging
16
17
  from abc import ABC, abstractmethod
17
18
  from collections.abc import Iterator, Mapping
18
19
  from typing import ClassVar, Generic, TypeVar
19
20
 
20
21
  from pydantic import BaseModel
22
+ from pydantic_core import from_json
21
23
 
22
24
  from verifiers.v1.types import Messages, Response, SamplingConfig, Tool
23
25
 
24
26
  ReqT = TypeVar("ReqT")
25
27
  RespT = TypeVar("RespT", bound=BaseModel)
26
28
 
27
-
28
- def iter_sse(raw: bytes) -> list[dict]:
29
- """Parse a complete SSE byte stream into its JSON data payloads, in order (skipping
30
- non-JSON sentinels like OpenAI's `data: [DONE]`). Shared by the dialects' `parse_stream`."""
31
- events: list[dict] = []
32
- for block in raw.decode("utf-8", errors="replace").split("\n\n"):
33
- data = "\n".join(
34
- line.removeprefix("data:").strip()
29
+ logger = logging.getLogger(__name__)
30
+
31
+
32
+ def iter_sse(raw: bytes) -> Iterator[dict]:
33
+ """Yield JSON SSE payloads in order without retaining prior events."""
34
+ # Detect the wire line ending once, then scan without retaining prior payloads.
35
+ first_newline = raw.find(b"\n")
36
+ separator = (
37
+ b"\r\n\r\n"
38
+ if first_newline > 0 and raw[first_newline - 1] == ord("\r")
39
+ else b"\n\n"
40
+ )
41
+ start = 0
42
+ while start < len(raw):
43
+ end = raw.find(separator, start)
44
+ if end == -1:
45
+ end = len(raw)
46
+ block = raw[start:end]
47
+ data = b"\n".join(
48
+ line.removeprefix(b"data:").strip()
35
49
  for line in block.splitlines()
36
- if line.startswith("data:")
50
+ if line.startswith(b"data:")
37
51
  )
38
- if not data or data == "[DONE]":
39
- continue
40
- events.append(json.loads(data))
41
- return events
52
+ if data and data != b"[DONE]":
53
+ try:
54
+ yield from_json(data)
55
+ except ValueError:
56
+ logger.warning(
57
+ "SSE JSON fast-path failed; falling back to stdlib with invalid UTF-8 replacement"
58
+ )
59
+ yield json.loads(data.decode("utf-8", errors="replace"))
60
+ start = end + len(separator)
42
61
 
43
62
 
44
63
  def iter_sse_reverse(raw: bytes) -> Iterator[dict]:
45
64
  """Yield JSON SSE payloads from the end without decoding earlier events."""
46
- for block in reversed(raw.decode("utf-8", errors="replace").split("\n\n")):
65
+ decoded = raw.decode("utf-8", errors="replace")
66
+ first_newline = decoded.find("\n")
67
+ separator = (
68
+ "\r\n\r\n"
69
+ if first_newline > 0 and decoded[first_newline - 1] == "\r"
70
+ else "\n\n"
71
+ )
72
+ for block in reversed(decoded.split(separator)):
47
73
  data = "\n".join(
48
74
  line.removeprefix("data:").strip()
49
75
  for line in block.splitlines()
@@ -229,13 +229,19 @@ class ChatDialect(Dialect[dict, ChatCompletion]):
229
229
 
230
230
  def parse_stream(self, raw: bytes) -> Response:
231
231
  """Assemble `chat.completion.chunk` deltas into one completion, then parse it."""
232
- chunks = iter_sse(raw)
233
232
  message: dict = {"role": "assistant", "content": None}
233
+ # Join streamed fields once; repeated concatenation recopies the growing response.
234
+ message_parts = {key: [] for key in REASONING_FIELDS[:2] + ("content",)}
234
235
  tool_calls: dict[int, dict] = {}
236
+ tool_arguments: dict[int, list[str]] = {}
235
237
  reasoning_details: list[dict] = []
238
+ reasoning_detail_parts: dict[int, list[str]] = {}
236
239
  finish_reason = None
237
240
  usage = None
238
- for chunk in chunks:
241
+ head = None
242
+ for chunk in iter_sse(raw):
243
+ if head is None:
244
+ head = chunk
239
245
  usage = chunk.get("usage") or usage
240
246
  for choice in chunk.get("choices") or []:
241
247
  if choice.get("index", 0) != 0:
@@ -244,32 +250,43 @@ class ChatDialect(Dialect[dict, ChatCompletion]):
244
250
  delta = choice.get("delta") or {}
245
251
  for key in ("content", "reasoning_content", "reasoning"):
246
252
  if delta.get(key) is not None:
247
- message[key] = (message.get(key) or "") + delta[key]
253
+ message_parts[key].append(delta[key])
248
254
  for detail in delta.get("reasoning_details") or []:
249
255
  previous = reasoning_details[-1] if reasoning_details else {}
250
256
  if detail.get("type") == previous.get("type") == "reasoning.text":
251
- previous["text"] = (previous.get("text") or "") + (
252
- detail.get("text") or ""
253
- )
257
+ reasoning_detail_parts.setdefault(
258
+ len(reasoning_details) - 1, [previous.get("text") or ""]
259
+ ).append(detail.get("text") or "")
254
260
  for field in ("signature", "format"):
255
261
  previous[field] = previous.get(field) or detail.get(field)
256
262
  else:
257
263
  reasoning_details.append(detail)
258
264
  for tc in delta.get("tool_calls") or []:
265
+ index = tc.get("index", 0)
259
266
  slot = tool_calls.setdefault(
260
- tc.get("index", 0),
267
+ index,
261
268
  {"type": "function", "function": {"name": "", "arguments": ""}},
262
269
  )
263
270
  slot["id"] = tc.get("id") or slot.get("id", "")
264
271
  fn = tc.get("function") or {}
265
272
  if fn.get("name"):
266
273
  slot["function"]["name"] = fn["name"]
267
- slot["function"]["arguments"] += fn.get("arguments") or ""
274
+ tool_arguments.setdefault(index, []).append(
275
+ fn.get("arguments") or ""
276
+ )
277
+ for key, parts in message_parts.items():
278
+ if parts:
279
+ message[key] = "".join(parts)
280
+ for index, parts in reasoning_detail_parts.items():
281
+ reasoning_details[index]["text"] = "".join(parts)
282
+ for index, parts in tool_arguments.items():
283
+ tool_calls[index]["function"]["arguments"] = "".join(parts)
268
284
  if tool_calls:
269
285
  message["tool_calls"] = [tool_calls[i] for i in sorted(tool_calls)]
270
286
  if reasoning_details:
271
287
  message["reasoning_details"] = reasoning_details
272
- head = chunks[0] if chunks else {}
288
+ if head is None:
289
+ head = {}
273
290
  return response_from_wire(
274
291
  ChatCompletion.model_validate(
275
292
  {
@@ -376,18 +376,20 @@ def _attribute_routed_experts(
376
376
  raw = binascii.a2b_base64(payload["data"])
377
377
  arr = np.frombuffer(raw, dtype=np.uint8).reshape(payload["shape"])
378
378
  off = path_len - int(payload.get("start", 0) or 0)
379
- # The engine omits routing for the turn's final position (no forward pass follows the last
380
- # generated token), so the array is one row short of the turn's new tokens. Pad the tail
381
- # with a copy of the last row so the final node still aligns 1:1 with its tokens.
382
379
  needed = off + sum(len(trace.nodes[nid].token_ids) for nid in new_node_ids)
383
- if arr.shape[0] and 0 < needed - arr.shape[0] <= 1:
384
- arr = np.concatenate([arr, arr[-1:]], axis=0)
385
380
  for nid in new_node_ids:
386
381
  n = len(trace.nodes[nid].token_ids)
387
- if n and 0 <= off and off + n <= arr.shape[0]:
382
+ end = off + n
383
+ if n and 0 <= off and end <= arr.shape[0]:
388
384
  # Own only this node's rows; a view would retain the turn's full-context array.
389
- trace.nodes[nid].routed_experts = arr[off : off + n].copy()
390
- off += n
385
+ trace.nodes[nid].routed_experts = arr[off:end].copy()
386
+ elif n and arr.shape[0] and 0 <= off and end == needed == arr.shape[0] + 1:
387
+ # The engine omits the turn's final position because no forward pass follows it.
388
+ # Pad only the final node's suffix instead of copying the full-context array.
389
+ trace.nodes[nid].routed_experts = np.concatenate(
390
+ [arr[off:], arr[-1:]], axis=0
391
+ )
392
+ off = end
391
393
 
392
394
 
393
395
  def _commit_turn(turn: PendingTurn, response: Response) -> None:
@@ -24,7 +24,7 @@ import contextlib
24
24
  import json
25
25
  import logging
26
26
  import secrets
27
- from collections.abc import Awaitable, Callable
27
+ from collections.abc import AsyncIterator, Awaitable, Callable
28
28
  from dataclasses import dataclass, field
29
29
  from typing import TYPE_CHECKING
30
30
 
@@ -56,6 +56,7 @@ logger = logging.getLogger(__name__)
56
56
  # context window are the real limits, this is just a host-OOM backstop.
57
57
  _MAX_REQUEST_BODY = 1024**3 # 1 GiB (aiohttp's default is 1 MiB)
58
58
  _KEEPALIVE_INTERVAL_SECONDS = 3
59
+ _STREAM_QUEUE_MAXSIZE = 16
59
60
  # The server binds loopback; callers reach it via localhost or a host tunnel (see `reachable_url`).
60
61
  _HOST = "127.0.0.1"
61
62
 
@@ -69,6 +70,20 @@ def _completion_response(completion: dict | None) -> web.Response:
69
70
  return web.Response(body=body, content_type="application/json", charset="utf-8")
70
71
 
71
72
 
73
+ async def _queue_chunks(
74
+ chunks: AsyncIterator[bytes],
75
+ queue: asyncio.Queue[bytes | None],
76
+ ready: asyncio.Event,
77
+ ) -> None:
78
+ try:
79
+ async for chunk in chunks:
80
+ await queue.put(chunk)
81
+ ready.set()
82
+ finally:
83
+ await queue.put(None)
84
+ ready.set()
85
+
86
+
72
87
  @dataclass(frozen=True)
73
88
  class RolloutLimits:
74
89
  """Per-rollout framework limits (None = no cap), checked before each turn is served.
@@ -446,28 +461,37 @@ class InterceptionServer:
446
461
  )
447
462
  resp.content_type = reply.content_type.split(";")[0].strip()
448
463
  buffer = bytearray()
449
- chunks = reply.chunks.__aiter__()
450
- next_chunk = asyncio.create_task(anext(chunks, None))
464
+ # One bounded producer avoids per-event tasks; keepalive timeouts only cancel readiness waits.
465
+ queue: asyncio.Queue[bytes | None] = asyncio.Queue(
466
+ maxsize=_STREAM_QUEUE_MAXSIZE
467
+ )
468
+ ready = asyncio.Event()
469
+ producer = asyncio.create_task(_queue_chunks(reply.chunks, queue, ready))
451
470
  try:
452
471
  await resp.prepare(request)
453
472
  while True:
454
- done, _ = await asyncio.wait(
455
- {next_chunk}, timeout=_KEEPALIVE_INTERVAL_SECONDS
456
- )
457
- if not done:
473
+ try:
474
+ async with asyncio.timeout(_KEEPALIVE_INTERVAL_SECONDS):
475
+ await ready.wait()
476
+ except TimeoutError:
458
477
  await resp.write(b": keepalive\n\n")
459
478
  continue
460
- chunk = next_chunk.result()
479
+ chunk = queue.get_nowait()
480
+ if queue.empty():
481
+ ready.clear()
461
482
  if chunk is None:
483
+ await producer
462
484
  break
463
485
  buffer += chunk
464
486
  await resp.write(chunk)
465
- next_chunk = asyncio.create_task(anext(chunks, None))
466
487
  except ConnectionResetError:
467
488
  return resp
468
489
  finally:
469
- next_chunk.cancel()
470
- await asyncio.gather(next_chunk, return_exceptions=True)
490
+ producer.cancel()
491
+ # Let a canceled producer enqueue EOF while unwinding.
492
+ if queue.full():
493
+ queue.get_nowait()
494
+ await asyncio.gather(producer, return_exceptions=True)
471
495
  await reply.close()
472
496
 
473
497
  try:
@@ -322,8 +322,18 @@ async def host_endpoint(port: int, is_local: bool, labels: list[str] | None = No
322
322
  try:
323
323
  yield url
324
324
  finally:
325
+ # Delay cancellation until the synchronous stop has finished.
326
+ cancelled = None
327
+ stop_task = asyncio.create_task(asyncio.to_thread(tunnel.sync_stop))
325
328
  with contextlib.suppress(Exception):
326
- tunnel.sync_stop()
329
+ while not stop_task.done():
330
+ try:
331
+ await asyncio.shield(stop_task)
332
+ except asyncio.CancelledError as e:
333
+ cancelled = e
334
+ stop_task.result()
335
+ if cancelled is not None:
336
+ raise cancelled
327
337
 
328
338
 
329
339
  class _Host:
@@ -7,11 +7,11 @@ direction (a program in the sandbox reaching a host service) is the shared host-
7
7
  """
8
8
 
9
9
  import asyncio
10
- import base64
11
10
  import contextlib
12
11
  import logging
13
12
  import shlex
14
- from pathlib import PurePosixPath
13
+ import tempfile
14
+ from pathlib import Path, PurePosixPath
15
15
  from typing import ClassVar, Literal
16
16
 
17
17
  from pydantic_config import BaseConfig
@@ -176,10 +176,22 @@ class PrimeRuntime(Runtime):
176
176
  )
177
177
 
178
178
  async def read(self, path: str) -> bytes:
179
- result = await self.run(["sh", "-c", f"base64 {shlex.quote(path)}"], {})
180
- if result.exit_code != 0:
181
- raise SandboxError(f"read {path!r}: {result.stderr.strip()}")
182
- return base64.b64decode(result.stdout)
179
+ # Avoid background-job log limits and base64 overhead by downloading binary data directly.
180
+ # The temporary file is removed on every exit, and its byte read stays off the event loop.
181
+ target = (
182
+ path
183
+ if path.startswith("/")
184
+ else f"{self.config.workdir.rstrip('/')}/{path}"
185
+ )
186
+ try:
187
+ with tempfile.TemporaryDirectory() as directory:
188
+ download = Path(directory) / "download"
189
+ await self._client.download_file(
190
+ self._sandbox_id, target, str(download)
191
+ )
192
+ return await asyncio.to_thread(download.read_bytes)
193
+ except Exception as e:
194
+ raise SandboxError(f"read {path!r}: {e}") from e
183
195
 
184
196
  async def write(self, path: str, data: bytes) -> None:
185
197
  # Upload via the gateway (multipart) — never inline the bytes on the command line