verifiers 0.3.1.dev43__tar.gz → 0.3.1.dev52__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (436) hide show
  1. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/PKG-INFO +3 -3
  2. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/pyproject.toml +1 -1
  3. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/conftest.py +4 -5
  4. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/agent.py +2 -0
  5. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/debug.py +1 -0
  6. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/validate.py +2 -0
  7. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/dialects/anthropic.py +49 -13
  8. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/dialects/base.py +84 -5
  9. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/dialects/chat.py +4 -3
  10. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/dialects/responses.py +51 -21
  11. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/interception/server.py +3 -1
  12. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/mcp/launch.py +7 -2
  13. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/rollout.py +18 -0
  14. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/runtimes/__init__.py +4 -1
  15. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/runtimes/base.py +9 -0
  16. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/runtimes/docker/__init__.py +9 -3
  17. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/runtimes/modal.py +3 -2
  18. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/runtimes/prime.py +4 -3
  19. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/runtimes/subprocess.py +3 -3
  20. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/task.py +4 -0
  21. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/harbor/env.py +4 -1
  22. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/harbor/taskset.py +72 -24
  23. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/.gitignore +0 -0
  24. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/LICENSE +0 -0
  25. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/README.md +0 -0
  26. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/__init__.py +0 -0
  27. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/conftest.py +0 -0
  28. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_browser_env.py +0 -0
  29. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_build_script.py +0 -0
  30. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_cli_agent_env.py +0 -0
  31. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_client_auth_errors.py +0 -0
  32. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_client_config.py +0 -0
  33. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_client_multimodal_types.py +0 -0
  34. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_composable_env.py +0 -0
  35. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_context_token_metrics.py +0 -0
  36. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_decorator_ranks.py +0 -0
  37. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_endpoint_registry.py +0 -0
  38. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_env_group.py +0 -0
  39. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_env_server.py +0 -0
  40. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_environment.py +0 -0
  41. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_environment_extra.py +0 -0
  42. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_error_chain.py +0 -0
  43. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_eval_display.py +0 -0
  44. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_eval_utils.py +0 -0
  45. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_gepa_cli.py +0 -0
  46. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_gepa_utils.py +0 -0
  47. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_gym_env.py +0 -0
  48. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_harbor_env_mcp.py +0 -0
  49. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_imports.py +0 -0
  50. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_init_script.py +0 -0
  51. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_install_utils.py +0 -0
  52. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_interception_utils.py +0 -0
  53. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_logging.py +0 -0
  54. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_math_rubric.py +0 -0
  55. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_maybe_think_parser.py +0 -0
  56. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_message_utils.py +0 -0
  57. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_message_utils_multimodal.py +0 -0
  58. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_multiturn_env.py +0 -0
  59. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_nemorl_client.py +0 -0
  60. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_openai_chat_completions_token_client.py +0 -0
  61. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_openai_responses_client.py +0 -0
  62. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_opencode_rlm_env.py +0 -0
  63. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_openenv_client.py +0 -0
  64. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_parser.py +0 -0
  65. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_path_utils.py +0 -0
  66. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_per_turn_timing.py +0 -0
  67. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_pricing_utils.py +0 -0
  68. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_prime_plugin.py +0 -0
  69. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_renderer_client.py +0 -0
  70. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_renderer_e2e.py +0 -0
  71. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_rlm_composable_env.py +0 -0
  72. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_rubric.py +0 -0
  73. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_rubric_group.py +0 -0
  74. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_sandbox_debug_env.py +0 -0
  75. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_sandbox_env.py +0 -0
  76. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_sandbox_mixin.py +0 -0
  77. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_save_utils.py +0 -0
  78. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_setup_script.py +0 -0
  79. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_singleturn_env.py +0 -0
  80. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_stateful_tool_env.py +0 -0
  81. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_think_parser.py +0 -0
  82. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_tool_env.py +0 -0
  83. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_tool_utils.py +0 -0
  84. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_trajectory_processing.py +0 -0
  85. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_tui_info_formatting.py +0 -0
  86. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_types.py +0 -0
  87. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_xml_parser.py +0 -0
  88. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  89. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/fixtures/duet_v1.py +0 -0
  90. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  91. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  92. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  93. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  94. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/fixtures/echo_v1.py +0 -0
  95. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/fixtures/pyproject.toml +0 -0
  96. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  97. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/test_color_codeword_tasks.py +0 -0
  98. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/test_configs.py +0 -0
  99. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/test_e2e.py +0 -0
  100. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/test_envs.py +0 -0
  101. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/test_graph.py +0 -0
  102. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/test_judges.py +0 -0
  103. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/test_scoring.py +0 -0
  104. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/test_taskset.py +0 -0
  105. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/test_trace.py +0 -0
  106. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/__init__.py +0 -0
  107. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/__init__.py +0 -0
  108. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/commands/__init__.py +0 -0
  109. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/commands/build.py +0 -0
  110. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/commands/eval.py +0 -0
  111. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/commands/gepa.py +0 -0
  112. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/commands/init.py +0 -0
  113. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/commands/install.py +0 -0
  114. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/commands/setup.py +0 -0
  115. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/plugins/__init__.py +0 -0
  116. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/plugins/prime.py +0 -0
  117. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/tui.py +0 -0
  118. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/__init__.py +0 -0
  119. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/clients/__init__.py +0 -0
  120. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/clients/anthropic_messages_client.py +0 -0
  121. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/clients/client.py +0 -0
  122. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/clients/nemorl_chat_completions_client.py +0 -0
  123. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/clients/openai_chat_completions_client.py +0 -0
  124. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/clients/openai_chat_completions_token_client.py +0 -0
  125. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/clients/openai_completions_client.py +0 -0
  126. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/clients/openai_responses_client.py +0 -0
  127. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/clients/renderer_client.py +0 -0
  128. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/decorators.py +0 -0
  129. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/__init__.py +0 -0
  130. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/env_group.py +0 -0
  131. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/environment.py +0 -0
  132. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/README.md +0 -0
  133. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/__init__.py +0 -0
  134. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/cli_agent_env.py +0 -0
  135. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/README.md +0 -0
  136. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/__init__.py +0 -0
  137. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/_filter.py +0 -0
  138. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/composable_env.py +0 -0
  139. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/harness.py +0 -0
  140. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/harnesses/__init__.py +0 -0
  141. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  142. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/harnesses/opencode.py +0 -0
  143. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/harnesses/prompt.txt +0 -0
  144. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/harnesses/rlm.py +0 -0
  145. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/sandbox_debug_env.py +0 -0
  146. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/swe_debug_env.py +0 -0
  147. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/task.py +0 -0
  148. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/__init__.py +0 -0
  149. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  150. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  151. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  152. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  153. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  154. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  155. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  156. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  157. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  158. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/README.md +0 -0
  159. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  160. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  161. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  162. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  163. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  164. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  165. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  166. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  167. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  168. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  169. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  170. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  171. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  172. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  173. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  174. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  175. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  176. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  177. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  178. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  179. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  180. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  181. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  182. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/gym_env.py +0 -0
  183. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/harbor_env/__init__.py +0 -0
  184. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/harbor_env/env.py +0 -0
  185. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/harbor_env/mcp.py +0 -0
  186. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/mcp_env.py +0 -0
  187. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/opencode_env.py +0 -0
  188. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/opencode_qa_env.py +0 -0
  189. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/opencode_rlm_env.py +0 -0
  190. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/sandbox_mixin.py +0 -0
  191. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/utils/__init__.py +0 -0
  192. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/utils/file_locks.py +0 -0
  193. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/utils/git_checkout_cache.py +0 -0
  194. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/README.md +0 -0
  195. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/__init__.py +0 -0
  196. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/browser_env/README.md +0 -0
  197. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/browser_env/__init__.py +0 -0
  198. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/browser_env/browser_env.py +0 -0
  199. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/browser_env/modes/__init__.py +0 -0
  200. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/browser_env/modes/base.py +0 -0
  201. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  202. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  203. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/openenv_env.py +0 -0
  204. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/reasoninggym_env.py +0 -0
  205. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/textarena_env.py +0 -0
  206. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/multiturn_env.py +0 -0
  207. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/python_env.py +0 -0
  208. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/sandbox_env.py +0 -0
  209. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/singleturn_env.py +0 -0
  210. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/stateful_tool_env.py +0 -0
  211. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/tool_env.py +0 -0
  212. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/errors.py +0 -0
  213. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/gepa/__init__.py +0 -0
  214. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/gepa/adapter.py +0 -0
  215. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/gepa/config.py +0 -0
  216. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/gepa/display.py +0 -0
  217. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/gepa/gepa_utils.py +0 -0
  218. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/parsers/__init__.py +0 -0
  219. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/parsers/maybe_think_parser.py +0 -0
  220. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/parsers/parser.py +0 -0
  221. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/parsers/think_parser.py +0 -0
  222. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/parsers/xml_parser.py +0 -0
  223. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/rubrics/__init__.py +0 -0
  224. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/rubrics/experimental/hybrid_math_rubric.py +0 -0
  225. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/rubrics/judge_rubric.py +0 -0
  226. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/rubrics/math_rubric.py +0 -0
  227. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/rubrics/rubric.py +0 -0
  228. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/rubrics/rubric_group.py +0 -0
  229. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/scripts/__init__.py +0 -0
  230. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/scripts/build.py +0 -0
  231. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/scripts/eval.py +0 -0
  232. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/scripts/gepa.py +0 -0
  233. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/scripts/init.py +0 -0
  234. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/scripts/install.py +0 -0
  235. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/scripts/setup.py +0 -0
  236. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/scripts/tui.py +0 -0
  237. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/serve/__init__.py +0 -0
  238. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/serve/client/env_client.py +0 -0
  239. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/serve/client/zmq_env_client.py +0 -0
  240. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/serve/server/__init__.py +0 -0
  241. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/serve/server/env_router.py +0 -0
  242. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/serve/server/env_server.py +0 -0
  243. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/serve/server/env_worker.py +0 -0
  244. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/serve/server/zmq_env_server.py +0 -0
  245. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/serve/types.py +0 -0
  246. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/types.py +0 -0
  247. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/__init__.py +0 -0
  248. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/async_utils.py +0 -0
  249. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/client_utils.py +0 -0
  250. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/config_utils.py +0 -0
  251. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/data_utils.py +0 -0
  252. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/display_utils.py +0 -0
  253. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/env_config_utils.py +0 -0
  254. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/env_utils.py +0 -0
  255. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/error_utils.py +0 -0
  256. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/eval_display.py +0 -0
  257. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/eval_utils.py +0 -0
  258. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/heartbeat.py +0 -0
  259. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/import_utils.py +0 -0
  260. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/install_utils.py +0 -0
  261. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/interception_utils.py +0 -0
  262. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/logging_utils.py +0 -0
  263. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/message_utils.py +0 -0
  264. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/metric_utils.py +0 -0
  265. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/path_utils.py +0 -0
  266. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/pricing_utils.py +0 -0
  267. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/process_utils.py +0 -0
  268. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/response_utils.py +0 -0
  269. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/save_utils.py +0 -0
  270. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/serve_utils.py +0 -0
  271. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/thread_utils.py +0 -0
  272. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/threaded_sandbox_client.py +0 -0
  273. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/tool_utils.py +0 -0
  274. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/usage_utils.py +0 -0
  275. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/version_utils.py +0 -0
  276. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/__init__.py +0 -0
  277. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/acp/__init__.py +0 -0
  278. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/acp/runner.py +0 -0
  279. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/__init__.py +0 -0
  280. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  281. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/dashboard/base.py +0 -0
  282. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/dashboard/eval.py +0 -0
  283. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/dashboard/replay.py +0 -0
  284. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/dashboard/validate.py +0 -0
  285. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/eval/__init__.py +0 -0
  286. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/eval/main.py +0 -0
  287. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/eval/resume.py +0 -0
  288. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/eval/runner.py +0 -0
  289. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/gepa.py +0 -0
  290. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/init.py +0 -0
  291. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/output.py +0 -0
  292. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/replay.py +0 -0
  293. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/resolve.py +0 -0
  294. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/resume.py +0 -0
  295. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/clients/__init__.py +0 -0
  296. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/clients/base.py +0 -0
  297. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/clients/client.py +0 -0
  298. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/clients/eval.py +0 -0
  299. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/clients/train.py +0 -0
  300. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/__init__.py +0 -0
  301. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/agent.py +0 -0
  302. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/cli/__init__.py +0 -0
  303. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/cli/debug.py +0 -0
  304. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/cli/env.py +0 -0
  305. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/cli/eval.py +0 -0
  306. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/cli/init.py +0 -0
  307. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/cli/replay.py +0 -0
  308. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/cli/validate.py +0 -0
  309. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/client.py +0 -0
  310. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/env.py +0 -0
  311. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/harness.py +0 -0
  312. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/judge.py +0 -0
  313. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/retries.py +0 -0
  314. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/runtime.py +0 -0
  315. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/serve.py +0 -0
  316. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/task.py +0 -0
  317. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/taskset.py +0 -0
  318. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/dialects/__init__.py +0 -0
  319. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/env.py +0 -0
  320. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/envs/__init__.py +0 -0
  321. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  322. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  323. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  324. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/envs/best_of_n/env.py +0 -0
  325. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
  326. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  327. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/envs/single_agent/env.py +0 -0
  328. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  329. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/envs/user_sim/env.py +0 -0
  330. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/episode.py +0 -0
  331. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/errors.py +0 -0
  332. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/gepa/__init__.py +0 -0
  333. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/gepa/adapter.py +0 -0
  334. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/gepa/config.py +0 -0
  335. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/gepa/dataset.py +0 -0
  336. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/gepa/reflection.py +0 -0
  337. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/gepa/runner.py +0 -0
  338. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/graph.py +0 -0
  339. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harness.py +0 -0
  340. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/__init__.py +0 -0
  341. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  342. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/bash/harness.py +0 -0
  343. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/bash/program.py +0 -0
  344. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  345. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  346. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  347. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  348. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  349. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  350. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/codex/harness.py +0 -0
  351. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  352. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  353. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  354. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  355. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  356. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  357. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  358. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  359. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/node.py +0 -0
  360. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/null/__init__.py +0 -0
  361. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/null/harness.py +0 -0
  362. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/null/program.py +0 -0
  363. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  364. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  365. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  366. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/pi/harness.py +0 -0
  367. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  368. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/pool/harness.py +0 -0
  369. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  370. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  371. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  372. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  373. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  374. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/interception/__init__.py +0 -0
  375. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/interception/base.py +0 -0
  376. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/interception/pool.py +0 -0
  377. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/interception/tool.py +0 -0
  378. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  379. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/interception/tunnel/base.py +0 -0
  380. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/interception/tunnel/custom.py +0 -0
  381. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/interception/tunnel/prime.py +0 -0
  382. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/judge.py +0 -0
  383. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/judges/__init__.py +0 -0
  384. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/judges/reference.py +0 -0
  385. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/judges/reference.txt +0 -0
  386. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/judges/rubric.py +0 -0
  387. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/judges/rubric.txt +0 -0
  388. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/mcp/__init__.py +0 -0
  389. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/mcp/server.py +0 -0
  390. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/mcp/toolset.py +0 -0
  391. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/runtimes/docker/egress.py +0 -0
  392. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/runtimes/limiters.py +0 -0
  393. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/serve/__init__.py +0 -0
  394. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/serve/client.py +0 -0
  395. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/serve/encoding.py +0 -0
  396. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/serve/pool.py +0 -0
  397. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/serve/server.py +0 -0
  398. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/serve/types.py +0 -0
  399. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/session.py +0 -0
  400. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/state.py +0 -0
  401. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/taskset.py +0 -0
  402. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/__init__.py +0 -0
  403. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  404. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  405. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  406. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  407. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  408. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  409. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  410. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  411. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  412. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  413. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  414. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  415. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  416. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/trace.py +0 -0
  417. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/types.py +0 -0
  418. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/__init__.py +0 -0
  419. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/aio.py +0 -0
  420. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/artifacts.py +0 -0
  421. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/compile.py +0 -0
  422. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/decorators.py +0 -0
  423. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/format.py +0 -0
  424. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/generic.py +0 -0
  425. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/git.py +0 -0
  426. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/image.py +0 -0
  427. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/interrupt.py +0 -0
  428. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/loaders.py +0 -0
  429. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/logging.py +0 -0
  430. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/memory.py +0 -0
  431. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/paths.py +0 -0
  432. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/platform.py +0 -0
  433. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/prime.py +0 -0
  434. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/retries.py +0 -0
  435. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/score.py +0 -0
  436. {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/version.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: verifiers
3
- Version: 0.3.1.dev43
3
+ Version: 0.3.1.dev52
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
@@ -34,7 +34,7 @@ Requires-Dist: msgpack>=1.1.2
34
34
  Requires-Dist: numpy>=2.1.0
35
35
  Requires-Dist: openai-agents>=0.8.2
36
36
  Requires-Dist: openai>=2.9.0
37
- Requires-Dist: prime-pydantic-config[toml]>=0.4.2
37
+ Requires-Dist: prime-pydantic-config[toml]>=0.4.3
38
38
  Requires-Dist: prime-sandboxes>=0.2.37
39
39
  Requires-Dist: prime-tunnel>=0.1.8
40
40
  Requires-Dist: pydantic>=2.12.3
@@ -47,7 +47,7 @@ dependencies = [
47
47
  "setproctitle>=1.3.0",
48
48
  "httpx>=0.27.0",
49
49
  "aiohttp>=3.9.0",
50
- "prime-pydantic-config[toml]>=0.4.2",
50
+ "prime-pydantic-config[toml]>=0.4.3",
51
51
  "uvloop>=0.21.0; sys_platform != 'win32' and sys_platform != 'cygwin' and platform_python_implementation != 'PyPy'",
52
52
  "loguru>=0.7.0",
53
53
  "tomli-w>=1.0.0",
@@ -154,6 +154,8 @@ def _eval_config(
154
154
  runtime_cfg = dict(runtime)
155
155
  _configure_prime_runtimes(runtime_cfg)
156
156
  env_cfg.setdefault("agent", {})["runtime"] = runtime_cfg
157
+ retries = {"max_retries": 2, "include": ["ProviderError", "HarnessError"]}
158
+ env_cfg.setdefault("retries", retries)
157
159
  # Per-run caps live on the seats: resolve the env's declared roles and cap
158
160
  # each one (a test's own seat dict wins over the shared defaults).
159
161
  config_cls = vf.env_config_type(taskset, env_cfg.get("id", ""))
@@ -167,11 +169,8 @@ def _eval_config(
167
169
  seat_cfg.setdefault("max_turns", max_turns)
168
170
  seat_cfg.setdefault("max_output_tokens", max_tokens)
169
171
  seat_cfg.setdefault("timeout", {"rollout": rollout_timeout, "scoring": 60})
170
- # Flake resilience: retries are per-agent now (flat RetryConfig).
171
- seat_cfg.setdefault(
172
- "retries",
173
- {"max_retries": 2, "include": ["ProviderError", "HarnessError"]},
174
- )
172
+ # Agent runs retry locally; interactions retry with their whole episode.
173
+ seat_cfg.setdefault("retries", retries)
175
174
  return EvalConfig(
176
175
  env={
177
176
  "taskset": taskset_cfg,
@@ -548,6 +548,8 @@ class Agent:
548
548
  else self.runtime_config
549
549
  )
550
550
  async with provision_runtime(config) as runtime:
551
+ # Keep sandbox startup task-neutral: this box may later host another task.
552
+ runtime.env = dict(task.runtime_env()) if task is not None else {}
551
553
  yield runtime
552
554
 
553
555
 
@@ -224,6 +224,7 @@ async def debug_task(task: Task, config: DebugConfig) -> tuple[Trace, bool]:
224
224
  else task.data.timeout.setup
225
225
  )
226
226
  try:
227
+ runtime.env = dict(task.runtime_env())
227
228
  trace.timing.boot.start = time.time()
228
229
  await runtime.start()
229
230
  now = time.time()
@@ -235,6 +235,7 @@ async def _run_gold(task: Task, config: ValidateConfig) -> ResultRow:
235
235
  )
236
236
  valid, exc = False, None
237
237
  try:
238
+ runtime.env = dict(task.runtime_env())
238
239
  trace = Trace(
239
240
  task=TraceTask(
240
241
  type=type(task).__name__, data=task.data, key=task.key, hash=task.hash
@@ -278,6 +279,7 @@ async def _run_setup(task: Task, config: ValidateConfig) -> ResultRow:
278
279
  )
279
280
  valid, exc = False, None
280
281
  try:
282
+ runtime.env = dict(task.runtime_env())
281
283
  trace = Trace(
282
284
  task=TraceTask(
283
285
  type=type(task).__name__, data=task.data, key=task.key, hash=task.hash
@@ -16,12 +16,14 @@ from anthropic.types import Message as AnthropicMessage
16
16
  from anthropic.types import MessageCreateParams
17
17
  from anthropic.types import Usage as AnthropicUsage
18
18
 
19
+ from verifiers.v1.configs.runtime import NetworkPolicyConfig
19
20
  from verifiers.v1.dialects.base import (
20
21
  Dialect,
21
22
  StreamParser,
22
23
  append_user_notice,
23
24
  blocked_url,
24
25
  parse_sse_event,
26
+ provider_allowed_domains,
25
27
  )
26
28
  from verifiers.v1.types import (
27
29
  AssistantMessage,
@@ -56,6 +58,7 @@ THINKING = ("redacted_thinking", "thinking")
56
58
  # at the provider. Anchoring the pattern keeps new versions client-side without treating an
57
59
  # arbitrary dated provider tool as safe.
58
60
  _CLIENT_TOOL_TYPE = re.compile(r"(?:bash|text_editor|computer|memory)_\d{8}").fullmatch
61
+ _WEB_TOOL_TYPE = re.compile(r"web_(?:search|fetch)_\d{8}").fullmatch
59
62
  _CONTENT_WRAPPERS = (
60
63
  "tool_result",
61
64
  "code_execution_tool_result",
@@ -126,10 +129,10 @@ def parse_content(content) -> str | list[ContentPart]:
126
129
  return parts
127
130
 
128
131
 
129
- def blocked_content_path(value, path: str) -> str | None:
132
+ def blocked_content_path(value, path: str, policy: NetworkPolicyConfig) -> str | None:
130
133
  if isinstance(value, list):
131
134
  for index, item in enumerate(value):
132
- if blocked := blocked_content_path(item, f"{path}[{index}]"):
135
+ if blocked := blocked_content_path(item, f"{path}[{index}]", policy):
133
136
  return blocked
134
137
  return None
135
138
  if not isinstance(value, dict):
@@ -148,10 +151,12 @@ def blocked_content_path(value, path: str) -> str | None:
148
151
  return source_path
149
152
  source_kind = source.get("type")
150
153
  if source_kind == "content":
151
- return blocked_content_path(source.get("content"), f"{source_path}.content")
154
+ return blocked_content_path(
155
+ source.get("content"), f"{source_path}.content", policy
156
+ )
152
157
  if source_kind == "url":
153
158
  url = source.get("url")
154
- if not isinstance(url, str) or blocked_url(url):
159
+ if not isinstance(url, str) or blocked_url(url, policy):
155
160
  return f"{source_path}.url"
156
161
  if source_kind == "file":
157
162
  return (
@@ -169,13 +174,13 @@ def blocked_content_path(value, path: str) -> str | None:
169
174
  ) and value.get("file_id"):
170
175
  return f"{path}.file_id"
171
176
  if kind in _CONTENT_WRAPPERS:
172
- return blocked_content_path(value.get("content"), f"{path}.content")
177
+ return blocked_content_path(value.get("content"), f"{path}.content", policy)
173
178
  return None if kind in _SAFE_CONTENT_TYPES else f"{path}.type"
174
179
 
175
180
 
176
- def mediate_content(value, path: str):
181
+ def mediate_content(value, path: str, policy: NetworkPolicyConfig):
177
182
  if not isinstance(value, list):
178
- blocked = blocked_content_path(value, path)
183
+ blocked = blocked_content_path(value, path, policy)
179
184
  return ("", [blocked]) if blocked else (value, [])
180
185
 
181
186
  mediated = []
@@ -183,16 +188,18 @@ def mediate_content(value, path: str):
183
188
  for index, block in enumerate(value):
184
189
  item_path = f"{path}[{index}]"
185
190
  if isinstance(block, dict) and block.get("type") in _CONTENT_WRAPPERS:
186
- if blocked := blocked_content_path({**block, "content": []}, item_path):
191
+ if blocked := blocked_content_path(
192
+ {**block, "content": []}, item_path, policy
193
+ ):
187
194
  capabilities.append(blocked)
188
195
  continue
189
196
  content, removed = mediate_content(
190
- block.get("content"), f"{item_path}.content"
197
+ block.get("content"), f"{item_path}.content", policy
191
198
  )
192
199
  if removed:
193
200
  block["content"] = content or ""
194
201
  capabilities.extend(removed)
195
- elif blocked := blocked_content_path(block, item_path):
202
+ elif blocked := blocked_content_path(block, item_path, policy):
196
203
  capabilities.append(blocked)
197
204
  continue
198
205
  mediated.append(block)
@@ -448,7 +455,7 @@ class AnthropicDialect(Dialect[MessageCreateParams, AnthropicMessage]):
448
455
  response_type = ModdedAnthropicMessage
449
456
 
450
457
  def mediate_external_capabilities(
451
- self, body: MessageCreateParams
458
+ self, body: MessageCreateParams, policy: NetworkPolicyConfig
452
459
  ) -> tuple[MessageCreateParams, list[str]]:
453
460
  mediated = body
454
461
  capabilities: list[str] = []
@@ -457,7 +464,7 @@ class AnthropicDialect(Dialect[MessageCreateParams, AnthropicMessage]):
457
464
  if mediated.pop(key, None):
458
465
  capabilities.append(key)
459
466
 
460
- system, removed = mediate_content(mediated.get("system"), "system")
467
+ system, removed = mediate_content(mediated.get("system"), "system", policy)
461
468
  capabilities.extend(removed)
462
469
  if removed:
463
470
  if system:
@@ -469,7 +476,9 @@ class AnthropicDialect(Dialect[MessageCreateParams, AnthropicMessage]):
469
476
  if not isinstance(message, dict):
470
477
  continue
471
478
  content, removed = mediate_content(
472
- message.get("content"), f"messages[{message_index}].content"
479
+ message.get("content"),
480
+ f"messages[{message_index}].content",
481
+ policy,
473
482
  )
474
483
  capabilities.extend(removed)
475
484
  if removed:
@@ -482,6 +491,33 @@ class AnthropicDialect(Dialect[MessageCreateParams, AnthropicMessage]):
482
491
  tools = []
483
492
  for index, tool in enumerate(tool_items):
484
493
  kind = tool.get("type") if isinstance(tool, dict) else None
494
+ if (
495
+ isinstance(tool, dict)
496
+ and isinstance(kind, str)
497
+ and _WEB_TOOL_TYPE(kind)
498
+ ):
499
+ callers = tool.get("allowed_callers")
500
+ domains = (
501
+ provider_allowed_domains(policy, tool.get("allowed_domains"))
502
+ if tool.get("blocked_domains") in (None, [])
503
+ and (
504
+ callers is None
505
+ or isinstance(callers, list)
506
+ and "direct" in callers
507
+ )
508
+ else []
509
+ )
510
+ if domains:
511
+ web_tool = {
512
+ **tool,
513
+ "allowed_domains": domains,
514
+ "allowed_callers": ["direct"],
515
+ }
516
+ web_tool.pop("blocked_domains", None)
517
+ tools.append(web_tool)
518
+ continue
519
+ capabilities.append(f"tools[{index}].type")
520
+ continue
485
521
  if isinstance(tool, dict) and (
486
522
  (isinstance(kind, str) and _CLIENT_TOOL_TYPE(kind))
487
523
  or (kind in (None, "custom") and "input_schema" in tool)
@@ -16,16 +16,19 @@ import logging
16
16
  from abc import ABC, abstractmethod
17
17
  from collections.abc import Callable, Iterator, Mapping
18
18
  from typing import ClassVar, Generic, TypeVar
19
+ from urllib.parse import urlsplit
19
20
 
20
- from pydantic import BaseModel
21
+ from pydantic import AnyHttpUrl, BaseModel, TypeAdapter, ValidationError
21
22
  from pydantic_core import from_json
22
23
 
24
+ from verifiers.v1.configs.runtime import NetworkPolicyConfig, network_rule_matches
23
25
  from verifiers.v1.types import Request, Response, Sampling, SamplingConfig
24
26
 
25
27
  ReqT = TypeVar("ReqT")
26
28
  RespT = TypeVar("RespT", bound=BaseModel)
27
29
 
28
30
  logger = logging.getLogger(__name__)
31
+ HTTP_URL_ADAPTER = TypeAdapter(AnyHttpUrl)
29
32
 
30
33
  PROVIDER_CAPABILITY_POLICY_CODE = "provider_capability_unavailable"
31
34
  CAPABILITY_NOTICE = (
@@ -35,9 +38,83 @@ CAPABILITY_NOTICE = (
35
38
  )
36
39
 
37
40
 
38
- def blocked_url(value: str) -> bool:
39
- """Whether a provider-resolved resource is not inline data."""
40
- return not value.lower().startswith("data:")
41
+ def blocked_url(value: str, policy: NetworkPolicyConfig) -> bool:
42
+ """Whether a provider-resolved resource is neither inline nor policy-permitted."""
43
+ if value.lower().startswith("data:"):
44
+ return False
45
+ try:
46
+ url = HTTP_URL_ADAPTER.validate_python(value)
47
+ except ValidationError:
48
+ return True
49
+ host = url.host.lower().rstrip(".").strip("[]")
50
+ return any(
51
+ network_rule_matches(rule, url.scheme, host, url.port) for rule in policy.block
52
+ ) or not any(
53
+ network_rule_matches(rule, url.scheme, host, url.port) for rule in policy.allow
54
+ )
55
+
56
+
57
+ def provider_allowed_domains(
58
+ policy: NetworkPolicyConfig, requested: object = None
59
+ ) -> list[str]:
60
+ """Translate a network policy to provider domain-filter semantics without widening it."""
61
+ if policy.block or not policy.allow or "*" in policy.allow:
62
+ return []
63
+ domains = []
64
+ for rule in policy.allow:
65
+ try:
66
+ url = urlsplit(rule if "://" in rule else f"//{rule}")
67
+ port = url.port
68
+ except ValueError:
69
+ return []
70
+ host = (url.hostname or "").lower().rstrip(".")
71
+ domain = host.removeprefix("*.")
72
+ if (
73
+ url.scheme
74
+ or port is not None
75
+ or not host.startswith("*.")
76
+ or not domain
77
+ or "*" in domain
78
+ or not domain.isascii()
79
+ ):
80
+ return []
81
+ domains.append(domain)
82
+ domains = list(dict.fromkeys(domains))
83
+ if requested is None:
84
+ return domains
85
+ if not isinstance(requested, list):
86
+ return []
87
+ requested_domains = []
88
+ for domain in requested:
89
+ if not isinstance(domain, str):
90
+ return []
91
+ try:
92
+ url = urlsplit(domain if "://" in domain else f"//{domain}")
93
+ port = url.port
94
+ except ValueError:
95
+ return []
96
+ host = (url.hostname or "").lower().rstrip(".")
97
+ if (
98
+ url.scheme
99
+ or port is not None
100
+ or url.username is not None
101
+ or url.path
102
+ or url.query
103
+ or url.fragment
104
+ or not host
105
+ or "*" in host
106
+ or not host.isascii()
107
+ ):
108
+ return []
109
+ requested_domains.append(host)
110
+ intersection = []
111
+ for allowed in domains:
112
+ for requested_domain in requested_domains:
113
+ if allowed == requested_domain or allowed.endswith(f".{requested_domain}"):
114
+ intersection.append(allowed)
115
+ elif requested_domain.endswith(f".{allowed}"):
116
+ intersection.append(requested_domain)
117
+ return list(dict.fromkeys(intersection))
41
118
 
42
119
 
43
120
  def append_user_notice(
@@ -187,7 +264,9 @@ class Dialect(ABC, Generic[ReqT, RespT]):
187
264
  return {"error": {"message": message, "type": "invalid_request_error"}}
188
265
 
189
266
  @abstractmethod
190
- def mediate_external_capabilities(self, body: ReqT) -> tuple[ReqT, list[str]]:
267
+ def mediate_external_capabilities(
268
+ self, body: ReqT, policy: NetworkPolicyConfig
269
+ ) -> tuple[ReqT, list[str]]:
191
270
  """Remove provider-side capabilities during restricted execution. Implementations add
192
271
  the same policy context on every call because the agent does not retain injected request
193
272
  content. Returned paths never contain request values."""
@@ -17,6 +17,7 @@ from urllib.parse import urlsplit
17
17
  from openai.types.chat import ChatCompletion
18
18
  from openai.types.chat.completion_create_params import CompletionCreateParams
19
19
 
20
+ from verifiers.v1.configs.runtime import NetworkPolicyConfig
20
21
  from verifiers.v1.dialects.base import (
21
22
  Dialect,
22
23
  StreamParser,
@@ -356,7 +357,7 @@ class ChatDialect(Dialect[CompletionCreateParams, ChatCompletion]):
356
357
  response_type = ModdedChatCompletion
357
358
 
358
359
  def mediate_external_capabilities(
359
- self, body: CompletionCreateParams
360
+ self, body: CompletionCreateParams, policy: NetworkPolicyConfig
360
361
  ) -> tuple[CompletionCreateParams, list[str]]:
361
362
  mediated = body
362
363
  capabilities: list[str] = []
@@ -446,7 +447,7 @@ class ChatDialect(Dialect[CompletionCreateParams, ChatCompletion]):
446
447
  elif kind == "image_url":
447
448
  image = part.get("image_url") or {}
448
449
  url = image.get("url") if isinstance(image, dict) else image
449
- if not isinstance(url, str) or blocked_url(url):
450
+ if not isinstance(url, str) or blocked_url(url, policy):
450
451
  capability = f"{path}.image_url.url"
451
452
  elif kind == "file":
452
453
  file = part.get("file")
@@ -465,7 +466,7 @@ class ChatDialect(Dialect[CompletionCreateParams, ChatCompletion]):
465
466
  capability = f"{path}.file.file_data"
466
467
  else:
467
468
  if (parsed.scheme or parsed.netloc) and blocked_url(
468
- file_data
469
+ file_data, policy
469
470
  ):
470
471
  capability = f"{path}.file.file_data"
471
472
  if capability is None:
@@ -8,6 +8,7 @@ parsing reads the `output` items. Relay-only: the eval client forwards the progr
8
8
  """
9
9
 
10
10
  import json
11
+ import re
11
12
  from collections import deque
12
13
  from typing import cast
13
14
 
@@ -17,12 +18,14 @@ from openai.types.responses import (
17
18
  from openai.types.responses.response_create_params import ResponseCreateParams
18
19
  from pydantic import BaseModel, ConfigDict
19
20
 
21
+ from verifiers.v1.configs.runtime import NetworkPolicyConfig
20
22
  from verifiers.v1.dialects.base import (
21
23
  Dialect,
22
24
  StreamParser,
23
25
  append_user_notice,
24
26
  blocked_url,
25
27
  iter_sse_reverse,
28
+ provider_allowed_domains,
26
29
  )
27
30
  from verifiers.v1.errors import OverlongPromptError, model_error
28
31
  from verifiers.v1.types import (
@@ -65,6 +68,7 @@ _CLIENT_TOOL_TYPES = (
65
68
  "computer_use_preview",
66
69
  )
67
70
  _CLIENT_TOOL_CHOICES = (*_CLIENT_TOOL_TYPES, "namespace", "tool_search", "shell")
71
+ _WEB_SEARCH_TOOL_TYPE = re.compile(r"web_search(?:_\d{4}_\d{2}_\d{2})?").fullmatch
68
72
  _SAFE_INPUT_TYPES = (
69
73
  "input_text",
70
74
  "input_file",
@@ -142,7 +146,9 @@ def parse_content(content) -> str | list[ContentPart]:
142
146
  return parts
143
147
 
144
148
 
145
- def mediate_tools(tools, path: str) -> tuple[list[dict], list[str]]:
149
+ def mediate_tools(
150
+ tools, path: str, policy: NetworkPolicyConfig
151
+ ) -> tuple[list[dict], list[str]]:
146
152
  if tools is not None and not isinstance(tools, list):
147
153
  return [], [path]
148
154
  mediated = []
@@ -153,11 +159,27 @@ def mediate_tools(tools, path: str) -> tuple[list[dict], list[str]]:
153
159
  capabilities.append(item_path)
154
160
  continue
155
161
  kind = tool.get("type")
162
+ if isinstance(kind, str) and _WEB_SEARCH_TOOL_TYPE(kind):
163
+ raw_filters = tool.get("filters")
164
+ if raw_filters is None or isinstance(raw_filters, dict):
165
+ requested = raw_filters.get("allowed_domains") if raw_filters else None
166
+ domains = provider_allowed_domains(policy, requested)
167
+ else:
168
+ domains = []
169
+ if domains:
170
+ filters = dict(raw_filters) if isinstance(raw_filters, dict) else {}
171
+ filters["allowed_domains"] = domains
172
+ mediated.append({**tool, "filters": filters})
173
+ continue
174
+ capabilities.append(f"{item_path}.type")
175
+ continue
156
176
  if kind in _CLIENT_TOOL_TYPES:
157
177
  mediated.append(tool)
158
178
  continue
159
179
  if kind == "namespace":
160
- nested, removed = mediate_tools(tool.get("tools"), f"{item_path}.tools")
180
+ nested, removed = mediate_tools(
181
+ tool.get("tools"), f"{item_path}.tools", policy
182
+ )
161
183
  capabilities.extend(removed)
162
184
  if nested:
163
185
  mediated.append({**tool, "tools": nested})
@@ -177,10 +199,10 @@ def mediate_tools(tools, path: str) -> tuple[list[dict], list[str]]:
177
199
  return mediated, capabilities
178
200
 
179
201
 
180
- def blocked_content_path(value, path: str) -> str | None:
202
+ def blocked_content_path(value, path: str, policy: NetworkPolicyConfig) -> str | None:
181
203
  if isinstance(value, list):
182
204
  for index, item in enumerate(value):
183
- if blocked := blocked_content_path(item, f"{path}[{index}]"):
205
+ if blocked := blocked_content_path(item, f"{path}[{index}]", policy):
184
206
  return blocked
185
207
  return None
186
208
  if not isinstance(value, dict):
@@ -196,7 +218,9 @@ def blocked_content_path(value, path: str) -> str | None:
196
218
  if value.get("file_id"):
197
219
  return f"{path}.file_id"
198
220
  if "file_url" in value:
199
- if not isinstance(value["file_url"], str) or blocked_url(value["file_url"]):
221
+ if not isinstance(value["file_url"], str) or blocked_url(
222
+ value["file_url"], policy
223
+ ):
200
224
  return f"{path}.file_url"
201
225
  elif not isinstance(value.get("file_data"), str):
202
226
  return f"{path}.file_data"
@@ -204,7 +228,7 @@ def blocked_content_path(value, path: str) -> str | None:
204
228
  if value.get("file_id"):
205
229
  return f"{path}.file_id"
206
230
  if not isinstance(value.get("image_url"), str) or blocked_url(
207
- value["image_url"]
231
+ value["image_url"], policy
208
232
  ):
209
233
  return f"{path}.image_url"
210
234
 
@@ -222,7 +246,7 @@ def blocked_content_path(value, path: str) -> str | None:
222
246
  if kind in ("additional_tools", "tool_search_output"):
223
247
  if kind == "tool_search_output" and value.get("execution") != "client":
224
248
  return f"{path}.execution"
225
- _, removed = mediate_tools(value.get("tools"), f"{path}.tools")
249
+ _, removed = mediate_tools(value.get("tools"), f"{path}.tools", policy)
226
250
  return removed[0] if removed else None
227
251
 
228
252
  if kind in (
@@ -230,21 +254,21 @@ def blocked_content_path(value, path: str) -> str | None:
230
254
  "function_call_output",
231
255
  "custom_tool_call_output",
232
256
  ):
233
- return blocked_content_path(value.get("output"), f"{path}.output")
257
+ return blocked_content_path(value.get("output"), f"{path}.output", policy)
234
258
  if kind in (None, "message") and "role" in value and "content" in value:
235
- return blocked_content_path(value["content"], f"{path}.content")
259
+ return blocked_content_path(value["content"], f"{path}.content", policy)
236
260
  return None if kind in _SAFE_INPUT_TYPES else f"{path}.type"
237
261
 
238
262
 
239
- def mediate_content(value, path: str):
263
+ def mediate_content(value, path: str, policy: NetworkPolicyConfig):
240
264
  if not isinstance(value, list):
241
- blocked = blocked_content_path(value, path)
265
+ blocked = blocked_content_path(value, path, policy)
242
266
  return ("", [blocked]) if blocked else (value, [])
243
267
 
244
268
  mediated = []
245
269
  capabilities = []
246
270
  for index, part in enumerate(value):
247
- if blocked := blocked_content_path(part, f"{path}[{index}]"):
271
+ if blocked := blocked_content_path(part, f"{path}[{index}]", policy):
248
272
  capabilities.append(blocked)
249
273
  continue
250
274
  mediated.append(part)
@@ -415,7 +439,7 @@ class ResponsesDialect(Dialect[ResponseCreateParams, OpenAIResponse]):
415
439
  response_type = OpenAIResponse
416
440
 
417
441
  def mediate_external_capabilities(
418
- self, body: ResponseCreateParams
442
+ self, body: ResponseCreateParams, policy: NetworkPolicyConfig
419
443
  ) -> tuple[ResponseCreateParams, list[str]]:
420
444
  mediated = body
421
445
  capabilities: list[str] = []
@@ -440,12 +464,12 @@ class ResponsesDialect(Dialect[ResponseCreateParams, OpenAIResponse]):
440
464
  kind = item.get("type")
441
465
  if kind in ("additional_tools", "tool_search_output"):
442
466
  if blocked := blocked_content_path(
443
- {**item, "tools": []}, item_path
467
+ {**item, "tools": []}, item_path, policy
444
468
  ):
445
469
  capabilities.append(blocked)
446
470
  continue
447
471
  item["tools"], removed = mediate_tools(
448
- item.get("tools"), f"{item_path}.tools"
472
+ item.get("tools"), f"{item_path}.tools", policy
449
473
  )
450
474
  capabilities.extend(removed)
451
475
  if kind == "tool_search_output" or item["tools"]:
@@ -459,14 +483,16 @@ class ResponsesDialect(Dialect[ResponseCreateParams, OpenAIResponse]):
459
483
 
460
484
  if content_field:
461
485
  content, removed = mediate_content(
462
- item.get(content_field), f"{item_path}.{content_field}"
486
+ item.get(content_field),
487
+ f"{item_path}.{content_field}",
488
+ policy,
463
489
  )
464
490
  capabilities.extend(removed)
465
491
  if removed:
466
492
  item[content_field] = content or ""
467
493
 
468
494
  scan = {**item, content_field: []} if content_field else item
469
- blocked = blocked_content_path(scan, item_path)
495
+ blocked = blocked_content_path(scan, item_path, policy)
470
496
  if blocked is None:
471
497
  safe_input.append(item)
472
498
  else:
@@ -480,11 +506,11 @@ class ResponsesDialect(Dialect[ResponseCreateParams, OpenAIResponse]):
480
506
  }
481
507
  safe_input.append(item)
482
508
  mediated["input"] = safe_input
483
- elif blocked := blocked_content_path(raw_input, "input"):
509
+ elif blocked := blocked_content_path(raw_input, "input", policy):
484
510
  capabilities.append(blocked)
485
511
  mediated["input"] = []
486
512
 
487
- tools, tool_capabilities = mediate_tools(mediated.get("tools"), "tools")
513
+ tools, tool_capabilities = mediate_tools(mediated.get("tools"), "tools", policy)
488
514
  capabilities.extend(tool_capabilities)
489
515
  if "tools" in mediated:
490
516
  mediated["tools"] = tools
@@ -497,14 +523,18 @@ class ResponsesDialect(Dialect[ResponseCreateParams, OpenAIResponse]):
497
523
  )
498
524
  if isinstance(choice, dict):
499
525
  kind = choice.get("type")
500
- valid_choice = kind in _CLIENT_TOOL_CHOICES and any(
526
+ valid_choice = (
527
+ kind in _CLIENT_TOOL_CHOICES
528
+ or isinstance(kind, str)
529
+ and _WEB_SEARCH_TOOL_TYPE(kind)
530
+ ) and any(
501
531
  tool.get("type") == kind
502
532
  and ("name" not in choice or tool.get("name") == choice["name"])
503
533
  for tool in tools
504
534
  )
505
535
  if kind == "allowed_tools":
506
536
  choice_tools, choice_capabilities = mediate_tools(
507
- choice.get("tools"), "tool_choice.tools"
537
+ choice.get("tools"), "tool_choice.tools", policy
508
538
  )
509
539
  valid_choice = not choice_capabilities
510
540
  mediated["tool_choice"] = {**choice, "tools": choice_tools}
@@ -280,7 +280,9 @@ class InterceptionServer(Interception):
280
280
  ) -> tuple[dict, list[str]]:
281
281
  if not session.network_policy.network_restricted:
282
282
  return body, []
283
- mediated, capabilities = dialect.mediate_external_capabilities(body)
283
+ mediated, capabilities = dialect.mediate_external_capabilities(
284
+ body, session.network_policy
285
+ )
284
286
  capabilities = list(dict.fromkeys(capabilities))
285
287
  if capabilities:
286
288
  logger.warning(
@@ -279,7 +279,12 @@ async def serve_in_runtime(
279
279
  env["MCP_PORT_FILE"] = port_file
280
280
  python = sys.executable
281
281
  if runtime.type != "subprocess":
282
- python = await _install_in_sandbox(server, runtime)
282
+ # Prebuilt runtime images may already contain the server and its Python
283
+ # environment. Let those servers bypass redundant per-launch source
284
+ # uploads and installation while preserving the existing default.
285
+ python = getattr(type(server), "RUNTIME_PYTHON", None)
286
+ if python is None:
287
+ python = await _install_in_sandbox(server, runtime)
283
288
  command = [python, "-m", type(server).__module__]
284
289
  if runtime.type != "subprocess":
285
290
  # Providers may invoke uv after the install shell exits, so preserve its PATH.
@@ -298,7 +303,7 @@ async def serve_in_runtime(
298
303
  except ToolsetError as e:
299
304
  raise ToolsetError(f"{e}: {await log_tail(runtime, log)}") from e
300
305
  probe = await runtime.run(
301
- ["python3", "-c", _PROBE, f"http://127.0.0.1:{port}/mcp"], {}
306
+ [python, "-c", _PROBE, f"http://127.0.0.1:{port}/mcp"], {}
302
307
  )
303
308
  if probe.exit_code != 0:
304
309
  raise ToolsetError(