verifiers 0.2.2.dev49__tar.gz → 0.2.2.dev57__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 (428) hide show
  1. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/PKG-INFO +1 -1
  2. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/pyproject.toml +1 -0
  3. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/conftest.py +4 -9
  4. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/counter_tool_v1.py +3 -1
  5. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_acp_resume_v1.py +3 -1
  6. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_tool_v1.py +3 -1
  7. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/tool_response_image_v1.py +17 -3
  8. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/test_color_codeword_tasks.py +1 -3
  9. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/test_e2e.py +29 -8
  10. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/test_judges.py +6 -18
  11. verifiers-0.2.2.dev57/tests/v1/test_taskset.py +93 -0
  12. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/__init__.py +13 -4
  13. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/agent.py +5 -2
  14. verifiers-0.2.2.dev57/verifiers/v1/artifacts.py +142 -0
  15. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/dashboard/eval.py +29 -42
  16. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/debug.py +14 -7
  17. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/eval/runner.py +18 -4
  18. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/init.py +7 -2
  19. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/replay.py +3 -3
  20. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/validate.py +8 -1
  21. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/judge.py +3 -10
  22. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/taskset.py +5 -0
  23. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/env.py +9 -16
  24. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/envs/agentic_judge/__init__.py +2 -0
  25. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/envs/agentic_judge/env.py +117 -60
  26. verifiers-0.2.2.dev57/verifiers/v1/episode.py +83 -0
  27. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/gepa/adapter.py +4 -8
  28. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/gepa/runner.py +18 -2
  29. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/graph.py +3 -4
  30. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/__init__.py +6 -0
  31. verifiers-0.2.2.dev57/verifiers/v1/harnesses/browser_use/__init__.py +6 -0
  32. verifiers-0.2.2.dev57/verifiers/v1/harnesses/browser_use/harness.py +125 -0
  33. verifiers-0.2.2.dev57/verifiers/v1/harnesses/browser_use/program.py +402 -0
  34. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/judge.py +9 -10
  35. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/judges/rubric.py +5 -5
  36. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/legacy.py +4 -3
  37. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/loaders.py +4 -4
  38. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/mcp/launch.py +2 -2
  39. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/mcp/server.py +2 -2
  40. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/rollout.py +8 -8
  41. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/serve/server.py +2 -2
  42. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/state.py +6 -6
  43. verifiers-0.2.2.dev57/verifiers/v1/task.py +238 -0
  44. verifiers-0.2.2.dev57/verifiers/v1/taskset.py +110 -0
  45. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/harbor/taskset.py +101 -3
  46. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/lean/taskset.py +1 -2
  47. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/trace.py +22 -23
  48. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/types.py +13 -17
  49. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/compile.py +10 -9
  50. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/generic.py +1 -1
  51. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/git.py +74 -9
  52. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/sampling.py +4 -5
  53. verifiers-0.2.2.dev49/tests/v1/test_taskset.py +0 -71
  54. verifiers-0.2.2.dev49/verifiers/v1/episode.py +0 -55
  55. verifiers-0.2.2.dev49/verifiers/v1/task.py +0 -274
  56. verifiers-0.2.2.dev49/verifiers/v1/taskset.py +0 -98
  57. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/.gitignore +0 -0
  58. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/LICENSE +0 -0
  59. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/README.md +0 -0
  60. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/__init__.py +0 -0
  61. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/conftest.py +0 -0
  62. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_browser_env.py +0 -0
  63. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_build_script.py +0 -0
  64. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_cli_agent_env.py +0 -0
  65. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_client_auth_errors.py +0 -0
  66. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_client_config.py +0 -0
  67. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_client_multimodal_types.py +0 -0
  68. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_composable_env.py +0 -0
  69. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_context_token_metrics.py +0 -0
  70. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_decorator_ranks.py +0 -0
  71. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_endpoint_registry.py +0 -0
  72. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_env_group.py +0 -0
  73. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_env_server.py +0 -0
  74. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_environment.py +0 -0
  75. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_environment_extra.py +0 -0
  76. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_error_chain.py +0 -0
  77. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_eval_display.py +0 -0
  78. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_eval_utils.py +0 -0
  79. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_gepa_cli.py +0 -0
  80. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_gepa_utils.py +0 -0
  81. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_gym_env.py +0 -0
  82. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_harbor_env_mcp.py +0 -0
  83. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_imports.py +0 -0
  84. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_init_script.py +0 -0
  85. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_install_utils.py +0 -0
  86. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_interception_utils.py +0 -0
  87. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_logging.py +0 -0
  88. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_math_rubric.py +0 -0
  89. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_maybe_think_parser.py +0 -0
  90. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_message_utils.py +0 -0
  91. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_message_utils_multimodal.py +0 -0
  92. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_multiturn_env.py +0 -0
  93. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_nemorl_client.py +0 -0
  94. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_openai_chat_completions_token_client.py +0 -0
  95. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_openai_responses_client.py +0 -0
  96. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_opencode_rlm_env.py +0 -0
  97. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_openenv_client.py +0 -0
  98. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_parser.py +0 -0
  99. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_path_utils.py +0 -0
  100. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_per_turn_timing.py +0 -0
  101. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_pricing_utils.py +0 -0
  102. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_prime_plugin.py +0 -0
  103. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_renderer_client.py +0 -0
  104. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_renderer_e2e.py +0 -0
  105. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_rlm_composable_env.py +0 -0
  106. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_rubric.py +0 -0
  107. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_rubric_group.py +0 -0
  108. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_sandbox_debug_env.py +0 -0
  109. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_sandbox_env.py +0 -0
  110. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_sandbox_mixin.py +0 -0
  111. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_save_utils.py +0 -0
  112. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_setup_script.py +0 -0
  113. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_singleturn_env.py +0 -0
  114. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_stateful_tool_env.py +0 -0
  115. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_think_parser.py +0 -0
  116. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_tool_env.py +0 -0
  117. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_tool_utils.py +0 -0
  118. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_trajectory_processing.py +0 -0
  119. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_tui_info_formatting.py +0 -0
  120. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_types.py +0 -0
  121. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_xml_parser.py +0 -0
  122. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/duet_v1.py +0 -0
  123. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  124. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  125. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  126. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_v0.py +0 -0
  127. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_v1.py +0 -0
  128. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/pyproject.toml +0 -0
  129. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/test_configs.py +0 -0
  130. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/test_envs.py +0 -0
  131. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/test_graph.py +0 -0
  132. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/test_legacy.py +0 -0
  133. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/test_scoring.py +0 -0
  134. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/test_trace.py +0 -0
  135. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/__init__.py +0 -0
  136. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/__init__.py +0 -0
  137. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/commands/__init__.py +0 -0
  138. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/commands/build.py +0 -0
  139. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/commands/eval.py +0 -0
  140. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/commands/gepa.py +0 -0
  141. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/commands/init.py +0 -0
  142. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/commands/install.py +0 -0
  143. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/commands/setup.py +0 -0
  144. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/plugins/__init__.py +0 -0
  145. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/plugins/prime.py +0 -0
  146. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/tui.py +0 -0
  147. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/clients/__init__.py +0 -0
  148. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/clients/anthropic_messages_client.py +0 -0
  149. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/clients/client.py +0 -0
  150. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  151. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/clients/openai_chat_completions_client.py +0 -0
  152. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  153. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/clients/openai_completions_client.py +0 -0
  154. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/clients/openai_responses_client.py +0 -0
  155. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/clients/renderer_client.py +0 -0
  156. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/decorators.py +0 -0
  157. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/__init__.py +0 -0
  158. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/env_group.py +0 -0
  159. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/environment.py +0 -0
  160. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/README.md +0 -0
  161. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/__init__.py +0 -0
  162. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  163. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/README.md +0 -0
  164. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/__init__.py +0 -0
  165. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/_filter.py +0 -0
  166. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  167. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/harness.py +0 -0
  168. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  169. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  170. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  171. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  172. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  173. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  174. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  175. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/task.py +0 -0
  176. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  177. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  178. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  179. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  180. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  181. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  182. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  183. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  184. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  185. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  186. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  187. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  188. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  189. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  190. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  191. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  192. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  193. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  194. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  195. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  196. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  197. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  198. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  199. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  200. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  201. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  202. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  203. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  204. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  205. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  206. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  207. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  208. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  209. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  210. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/gym_env.py +0 -0
  211. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  212. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  213. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  214. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/mcp_env.py +0 -0
  215. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/opencode_env.py +0 -0
  216. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  217. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  218. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  219. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/utils/__init__.py +0 -0
  220. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  221. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  222. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/README.md +0 -0
  223. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/__init__.py +0 -0
  224. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/README.md +0 -0
  225. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  226. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  227. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  228. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  229. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  230. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  231. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/openenv_env.py +0 -0
  232. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  233. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/textarena_env.py +0 -0
  234. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/multiturn_env.py +0 -0
  235. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/python_env.py +0 -0
  236. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/sandbox_env.py +0 -0
  237. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/singleturn_env.py +0 -0
  238. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/stateful_tool_env.py +0 -0
  239. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/tool_env.py +0 -0
  240. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/errors.py +0 -0
  241. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/gepa/__init__.py +0 -0
  242. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/gepa/adapter.py +0 -0
  243. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/gepa/config.py +0 -0
  244. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/gepa/display.py +0 -0
  245. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/gepa/gepa_utils.py +0 -0
  246. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/parsers/__init__.py +0 -0
  247. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/parsers/maybe_think_parser.py +0 -0
  248. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/parsers/parser.py +0 -0
  249. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/parsers/think_parser.py +0 -0
  250. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/parsers/xml_parser.py +0 -0
  251. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/rubrics/__init__.py +0 -0
  252. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  253. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/rubrics/judge_rubric.py +0 -0
  254. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/rubrics/math_rubric.py +0 -0
  255. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/rubrics/rubric.py +0 -0
  256. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/rubrics/rubric_group.py +0 -0
  257. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/scripts/__init__.py +0 -0
  258. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/scripts/build.py +0 -0
  259. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/scripts/eval.py +0 -0
  260. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/scripts/gepa.py +0 -0
  261. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/scripts/init.py +0 -0
  262. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/scripts/install.py +0 -0
  263. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/scripts/setup.py +0 -0
  264. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/scripts/tui.py +0 -0
  265. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/serve/__init__.py +0 -0
  266. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/serve/client/env_client.py +0 -0
  267. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/serve/client/zmq_env_client.py +0 -0
  268. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/serve/server/__init__.py +0 -0
  269. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/serve/server/env_router.py +0 -0
  270. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/serve/server/env_server.py +0 -0
  271. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/serve/server/env_worker.py +0 -0
  272. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/serve/server/zmq_env_server.py +0 -0
  273. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/serve/types.py +0 -0
  274. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/types.py +0 -0
  275. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/__init__.py +0 -0
  276. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/async_utils.py +0 -0
  277. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/client_utils.py +0 -0
  278. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/config_utils.py +0 -0
  279. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/data_utils.py +0 -0
  280. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/display_utils.py +0 -0
  281. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/env_config_utils.py +0 -0
  282. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/env_utils.py +0 -0
  283. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/error_utils.py +0 -0
  284. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/eval_display.py +0 -0
  285. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/eval_utils.py +0 -0
  286. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/heartbeat.py +0 -0
  287. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/import_utils.py +0 -0
  288. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/install_utils.py +0 -0
  289. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/interception_utils.py +0 -0
  290. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/logging_utils.py +0 -0
  291. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/message_utils.py +0 -0
  292. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/metric_utils.py +0 -0
  293. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/path_utils.py +0 -0
  294. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/pricing_utils.py +0 -0
  295. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/process_utils.py +0 -0
  296. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/response_utils.py +0 -0
  297. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/save_utils.py +0 -0
  298. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/serve_utils.py +0 -0
  299. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/thread_utils.py +0 -0
  300. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/threaded_sandbox_client.py +0 -0
  301. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/tool_utils.py +0 -0
  302. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/usage_utils.py +0 -0
  303. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/version_utils.py +0 -0
  304. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/acp/__init__.py +0 -0
  305. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/acp/_runner.py +0 -0
  306. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/__init__.py +0 -0
  307. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  308. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/dashboard/base.py +0 -0
  309. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/dashboard/replay.py +0 -0
  310. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/dashboard/validate.py +0 -0
  311. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/eval/__init__.py +0 -0
  312. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/eval/main.py +0 -0
  313. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/eval/resume.py +0 -0
  314. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/gepa.py +0 -0
  315. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/output.py +0 -0
  316. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/resolve.py +0 -0
  317. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/serve.py +0 -0
  318. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/clients/__init__.py +0 -0
  319. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/clients/client.py +0 -0
  320. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/clients/config.py +0 -0
  321. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/clients/eval.py +0 -0
  322. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/clients/train.py +0 -0
  323. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/__init__.py +0 -0
  324. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/agent.py +0 -0
  325. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/__init__.py +0 -0
  326. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/debug.py +0 -0
  327. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/env.py +0 -0
  328. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/eval.py +0 -0
  329. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/init.py +0 -0
  330. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/replay.py +0 -0
  331. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/serve.py +0 -0
  332. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/validate.py +0 -0
  333. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/env.py +0 -0
  334. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/harness.py +0 -0
  335. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/legacy.py +0 -0
  336. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/retries.py +0 -0
  337. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/serve.py +0 -0
  338. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/task.py +0 -0
  339. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/decorators.py +0 -0
  340. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/dialects/__init__.py +0 -0
  341. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/dialects/anthropic.py +0 -0
  342. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/dialects/base.py +0 -0
  343. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/dialects/chat.py +0 -0
  344. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/dialects/responses.py +0 -0
  345. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/envs/__init__.py +0 -0
  346. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  347. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/envs/best_of_n/env.py +0 -0
  348. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  349. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/envs/single_agent/env.py +0 -0
  350. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  351. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/envs/user_sim/env.py +0 -0
  352. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/errors.py +0 -0
  353. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/gepa/__init__.py +0 -0
  354. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/gepa/config.py +0 -0
  355. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/gepa/dataset.py +0 -0
  356. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/gepa/reflection.py +0 -0
  357. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harness.py +0 -0
  358. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  359. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/bash/harness.py +0 -0
  360. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/bash/program.py +0 -0
  361. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  362. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  363. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  364. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/codex/harness.py +0 -0
  365. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  366. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  367. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  368. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  369. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  370. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/null/__init__.py +0 -0
  371. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/null/harness.py +0 -0
  372. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/null/program.py +0 -0
  373. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  374. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/pi/harness.py +0 -0
  375. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  376. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/pool/harness.py +0 -0
  377. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  378. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  379. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  380. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  381. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  382. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/interception/__init__.py +0 -0
  383. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/interception/base.py +0 -0
  384. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/interception/pool.py +0 -0
  385. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/interception/server.py +0 -0
  386. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  387. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/interception/tunnel/base.py +0 -0
  388. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/interception/tunnel/custom.py +0 -0
  389. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/interception/tunnel/prime.py +0 -0
  390. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/judges/__init__.py +0 -0
  391. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/judges/reference.py +0 -0
  392. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/judges/reference.txt +0 -0
  393. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/judges/rubric.txt +0 -0
  394. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/mcp/__init__.py +0 -0
  395. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/mcp/toolset.py +0 -0
  396. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/push.py +0 -0
  397. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/retries.py +0 -0
  398. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/__init__.py +0 -0
  399. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/base.py +0 -0
  400. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  401. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/docker/egress.py +0 -0
  402. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/limiters.py +0 -0
  403. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/modal.py +0 -0
  404. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/prime.py +0 -0
  405. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/subprocess.py +0 -0
  406. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/scoring.py +0 -0
  407. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/serve/__init__.py +0 -0
  408. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/serve/client.py +0 -0
  409. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/serve/pool.py +0 -0
  410. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/serve/types.py +0 -0
  411. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/session.py +0 -0
  412. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/__init__.py +0 -0
  413. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  414. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  415. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  416. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  417. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  418. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  419. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  420. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/__init__.py +0 -0
  421. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/aio.py +0 -0
  422. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/format.py +0 -0
  423. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/image.py +0 -0
  424. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/install.py +0 -0
  425. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/interrupt.py +0 -0
  426. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/logging.py +0 -0
  427. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/memory.py +0 -0
  428. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.2.2.dev49
3
+ Version: 0.2.2.dev57
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
@@ -234,6 +234,7 @@ markers = [
234
234
  "colocated: v1 e2e cases with a user/tool server colocated in the harness runtime",
235
235
  "null: v1 e2e cases on the null harness",
236
236
  "bash: v1 e2e cases on the bash harness",
237
+ "browser_use: v1 e2e cases on the browser_use harness",
237
238
  "rlm: v1 e2e cases on the rlm harness",
238
239
  "kimi_code: v1 e2e cases on the kimi-code harness",
239
240
  "pi: v1 e2e cases on the pi harness",
@@ -135,10 +135,6 @@ def _eval_config(
135
135
  `{id: ...}` config; `runtime` places the `agent` seat's harness (an agent field, not a
136
136
  harness one); `model` overrides the default text model (e.g. a VLM for an image task).
137
137
 
138
- `temperature=0` (greedy) makes the run reproducible; `max_tokens` is generous headroom,
139
- not a target — these trivial tasks finish in a few hundred tokens, so capping tighter only
140
- risks truncating the reasoning before the answer (which tanks the reward).
141
-
142
138
  `harness=None` leaves every seat on its own story — the multi-agent case: there
143
139
  is no run-level harness, so a single-agent test's `harness` lands on the `agent`
144
140
  seat and a multi-agent test pins its seats through `env` role fields instead."""
@@ -175,7 +171,6 @@ def _eval_config(
175
171
  num_rollouts=n,
176
172
  sampling={
177
173
  "max_tokens": max_tokens,
178
- "temperature": 0,
179
174
  "reasoning_effort": reasoning_effort,
180
175
  },
181
176
  rich=False,
@@ -219,8 +214,8 @@ def run_v1_server():
219
214
 
220
215
  @pytest.fixture
221
216
  async def live_ctx():
222
- """A live `ModelContext` (the e2e default model + endpoint, greedy) for driving
223
- `Agent` directly — the agent-surface counterpart of `run_v1`."""
217
+ """A live `ModelContext` (the e2e default model + endpoint, provider-default
218
+ sampling) for driving `Agent` directly — the agent-surface counterpart of `run_v1`."""
224
219
  from verifiers.v1.clients import EvalClientConfig, ModelContext, resolve_client
225
220
  from verifiers.v1.types import SamplingConfig
226
221
 
@@ -229,7 +224,7 @@ async def live_ctx():
229
224
  yield ModelContext(
230
225
  model="deepseek/deepseek-v4-flash",
231
226
  client=client,
232
- sampling=SamplingConfig(max_tokens=2048, temperature=0),
227
+ sampling=SamplingConfig(max_tokens=2048),
233
228
  )
234
229
  finally:
235
230
  await client.close()
@@ -252,7 +247,7 @@ def run_v0():
252
247
  legacy={"id": env_id, "args": args or {}},
253
248
  num_tasks=1,
254
249
  num_rollouts=n,
255
- sampling={"max_tokens": max_tokens, "temperature": 0},
250
+ sampling={"max_tokens": max_tokens},
256
251
  rich=False,
257
252
  output_dir=output_dir,
258
253
  )
@@ -24,7 +24,9 @@ class CounterTaskConfig(vf.TaskConfig):
24
24
 
25
25
 
26
26
  class CounterTask(vf.Task[vf.TaskData, CounterState, CounterTaskConfig]):
27
- tools = (CounterToolset,)
27
+ @classmethod
28
+ def toolsets(cls, config: CounterTaskConfig) -> list[vf.Toolset]:
29
+ return [CounterToolset(config.tools)]
28
30
 
29
31
  @vf.reward(weight=1.0)
30
32
  async def counted(self, trace: vf.Trace) -> float:
@@ -28,7 +28,9 @@ class ACPResumeConfig(vf.TasksetConfig):
28
28
 
29
29
 
30
30
  class ACPResumeTask(vf.Task[vf.TaskData, vf.State, ACPResumeTaskConfig]):
31
- tools = (ResumeToolset,)
31
+ @classmethod
32
+ def toolsets(cls, config: ACPResumeTaskConfig) -> list[vf.Toolset]:
33
+ return [ResumeToolset(config.tools)]
32
34
 
33
35
  @vf.reward(weight=1.0)
34
36
  async def resumed(self, trace: vf.Trace) -> float:
@@ -29,7 +29,9 @@ class EchoToolTaskConfig(vf.TaskConfig):
29
29
 
30
30
 
31
31
  class EchoToolTask(vf.Task[vf.TaskData, vf.State, EchoToolTaskConfig]):
32
- tools = (EchoToolset,)
32
+ @classmethod
33
+ def toolsets(cls, config: EchoToolTaskConfig) -> list[vf.Toolset]:
34
+ return [EchoToolset(config.tools)]
33
35
 
34
36
  @vf.reward(weight=1.0)
35
37
  async def echoed(self, trace: vf.Trace) -> float:
@@ -26,8 +26,16 @@ class VisionToolset(vf.Toolset[vf.ToolsetConfig]):
26
26
  ]
27
27
 
28
28
 
29
- class ToolResponseImageTask(vf.Task):
30
- tools = (VisionToolset,)
29
+ class ToolResponseImageTaskConfig(vf.TaskConfig):
30
+ tools: vf.ToolsetConfig = vf.ToolsetConfig()
31
+
32
+
33
+ class ToolResponseImageTask(
34
+ vf.Task[vf.TaskData, vf.State, ToolResponseImageTaskConfig]
35
+ ):
36
+ @classmethod
37
+ def toolsets(cls, config: ToolResponseImageTaskConfig) -> list[vf.Toolset]:
38
+ return [VisionToolset(config.tools)]
31
39
 
32
40
  @vf.reward(weight=1.0)
33
41
  async def preserved_image_tool_result(self, trace: vf.Trace) -> float:
@@ -39,7 +47,13 @@ class ToolResponseImageTask(vf.Task):
39
47
  return 0.0
40
48
 
41
49
 
42
- class ToolResponseImageTaskset(vf.Taskset[ToolResponseImageTask, vf.TasksetConfig]):
50
+ class ToolResponseImageConfig(vf.TasksetConfig):
51
+ task: ToolResponseImageTaskConfig = ToolResponseImageTaskConfig()
52
+
53
+
54
+ class ToolResponseImageTaskset(
55
+ vf.Taskset[ToolResponseImageTask, ToolResponseImageConfig]
56
+ ):
43
57
  def load(self) -> list[ToolResponseImageTask]:
44
58
  return [
45
59
  ToolResponseImageTask(
@@ -10,9 +10,7 @@ def test_color_images_are_rendered_once(monkeypatch) -> None:
10
10
  return render(image)
11
11
 
12
12
  monkeypatch.setattr(taskset, "image_data_url", counted)
13
- tasks = taskset.ColorCodewordTaskset(taskset.ColorCodewordConfig()).select(
14
- num_tasks=100
15
- )
13
+ tasks = list(taskset.ColorCodewordTaskset(taskset.ColorCodewordConfig()).head(100))
16
14
 
17
15
  assert len(tasks) == 100
18
16
  assert calls == list(taskset.COLOR_RGB.values())
@@ -109,7 +109,7 @@ async def test_single_turn(run_v1, harness, harness_runtime, tmp_path):
109
109
  assert trace.stop_condition == "agent_completed"
110
110
  assert trace.reward == 1.0
111
111
  # The seat's resolved identity rides the trace (policy metadata for trainers).
112
- assert trace.agent is not None and trace.agent.config.sampling.temperature == 0
112
+ assert trace.agent is not None and trace.agent.config.sampling.max_tokens == 2048
113
113
  # Every sampled turn has one per-call record, linked to its assistant node.
114
114
  sampled = [i for i, n in enumerate(trace.nodes) if n.sampled]
115
115
  assert [c.node for c in trace.calls if c.error is None] == sampled
@@ -118,6 +118,26 @@ async def test_single_turn(run_v1, harness, harness_runtime, tmp_path):
118
118
  assert call.time.duration > 0
119
119
 
120
120
 
121
+ @pytest.mark.e2e
122
+ @pytest.mark.browser_use
123
+ @pytest.mark.docker
124
+ async def test_browser_use(run_v1, tmp_path):
125
+ """The browser_use harness runs in an explicitly browser-capable runtime."""
126
+ image = (
127
+ "mcr.microsoft.com/playwright/python:v1.61.0-noble@"
128
+ "sha256:a9731514f24121d1dcd25d58d0a38146646d290a5998fd80d3e533e7b5e21c69"
129
+ )
130
+ (trace,) = await run_v1(
131
+ "echo-v1",
132
+ harness="browser_use",
133
+ runtime={"type": "docker", "image": image},
134
+ output_dir=tmp_path,
135
+ max_turns=2,
136
+ )
137
+ assert trace.ok
138
+ assert trace.reward == 1.0
139
+
140
+
121
141
  @pytest.mark.e2e
122
142
  @pytest.mark.parametrize("harness_runtime", USER_RUNTIMES, indirect=True)
123
143
  async def test_user(run_v1, harness_runtime, tmp_path):
@@ -335,6 +355,7 @@ async def test_agentic(run_v1, harness, harness_runtime, tmp_path):
335
355
  runtime={"type": harness_runtime},
336
356
  output_dir=tmp_path,
337
357
  max_turns=10,
358
+ max_tokens=8192,
338
359
  )
339
360
  assert trace.ok
340
361
  assert trace.num_turns >= 1 # ran a command, then finished
@@ -366,7 +387,7 @@ async def test_multi_agent_env(run_v1, tmp_path):
366
387
  # agent info (completion order — the gathered seats land in either order).
367
388
  (line,) = (tmp_path / "traces.jsonl").read_text().splitlines()
368
389
  row = json.loads(line)
369
- assert row["env"] == "duet-v1"
390
+ assert row["env"] == {"id": "duet-v1"}
370
391
  by_name = {t["agent"]["name"]: t for t in row["traces"]}
371
392
  assert set(by_name) == {"a", "b"}
372
393
  assert by_name["a"]["agent"]["trainable"] is True
@@ -401,21 +422,21 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
401
422
  model's call. Exercises the config surface too: a policy-only prompt
402
423
  override (the verdict contract is appended regardless) and
403
424
  reward-composition weights."""
425
+ policy = tmp_path / "judge_policy.txt"
426
+ policy.write_text("Check EMPIRICALLY that the agent echoed the word back.")
404
427
  traces = await run_v1(
405
428
  "echo-v1",
406
- harness=None, # seats pin their own harness; there is no run-level one
429
+ harness=None,
407
430
  env={
408
431
  "id": "agentic-judge",
409
- # The solver owns the shared box, so the container is pinned here.
410
432
  "solver": {"harness": {"id": "bash"}, "runtime": {"type": "docker"}},
411
- # The judge reads the trace and reasons before it writes the
412
- # verdict file; the shared 2048-token run cap truncates it mid-audit.
413
433
  "judge": {
414
434
  "harness": {"id": "bash"},
415
435
  "max_output_tokens": 8192,
416
436
  },
417
437
  "task": {
418
- "prompt": "Check EMPIRICALLY that the agent echoed the word back.",
438
+ "prompt": {"path": str(policy)},
439
+ "hint": "Do not rely on README.md",
419
440
  },
420
441
  "score": {"task_weight": 0.5},
421
442
  },
@@ -431,7 +452,7 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
431
452
  # The task's own reward keeps its raw score; the rescale lands on the weight.
432
453
  assert solver.rewards["echoed"].score == 1.0
433
454
  assert solver.rewards["echoed"].weight == 0.5
434
- assert isinstance(judge.info.get("verdict"), dict) # scraped off the box
455
+ assert isinstance(judge.info.get("verdict"), dict)
435
456
  assert 0.0 <= solver.rewards["judge"].score <= 1.0
436
457
 
437
458
 
@@ -371,32 +371,20 @@ async def test_rubric_view_full_trace(tmp_path, fake_judge_model):
371
371
  assert all("SECRET REASONING" not in prompt for prompt in fake_judge_model)
372
372
 
373
373
 
374
- async def test_config_prompt_overrides_class_template(fake_judge_model):
375
- judge = vf.ReferenceJudge(
376
- vf.ReferenceJudgeConfig(prompt="Q:{question} A:{answer} R:{response}")
377
- )
374
+ async def test_config_prompt_overrides_class_template(tmp_path, fake_judge_model):
375
+ # Config `prompt` is a file path; the same {field} placeholders work.
376
+ file = tmp_path / "judge.txt"
377
+ file.write_text("Q:{question} A:{answer} R:{response}")
378
+ judge = vf.ReferenceJudge(vf.ReferenceJudgeConfig(prompt=file))
378
379
  assert judge.build_messages(question="q", answer="a", response="r") == "Q:q A:a R:r"
379
380
  # A template needn't use every evaluate field: score also passes {positive}/{negative},
380
381
  # which str.format ignores when the (custom) prompt doesn't reference them.
381
382
  trace = make_trace()
382
383
  assert await judge.score(trace.task.data, trace) == 1.0
383
384
  assert fake_judge_model[0] == "Q:Capital of France? A:Paris R:It is Paris."
384
-
385
-
386
- async def test_prompt_file(tmp_path, fake_judge_model):
387
- # The prompt template can come from a file; the same {field} placeholders work.
388
- file = tmp_path / "judge.txt"
389
- file.write_text("Q:{question} A:{answer} R:{response}")
390
- trace = make_trace()
391
- judge = vf.ReferenceJudge(vf.ReferenceJudgeConfig(prompt_file=file))
392
- assert await judge.score(trace.task.data, trace) == 1.0
393
- assert fake_judge_model[0] == "Q:Capital of France? A:Paris R:It is Paris."
394
385
  # a bad path fails at judge construction, not mid-eval at score time
395
386
  with pytest.raises(FileNotFoundError):
396
- vf.ReferenceJudge(vf.ReferenceJudgeConfig(prompt_file=tmp_path / "missing.txt"))
397
- # inline and file prompts are mutually exclusive
398
- with pytest.raises(ValueError, match="not both"):
399
- vf.ReferenceJudgeConfig(prompt="inline", prompt_file=file)
387
+ vf.ReferenceJudge(vf.ReferenceJudgeConfig(prompt=tmp_path / "missing.txt"))
400
388
 
401
389
 
402
390
  # --- reference input/verdict knobs ------------------------------------------------------------
@@ -0,0 +1,93 @@
1
+ """`Taskset` iteration and the `head`/`shuffle` views over list, generator,
2
+ and `INFINITE` `load` implementations."""
3
+
4
+ import itertools
5
+
6
+ import pytest
7
+
8
+ import verifiers.v1 as vf
9
+
10
+
11
+ class CountTask(vf.Task[vf.TaskData]):
12
+ pass
13
+
14
+
15
+ class InfiniteTaskset(vf.Taskset[CountTask, vf.TasksetConfig]):
16
+ INFINITE = True
17
+
18
+ def load(self):
19
+ for i in itertools.count():
20
+ yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
21
+
22
+
23
+ class FiniteTaskset(vf.Taskset[CountTask, vf.TasksetConfig]):
24
+ def load(self):
25
+ for i in range(10):
26
+ yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
27
+
28
+
29
+ def idxs(tasks) -> list[int]:
30
+ return [task.data.idx for task in tasks]
31
+
32
+
33
+ def test_head_bounds_an_infinite_taskset() -> None:
34
+ tasks = list(InfiniteTaskset(vf.TasksetConfig()).head(5))
35
+ assert idxs(tasks) == [0, 1, 2, 3, 4]
36
+
37
+
38
+ def test_iteration_materializes_a_finite_taskset() -> None:
39
+ taskset = FiniteTaskset(vf.TasksetConfig())
40
+ assert len(list(taskset)) == 10
41
+ assert idxs(taskset.head(4)) == [0, 1, 2, 3]
42
+
43
+
44
+ def test_head_returns_the_same_taskset_type() -> None:
45
+ view = FiniteTaskset(vf.TasksetConfig()).head(4)
46
+ assert isinstance(view, FiniteTaskset)
47
+ assert view.task_type() is CountTask
48
+
49
+
50
+ def test_shuffle_samples_the_whole_taskset_reproducibly() -> None:
51
+ taskset = FiniteTaskset(vf.TasksetConfig())
52
+ first = idxs(taskset.shuffle().head(5))
53
+ assert first == idxs(taskset.shuffle().head(5))
54
+ assert len(first) == 5 and set(first) <= set(range(10))
55
+ assert first != [0, 1, 2, 3, 4] # sampled from the whole set, not the head
56
+
57
+
58
+ def test_shuffle_seed_changes_the_sample() -> None:
59
+ taskset = FiniteTaskset(vf.TasksetConfig())
60
+ seeded = idxs(taskset.shuffle(seed=7).head(5))
61
+ assert seeded == idxs(taskset.shuffle(seed=7).head(5)) # reproducible per seed
62
+ assert seeded != idxs(taskset.shuffle().head(5)) # differs from the default seed
63
+
64
+
65
+ def test_shuffle_raises_on_infinite() -> None:
66
+ with pytest.raises(ValueError, match="infinite"):
67
+ InfiniteTaskset(vf.TasksetConfig()).shuffle()
68
+
69
+
70
+ def test_head_then_shuffle_bounds_an_infinite_taskset() -> None:
71
+ head = idxs(InfiniteTaskset(vf.TasksetConfig()).head(5).shuffle())
72
+ assert sorted(head) == [0, 1, 2, 3, 4]
73
+ assert head != [0, 1, 2, 3, 4] # shuffled within the bounded head
74
+
75
+
76
+ def test_head_only_builds_what_the_run_takes() -> None:
77
+ built: list[int] = []
78
+
79
+ class RecordingTaskset(InfiniteTaskset):
80
+ def load(self):
81
+ for i in itertools.count():
82
+ built.append(i)
83
+ yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
84
+
85
+ list(RecordingTaskset(vf.TasksetConfig()).head(3))
86
+ assert built == [0, 1, 2]
87
+
88
+
89
+ def test_views_do_not_mutate_the_base_taskset() -> None:
90
+ taskset = InfiniteTaskset(vf.TasksetConfig())
91
+ view = taskset.head(3)
92
+ assert view.INFINITE is False and taskset.INFINITE is True
93
+ assert idxs(taskset.head(2)) == [0, 1] # base iterates untransformed
@@ -4,6 +4,12 @@ from pydantic_config import BaseConfig
4
4
 
5
5
  from verifiers.v1.acp import ACP
6
6
  from verifiers.v1.agent import Agent, Agents, Interaction, Segment, make_agent
7
+ from verifiers.v1.artifacts import (
8
+ ARTIFACTS_DIR,
9
+ Artifact,
10
+ collect,
11
+ restore,
12
+ )
7
13
  from verifiers.v1.clients import (
8
14
  BaseClientConfig,
9
15
  Client,
@@ -109,10 +115,10 @@ from verifiers.v1.taskset import Taskset
109
115
  from verifiers.v1.trace import (
110
116
  TRACE_VERSION,
111
117
  AgentInfo,
118
+ AgentSpan,
112
119
  Branch,
113
120
  Error,
114
121
  EvalRunInfo,
115
- GenerationSpan,
116
122
  ModelCall,
117
123
  Reward,
118
124
  RunInfo,
@@ -138,7 +144,6 @@ from verifiers.v1.types import (
138
144
  Response,
139
145
  Sampling,
140
146
  SamplingConfig,
141
- StrictBaseModel,
142
147
  SystemMessage,
143
148
  TextContentPart,
144
149
  Tool,
@@ -171,7 +176,6 @@ __all__ = [ # noqa: RUF022 - grouped by public API area
171
176
  "Response",
172
177
  "Sampling",
173
178
  "SamplingConfig",
174
- "StrictBaseModel",
175
179
  "SystemMessage",
176
180
  "TextContentPart",
177
181
  "Tool",
@@ -207,7 +211,7 @@ __all__ = [ # noqa: RUF022 - grouped by public API area
207
211
  "Timing",
208
212
  "TimeSpan",
209
213
  "TimeSplit",
210
- "GenerationSpan",
214
+ "AgentSpan",
211
215
  "Error",
212
216
  # decorators
213
217
  "stop",
@@ -297,6 +301,11 @@ __all__ = [ # noqa: RUF022 - grouped by public API area
297
301
  "PATCH_CAP_BYTES",
298
302
  "capture_patch",
299
303
  "resolve_head",
304
+ # grading artifacts
305
+ "ARTIFACTS_DIR",
306
+ "Artifact",
307
+ "collect",
308
+ "restore",
300
309
  # scoring
301
310
  "compare_stdout_results",
302
311
  "extract_boxed_answer",
@@ -335,7 +335,7 @@ class Agent:
335
335
  if self._server is None:
336
336
  return None
337
337
  if self._server.tunnel is not None or (
338
- run_is_local and not shared_tools and not type(task).tools
338
+ run_is_local and not shared_tools and not task.toolsets(task.config)
339
339
  ):
340
340
  return self._server
341
341
  return None
@@ -517,7 +517,10 @@ class Agent:
517
517
  )
518
518
  run_is_local = runtime_is_local(runtime_config)
519
519
  validate_pairing(
520
- self.harness, type(task), runtime_config, shared_tools=shared_tools
520
+ self.harness,
521
+ type(task),
522
+ runtime_config,
523
+ tools=[*task.toolsets(task.config), *shared_tools.values()],
521
524
  )
522
525
  # Timeout precedence: agent-level wins, else the task's, else no limit.
523
526
  agent_timeout = (
@@ -0,0 +1,142 @@
1
+ """Artifact collection and restoration across runtimes."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ import shlex
7
+ import uuid
8
+ from pathlib import PurePosixPath
9
+ from typing import TYPE_CHECKING
10
+
11
+ from pydantic import BaseModel, Field
12
+
13
+ if TYPE_CHECKING:
14
+ from verifiers.v1.runtimes import Runtime
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+ ARTIFACTS_DIR = "/logs/artifacts"
19
+ """Implicit artifact directory; tasks that write here need no declaration."""
20
+
21
+ MAX_ARTIFACT_BYTES = 32 * 1024 * 1024
22
+ """Ceiling per collection. Sized for a delta, not a tree: the grading box boots from the
23
+ agent's image, so the repo is already there and only its output has to travel."""
24
+
25
+
26
+ class Artifact(BaseModel):
27
+ """One path to restore at the same location in another runtime."""
28
+
29
+ source: str
30
+ exclude: list[str] = Field(default_factory=list)
31
+ """`tar --exclude` patterns, applied when `source` is a directory."""
32
+
33
+
34
+ async def collect(
35
+ runtime: Runtime, artifacts: list[Artifact] | None = None
36
+ ) -> dict[str, bytes]:
37
+ """Tar the convention dir and every declared path out of `runtime`.
38
+
39
+ Keyed by source path; the values are tar archives. Insertion order is the order
40
+ they were declared, and a path cannot be collected twice.
41
+
42
+ A declared source that is missing raises: it was declared because grading needs it,
43
+ and grading a partial state scores the rollout wrong rather than failing it. The
44
+ implicit convention sweep is exempt — most tasks never write there.
45
+
46
+ Each source is archived separately so its exclude patterns stay local.
47
+ """
48
+ # Resolve relative sources against the runtime workdir. Joining also normalises
49
+ # `/work/` to `/work`, so one tree cannot key two entries (the source is both the
50
+ # dict key and `restore`'s rm -rf target).
51
+ workdir = PurePosixPath(getattr(runtime.config, "workdir", "") or "/")
52
+ declared = [
53
+ a.model_copy(update={"source": str(workdir / a.source)})
54
+ for a in artifacts or []
55
+ ]
56
+ convention = PurePosixPath(ARTIFACTS_DIR)
57
+ sweep = not any(
58
+ (p := PurePosixPath(a.source)) == convention
59
+ or p.is_relative_to(convention)
60
+ or convention.is_relative_to(p)
61
+ for a in declared
62
+ )
63
+ entries = ([Artifact(source=ARTIFACTS_DIR)] if sweep else []) + declared
64
+
65
+ collected: dict[str, bytes] = {}
66
+ budget = MAX_ARTIFACT_BYTES
67
+ for artifact in entries:
68
+ source = artifact.source
69
+ if (await runtime.run(["test", "-e", source], {})).exit_code != 0:
70
+ if sweep and source == ARTIFACTS_DIR:
71
+ continue
72
+ raise RuntimeError(
73
+ f"declared artifact {source!r} does not exist in the runtime"
74
+ )
75
+ archive = await _tar_out(runtime, artifact, budget)
76
+ budget -= len(archive)
77
+ collected[source] = archive
78
+
79
+ logger.debug("collected artifact roots: %s", list(collected))
80
+ return collected
81
+
82
+
83
+ async def restore(runtime: Runtime, collected: dict[str, bytes]) -> None:
84
+ """Extract `collected` in `runtime` at the original absolute paths."""
85
+ if not collected:
86
+ return
87
+ # Restoring into the subprocess runtime would extract absolute paths onto the
88
+ # developer's filesystem, so refuse it before any archive reaches the host.
89
+ if getattr(runtime.config, "type", None) == "subprocess":
90
+ raise RuntimeError(
91
+ "refusing to restore artifacts into the subprocess runtime: extraction "
92
+ "writes to absolute paths on the host. Grade in a container."
93
+ )
94
+ # Clear every root up front, not per entry: a later nested root would otherwise
95
+ # delete content an earlier one just restored. Clearing also drops any file or
96
+ # symlink the image left at the target.
97
+ roots = " ".join(shlex.quote(root) for root in collected)
98
+ await _run(runtime, f"rm -rf -- {roots}", "clear artifact roots")
99
+ for root, archive in collected.items():
100
+ path = f"/tmp/vf-artifact-{uuid.uuid4().hex}.tar"
101
+ await runtime.write(path, archive)
102
+ await _run(
103
+ runtime,
104
+ f"tar -xf {shlex.quote(path)} -C / && rm -f {shlex.quote(path)}",
105
+ f"restore artifact {root!r}",
106
+ )
107
+
108
+
109
+ async def _tar_out(runtime: Runtime, artifact: Artifact, budget: int) -> bytes:
110
+ path = f"/tmp/vf-artifact-{uuid.uuid4().hex}.tar"
111
+ excludes = " ".join(f"--exclude={shlex.quote(p)}" for p in artifact.exclude)
112
+ try:
113
+ await _run(
114
+ runtime,
115
+ f"tar -cf {shlex.quote(path)} -C / {excludes} -- "
116
+ f"{shlex.quote(artifact.source.lstrip('/'))}",
117
+ f"collect artifact {artifact.source!r}",
118
+ )
119
+ # Size it in the box: an oversized collection is refused before it reaches host
120
+ # memory, not after.
121
+ sized = await runtime.run(["sh", "-c", f"wc -c < {shlex.quote(path)}"], {})
122
+ if (raw := sized.stdout.strip()).isdigit() and int(raw) > budget:
123
+ raise RuntimeError(
124
+ f"artifact {artifact.source!r} takes the collection over the "
125
+ f"{MAX_ARTIFACT_BYTES} byte limit. The grading box boots from the "
126
+ "agent's image, so only the delta needs to travel — narrow the source "
127
+ "or add `exclude` patterns."
128
+ )
129
+ return await runtime.read(path)
130
+ finally:
131
+ # Best-effort: the box is about to be destroyed and the name is unique per call.
132
+ try:
133
+ await runtime.run(["rm", "-f", path], {})
134
+ except Exception:
135
+ logger.debug("failed to remove %s", path, exc_info=True)
136
+
137
+
138
+ async def _run(runtime: Runtime, command: str, action: str) -> None:
139
+ result = await runtime.run(["sh", "-c", command], {})
140
+ if result.exit_code:
141
+ detail = (result.stderr or result.stdout).strip()[-500:]
142
+ raise RuntimeError(f"failed to {action}: {detail}")