verifiers 0.2.2.dev6__tar.gz → 0.2.2.dev7__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 (420) hide show
  1. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/.gitignore +1 -1
  2. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/PKG-INFO +1 -1
  3. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/pyproject.toml +2 -1
  4. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/v1/conftest.py +64 -80
  5. verifiers-0.2.2.dev7/tests/v1/fixtures/duet_v1.py +45 -0
  6. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/v1/test_configs.py +2 -1
  7. verifiers-0.2.2.dev7/tests/v1/test_e2e.py +411 -0
  8. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/v1/test_envs.py +14 -5
  9. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/__init__.py +38 -16
  10. verifiers-0.2.2.dev7/verifiers/v1/agent.py +476 -0
  11. verifiers-0.2.2.dev7/verifiers/v1/cli/__init__.py +0 -0
  12. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/cli/dashboard/__init__.py +0 -2
  13. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/cli/dashboard/eval.py +298 -153
  14. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/cli/debug.py +11 -6
  15. verifiers-0.2.2.dev7/verifiers/v1/cli/eval/__init__.py +0 -0
  16. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/cli/eval/main.py +32 -18
  17. verifiers-0.2.2.dev7/verifiers/v1/cli/eval/resume.py +134 -0
  18. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/cli/eval/runner.py +64 -66
  19. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/cli/gepa.py +36 -16
  20. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/cli/init.py +3 -3
  21. verifiers-0.2.2.dev7/verifiers/v1/cli/output.py +134 -0
  22. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/cli/replay.py +55 -41
  23. verifiers-0.2.2.dev7/verifiers/v1/cli/resolve.py +98 -0
  24. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/cli/serve.py +17 -9
  25. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/cli/validate.py +14 -6
  26. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/clients/__init__.py +0 -2
  27. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/clients/client.py +2 -2
  28. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/configs/__init__.py +0 -2
  29. verifiers-0.2.2.dev7/verifiers/v1/configs/env.py +169 -0
  30. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/configs/eval.py +14 -6
  31. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/configs/init.py +1 -1
  32. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/configs/replay.py +12 -5
  33. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/configs/serve.py +1 -1
  34. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/decorators.py +7 -16
  35. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/dialects/__init__.py +1 -4
  36. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/dialects/base.py +0 -21
  37. verifiers-0.2.2.dev7/verifiers/v1/env.py +543 -0
  38. verifiers-0.2.2.dev7/verifiers/v1/envs/__init__.py +0 -0
  39. verifiers-0.2.2.dev7/verifiers/v1/envs/agentic_judge/__init__.py +3 -0
  40. verifiers-0.2.2.dev7/verifiers/v1/envs/agentic_judge/env.py +174 -0
  41. verifiers-0.2.2.dev7/verifiers/v1/envs/best_of_n/__init__.py +3 -0
  42. verifiers-0.2.2.dev7/verifiers/v1/envs/best_of_n/env.py +44 -0
  43. verifiers-0.2.2.dev7/verifiers/v1/envs/single_agent/__init__.py +3 -0
  44. verifiers-0.2.2.dev7/verifiers/v1/envs/single_agent/env.py +27 -0
  45. verifiers-0.2.2.dev7/verifiers/v1/episode.py +53 -0
  46. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/errors.py +8 -2
  47. verifiers-0.2.2.dev7/verifiers/v1/gepa/__init__.py +5 -0
  48. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/gepa/adapter.py +57 -40
  49. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/gepa/config.py +23 -10
  50. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/gepa/dataset.py +0 -15
  51. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/gepa/runner.py +8 -12
  52. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/graph.py +0 -4
  53. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harness.py +22 -15
  54. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/bash/harness.py +3 -3
  55. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/null/harness.py +1 -0
  56. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/terminus_2/harness.py +1 -1
  57. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/interception/__init__.py +1 -11
  58. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/interception/server.py +35 -4
  59. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/interception/tunnel/__init__.py +0 -9
  60. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/judge.py +9 -1
  61. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/judges/__init__.py +0 -2
  62. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/legacy.py +27 -15
  63. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/loaders.py +111 -8
  64. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/mcp/__init__.py +0 -2
  65. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/mcp/launch.py +4 -5
  66. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/push.py +81 -55
  67. verifiers-0.2.2.dev7/verifiers/v1/retries.py +152 -0
  68. verifiers-0.2.2.dev7/verifiers/v1/rollout.py +397 -0
  69. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/runtimes/__init__.py +0 -2
  70. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/runtimes/base.py +8 -0
  71. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/runtimes/modal.py +1 -1
  72. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/runtimes/prime.py +1 -1
  73. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/serve/__init__.py +4 -6
  74. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/serve/client.py +13 -10
  75. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/serve/pool.py +8 -7
  76. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/serve/server.py +36 -40
  77. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/serve/types.py +16 -9
  78. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/session.py +27 -0
  79. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/task.py +35 -77
  80. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/taskset.py +21 -30
  81. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/tasksets/__init__.py +0 -2
  82. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/tasksets/harbor/taskset.py +1 -1
  83. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/tasksets/textarena/taskset.py +1 -1
  84. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/trace.py +37 -26
  85. verifiers-0.2.2.dev7/verifiers/v1/utils/__init__.py +0 -0
  86. verifiers-0.2.2.dev7/verifiers/v1/utils/compile.py +108 -0
  87. verifiers-0.2.2.dev7/verifiers/v1/utils/generic.py +53 -0
  88. verifiers-0.2.2.dev6/tests/v1/test_e2e.py +0 -256
  89. verifiers-0.2.2.dev6/verifiers/v1/cli/__init__.py +0 -1
  90. verifiers-0.2.2.dev6/verifiers/v1/cli/eval/__init__.py +0 -1
  91. verifiers-0.2.2.dev6/verifiers/v1/cli/eval/resume.py +0 -115
  92. verifiers-0.2.2.dev6/verifiers/v1/cli/output.py +0 -90
  93. verifiers-0.2.2.dev6/verifiers/v1/cli/resolve.py +0 -67
  94. verifiers-0.2.2.dev6/verifiers/v1/env.py +0 -416
  95. verifiers-0.2.2.dev6/verifiers/v1/episode.py +0 -55
  96. verifiers-0.2.2.dev6/verifiers/v1/gepa/__init__.py +0 -12
  97. verifiers-0.2.2.dev6/verifiers/v1/retries.py +0 -141
  98. verifiers-0.2.2.dev6/verifiers/v1/rollout.py +0 -267
  99. verifiers-0.2.2.dev6/verifiers/v1/utils/__init__.py +0 -1
  100. verifiers-0.2.2.dev6/verifiers/v1/utils/generic.py +0 -19
  101. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/LICENSE +0 -0
  102. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/README.md +0 -0
  103. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/AGENTS.md +0 -0
  104. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/__init__.py +0 -0
  105. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/conftest.py +0 -0
  106. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_browser_env.py +0 -0
  107. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_build_script.py +0 -0
  108. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_cli_agent_env.py +0 -0
  109. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_client_auth_errors.py +0 -0
  110. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_client_config.py +0 -0
  111. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_client_multimodal_types.py +0 -0
  112. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_composable_env.py +0 -0
  113. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_context_token_metrics.py +0 -0
  114. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_decorator_ranks.py +0 -0
  115. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_endpoint_registry.py +0 -0
  116. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_env_group.py +0 -0
  117. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_env_server.py +0 -0
  118. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_environment.py +0 -0
  119. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_environment_extra.py +0 -0
  120. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_error_chain.py +0 -0
  121. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_eval_display.py +0 -0
  122. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_eval_utils.py +0 -0
  123. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_gepa_cli.py +0 -0
  124. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_gepa_utils.py +0 -0
  125. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_gym_env.py +0 -0
  126. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_harbor_env_mcp.py +0 -0
  127. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_imports.py +0 -0
  128. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_init_script.py +0 -0
  129. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_install_utils.py +0 -0
  130. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_interception_utils.py +0 -0
  131. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_logging.py +0 -0
  132. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_math_rubric.py +0 -0
  133. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_maybe_think_parser.py +0 -0
  134. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_message_utils.py +0 -0
  135. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_message_utils_multimodal.py +0 -0
  136. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_multiturn_env.py +0 -0
  137. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_nemorl_client.py +0 -0
  138. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_openai_chat_completions_token_client.py +0 -0
  139. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_openai_responses_client.py +0 -0
  140. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_opencode_rlm_env.py +0 -0
  141. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_openenv_client.py +0 -0
  142. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_parser.py +0 -0
  143. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_path_utils.py +0 -0
  144. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_per_turn_timing.py +0 -0
  145. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_pricing_utils.py +0 -0
  146. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_prime_plugin.py +0 -0
  147. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_renderer_client.py +0 -0
  148. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_renderer_e2e.py +0 -0
  149. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_rlm_composable_env.py +0 -0
  150. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_rubric.py +0 -0
  151. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_rubric_group.py +0 -0
  152. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_sandbox_debug_env.py +0 -0
  153. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_sandbox_env.py +0 -0
  154. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_sandbox_mixin.py +0 -0
  155. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_save_utils.py +0 -0
  156. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_setup_script.py +0 -0
  157. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_singleturn_env.py +0 -0
  158. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_stateful_tool_env.py +0 -0
  159. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_think_parser.py +0 -0
  160. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_tool_env.py +0 -0
  161. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_tool_utils.py +0 -0
  162. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_trajectory_processing.py +0 -0
  163. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_tui_info_formatting.py +0 -0
  164. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_types.py +0 -0
  165. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/test_xml_parser.py +0 -0
  166. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  167. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  168. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  169. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  170. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  171. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/v1/fixtures/echo_v0.py +0 -0
  172. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/v1/fixtures/echo_v1.py +0 -0
  173. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/v1/fixtures/pyproject.toml +0 -0
  174. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  175. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/v1/test_color_codeword_tasks.py +0 -0
  176. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/v1/test_graph.py +0 -0
  177. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/v1/test_judges.py +0 -0
  178. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/v1/test_legacy.py +0 -0
  179. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/v1/test_scoring.py +0 -0
  180. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/v1/test_taskset.py +0 -0
  181. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/tests/v1/test_trace.py +0 -0
  182. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/__init__.py +0 -0
  183. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/cli/__init__.py +0 -0
  184. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/cli/commands/__init__.py +0 -0
  185. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/cli/commands/build.py +0 -0
  186. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/cli/commands/eval.py +0 -0
  187. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/cli/commands/gepa.py +0 -0
  188. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/cli/commands/init.py +0 -0
  189. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/cli/commands/install.py +0 -0
  190. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/cli/commands/setup.py +0 -0
  191. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/cli/plugins/__init__.py +0 -0
  192. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/cli/plugins/prime.py +0 -0
  193. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/cli/tui.py +0 -0
  194. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/clients/__init__.py +0 -0
  195. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/clients/anthropic_messages_client.py +0 -0
  196. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/clients/client.py +0 -0
  197. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  198. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/clients/openai_chat_completions_client.py +0 -0
  199. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  200. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/clients/openai_completions_client.py +0 -0
  201. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/clients/openai_responses_client.py +0 -0
  202. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/clients/renderer_client.py +0 -0
  203. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/decorators.py +0 -0
  204. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/AGENTS.md +0 -0
  205. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/__init__.py +0 -0
  206. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/env_group.py +0 -0
  207. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/environment.py +0 -0
  208. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/README.md +0 -0
  209. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/__init__.py +0 -0
  210. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  211. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/README.md +0 -0
  212. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/__init__.py +0 -0
  213. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/_filter.py +0 -0
  214. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  215. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/harness.py +0 -0
  216. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  217. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  218. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  219. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  220. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  221. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  222. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  223. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/task.py +0 -0
  224. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  225. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  226. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  227. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  228. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  229. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  230. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  231. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  232. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  233. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  234. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  235. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  236. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  237. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  238. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  239. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  240. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  241. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  242. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  243. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  244. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  245. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  246. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  247. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  248. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  249. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  250. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  251. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  252. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  253. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  254. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  255. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  256. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  257. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  258. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/gym_env.py +0 -0
  259. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  260. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  261. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  262. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/mcp_env.py +0 -0
  263. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/opencode_env.py +0 -0
  264. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  265. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  266. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  267. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/utils/__init__.py +0 -0
  268. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  269. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  270. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/integrations/README.md +0 -0
  271. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/integrations/__init__.py +0 -0
  272. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/integrations/browser_env/README.md +0 -0
  273. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  274. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  275. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  276. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  277. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  278. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  279. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/integrations/openenv_env.py +0 -0
  280. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  281. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/integrations/textarena_env.py +0 -0
  282. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/multiturn_env.py +0 -0
  283. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/python_env.py +0 -0
  284. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/sandbox_env.py +0 -0
  285. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/singleturn_env.py +0 -0
  286. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/stateful_tool_env.py +0 -0
  287. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/envs/tool_env.py +0 -0
  288. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/errors.py +0 -0
  289. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/gepa/__init__.py +0 -0
  290. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/gepa/adapter.py +0 -0
  291. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/gepa/config.py +0 -0
  292. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/gepa/display.py +0 -0
  293. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/gepa/gepa_utils.py +0 -0
  294. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/parsers/__init__.py +0 -0
  295. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/parsers/maybe_think_parser.py +0 -0
  296. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/parsers/parser.py +0 -0
  297. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/parsers/think_parser.py +0 -0
  298. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/parsers/xml_parser.py +0 -0
  299. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/rubrics/__init__.py +0 -0
  300. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  301. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/rubrics/judge_rubric.py +0 -0
  302. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/rubrics/math_rubric.py +0 -0
  303. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/rubrics/rubric.py +0 -0
  304. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/rubrics/rubric_group.py +0 -0
  305. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/scripts/__init__.py +0 -0
  306. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/scripts/build.py +0 -0
  307. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/scripts/eval.py +0 -0
  308. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/scripts/gepa.py +0 -0
  309. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/scripts/init.py +0 -0
  310. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/scripts/install.py +0 -0
  311. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/scripts/setup.py +0 -0
  312. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/scripts/tui.py +0 -0
  313. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/serve/__init__.py +0 -0
  314. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/serve/client/env_client.py +0 -0
  315. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/serve/client/zmq_env_client.py +0 -0
  316. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/serve/server/__init__.py +0 -0
  317. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/serve/server/env_router.py +0 -0
  318. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/serve/server/env_server.py +0 -0
  319. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/serve/server/env_worker.py +0 -0
  320. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/serve/server/zmq_env_server.py +0 -0
  321. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/serve/types.py +0 -0
  322. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/types.py +0 -0
  323. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/__init__.py +0 -0
  324. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/async_utils.py +0 -0
  325. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/client_utils.py +0 -0
  326. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/config_utils.py +0 -0
  327. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/data_utils.py +0 -0
  328. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/display_utils.py +0 -0
  329. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/env_config_utils.py +0 -0
  330. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/env_utils.py +0 -0
  331. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/error_utils.py +0 -0
  332. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/eval_display.py +0 -0
  333. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/eval_utils.py +0 -0
  334. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/heartbeat.py +0 -0
  335. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/import_utils.py +0 -0
  336. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/install_utils.py +0 -0
  337. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/interception_utils.py +0 -0
  338. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/logging_utils.py +0 -0
  339. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/message_utils.py +0 -0
  340. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/metric_utils.py +0 -0
  341. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/path_utils.py +0 -0
  342. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/pricing_utils.py +0 -0
  343. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/process_utils.py +0 -0
  344. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/response_utils.py +0 -0
  345. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/save_utils.py +0 -0
  346. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/serve_utils.py +0 -0
  347. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/thread_utils.py +0 -0
  348. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/threaded_sandbox_client.py +0 -0
  349. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/tool_utils.py +0 -0
  350. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/usage_utils.py +0 -0
  351. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/utils/version_utils.py +0 -0
  352. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/cli/dashboard/base.py +0 -0
  353. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/cli/dashboard/replay.py +0 -0
  354. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/cli/dashboard/validate.py +0 -0
  355. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/clients/config.py +0 -0
  356. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/clients/eval.py +0 -0
  357. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/clients/train.py +0 -0
  358. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/configs/debug.py +0 -0
  359. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/configs/validate.py +0 -0
  360. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/dialects/anthropic.py +0 -0
  361. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/dialects/chat.py +0 -0
  362. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/dialects/responses.py +0 -0
  363. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/gepa/reflection.py +0 -0
  364. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/__init__.py +0 -0
  365. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  366. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/bash/program.py +0 -0
  367. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  368. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  369. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  370. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/codex/harness.py +0 -0
  371. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  372. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  373. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  374. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  375. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  376. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/null/__init__.py +0 -0
  377. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/null/program.py +0 -0
  378. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  379. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/pi/harness.py +0 -0
  380. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  381. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/pool/harness.py +0 -0
  382. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  383. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  384. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  385. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  386. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/interception/base.py +0 -0
  387. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/interception/pool.py +0 -0
  388. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/interception/tunnel/base.py +0 -0
  389. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/interception/tunnel/custom.py +0 -0
  390. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/interception/tunnel/prime.py +0 -0
  391. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/judges/reference.py +0 -0
  392. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/judges/reference.txt +0 -0
  393. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/judges/rubric.py +0 -0
  394. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/judges/rubric.txt +0 -0
  395. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/mcp/server.py +0 -0
  396. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/mcp/toolset.py +0 -0
  397. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/mcp/user.py +0 -0
  398. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/runtimes/docker.py +0 -0
  399. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/runtimes/limiters.py +0 -0
  400. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/runtimes/subprocess.py +0 -0
  401. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/scoring.py +0 -0
  402. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/state.py +0 -0
  403. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  404. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  405. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  406. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  407. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  408. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  409. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  410. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/types.py +0 -0
  411. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/utils/aio.py +0 -0
  412. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/utils/format.py +0 -0
  413. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/utils/git.py +0 -0
  414. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/utils/image.py +0 -0
  415. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/utils/install.py +0 -0
  416. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/utils/interrupt.py +0 -0
  417. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/utils/logging.py +0 -0
  418. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/utils/memory.py +0 -0
  419. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/utils/sampling.py +0 -0
  420. {verifiers-0.2.2.dev6 → verifiers-0.2.2.dev7}/verifiers/v1/utils/version.py +0 -0
@@ -1,4 +1,4 @@
1
- # env
1
+ # env
2
2
  .venv
3
3
  .venv/
4
4
  venv/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.2.2.dev6
3
+ Version: 0.2.2.dev7
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
@@ -77,7 +77,7 @@ dev = [
77
77
  examples = [
78
78
  "compact",
79
79
  "gsm8k-v1", "glossary-v1", "deepwiki-v1", "wiki-search-v1", "code-golf-v1",
80
- "reverse-text-v1", "color-codeword-v1",
80
+ "proposer-solver-v1", "reverse-text-v1", "color-codeword-v1",
81
81
  "wordle-v1", "openenv-wordle-v1", "alphabet-sort-v1", "scratchpad-v1",
82
82
  ]
83
83
 
@@ -124,6 +124,7 @@ deepwiki-v1 = { path = "environments/deepwiki_v1", editable = true }
124
124
  wiki-search-v1 = { path = "environments/wiki_search_v1", editable = true }
125
125
  gsm8k-v1 = { path = "environments/gsm8k_v1", editable = true }
126
126
  code-golf-v1 = { path = "environments/code_golf_v1", editable = true }
127
+ proposer-solver-v1 = { path = "environments/proposer_solver_v1", editable = true }
127
128
  reverse-text-v1 = { path = "environments/reverse_text_v1", editable = true }
128
129
  wordle-v1 = { path = "environments/wordle_v1", editable = true }
129
130
  openenv-wordle-v1 = { path = "environments/openenv_wordle_v1", editable = true }
@@ -6,14 +6,18 @@ not unit tests of individual components. They need a model API key (`PRIME_API_K
6
6
  without one the `e2e`-marked tests skip (config parsing still runs).
7
7
 
8
8
  `run_v1` / `run_v0` mirror the eval CLI's two paths (`run_eval` for a v1 taskset,
9
- `run_legacy_eval` for a v0 env). The tests fan out over a matrix of where a rollout places
10
- things: the harness (`harness`) x the harness runtime (`harness_runtime`) x the user/tool server
11
- runtime (`user_runtime` / `tool_runtime`).
12
-
13
- Every matrix value carries a pytest mark, so subsets select with `-m`:
14
-
15
- uv run pytest tests/v1 -n auto # the whole matrix (needs modal setup)
16
- uv run pytest tests/v1 -n auto -m "not prime and not modal" # the CI matrix (host + docker only)
9
+ `run_legacy_eval` for a v0 env). Placement coverage (harness x harness runtime x user/tool
10
+ server runtime) is PAIRWISE, not a full cross product: each test carries a curated list of
11
+ combinations (in test_e2e.py) that hits every axis value and the cross-boundary pairs with
12
+ distinct networking. The full cross bought flake exposure and CI minutes, not coverage — add
13
+ a combination to a test's list when it exercises a genuinely new reachability pair. The
14
+ placement fixtures below are indirect-only: they translate a parametrized value, and using
15
+ one without `indirect=True` fails loudly.
16
+
17
+ Every combination carries its axes' pytest marks, so subsets select with `-m`:
18
+
19
+ uv run pytest tests/v1 -n auto # everything (needs modal setup)
20
+ uv run pytest tests/v1 -n auto -m "not prime and not modal" # the CI set (host + docker only)
17
21
  uv run pytest tests/v1 -n auto -m docker # any case touching the docker runtime
18
22
  uv run pytest tests/v1 -n auto -m bash # only the bash harness
19
23
  uv run pytest tests/v1 -n auto -m prime # only prime (real sandboxes; local)
@@ -32,8 +36,9 @@ from pathlib import Path
32
36
 
33
37
  import pytest
34
38
 
39
+ import verifiers.v1 as vf
35
40
  from verifiers.v1.configs.eval import EvalConfig
36
- from verifiers.v1.env import Environment
41
+ from verifiers.v1.loaders import load_environment
37
42
  from verifiers.v1.cli.eval.runner import run_eval
38
43
  from verifiers.v1.trace import Trace
39
44
 
@@ -41,40 +46,17 @@ from verifiers.v1.trace import Trace
41
46
  # tests/v1/fixtures, added to the path via `pythonpath` in pyproject so the v1 loader and the
42
47
  # v0 legacy bridge both resolve them by id (no install).
43
48
 
44
- # The harness runtime. Each value carries its runtime mark so a subset can be selected
45
- # (`-m docker`, `-m "not prime"`, ...). docker needs the daemon; prime/modal provision real remote
46
- # sandboxes (slow, infra-flaky, need setup), so they're local-only — CI runs `-m "not prime and
47
- # not modal"`. The `id`s make a test read like `<harness>-harness-in-<rt>` /
48
- # `harness-in-<rt>-with-<user|tool>-...`.
49
- HARNESS_RUNTIMES = [
50
- pytest.param(
51
- "subprocess", marks=pytest.mark.subprocess, id="harness-in-subprocess"
52
- ),
53
- pytest.param("docker", marks=pytest.mark.docker, id="harness-in-docker"),
54
- pytest.param("prime", marks=pytest.mark.prime, id="harness-in-prime"),
55
- pytest.param("modal", marks=pytest.mark.modal, id="harness-in-modal"),
56
- ]
57
-
58
-
59
- @pytest.fixture(params=HARNESS_RUNTIMES)
60
- def harness_runtime(request) -> str:
61
- return request.param
49
+ # The placement fixtures translate one parametrized value each; the combinations live on
50
+ # the tests (`indirect=True`), so coverage is a visible, curated list never an implicit
51
+ # cross product.
62
52
 
63
53
 
64
- # The user simulator's runtime: inside the harness's runtime (`colocated`) or its own runtime; this
65
- # fans the user test across both, each carrying its placement/runtime mark.
66
- USER_RUNTIMES = [
67
- pytest.param("colocated", marks=pytest.mark.colocated, id="with-user-colocated"),
68
- pytest.param(
69
- "subprocess", marks=pytest.mark.subprocess, id="with-user-in-subprocess"
70
- ),
71
- pytest.param("docker", marks=pytest.mark.docker, id="with-user-in-docker"),
72
- pytest.param("prime", marks=pytest.mark.prime, id="with-user-in-prime"),
73
- pytest.param("modal", marks=pytest.mark.modal, id="with-user-in-modal"),
74
- ]
54
+ @pytest.fixture
55
+ def harness_runtime(request) -> str:
56
+ return request.param
75
57
 
76
58
 
77
- @pytest.fixture(params=USER_RUNTIMES)
59
+ @pytest.fixture
78
60
  def user_runtime(request) -> dict:
79
61
  """A `taskset.task.user` override placing the user simulator: `colocated` (inside the harness's
80
62
  runtime) or its own runtime, by type."""
@@ -83,19 +65,7 @@ def user_runtime(request) -> dict:
83
65
  return {"colocated": False, "runtime": {"type": request.param}}
84
66
 
85
67
 
86
- # Task-scoped and shared tool tests both use these runtime placements.
87
- TOOL_RUNTIMES = [
88
- pytest.param("colocated", marks=pytest.mark.colocated, id="with-tool-colocated"),
89
- pytest.param(
90
- "subprocess", marks=pytest.mark.subprocess, id="with-tool-in-subprocess"
91
- ),
92
- pytest.param("docker", marks=pytest.mark.docker, id="with-tool-in-docker"),
93
- pytest.param("prime", marks=pytest.mark.prime, id="with-tool-in-prime"),
94
- pytest.param("modal", marks=pytest.mark.modal, id="with-tool-in-modal"),
95
- ]
96
-
97
-
98
- @pytest.fixture(params=TOOL_RUNTIMES)
68
+ @pytest.fixture
99
69
  def tool_runtime(request) -> dict:
100
70
  """A `taskset.task.tools` override placing the tool server: `colocated` (inside the harness's
101
71
  runtime) or its own runtime, by type."""
@@ -104,21 +74,10 @@ def tool_runtime(request) -> dict:
104
74
  return {"runtime": {"type": request.param}}
105
75
 
106
76
 
107
- # Harnesses, composed with the runtime fixtures, each carrying its harness mark (`-m bash`, ...).
108
- # Built-ins are bundled in the `harnesses` package; the agent CLIs (`rlm` / `kimi-code` / `codex` /
109
- # `claude-code`) install their dependencies at rollout. `compact` (an example harness) and
110
- # `terminus-2` (drives the host tmux) are excluded. `test_agentic` skips `null` (a chat loop with no
111
- # shell); `test_single_turn` skips the coding agents, which are unreliable on a no-op echo.
112
- @pytest.fixture(
113
- params=[
114
- pytest.param("null", marks=pytest.mark.null, id="null"),
115
- pytest.param("bash", marks=pytest.mark.bash, id="bash"),
116
- pytest.param("rlm", marks=pytest.mark.rlm, id="rlm"),
117
- pytest.param("kimi-code", marks=pytest.mark.kimi_code, id="kimi-code"),
118
- pytest.param("codex", marks=pytest.mark.codex, id="codex"),
119
- pytest.param("claude-code", marks=pytest.mark.claude_code, id="claude-code"),
120
- ]
121
- )
77
+ # Built-in harnesses are bundled in the `harnesses` package; the agent CLIs (`rlm` /
78
+ # `kimi-code` / `codex` / `claude-code`) install their dependencies at rollout. `compact` (an
79
+ # example harness) and `terminus-2` (drives the host tmux) are excluded from e2e.
80
+ @pytest.fixture
122
81
  def harness(request) -> str:
123
82
  return request.param
124
83
 
@@ -164,7 +123,7 @@ def _eval_config(
164
123
  taskset: str,
165
124
  *,
166
125
  output_dir: Path,
167
- harness: str = "null",
126
+ harness: str | None = "null",
168
127
  n: int = 1,
169
128
  num_tasks: int = 1,
170
129
  max_tokens: int = 2048,
@@ -172,6 +131,7 @@ def _eval_config(
172
131
  rollout_timeout: float = 180,
173
132
  taskset_overrides: dict | None = None,
174
133
  harness_overrides: dict | None = None,
134
+ env: dict | None = None,
175
135
  pool: dict | None = None,
176
136
  model: str | None = None,
177
137
  reasoning_effort: str | None = None,
@@ -183,25 +143,45 @@ def _eval_config(
183
143
 
184
144
  `temperature=0` (greedy) makes the run reproducible; `max_tokens` is generous headroom,
185
145
  not a target — these trivial tasks finish in a few hundred tokens, so capping tighter only
186
- risks truncating the reasoning before the answer (which tanks the reward)."""
146
+ risks truncating the reasoning before the answer (which tanks the reward).
147
+
148
+ `harness=None` leaves every seat on its own story — the multi-agent case: there
149
+ is no run-level harness, so a single-agent test's `harness` lands on the `agent`
150
+ seat and a multi-agent test pins its seats through `env` role fields instead."""
187
151
  taskset_cfg = {"id": taskset, **(taskset_overrides or {})}
188
- harness_cfg = {"id": harness, **(harness_overrides or {})}
152
+ env_cfg = dict(env or {})
189
153
  _configure_prime_runtimes(taskset_cfg)
190
- _configure_prime_runtimes(harness_cfg)
154
+ if harness:
155
+ harness_cfg = {"id": harness, **(harness_overrides or {})}
156
+ _configure_prime_runtimes(harness_cfg)
157
+ env_cfg.setdefault("agent", {})["harness"] = harness_cfg
158
+ # Per-run caps live on the seats: resolve the env's declared roles and cap
159
+ # each one (a test's own seat dict wins over the shared defaults).
160
+ config_cls = vf.env_config_type(taskset, env_cfg.get("id", ""))
161
+ seats = [
162
+ name
163
+ for name, field in config_cls.model_fields.items()
164
+ if isinstance(field.default, vf.AgentConfig)
165
+ ]
166
+ for seat in seats:
167
+ seat_cfg = env_cfg.setdefault(seat, {})
168
+ seat_cfg.setdefault("max_turns", max_turns)
169
+ seat_cfg.setdefault("max_output_tokens", max_tokens)
170
+ seat_cfg.setdefault("timeout", {"rollout": rollout_timeout, "scoring": 60})
171
+ # Flake resilience: retries are per-agent now (flat RetryConfig).
172
+ seat_cfg.setdefault("retries", {"max_retries": 2, "include": ["ProviderError"]})
191
173
  return EvalConfig(
192
- taskset=taskset_cfg,
193
- harness=harness_cfg,
174
+ env={
175
+ "taskset": taskset_cfg,
176
+ **env_cfg,
177
+ },
194
178
  num_tasks=num_tasks,
195
179
  num_rollouts=n,
196
- max_turns=max_turns,
197
- max_output_tokens=max_tokens,
198
180
  sampling={
199
181
  "max_tokens": max_tokens,
200
182
  "temperature": 0,
201
183
  "reasoning_effort": reasoning_effort,
202
184
  },
203
- timeout={"rollout": rollout_timeout, "scoring": 60},
204
- retries={"rollout": {"max_retries": 2, "include": ["ProviderError"]}},
205
185
  rich=False,
206
186
  output_dir=output_dir,
207
187
  **({"pool": pool} if pool else {}),
@@ -216,7 +196,9 @@ def run_v1():
216
196
 
217
197
  async def _run(taskset: str, **kwargs) -> list[Trace]:
218
198
  config = _eval_config(taskset, **kwargs)
219
- return await run_eval(Environment(config), config)
199
+ records = await run_eval(load_environment(config.env), config)
200
+ # The runner answers durability envelopes; the tests assert on traces.
201
+ return [t for r in records for t in r.traces]
220
202
 
221
203
  return _run
222
204
 
@@ -233,7 +215,8 @@ def run_v1_server():
233
215
  async def _run(taskset: str, **kwargs) -> list[Trace]:
234
216
  kwargs.setdefault("pool", {"type": "static", "num_workers": 1})
235
217
  config = _eval_config(taskset, **kwargs)
236
- return await run_eval_server(config)
218
+ records = await run_eval_server(config)
219
+ return [t for r in records for t in r.traces]
237
220
 
238
221
  return _run
239
222
 
@@ -260,6 +243,7 @@ def run_v0():
260
243
  rich=False,
261
244
  output_dir=output_dir,
262
245
  )
263
- return await run_legacy_eval(config)
246
+ records = await run_legacy_eval(config)
247
+ return [t for r in records for t in r.traces]
264
248
 
265
249
  return _run
@@ -0,0 +1,45 @@
1
+ """duet: the smallest multi-agent environment — two roles echo the same phrase.
2
+
3
+ The multi-agent fixture for the v1 e2e suite (resolved by id `duet-v1`): an
4
+ `Env` subclass exported alongside its taskset, with two roles ("a", a trainable
5
+ seat on the run's model; "b", pinned untrainable), a `run()` that fans both out on
6
+ the task, and a `finalize()` that records a sibling-dependent signal. One eval rollout
7
+ should land one record carrying two role-stamped traces.
8
+ """
9
+
10
+ import asyncio
11
+
12
+ import verifiers.v1 as vf
13
+
14
+ from echo_v1 import EchoTaskset, lenient_match
15
+
16
+
17
+ class DuetEnvConfig(vf.EnvConfig):
18
+ # Both seats pin the lean `null` chat loop.
19
+ a: vf.AgentConfig = vf.AgentConfig(harness=vf.HarnessConfig(id="null"))
20
+ b: vf.AgentConfig = vf.AgentConfig(harness=vf.HarnessConfig(id="null"))
21
+
22
+
23
+ class DuetEnv(vf.Env[DuetEnvConfig]):
24
+ async def setup(self, agents):
25
+ # "b" plays a fixed, untrainable participant.
26
+ agents.b.trainable = False
27
+
28
+ async def run(self, task, agents):
29
+ await asyncio.gather(agents.a.run(task), agents.b.run(task))
30
+
31
+ async def finalize(self, task, episode):
32
+ # A sibling-dependent signal: did every seat echo the phrase?
33
+ echoed = all(
34
+ lenient_match(task.data.answer, t.last_reply) and not t.has_error
35
+ for t in episode.traces
36
+ )
37
+ for trace in episode.traces:
38
+ trace.record_metric("duet", float(echoed))
39
+
40
+
41
+ class DuetTaskset(EchoTaskset):
42
+ pass
43
+
44
+
45
+ __all__ = ["DuetTaskset", "DuetEnv"]
@@ -23,4 +23,5 @@ CONFIGS = sorted(
23
23
  @pytest.mark.parametrize("path", CONFIGS, ids=lambda p: p.name)
24
24
  def test_eval_config_parses(path: Path) -> None:
25
25
  config = EvalConfig.model_validate(tomllib.load(path.open("rb")))
26
- assert config.taskset.id or config.id # resolved to a v1 taskset or a v0 env id
26
+ # resolved to a v1 taskset or a v0 env id
27
+ assert (config.env.taskset is not None and config.env.taskset.id) or config.id