verifiers 0.1.15.dev359__tar.gz → 0.1.15.dev364__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.dev359 → verifiers-0.1.15.dev364}/PKG-INFO +1 -1
  2. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/eval/resume.py +46 -26
  3. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/interception/server.py +45 -19
  4. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/mcp/server.py +32 -19
  5. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/runtimes/base.py +11 -1
  6. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/runtimes/prime.py +18 -6
  7. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/.gitignore +0 -0
  8. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/LICENSE +0 -0
  9. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/README.md +0 -0
  10. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/pyproject.toml +0 -0
  11. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/AGENTS.md +0 -0
  12. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/README.md +0 -0
  13. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/__init__.py +0 -0
  14. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/conftest.py +0 -0
  15. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_browser_env.py +0 -0
  16. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_build_script.py +0 -0
  17. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_cli_agent_env.py +0 -0
  18. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_client_auth_errors.py +0 -0
  19. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_client_config.py +0 -0
  20. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_client_multimodal_types.py +0 -0
  21. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_composable_env.py +0 -0
  22. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_context_token_metrics.py +0 -0
  23. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_decorator_ranks.py +0 -0
  24. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_endpoint_registry.py +0 -0
  25. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_env_group.py +0 -0
  26. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_env_server.py +0 -0
  27. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_environment.py +0 -0
  28. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_environment_extra.py +0 -0
  29. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_envs.py +0 -0
  30. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_error_chain.py +0 -0
  31. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_eval_display.py +0 -0
  32. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_eval_utils.py +0 -0
  33. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_gepa_cli.py +0 -0
  34. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_gepa_utils.py +0 -0
  35. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_gym_env.py +0 -0
  36. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_harbor_env_mcp.py +0 -0
  37. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_imports.py +0 -0
  38. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_init_script.py +0 -0
  39. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_install_utils.py +0 -0
  40. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_interception_utils.py +0 -0
  41. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_lean_task.py +0 -0
  42. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_logging.py +0 -0
  43. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_math_rubric.py +0 -0
  44. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_maybe_think_parser.py +0 -0
  45. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_message_utils.py +0 -0
  46. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_message_utils_multimodal.py +0 -0
  47. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_multiturn_env.py +0 -0
  48. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_nemorl_client.py +0 -0
  49. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_openai_chat_completions_token_client.py +0 -0
  50. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_openai_responses_client.py +0 -0
  51. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_opencode_rlm_env.py +0 -0
  52. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_openenv_client.py +0 -0
  53. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_parser.py +0 -0
  54. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_path_utils.py +0 -0
  55. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_per_turn_timing.py +0 -0
  56. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_pricing_utils.py +0 -0
  57. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_prime_plugin.py +0 -0
  58. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_renderer_client.py +0 -0
  59. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_renderer_e2e.py +0 -0
  60. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_rlm_composable_env.py +0 -0
  61. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_rubric.py +0 -0
  62. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_rubric_group.py +0 -0
  63. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_sandbox_debug_env.py +0 -0
  64. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_sandbox_env.py +0 -0
  65. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_sandbox_mixin.py +0 -0
  66. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_save_utils.py +0 -0
  67. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_setup_script.py +0 -0
  68. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_singleturn_env.py +0 -0
  69. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_stateful_tool_env.py +0 -0
  70. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_think_parser.py +0 -0
  71. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_tool_env.py +0 -0
  72. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_tool_utils.py +0 -0
  73. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_trajectory_processing.py +0 -0
  74. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_tui_info_formatting.py +0 -0
  75. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_types.py +0 -0
  76. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_wordle_env.py +0 -0
  77. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_xml_parser.py +0 -0
  78. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/conftest.py +0 -0
  79. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  80. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  81. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  82. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  83. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  84. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/fixtures/echo_v0.py +0 -0
  85. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/fixtures/echo_v1.py +0 -0
  86. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/fixtures/pyproject.toml +0 -0
  87. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  88. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/test_color_codeword_tasks.py +0 -0
  89. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/test_configs.py +0 -0
  90. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/test_e2e.py +0 -0
  91. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/test_envs.py +0 -0
  92. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/test_graph.py +0 -0
  93. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/test_legacy.py +0 -0
  94. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/test_trace.py +0 -0
  95. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/AGENTS.md +0 -0
  96. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/__init__.py +0 -0
  97. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/__init__.py +0 -0
  98. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/commands/__init__.py +0 -0
  99. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/commands/build.py +0 -0
  100. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/commands/eval.py +0 -0
  101. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/commands/gepa.py +0 -0
  102. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/commands/init.py +0 -0
  103. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/commands/install.py +0 -0
  104. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/commands/setup.py +0 -0
  105. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/plugins/__init__.py +0 -0
  106. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/plugins/prime.py +0 -0
  107. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/tui.py +0 -0
  108. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/clients/__init__.py +0 -0
  109. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/clients/anthropic_messages_client.py +0 -0
  110. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/clients/client.py +0 -0
  111. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  112. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/clients/openai_chat_completions_client.py +0 -0
  113. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  114. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/clients/openai_completions_client.py +0 -0
  115. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/clients/openai_responses_client.py +0 -0
  116. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/clients/renderer_client.py +0 -0
  117. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/decorators.py +0 -0
  118. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/AGENTS.md +0 -0
  119. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/__init__.py +0 -0
  120. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/env_group.py +0 -0
  121. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/environment.py +0 -0
  122. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/README.md +0 -0
  123. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/__init__.py +0 -0
  124. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  125. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/README.md +0 -0
  126. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/__init__.py +0 -0
  127. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/_filter.py +0 -0
  128. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  129. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/harness.py +0 -0
  130. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  131. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  132. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  133. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  134. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  135. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  136. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  137. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/task.py +0 -0
  138. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  139. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  140. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  141. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  142. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  143. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  144. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  145. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  146. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/lean/__init__.py +0 -0
  147. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/lean/lean_task.py +0 -0
  148. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  149. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  150. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
  151. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
  152. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
  153. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
  154. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
  155. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
  156. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
  157. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
  158. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
  159. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
  160. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
  161. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
  162. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
  163. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
  164. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
  165. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
  166. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
  167. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
  168. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
  169. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
  170. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
  171. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
  172. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
  173. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
  174. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
  175. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
  176. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
  177. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
  178. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
  179. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  180. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  181. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  182. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  183. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  184. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  185. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  186. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  187. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  188. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  189. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  190. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  191. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  192. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  193. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  194. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  195. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  196. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  197. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  198. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  199. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  200. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  201. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  202. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  203. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/gym_env.py +0 -0
  204. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  205. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  206. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  207. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/mcp_env.py +0 -0
  208. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/opencode_env.py +0 -0
  209. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  210. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  211. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  212. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/utils/__init__.py +0 -0
  213. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  214. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  215. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/README.md +0 -0
  216. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/__init__.py +0 -0
  217. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/browser_env/README.md +0 -0
  218. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  219. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  220. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  221. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  222. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  223. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  224. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/openenv_env.py +0 -0
  225. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  226. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/textarena_env.py +0 -0
  227. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/multiturn_env.py +0 -0
  228. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/python_env.py +0 -0
  229. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/sandbox_env.py +0 -0
  230. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/singleturn_env.py +0 -0
  231. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/stateful_tool_env.py +0 -0
  232. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/tool_env.py +0 -0
  233. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/errors.py +0 -0
  234. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/gepa/__init__.py +0 -0
  235. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/gepa/adapter.py +0 -0
  236. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/gepa/config.py +0 -0
  237. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/gepa/display.py +0 -0
  238. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/gepa/gepa_utils.py +0 -0
  239. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/parsers/__init__.py +0 -0
  240. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/parsers/maybe_think_parser.py +0 -0
  241. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/parsers/parser.py +0 -0
  242. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/parsers/think_parser.py +0 -0
  243. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/parsers/xml_parser.py +0 -0
  244. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rl/README.md +0 -0
  245. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rl/__init__.py +0 -0
  246. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rl/inference/__init__.py +0 -0
  247. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rl/inference/client.py +0 -0
  248. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rl/inference/server.py +0 -0
  249. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rl/trainer/__init__.py +0 -0
  250. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rl/trainer/config.py +0 -0
  251. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rl/trainer/orchestrator.py +0 -0
  252. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rl/trainer/trainer.py +0 -0
  253. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rl/trainer/utils.py +0 -0
  254. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rubrics/__init__.py +0 -0
  255. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  256. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rubrics/judge_rubric.py +0 -0
  257. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rubrics/math_rubric.py +0 -0
  258. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rubrics/rubric.py +0 -0
  259. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rubrics/rubric_group.py +0 -0
  260. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/__init__.py +0 -0
  261. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/build.py +0 -0
  262. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/eval.py +0 -0
  263. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/gepa.py +0 -0
  264. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/init.py +0 -0
  265. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/install.py +0 -0
  266. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/rl.py +0 -0
  267. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/setup.py +0 -0
  268. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/train.py +0 -0
  269. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/tui.py +0 -0
  270. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/vllm.py +0 -0
  271. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/serve/__init__.py +0 -0
  272. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/serve/client/env_client.py +0 -0
  273. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/serve/client/zmq_env_client.py +0 -0
  274. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/serve/server/__init__.py +0 -0
  275. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/serve/server/env_router.py +0 -0
  276. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/serve/server/env_server.py +0 -0
  277. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/serve/server/env_worker.py +0 -0
  278. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/serve/server/zmq_env_server.py +0 -0
  279. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/serve/types.py +0 -0
  280. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/types.py +0 -0
  281. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/__init__.py +0 -0
  282. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/async_utils.py +0 -0
  283. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/client_utils.py +0 -0
  284. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/config_utils.py +0 -0
  285. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/data_utils.py +0 -0
  286. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/display_utils.py +0 -0
  287. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/env_config_utils.py +0 -0
  288. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/env_utils.py +0 -0
  289. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/error_utils.py +0 -0
  290. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/eval_display.py +0 -0
  291. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/eval_utils.py +0 -0
  292. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/heartbeat.py +0 -0
  293. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/import_utils.py +0 -0
  294. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/install_utils.py +0 -0
  295. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/interception_utils.py +0 -0
  296. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/logging_utils.py +0 -0
  297. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/message_utils.py +0 -0
  298. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/metric_utils.py +0 -0
  299. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/path_utils.py +0 -0
  300. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/pricing_utils.py +0 -0
  301. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/process_utils.py +0 -0
  302. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/response_utils.py +0 -0
  303. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/save_utils.py +0 -0
  304. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/serve_utils.py +0 -0
  305. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/thread_utils.py +0 -0
  306. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/threaded_sandbox_client.py +0 -0
  307. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/tool_utils.py +0 -0
  308. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/usage_utils.py +0 -0
  309. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/version_utils.py +0 -0
  310. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/ARCHITECTURE.md +0 -0
  311. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/GUIDE.md +0 -0
  312. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/README.md +0 -0
  313. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/__init__.py +0 -0
  314. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/__init__.py +0 -0
  315. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  316. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/dashboard/base.py +0 -0
  317. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/dashboard/eval.py +0 -0
  318. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/dashboard/validate.py +0 -0
  319. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/eval/__init__.py +0 -0
  320. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/eval/main.py +0 -0
  321. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/eval/runner.py +0 -0
  322. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/init.py +0 -0
  323. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/output.py +0 -0
  324. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/resolve.py +0 -0
  325. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/serve.py +0 -0
  326. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/validate.py +0 -0
  327. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/clients/__init__.py +0 -0
  328. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/clients/client.py +0 -0
  329. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/clients/config.py +0 -0
  330. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/clients/eval.py +0 -0
  331. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/clients/train.py +0 -0
  332. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/configs/__init__.py +0 -0
  333. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/configs/eval.py +0 -0
  334. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/configs/init.py +0 -0
  335. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/configs/serve.py +0 -0
  336. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/configs/validate.py +0 -0
  337. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/decorators.py +0 -0
  338. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/dialects/__init__.py +0 -0
  339. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/dialects/anthropic.py +0 -0
  340. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/dialects/base.py +0 -0
  341. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/dialects/chat.py +0 -0
  342. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/dialects/responses.py +0 -0
  343. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/env.py +0 -0
  344. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/episode.py +0 -0
  345. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/errors.py +0 -0
  346. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/graph.py +0 -0
  347. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harness.py +0 -0
  348. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/__init__.py +0 -0
  349. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  350. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/bash/harness.py +0 -0
  351. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/bash/program.py +0 -0
  352. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  353. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/codex/harness.py +0 -0
  354. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/default/__init__.py +0 -0
  355. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/default/harness.py +0 -0
  356. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/default/program.py +0 -0
  357. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  358. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  359. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  360. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  361. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  362. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  363. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  364. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  365. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  366. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  367. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/interception/__init__.py +0 -0
  368. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/interception/pool.py +0 -0
  369. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/legacy.py +0 -0
  370. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/loaders.py +0 -0
  371. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/mcp/__init__.py +0 -0
  372. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/mcp/launch.py +0 -0
  373. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/mcp/multiplex.py +0 -0
  374. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/mcp/toolset.py +0 -0
  375. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/mcp/user.py +0 -0
  376. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/retries.py +0 -0
  377. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/rollout.py +0 -0
  378. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/runtimes/__init__.py +0 -0
  379. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/runtimes/docker.py +0 -0
  380. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/runtimes/limiters.py +0 -0
  381. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/runtimes/modal.py +0 -0
  382. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/runtimes/subprocess.py +0 -0
  383. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/serve/__init__.py +0 -0
  384. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/serve/client.py +0 -0
  385. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/serve/pool.py +0 -0
  386. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/serve/server.py +0 -0
  387. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/serve/types.py +0 -0
  388. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/state.py +0 -0
  389. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/task.py +0 -0
  390. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/taskset.py +0 -0
  391. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/tasksets/__init__.py +0 -0
  392. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/tasksets/harbor_v1/__init__.py +0 -0
  393. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/tasksets/harbor_v1/taskset.py +0 -0
  394. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/tasksets/textarena_v1/__init__.py +0 -0
  395. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/tasksets/textarena_v1/taskset.py +0 -0
  396. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/trace.py +0 -0
  397. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/types.py +0 -0
  398. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/utils/__init__.py +0 -0
  399. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/utils/format.py +0 -0
  400. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/utils/install.py +0 -0
  401. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/utils/logging.py +0 -0
  402. {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/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.dev359
3
+ Version: 0.1.15.dev364
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
 
@@ -24,12 +24,12 @@ 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
 
31
31
  from aiohttp import web
32
- from pydantic import ValidationError
32
+ from pydantic import TypeAdapter, ValidationError
33
33
  from pydantic_core import PydanticSerializationError, from_json, to_json
34
34
 
35
35
  from verifiers.v1.clients import RolloutContext
@@ -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:
@@ -522,8 +546,12 @@ class InterceptionServer:
522
546
  if session is None:
523
547
  return web.json_response({"error": "unauthorized"}, status=401)
524
548
  logger.debug("intercept GET /state: id=%s", session.trace.id)
549
+ state = session.trace.state
525
550
  return web.Response(
526
- text=session.trace.state.model_dump_json(), content_type="application/json"
551
+ # TypeAdapter emits UTF-8 bytes directly, avoiding a JSON str copy in aiohttp.
552
+ body=TypeAdapter(type(state)).dump_json(state),
553
+ content_type="application/json",
554
+ charset="utf-8",
527
555
  )
528
556
 
529
557
  async def handle_task_get(self, request: web.Request) -> web.Response:
@@ -550,13 +578,11 @@ class InterceptionServer:
550
578
  return web.json_response({"error": "unauthorized"}, status=401)
551
579
  logger.debug("intercept PUT /state: id=%s", session.trace.id)
552
580
  state_cls = type(session.trace.state)
581
+ raw = await request.read()
553
582
  try:
554
- new_state = state_cls.model_validate(await request.json())
555
- except (ValidationError, ValueError) as e:
556
- # Malformed JSON (`request.json()` -> JSONDecodeError, a ValueError) or a pushed state
557
- # that doesn't fit the trace's `State` type (almost always a `StateT` mismatch between the
558
- # taskset and a server). Surface a clean 400 (with the reason) rather than a 500, so the
559
- # server's failed PUT fails the rollout legibly.
583
+ new_state = state_cls.model_validate_json(raw)
584
+ except ValidationError as e:
585
+ # Reject malformed, over-nested, or mismatched state before it enters the shared channel.
560
586
  logger.warning("state PUT rejected: id=%s %s", session.trace.id, e)
561
587
  return web.json_response(
562
588
  {"error": f"invalid state PUT for {state_cls.__name__}: {e}"},
@@ -12,18 +12,21 @@ import contextlib
12
12
  import contextvars
13
13
  import functools
14
14
  import inspect
15
+ import logging
15
16
  import os
16
17
  from typing import TYPE_CHECKING, Callable, ClassVar, Generic, TypeVar, get_args
17
18
 
19
+ from pydantic import TypeAdapter, ValidationError
18
20
  from pydantic_config import BaseConfig
19
21
 
20
22
  from verifiers.v1.state import State, StateT, state_cls
21
23
 
22
24
  if TYPE_CHECKING:
23
- from httpx import AsyncClient
25
+ from httpx import AsyncClient, Response
24
26
  from mcp.server.fastmcp import FastMCP
25
27
 
26
28
  ConfigT = TypeVar("ConfigT", bound=BaseConfig)
29
+ logger = logging.getLogger(__name__)
27
30
 
28
31
  STATE_TIMEOUT = 30.0
29
32
  """Seconds for a state-channel GET/PUT (localhost, or a tunnel to the host)."""
@@ -38,13 +41,13 @@ async def _channel_request(
38
41
  url: str,
39
42
  secret: str,
40
43
  *,
41
- json: dict | None = None,
44
+ content: bytes | None = None,
42
45
  client: AsyncClient | None = None,
43
- ) -> dict:
46
+ ) -> Response:
44
47
  """One bearer-authed call to the interception `/state` or `/task` channel, retried with
45
48
  exponential backoff + jitter on transient failures (connection resets / 5xx from the host
46
49
  tunnel). A 4xx is a real error (e.g. an invalid state PUT) and is not retried. Returns the
47
- parsed JSON body."""
50
+ response so typed callers can validate its JSON bytes directly."""
48
51
  import httpx
49
52
  from tenacity import (
50
53
  AsyncRetrying,
@@ -58,18 +61,21 @@ async def _channel_request(
58
61
  isinstance(e, httpx.HTTPStatusError) and e.response.status_code >= 500
59
62
  )
60
63
 
61
- async def request() -> dict:
64
+ async def request() -> Response:
62
65
  manager = (
63
66
  contextlib.nullcontext(client)
64
67
  if client is not None
65
68
  else httpx.AsyncClient(timeout=STATE_TIMEOUT)
66
69
  )
67
70
  async with manager as request_client:
71
+ headers = {"Authorization": f"Bearer {secret}"}
72
+ if content is not None:
73
+ headers["Content-Type"] = "application/json"
68
74
  resp = await request_client.request(
69
- method, url, json=json, headers={"Authorization": f"Bearer {secret}"}
75
+ method, url, content=content, headers=headers
70
76
  )
71
77
  resp.raise_for_status()
72
- return resp.json()
78
+ return resp
73
79
 
74
80
  return await AsyncRetrying(
75
81
  stop=stop_after_attempt(STATE_RETRIES + 1),
@@ -158,6 +164,8 @@ class ServerBase(Generic[ConfigT, StateT]):
158
164
  def __init__(self, config: ConfigT) -> None:
159
165
  self.config = config
160
166
  self._state_cls = state_cls(type(self))
167
+ # Reuse Pydantic's public byte serializer/validator across state-channel calls.
168
+ self._state_adapter = TypeAdapter(self._state_cls)
161
169
  self._inert_state: StateT = self._state_cls() # type: ignore[assignment]
162
170
  """A fresh state used outside a tool/respond call (setup, or a manual debug run) — there's
163
171
  no channel to sync, so writes to it don't escape the process (matches the no-channel case)."""
@@ -188,27 +196,31 @@ class ServerBase(Generic[ConfigT, StateT]):
188
196
  """Fetch the in-flight call's shared state from the channel (so it reflects other servers'
189
197
  writes); a fresh inert state when there's no channel."""
190
198
  url, secret = self._state_channel()
191
- cls = self._state_cls
192
199
  if not url:
193
- return cls()
194
- return cls.model_validate(
195
- await _channel_request("GET", url, secret, client=self._state_client)
196
- )
200
+ return self._state_cls()
201
+ response = await _channel_request("GET", url, secret, client=self._state_client)
202
+ try:
203
+ return self._state_adapter.validate_json(response.content)
204
+ except ValidationError as e:
205
+ # Excessively nested or otherwise invalid state is a broken channel contract.
206
+ logger.warning(
207
+ "state pull rejected for %s: %s", self._state_cls.__name__, e
208
+ )
209
+ raise
197
210
 
198
- async def _push_state(self, before: dict) -> None:
211
+ async def _push_state(self, before: bytes) -> None:
199
212
  """Push the in-flight call's `self.state` back to the shared channel if it changed. No-op
200
213
  without a channel or when nothing changed."""
201
214
  url, secret = self._state_channel()
202
215
  if not url:
203
216
  return
204
217
  state = _call_state.get()
205
- after = (state if state is not None else self._inert_state).model_dump(
206
- mode="json"
207
- )
218
+ current = state if state is not None else self._inert_state
219
+ after = self._state_adapter.dump_json(current)
208
220
  if after == before:
209
221
  return
210
222
  await _channel_request(
211
- "PUT", url, secret, json=after, client=self._state_client
223
+ "PUT", url, secret, content=after, client=self._state_client
212
224
  )
213
225
 
214
226
  async def _fetch_task(self, state_url: str | None, secret: str):
@@ -222,7 +234,7 @@ class ServerBase(Generic[ConfigT, StateT]):
222
234
  if state_url.endswith("/state")
223
235
  else state_url
224
236
  )
225
- data = await _channel_request("GET", task_url, secret)
237
+ data = (await _channel_request("GET", task_url, secret)).json()
226
238
  return _import_ref(data["cls"]).model_validate_json(data["task"])
227
239
 
228
240
  async def _setup_task_from_channel(
@@ -253,7 +265,8 @@ class ServerBase(Generic[ConfigT, StateT]):
253
265
  state = await self._pull_state()
254
266
  token = _call_state.set(state)
255
267
  try:
256
- before = state.model_dump(mode="json")
268
+ # Reuse the second serialization as the PUT body when the callback mutates state.
269
+ before = self._state_adapter.dump_json(state)
257
270
  result = fn(*args, **kwargs)
258
271
  if inspect.isawaitable(result):
259
272
  result = await result
@@ -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