verifiers 0.3.1.dev25__tar.gz → 0.3.1.dev31__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 (439) hide show
  1. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/PKG-INFO +1 -1
  2. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/pyproject.toml +20 -3
  3. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/v1/test_scoring.py +4 -1
  4. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/__init__.py +13 -1
  5. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/agent.py +2 -6
  6. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/clients/train.py +3 -1
  7. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/configs/task.py +3 -3
  8. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/dialects/anthropic.py +136 -5
  9. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/dialects/base.py +15 -3
  10. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/dialects/chat.py +44 -5
  11. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/dialects/responses.py +122 -5
  12. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/graph.py +12 -0
  13. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harness.py +27 -1
  14. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/bash/harness.py +4 -0
  15. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/bash/program.py +84 -43
  16. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/interception/server.py +256 -88
  17. verifiers-0.3.1.dev31/verifiers/v1/interception/tool.py +12 -0
  18. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/rollout.py +88 -14
  19. verifiers-0.3.1.dev31/verifiers/v1/session.py +402 -0
  20. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/tasksets/nemo_gym/taskset.py +2 -2
  21. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/trace.py +22 -0
  22. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/types.py +7 -0
  23. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/decorators.py +21 -4
  24. verifiers-0.3.1.dev25/verifiers/v1/session.py +0 -147
  25. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/.gitignore +0 -0
  26. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/LICENSE +0 -0
  27. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/README.md +0 -0
  28. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/__init__.py +0 -0
  29. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/conftest.py +0 -0
  30. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_browser_env.py +0 -0
  31. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_build_script.py +0 -0
  32. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_cli_agent_env.py +0 -0
  33. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_client_auth_errors.py +0 -0
  34. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_client_config.py +0 -0
  35. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_client_multimodal_types.py +0 -0
  36. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_composable_env.py +0 -0
  37. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_context_token_metrics.py +0 -0
  38. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_decorator_ranks.py +0 -0
  39. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_endpoint_registry.py +0 -0
  40. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_env_group.py +0 -0
  41. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_env_server.py +0 -0
  42. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_environment.py +0 -0
  43. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_environment_extra.py +0 -0
  44. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_error_chain.py +0 -0
  45. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_eval_display.py +0 -0
  46. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_eval_utils.py +0 -0
  47. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_gepa_cli.py +0 -0
  48. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_gepa_utils.py +0 -0
  49. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_gym_env.py +0 -0
  50. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_harbor_env_mcp.py +0 -0
  51. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_imports.py +0 -0
  52. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_init_script.py +0 -0
  53. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_install_utils.py +0 -0
  54. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_interception_utils.py +0 -0
  55. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_logging.py +0 -0
  56. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_math_rubric.py +0 -0
  57. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_maybe_think_parser.py +0 -0
  58. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_message_utils.py +0 -0
  59. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_message_utils_multimodal.py +0 -0
  60. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_multiturn_env.py +0 -0
  61. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_nemorl_client.py +0 -0
  62. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_openai_chat_completions_token_client.py +0 -0
  63. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_openai_responses_client.py +0 -0
  64. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_opencode_rlm_env.py +0 -0
  65. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_openenv_client.py +0 -0
  66. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_parser.py +0 -0
  67. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_path_utils.py +0 -0
  68. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_per_turn_timing.py +0 -0
  69. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_pricing_utils.py +0 -0
  70. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_prime_plugin.py +0 -0
  71. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_renderer_client.py +0 -0
  72. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_renderer_e2e.py +0 -0
  73. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_rlm_composable_env.py +0 -0
  74. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_rubric.py +0 -0
  75. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_rubric_group.py +0 -0
  76. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_sandbox_debug_env.py +0 -0
  77. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_sandbox_env.py +0 -0
  78. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_sandbox_mixin.py +0 -0
  79. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_save_utils.py +0 -0
  80. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_setup_script.py +0 -0
  81. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_singleturn_env.py +0 -0
  82. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_stateful_tool_env.py +0 -0
  83. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_think_parser.py +0 -0
  84. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_tool_env.py +0 -0
  85. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_tool_utils.py +0 -0
  86. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_trajectory_processing.py +0 -0
  87. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_tui_info_formatting.py +0 -0
  88. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_types.py +0 -0
  89. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/test_xml_parser.py +0 -0
  90. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/v1/conftest.py +0 -0
  91. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  92. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/v1/fixtures/duet_v1.py +0 -0
  93. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  94. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  95. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  96. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  97. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/v1/fixtures/echo_v1.py +0 -0
  98. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/v1/fixtures/pyproject.toml +0 -0
  99. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  100. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/v1/test_color_codeword_tasks.py +0 -0
  101. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/v1/test_configs.py +0 -0
  102. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/v1/test_e2e.py +0 -0
  103. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/v1/test_envs.py +0 -0
  104. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/v1/test_graph.py +0 -0
  105. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/v1/test_judges.py +0 -0
  106. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/v1/test_taskset.py +0 -0
  107. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/tests/v1/test_trace.py +0 -0
  108. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/__init__.py +0 -0
  109. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/cli/__init__.py +0 -0
  110. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/cli/commands/__init__.py +0 -0
  111. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/cli/commands/build.py +0 -0
  112. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/cli/commands/eval.py +0 -0
  113. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/cli/commands/gepa.py +0 -0
  114. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/cli/commands/init.py +0 -0
  115. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/cli/commands/install.py +0 -0
  116. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/cli/commands/setup.py +0 -0
  117. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/cli/plugins/__init__.py +0 -0
  118. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/cli/plugins/prime.py +0 -0
  119. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/cli/tui.py +0 -0
  120. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/__init__.py +0 -0
  121. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/clients/__init__.py +0 -0
  122. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/clients/anthropic_messages_client.py +0 -0
  123. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/clients/client.py +0 -0
  124. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/clients/nemorl_chat_completions_client.py +0 -0
  125. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/clients/openai_chat_completions_client.py +0 -0
  126. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/clients/openai_chat_completions_token_client.py +0 -0
  127. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/clients/openai_completions_client.py +0 -0
  128. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/clients/openai_responses_client.py +0 -0
  129. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/clients/renderer_client.py +0 -0
  130. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/decorators.py +0 -0
  131. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/__init__.py +0 -0
  132. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/env_group.py +0 -0
  133. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/environment.py +0 -0
  134. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/README.md +0 -0
  135. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/__init__.py +0 -0
  136. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/cli_agent_env.py +0 -0
  137. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/README.md +0 -0
  138. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/__init__.py +0 -0
  139. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/_filter.py +0 -0
  140. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/composable_env.py +0 -0
  141. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/harness.py +0 -0
  142. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/harnesses/__init__.py +0 -0
  143. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  144. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/harnesses/opencode.py +0 -0
  145. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/harnesses/prompt.txt +0 -0
  146. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/harnesses/rlm.py +0 -0
  147. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/sandbox_debug_env.py +0 -0
  148. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/swe_debug_env.py +0 -0
  149. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/task.py +0 -0
  150. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/__init__.py +0 -0
  151. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  152. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  153. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  154. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  155. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  156. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  157. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  158. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  159. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  160. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/README.md +0 -0
  161. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  162. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  163. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  164. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  165. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  166. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  167. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  168. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  169. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  170. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  171. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  172. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  173. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  174. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  175. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  176. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  177. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  178. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  179. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  180. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  181. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  182. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  183. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  184. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/gym_env.py +0 -0
  185. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/harbor_env/__init__.py +0 -0
  186. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/harbor_env/env.py +0 -0
  187. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/harbor_env/mcp.py +0 -0
  188. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/mcp_env.py +0 -0
  189. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/opencode_env.py +0 -0
  190. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/opencode_qa_env.py +0 -0
  191. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/opencode_rlm_env.py +0 -0
  192. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/sandbox_mixin.py +0 -0
  193. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/utils/__init__.py +0 -0
  194. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/utils/file_locks.py +0 -0
  195. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/experimental/utils/git_checkout_cache.py +0 -0
  196. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/integrations/README.md +0 -0
  197. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/integrations/__init__.py +0 -0
  198. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/integrations/browser_env/README.md +0 -0
  199. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/integrations/browser_env/__init__.py +0 -0
  200. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/integrations/browser_env/browser_env.py +0 -0
  201. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/integrations/browser_env/modes/__init__.py +0 -0
  202. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/integrations/browser_env/modes/base.py +0 -0
  203. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  204. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  205. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/integrations/openenv_env.py +0 -0
  206. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/integrations/reasoninggym_env.py +0 -0
  207. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/integrations/textarena_env.py +0 -0
  208. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/multiturn_env.py +0 -0
  209. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/python_env.py +0 -0
  210. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/sandbox_env.py +0 -0
  211. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/singleturn_env.py +0 -0
  212. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/stateful_tool_env.py +0 -0
  213. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/envs/tool_env.py +0 -0
  214. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/errors.py +0 -0
  215. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/gepa/__init__.py +0 -0
  216. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/gepa/adapter.py +0 -0
  217. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/gepa/config.py +0 -0
  218. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/gepa/display.py +0 -0
  219. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/gepa/gepa_utils.py +0 -0
  220. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/parsers/__init__.py +0 -0
  221. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/parsers/maybe_think_parser.py +0 -0
  222. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/parsers/parser.py +0 -0
  223. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/parsers/think_parser.py +0 -0
  224. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/parsers/xml_parser.py +0 -0
  225. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/rubrics/__init__.py +0 -0
  226. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/rubrics/experimental/hybrid_math_rubric.py +0 -0
  227. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/rubrics/judge_rubric.py +0 -0
  228. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/rubrics/math_rubric.py +0 -0
  229. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/rubrics/rubric.py +0 -0
  230. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/rubrics/rubric_group.py +0 -0
  231. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/scripts/__init__.py +0 -0
  232. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/scripts/build.py +0 -0
  233. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/scripts/eval.py +0 -0
  234. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/scripts/gepa.py +0 -0
  235. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/scripts/init.py +0 -0
  236. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/scripts/install.py +0 -0
  237. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/scripts/setup.py +0 -0
  238. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/scripts/tui.py +0 -0
  239. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/serve/__init__.py +0 -0
  240. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/serve/client/env_client.py +0 -0
  241. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/serve/client/zmq_env_client.py +0 -0
  242. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/serve/server/__init__.py +0 -0
  243. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/serve/server/env_router.py +0 -0
  244. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/serve/server/env_server.py +0 -0
  245. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/serve/server/env_worker.py +0 -0
  246. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/serve/server/zmq_env_server.py +0 -0
  247. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/serve/types.py +0 -0
  248. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/types.py +0 -0
  249. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/__init__.py +0 -0
  250. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/async_utils.py +0 -0
  251. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/client_utils.py +0 -0
  252. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/config_utils.py +0 -0
  253. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/data_utils.py +0 -0
  254. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/display_utils.py +0 -0
  255. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/env_config_utils.py +0 -0
  256. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/env_utils.py +0 -0
  257. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/error_utils.py +0 -0
  258. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/eval_display.py +0 -0
  259. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/eval_utils.py +0 -0
  260. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/heartbeat.py +0 -0
  261. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/import_utils.py +0 -0
  262. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/install_utils.py +0 -0
  263. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/interception_utils.py +0 -0
  264. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/logging_utils.py +0 -0
  265. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/message_utils.py +0 -0
  266. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/metric_utils.py +0 -0
  267. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/path_utils.py +0 -0
  268. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/pricing_utils.py +0 -0
  269. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/process_utils.py +0 -0
  270. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/response_utils.py +0 -0
  271. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/save_utils.py +0 -0
  272. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/serve_utils.py +0 -0
  273. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/thread_utils.py +0 -0
  274. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/threaded_sandbox_client.py +0 -0
  275. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/tool_utils.py +0 -0
  276. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/usage_utils.py +0 -0
  277. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/legacy/utils/version_utils.py +0 -0
  278. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/acp/__init__.py +0 -0
  279. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/acp/runner.py +0 -0
  280. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/cli/__init__.py +0 -0
  281. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  282. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/cli/dashboard/base.py +0 -0
  283. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/cli/dashboard/eval.py +0 -0
  284. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/cli/dashboard/replay.py +0 -0
  285. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/cli/dashboard/validate.py +0 -0
  286. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/cli/debug.py +0 -0
  287. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/cli/eval/__init__.py +0 -0
  288. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/cli/eval/main.py +0 -0
  289. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/cli/eval/resume.py +0 -0
  290. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/cli/eval/runner.py +0 -0
  291. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/cli/gepa.py +0 -0
  292. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/cli/init.py +0 -0
  293. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/cli/output.py +0 -0
  294. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/cli/replay.py +0 -0
  295. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/cli/resolve.py +0 -0
  296. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/cli/resume.py +0 -0
  297. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/cli/validate.py +0 -0
  298. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/clients/__init__.py +0 -0
  299. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/clients/base.py +0 -0
  300. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/clients/client.py +0 -0
  301. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/clients/eval.py +0 -0
  302. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/configs/__init__.py +0 -0
  303. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/configs/agent.py +0 -0
  304. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/configs/cli/__init__.py +0 -0
  305. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/configs/cli/debug.py +0 -0
  306. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/configs/cli/env.py +0 -0
  307. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/configs/cli/eval.py +0 -0
  308. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/configs/cli/init.py +0 -0
  309. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/configs/cli/replay.py +0 -0
  310. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/configs/cli/validate.py +0 -0
  311. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/configs/client.py +0 -0
  312. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/configs/env.py +0 -0
  313. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/configs/harness.py +0 -0
  314. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/configs/judge.py +0 -0
  315. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/configs/retries.py +0 -0
  316. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/configs/runtime.py +0 -0
  317. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/configs/serve.py +0 -0
  318. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/configs/taskset.py +0 -0
  319. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/dialects/__init__.py +0 -0
  320. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/env.py +0 -0
  321. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/envs/__init__.py +0 -0
  322. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  323. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  324. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  325. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/envs/best_of_n/env.py +0 -0
  326. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
  327. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  328. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/envs/single_agent/env.py +0 -0
  329. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  330. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/envs/user_sim/env.py +0 -0
  331. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/episode.py +0 -0
  332. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/errors.py +0 -0
  333. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/gepa/__init__.py +0 -0
  334. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/gepa/adapter.py +0 -0
  335. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/gepa/config.py +0 -0
  336. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/gepa/dataset.py +0 -0
  337. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/gepa/reflection.py +0 -0
  338. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/gepa/runner.py +0 -0
  339. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/__init__.py +0 -0
  340. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  341. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  342. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  343. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  344. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  345. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  346. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  347. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/codex/harness.py +0 -0
  348. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  349. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  350. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  351. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  352. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  353. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  354. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  355. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  356. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/node.py +0 -0
  357. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/null/__init__.py +0 -0
  358. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/null/harness.py +0 -0
  359. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/null/program.py +0 -0
  360. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  361. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  362. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  363. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/pi/harness.py +0 -0
  364. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  365. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/pool/harness.py +0 -0
  366. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  367. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  368. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  369. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  370. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  371. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/interception/__init__.py +0 -0
  372. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/interception/base.py +0 -0
  373. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/interception/pool.py +0 -0
  374. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  375. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/interception/tunnel/base.py +0 -0
  376. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/interception/tunnel/custom.py +0 -0
  377. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/interception/tunnel/prime.py +0 -0
  378. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/judge.py +0 -0
  379. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/judges/__init__.py +0 -0
  380. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/judges/reference.py +0 -0
  381. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/judges/reference.txt +0 -0
  382. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/judges/rubric.py +0 -0
  383. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/judges/rubric.txt +0 -0
  384. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/mcp/__init__.py +0 -0
  385. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/mcp/launch.py +0 -0
  386. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/mcp/server.py +0 -0
  387. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/mcp/toolset.py +0 -0
  388. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/runtimes/__init__.py +0 -0
  389. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/runtimes/base.py +0 -0
  390. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  391. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/runtimes/docker/egress.py +0 -0
  392. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/runtimes/limiters.py +0 -0
  393. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/runtimes/modal.py +0 -0
  394. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/runtimes/prime.py +0 -0
  395. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/runtimes/subprocess.py +0 -0
  396. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/serve/__init__.py +0 -0
  397. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/serve/client.py +0 -0
  398. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/serve/encoding.py +0 -0
  399. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/serve/pool.py +0 -0
  400. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/serve/server.py +0 -0
  401. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/serve/types.py +0 -0
  402. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/state.py +0 -0
  403. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/task.py +0 -0
  404. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/taskset.py +0 -0
  405. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/tasksets/__init__.py +0 -0
  406. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  407. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/tasksets/harbor/env.py +0 -0
  408. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  409. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  410. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  411. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  412. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  413. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  414. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  415. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  416. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  417. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  418. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  419. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  420. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/__init__.py +0 -0
  421. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/aio.py +0 -0
  422. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/artifacts.py +0 -0
  423. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/compile.py +0 -0
  424. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/format.py +0 -0
  425. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/generic.py +0 -0
  426. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/git.py +0 -0
  427. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/image.py +0 -0
  428. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/install.py +0 -0
  429. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/install_utils.py +0 -0
  430. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/interrupt.py +0 -0
  431. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/loaders.py +0 -0
  432. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/logging.py +0 -0
  433. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/memory.py +0 -0
  434. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/paths.py +0 -0
  435. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/platform.py +0 -0
  436. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/prime_config.py +0 -0
  437. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/retries.py +0 -0
  438. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/score.py +0 -0
  439. {verifiers-0.3.1.dev25 → verifiers-0.3.1.dev31}/verifiers/v1/utils/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.3.1.dev25
3
+ Version: 0.3.1.dev31
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
@@ -76,10 +76,23 @@ dev = [
76
76
  # from this repo. The built-in tasksets/harnesses ship inside verifiers (verifiers/v1/...).
77
77
  examples = [
78
78
  "compact",
79
- "gsm8k", "glossary", "deepwiki", "wiki-search", "code-golf",
80
- "proposer-solver", "reverse-text", "color-codeword",
81
- "wordle", "openenv-wordle", "alphabet-sort", "scratchpad",
79
+ "gsm8k",
80
+ "glossary",
81
+ "deepwiki",
82
+ "wiki-search",
83
+ "code-golf",
84
+ "proposer-solver",
85
+ "reverse-text",
86
+ "color-codeword",
87
+ "wordle",
88
+ "openenv-wordle",
89
+ "alphabet-sort",
90
+ "scratchpad",
82
91
  "kuhn-poker",
92
+ "interception",
93
+ "grayscale-interception",
94
+ "bash-interception",
95
+ "web-search-interception",
83
96
  ]
84
97
 
85
98
  [project.optional-dependencies]
@@ -164,6 +177,10 @@ color-codeword = { path = "environments/color_codeword", editable = true }
164
177
  alphabet-sort = { path = "environments/alphabet_sort", editable = true }
165
178
  scratchpad = { path = "environments/scratchpad", editable = true }
166
179
  kuhn-poker = { path = "environments/kuhn_poker", editable = true }
180
+ interception = { path = "environments/interception", editable = true }
181
+ grayscale-interception = { path = "environments/grayscale_interception", editable = true }
182
+ bash-interception = { path = "environments/bash_interception", editable = true }
183
+ web-search-interception = { path = "environments/web_search_interception", editable = true }
167
184
 
168
185
  [tool.uv.exclude-newer-package]
169
186
  # Bounded cutoffs for the explicitly requested tool upgrades.
@@ -5,6 +5,9 @@ from verifiers.v1.graph import MessageNode
5
5
  from verifiers.v1.types import AssistantMessage, UserMessage
6
6
 
7
7
  PLUGGED_FNS_PY = """
8
+ from verifiers.v1 import Trace
9
+
10
+
8
11
  async def reply_length(trace) -> float:
9
12
  return float(len(trace.last_reply or ""))
10
13
 
@@ -17,7 +20,7 @@ async def marker(trace) -> float:
17
20
  return 0.125
18
21
 
19
22
 
20
- async def two_turns(trace) -> bool:
23
+ async def two_turns(trace: Trace) -> bool:
21
24
  return trace.num_turns >= 2
22
25
  """
23
26
 
@@ -80,6 +80,7 @@ from verifiers.v1.trace import (
80
80
  Branch,
81
81
  Error,
82
82
  EvalRunInfo,
83
+ InterceptRecord,
83
84
  ModelCall,
84
85
  PolicyEvent,
85
86
  Reward,
@@ -103,6 +104,7 @@ from verifiers.v1.types import (
103
104
  Message,
104
105
  MessageContent,
105
106
  Messages,
107
+ Request,
106
108
  Response,
107
109
  Sampling,
108
110
  SamplingConfig,
@@ -121,7 +123,13 @@ from verifiers.v1.utils.artifacts import (
121
123
  collect,
122
124
  restore,
123
125
  )
124
- from verifiers.v1.utils.decorators import metric, reward, stop, tool
126
+ from verifiers.v1.utils.decorators import (
127
+ intercept,
128
+ metric,
129
+ reward,
130
+ stop,
131
+ tool,
132
+ )
125
133
  from verifiers.v1.utils.git import (
126
134
  PATCH_CAP_BYTES as PATCH_CAP_BYTES,
127
135
  )
@@ -178,6 +186,7 @@ __all__ = [ # noqa: RUF022 - grouped by public API area
178
186
  "Message",
179
187
  "MessageContent",
180
188
  "Messages",
189
+ "Request",
181
190
  "Response",
182
191
  "Sampling",
183
192
  "SamplingConfig",
@@ -220,10 +229,13 @@ __all__ = [ # noqa: RUF022 - grouped by public API area
220
229
  "AgentSpan",
221
230
  "Error",
222
231
  # decorators
232
+ "intercept",
223
233
  "stop",
224
234
  "tool",
225
235
  "metric",
226
236
  "reward",
237
+ # interception
238
+ "InterceptRecord",
227
239
  # errors
228
240
  "RolloutError",
229
241
  "EnvError",
@@ -465,15 +465,11 @@ class Agent:
465
465
  interaction = Interaction(run, gate=self._gate)
466
466
  async with self._gate or nullcontext():
467
467
  opened = await run.open()
468
- if not opened:
468
+ if not opened and (failure := run.failure) is not None:
469
469
  trace = await run.close()
470
470
  if trace.agent.runtime is not None:
471
471
  trace.agent.runtime.borrowed = runtime is not None
472
- if not opened:
473
- failure = run.failure
474
- if failure is None: # `open()` returning False always captures one.
475
- raise RuntimeError("rollout setup failed without a captured error")
476
- raise failure
472
+ raise failure
477
473
  try:
478
474
  yield interaction
479
475
  except Exception as e:
@@ -342,7 +342,9 @@ class TrainClient(Client):
342
342
  prompt = turn.prompt
343
343
  tools = parse_tools(body.get("tools"))
344
344
  else:
345
- prompt, tools = dialect.parse_request(body)
345
+ request = dialect.parse_request(body)
346
+ prompt = request.messages
347
+ tools = request.tools
346
348
  from renderers.client import generate
347
349
 
348
350
  wire_tools = [tool_to_wire(t) for t in tools] if tools else None
@@ -40,9 +40,9 @@ class TaskConfig(BaseConfig):
40
40
  """Judge plugins run after task rewards, set through `--env.taskset.task.judges`."""
41
41
 
42
42
  stops: dict[str, DecoratedFunctionConfig] = Field(default_factory=dict)
43
- """Stop conditions `(trace) -> bool` plugged by name, merged with the task's
44
- `@vf.stop` methods (a plugged function replaces a decorated one with the same
45
- name)."""
43
+ """Typed `Request`, `Response`, or `Trace` stop predicates plugged by name and
44
+ merged with the task's `@vf.stop` methods (a plugged function replaces a
45
+ decorated one with the same name)."""
46
46
  metrics: dict[str, DecoratedFunctionConfig] = Field(default_factory=dict)
47
47
  """Metrics `(task, trace, runtime) -> float` plugged by name, merged with the
48
48
  task's `@vf.metric` methods."""
@@ -30,6 +30,7 @@ from verifiers.v1.types import (
30
30
  ImageUrlContentPart,
31
31
  ImageUrlSource,
32
32
  Messages,
33
+ Request,
33
34
  Response,
34
35
  Sampling,
35
36
  SamplingConfig,
@@ -198,6 +199,37 @@ def mediate_content(value, path: str):
198
199
  return mediated, capabilities
199
200
 
200
201
 
202
+ def content_to_wire(content) -> str | list[dict]:
203
+ """Typed text/image content in Anthropic's native request shape."""
204
+ if isinstance(content, str):
205
+ return content
206
+ blocks = []
207
+ for part in content:
208
+ if isinstance(part, TextContentPart):
209
+ blocks.append({"type": "text", "text": part.text})
210
+ continue
211
+ metadata, separator, data = part.image_url.url.partition(",")
212
+ if separator and metadata.startswith("data:") and metadata.endswith(";base64"):
213
+ blocks.append(
214
+ {
215
+ "type": "image",
216
+ "source": {
217
+ "type": "base64",
218
+ "media_type": metadata[5:-7],
219
+ "data": data,
220
+ },
221
+ }
222
+ )
223
+ else:
224
+ blocks.append(
225
+ {
226
+ "type": "image",
227
+ "source": {"type": "url", "url": part.image_url.url},
228
+ }
229
+ )
230
+ return blocks
231
+
232
+
201
233
  def parse_messages(body: dict) -> Messages:
202
234
  """The request's top-level `system` + `messages` -> typed messages. Assistant turns fold
203
235
  their blocks into one message (thinking -> reasoning, tool_use -> tool calls); a user turn's
@@ -380,7 +412,9 @@ class AnthropicStreamParser(StreamParser):
380
412
  for index, parts in self.partial_json.items():
381
413
  self.blocks[index]["input"] = json.loads("".join(parts) or "{}")
382
414
  self.message["content"] = [self.blocks[index] for index in sorted(self.blocks)]
383
- return response_from_wire(self.validate_response(self.message))
415
+ response = response_from_wire(self.validate_response(self.message))
416
+ response.raw = self.message
417
+ return response
384
418
 
385
419
 
386
420
  class ModdedUsage(AnthropicUsage):
@@ -480,6 +514,12 @@ class AnthropicDialect(Dialect[MessageCreateParams, AnthropicMessage]):
480
514
  append_user_notice(mediated.setdefault("messages", []))
481
515
  return mediated, capabilities
482
516
 
517
+ def is_terminal_event(self, chunk: bytes) -> bool:
518
+ return any(
519
+ line.removeprefix(b"event:").strip() == b"message_stop"
520
+ for line in chunk.splitlines()
521
+ )
522
+
483
523
  def auth_headers(self, api_key: str) -> dict[str, str]:
484
524
  return {"x-api-key": api_key, "anthropic-version": "2023-06-01"}
485
525
 
@@ -493,9 +533,7 @@ class AnthropicDialect(Dialect[MessageCreateParams, AnthropicMessage]):
493
533
  "error": {"type": "invalid_request_error", "message": message},
494
534
  }
495
535
 
496
- def parse_request(
497
- self, body: MessageCreateParams
498
- ) -> tuple[Messages, list[Tool] | None]:
536
+ def parse_request(self, body: MessageCreateParams) -> Request:
499
537
  tools = [
500
538
  Tool(
501
539
  name=t["name"],
@@ -505,11 +543,104 @@ class AnthropicDialect(Dialect[MessageCreateParams, AnthropicMessage]):
505
543
  for t in body.get("tools") or []
506
544
  if "input_schema" in t # skip server tools (web_search etc.)
507
545
  ] or None
508
- return parse_messages(body), tools
546
+ return Request(messages=parse_messages(body), tools=tools)
509
547
 
510
548
  def parse_response(self, response: AnthropicMessage) -> Response:
511
549
  return response_from_wire(response)
512
550
 
551
+ def rewrite_request(self, body: dict, before: Request, after: Request) -> None:
552
+ original = [
553
+ m for m in before.messages if isinstance(m, (UserMessage, ToolMessage))
554
+ ]
555
+ rewritten = [
556
+ m for m in after.messages if isinstance(m, (UserMessage, ToolMessage))
557
+ ]
558
+ targets: list[tuple[dict, dict | None]] = []
559
+ for native in body.get("messages", []):
560
+ if native.get("role") == "assistant":
561
+ continue
562
+ content = native.get("content")
563
+ if isinstance(content, str):
564
+ targets.append((native, None))
565
+ continue
566
+ blocks = content or []
567
+ targets.extend(
568
+ (native, block)
569
+ for block in blocks
570
+ if block.get("type") == "tool_result"
571
+ )
572
+ if any(block.get("type") != "tool_result" for block in blocks):
573
+ targets.append((native, None))
574
+
575
+ for (native, block), old, new in zip(targets, original, rewritten, strict=True):
576
+ if old == new:
577
+ continue
578
+ if block is not None:
579
+ block["content"] = content_to_wire(new.content)
580
+ continue
581
+ replacement = content_to_wire(new.content)
582
+ if isinstance(native.get("content"), str):
583
+ native["content"] = replacement
584
+ continue
585
+ replacement = (
586
+ [{"type": "text", "text": replacement}]
587
+ if isinstance(replacement, str)
588
+ else replacement
589
+ )
590
+ blocks = native.get("content") or []
591
+ updated = []
592
+ inserted = False
593
+ for current in blocks:
594
+ if current.get("type") == "tool_result":
595
+ updated.append(current)
596
+ elif not inserted:
597
+ updated.extend(replacement)
598
+ inserted = True
599
+ native["content"] = updated
600
+
601
+ def rewrite_response(self, raw: dict, text: str) -> None:
602
+ raw["content"] = [{"type": "text", "text": text}]
603
+ raw["stop_reason"] = "end_turn"
604
+ raw["stop_sequence"] = None
605
+
606
+ def stream_events(self, raw: dict) -> list[bytes]:
607
+ def event(kind: str, payload: dict) -> bytes:
608
+ return f"event: {kind}\ndata: {json.dumps(payload)}\n\n".encode()
609
+
610
+ text = raw["content"][0]["text"]
611
+ head = {**raw, "content": [], "stop_reason": None, "stop_sequence": None}
612
+ if isinstance(usage := head.get("usage"), dict):
613
+ head["usage"] = {**usage, "output_tokens": 0}
614
+ return [
615
+ event("message_start", {"type": "message_start", "message": head}),
616
+ event(
617
+ "content_block_start",
618
+ {
619
+ "type": "content_block_start",
620
+ "index": 0,
621
+ "content_block": {"type": "text", "text": ""},
622
+ },
623
+ ),
624
+ event(
625
+ "content_block_delta",
626
+ {
627
+ "type": "content_block_delta",
628
+ "index": 0,
629
+ "delta": {"type": "text_delta", "text": text},
630
+ },
631
+ ),
632
+ event("content_block_stop", {"type": "content_block_stop", "index": 0}),
633
+ event(
634
+ "message_delta",
635
+ {
636
+ "type": "message_delta",
637
+ "delta": {"stop_reason": "end_turn", "stop_sequence": None},
638
+ "usage": raw.get("usage") or {},
639
+ },
640
+ ),
641
+ event("message_stop", {"type": "message_stop"}),
642
+ ]
643
+
513
644
  def stream_parser(self) -> StreamParser:
514
645
  return AnthropicStreamParser(self.validate_response)
515
646
 
@@ -20,7 +20,7 @@ from typing import ClassVar, Generic, TypeVar
20
20
  from pydantic import BaseModel
21
21
  from pydantic_core import from_json
22
22
 
23
- from verifiers.v1.types import Messages, Response, Sampling, SamplingConfig, Tool
23
+ from verifiers.v1.types import Request, Response, Sampling, SamplingConfig
24
24
 
25
25
  ReqT = TypeVar("ReqT")
26
26
  RespT = TypeVar("RespT", bound=BaseModel)
@@ -193,8 +193,8 @@ class Dialect(ABC, Generic[ReqT, RespT]):
193
193
  content. Returned paths never contain request values."""
194
194
 
195
195
  @abstractmethod
196
- def parse_request(self, body: ReqT) -> tuple[Messages, list[Tool] | None]:
197
- """The native request -> vf prompt + tools (for the trace)."""
196
+ def parse_request(self, body: ReqT) -> Request:
197
+ """The native request -> the typed model request."""
198
198
 
199
199
  def parse_sampling(self, body: ReqT) -> Sampling:
200
200
  """The native request's call settings -> the canonical `Sampling` (for the
@@ -212,6 +212,18 @@ class Dialect(ABC, Generic[ReqT, RespT]):
212
212
  """Validate a native response, normalizing provider-compatible extensions if needed."""
213
213
  return self.response_type.model_validate(raw)
214
214
 
215
+ @abstractmethod
216
+ def rewrite_request(self, body: ReqT, before: Request, after: Request) -> None:
217
+ """Patch rewritten user/tool messages into the native conversation."""
218
+
219
+ @abstractmethod
220
+ def rewrite_response(self, raw: dict, text: str) -> None:
221
+ """Replace the native assistant response with inert text."""
222
+
223
+ @abstractmethod
224
+ def stream_events(self, raw: dict) -> list[bytes]:
225
+ """Serialize a rewritten response as a minimal native SSE stream."""
226
+
215
227
  @abstractmethod
216
228
  def stream_parser(self) -> StreamParser:
217
229
  """Create the per-request incremental parser for a native SSE response."""
@@ -6,6 +6,7 @@ and responses (`parse_response`). Reasoning extraction mirrors the v0 chat clien
6
6
  read them in the same precedence (`reasoning` / `reasoning_content` / `reasoning_details`).
7
7
  """
8
8
 
9
+ import json
9
10
  import time
10
11
  from collections.abc import Mapping
11
12
  from dataclasses import dataclass
@@ -28,6 +29,7 @@ from verifiers.v1.types import (
28
29
  FinishReason,
29
30
  Message,
30
31
  Messages,
32
+ Request,
31
33
  Response,
32
34
  Sampling,
33
35
  SamplingConfig,
@@ -319,7 +321,9 @@ class ChatStreamParser(StreamParser):
319
321
  ],
320
322
  "usage": self.usage,
321
323
  }
322
- return response_from_wire(ModdedChatCompletion.model_validate(completion))
324
+ response = response_from_wire(ModdedChatCompletion.model_validate(completion))
325
+ response.raw = completion
326
+ return response
323
327
 
324
328
 
325
329
  class ChatDialect(Dialect[CompletionCreateParams, ChatCompletion]):
@@ -473,9 +477,9 @@ class ChatDialect(Dialect[CompletionCreateParams, ChatCompletion]):
473
477
  append_user_notice(mediated.setdefault("messages", []))
474
478
  return mediated, capabilities
475
479
 
476
- def parse_request(
477
- self, body: CompletionCreateParams
478
- ) -> tuple[Messages, list[Tool] | None]:
480
+ def parse_request(self, body: CompletionCreateParams) -> Request:
481
+ if body.get("n", 1) != 1:
482
+ raise ValueError("chat completions require n=1")
479
483
  messages: Messages = []
480
484
  tool_names: dict[str, str] = {}
481
485
  for raw in body.get("messages", []):
@@ -488,7 +492,7 @@ class ChatDialect(Dialect[CompletionCreateParams, ChatCompletion]):
488
492
  if isinstance(message, AssistantMessage):
489
493
  for call in message.tool_calls or []:
490
494
  tool_names[call.id] = call.name
491
- return messages, parse_tools(body.get("tools"))
495
+ return Request(messages=messages, tools=parse_tools(body.get("tools")))
492
496
 
493
497
  def parse_sampling(self, body: CompletionCreateParams) -> Sampling:
494
498
  settings = {k: v for k, v in body.items() if k in self.sampling_fields}
@@ -501,6 +505,41 @@ class ChatDialect(Dialect[CompletionCreateParams, ChatCompletion]):
501
505
  def parse_response(self, response: ChatCompletion) -> Response:
502
506
  return response_from_wire(response)
503
507
 
508
+ def rewrite_request(self, body: dict, before: Request, after: Request) -> None:
509
+ for native, original, rewritten in zip(
510
+ body.get("messages", []), before.messages, after.messages, strict=True
511
+ ):
512
+ if rewritten != original:
513
+ native["content"] = message_to_wire(rewritten)["content"]
514
+ if isinstance(rewritten, ToolMessage):
515
+ if rewritten.name is None:
516
+ native.pop("name", None)
517
+ else:
518
+ native["name"] = rewritten.name
519
+
520
+ def rewrite_response(self, raw: dict, text: str) -> None:
521
+ for choice in raw.get("choices") or []:
522
+ if isinstance(choice.get("message"), dict):
523
+ choice["message"] = {"role": "assistant", "content": text}
524
+ choice["finish_reason"] = "stop"
525
+ choice.pop("logprobs", None)
526
+
527
+ def stream_events(self, raw: dict) -> list[bytes]:
528
+ choice = (raw.get("choices") or [{}])[0]
529
+ chunk = {
530
+ **{key: value for key, value in raw.items() if key != "choices"},
531
+ "object": "chat.completion.chunk",
532
+ "choices": [
533
+ {
534
+ "index": 0,
535
+ "delta": choice.get("message")
536
+ or {"role": "assistant", "content": ""},
537
+ "finish_reason": choice.get("finish_reason"),
538
+ }
539
+ ],
540
+ }
541
+ return [f"data: {json.dumps(chunk)}\n\n".encode(), b"data: [DONE]\n\n"]
542
+
504
543
  def stream_parser(self) -> StreamParser:
505
544
  return ChatStreamParser()
506
545
 
@@ -32,6 +32,7 @@ from verifiers.v1.types import (
32
32
  ImageUrlContentPart,
33
33
  ImageUrlSource,
34
34
  Messages,
35
+ Request,
35
36
  Response,
36
37
  Sampling,
37
38
  SamplingConfig,
@@ -386,9 +387,11 @@ class ResponsesStreamParser(StreamParser):
386
387
  events = self.terminal_events or self.events
387
388
  for event in iter_sse_reverse(b"".join(events)):
388
389
  if event.get("type") in FINAL_EVENTS:
389
- return response_from_wire(
390
+ response = response_from_wire(
390
391
  OpenAIResponse.model_validate(event["response"])
391
392
  )
393
+ response.raw = event["response"]
394
+ return response
392
395
  raise ValueError("Responses stream ended without a terminal event")
393
396
 
394
397
 
@@ -541,9 +544,7 @@ class ResponsesDialect(Dialect[ResponseCreateParams, OpenAIResponse]):
541
544
  settings["max_tokens"] = settings.pop("max_output_tokens")
542
545
  return Sampling.model_validate(settings)
543
546
 
544
- def parse_request(
545
- self, body: ResponseCreateParams
546
- ) -> tuple[Messages, list[Tool] | None]:
547
+ def parse_request(self, body: ResponseCreateParams) -> Request:
547
548
  prompt: Messages = []
548
549
  if instructions := body.get("instructions"):
549
550
  prompt.append(SystemMessage(content=instructions))
@@ -596,11 +597,127 @@ class ResponsesDialect(Dialect[ResponseCreateParams, OpenAIResponse]):
596
597
  for t in body.get("tools") or []
597
598
  if t.get("type") == "function"
598
599
  ] or None
599
- return prompt, tools
600
+ return Request(messages=prompt, tools=tools)
600
601
 
601
602
  def parse_response(self, response: OpenAIResponse) -> Response:
602
603
  return response_from_wire(response)
603
604
 
605
+ def rewrite_request(self, body: dict, before: Request, after: Request) -> None:
606
+ original = [
607
+ m for m in before.messages if isinstance(m, (UserMessage, ToolMessage))
608
+ ]
609
+ rewritten = [
610
+ m for m in after.messages if isinstance(m, (UserMessage, ToolMessage))
611
+ ]
612
+ items = body.get("input")
613
+ if isinstance(items, str):
614
+ if original != rewritten:
615
+ message = rewritten[0]
616
+ content = (
617
+ message.content
618
+ if isinstance(message.content, str)
619
+ else [
620
+ {"type": "input_text", "text": part.text}
621
+ if isinstance(part, TextContentPart)
622
+ else {
623
+ "type": "input_image",
624
+ "image_url": part.image_url.url,
625
+ }
626
+ for part in message.content
627
+ ]
628
+ )
629
+ body["input"] = (
630
+ content
631
+ if isinstance(content, str)
632
+ else [{"role": "user", "content": content}]
633
+ )
634
+ return
635
+
636
+ targets = []
637
+ for item in items or []:
638
+ role = item.get("role")
639
+ kind = item.get("type") or ""
640
+ assistant = role == "assistant" or (
641
+ role is None and not kind.endswith(("_output", "_response"))
642
+ )
643
+ if assistant or role in ("system", "developer"):
644
+ continue
645
+ targets.append(item)
646
+ for item, old, new in zip(targets, original, rewritten, strict=True):
647
+ if old == new:
648
+ continue
649
+ content = (
650
+ new.content
651
+ if isinstance(new.content, str)
652
+ else [
653
+ {"type": "input_text", "text": part.text}
654
+ if isinstance(part, TextContentPart)
655
+ else {
656
+ "type": "input_image",
657
+ "image_url": part.image_url.url,
658
+ }
659
+ for part in new.content
660
+ ]
661
+ )
662
+ item["output" if isinstance(new, ToolMessage) else "content"] = content
663
+
664
+ def rewrite_response(self, raw: dict, text: str) -> None:
665
+ original = next(
666
+ (
667
+ item
668
+ for item in raw.get("output") or []
669
+ if isinstance(item, dict) and item.get("type") == "message"
670
+ ),
671
+ {},
672
+ )
673
+ raw["output"] = [
674
+ {
675
+ "type": "message",
676
+ "id": original.get("id") or "msg_intercepted",
677
+ "role": "assistant",
678
+ "status": "completed",
679
+ "content": [{"type": "output_text", "text": text, "annotations": []}],
680
+ }
681
+ ]
682
+ raw.update(status="completed", error=None, incomplete_details=None)
683
+ raw.pop("required_action", None)
684
+ if "output_text" in raw:
685
+ raw["output_text"] = text
686
+
687
+ def stream_events(self, raw: dict) -> list[bytes]:
688
+ item = raw["output"][0]
689
+ part = item["content"][0]
690
+ common = {"output_index": 0, "item_id": item["id"], "content_index": 0}
691
+ head = {
692
+ **raw,
693
+ "status": "in_progress",
694
+ "output": [],
695
+ "completed_at": None,
696
+ }
697
+ events = [
698
+ ("response.created", {"response": head}),
699
+ (
700
+ "response.output_item.added",
701
+ {"output_index": 0, "item": {**item, "content": []}},
702
+ ),
703
+ (
704
+ "response.content_part.added",
705
+ {**common, "part": {**part, "text": ""}},
706
+ ),
707
+ ("response.output_text.delta", {**common, "delta": part["text"]}),
708
+ ("response.output_text.done", {**common, "text": part["text"]}),
709
+ ("response.content_part.done", {**common, "part": part}),
710
+ ("response.output_item.done", {"output_index": 0, "item": item}),
711
+ ("response.completed", {"response": raw}),
712
+ ]
713
+ return [
714
+ *(
715
+ f"data: {json.dumps({'type': kind, 'sequence_number': i, **data})}\n\n".encode()
716
+ for i, (kind, data) in enumerate(events)
717
+ ),
718
+ b"data: [DONE]\n\n",
719
+ ]
720
+
604
721
  def stream_parser(self) -> StreamParser:
605
722
  return ResponsesStreamParser()
606
723
 
@@ -375,6 +375,18 @@ class PendingTurn:
375
375
  self.trace.tools = tools
376
376
  return assistant_id
377
377
 
378
+ def commit_prompt(self, tools: list[Tool] | None = None) -> None:
379
+ """Record an input that terminated before model inference."""
380
+ parent = self.prefix_node_ids[-1] if self.prefix_node_ids else None
381
+ index = _head_index(self.trace)
382
+ for message in self.tail:
383
+ previous = parent
384
+ self.trace.nodes.append(MessageNode(parent=parent, message=message))
385
+ parent = len(self.trace.nodes) - 1
386
+ index[(previous, message_hash(message))] = parent
387
+ if tools:
388
+ self.trace.tools = tools
389
+
378
390
 
379
391
  def prepare_turn(trace: Trace, prompt: list[Message]) -> PendingTurn:
380
392
  """Resolve `prompt` against the trace graph without mutating it."""