verifiers 0.2.1.dev5__tar.gz → 0.2.1.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 (409) hide show
  1. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/PKG-INFO +1 -1
  2. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/pyproject.toml +1 -0
  3. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/cli/debug.py +6 -9
  4. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/cli/eval/main.py +1 -1
  5. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/cli/eval/runner.py +3 -14
  6. verifiers-0.2.1.dev7/verifiers/v1/cli/gepa.py +74 -0
  7. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/cli/replay.py +4 -3
  8. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/cli/validate.py +6 -10
  9. verifiers-0.2.1.dev7/verifiers/v1/gepa/__init__.py +12 -0
  10. verifiers-0.2.1.dev7/verifiers/v1/gepa/adapter.py +112 -0
  11. verifiers-0.2.1.dev7/verifiers/v1/gepa/config.py +78 -0
  12. verifiers-0.2.1.dev7/verifiers/v1/gepa/dataset.py +63 -0
  13. verifiers-0.2.1.dev7/verifiers/v1/gepa/reflection.py +28 -0
  14. verifiers-0.2.1.dev7/verifiers/v1/gepa/runner.py +122 -0
  15. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/harnesses/codex/harness.py +6 -4
  16. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/legacy.py +2 -6
  17. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/utils/interrupt.py +7 -5
  18. verifiers-0.2.1.dev7/verifiers/v1/utils/sampling.py +26 -0
  19. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/.gitignore +0 -0
  20. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/LICENSE +0 -0
  21. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/README.md +0 -0
  22. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/AGENTS.md +0 -0
  23. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/__init__.py +0 -0
  24. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/conftest.py +0 -0
  25. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_browser_env.py +0 -0
  26. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_build_script.py +0 -0
  27. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_cli_agent_env.py +0 -0
  28. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_client_auth_errors.py +0 -0
  29. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_client_config.py +0 -0
  30. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_client_multimodal_types.py +0 -0
  31. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_composable_env.py +0 -0
  32. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_context_token_metrics.py +0 -0
  33. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_decorator_ranks.py +0 -0
  34. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_endpoint_registry.py +0 -0
  35. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_env_group.py +0 -0
  36. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_env_server.py +0 -0
  37. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_environment.py +0 -0
  38. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_environment_extra.py +0 -0
  39. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_envs.py +0 -0
  40. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_error_chain.py +0 -0
  41. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_eval_display.py +0 -0
  42. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_eval_utils.py +0 -0
  43. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_gepa_cli.py +0 -0
  44. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_gepa_utils.py +0 -0
  45. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_gym_env.py +0 -0
  46. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_harbor_env_mcp.py +0 -0
  47. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_imports.py +0 -0
  48. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_init_script.py +0 -0
  49. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_install_utils.py +0 -0
  50. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_interception_utils.py +0 -0
  51. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_logging.py +0 -0
  52. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_math_rubric.py +0 -0
  53. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_maybe_think_parser.py +0 -0
  54. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_message_utils.py +0 -0
  55. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_message_utils_multimodal.py +0 -0
  56. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_multiturn_env.py +0 -0
  57. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_nemorl_client.py +0 -0
  58. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_openai_chat_completions_token_client.py +0 -0
  59. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_openai_responses_client.py +0 -0
  60. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_opencode_rlm_env.py +0 -0
  61. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_openenv_client.py +0 -0
  62. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_parser.py +0 -0
  63. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_path_utils.py +0 -0
  64. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_per_turn_timing.py +0 -0
  65. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_pricing_utils.py +0 -0
  66. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_prime_plugin.py +0 -0
  67. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_renderer_client.py +0 -0
  68. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_renderer_e2e.py +0 -0
  69. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_rlm_composable_env.py +0 -0
  70. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_rubric.py +0 -0
  71. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_rubric_group.py +0 -0
  72. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_sandbox_debug_env.py +0 -0
  73. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_sandbox_env.py +0 -0
  74. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_sandbox_mixin.py +0 -0
  75. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_save_utils.py +0 -0
  76. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_setup_script.py +0 -0
  77. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_singleturn_env.py +0 -0
  78. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_stateful_tool_env.py +0 -0
  79. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_think_parser.py +0 -0
  80. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_tool_env.py +0 -0
  81. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_tool_utils.py +0 -0
  82. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_trajectory_processing.py +0 -0
  83. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_tui_info_formatting.py +0 -0
  84. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_types.py +0 -0
  85. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_wordle_env.py +0 -0
  86. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/test_xml_parser.py +0 -0
  87. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/v1/conftest.py +0 -0
  88. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  89. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  90. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  91. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  92. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  93. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/v1/fixtures/echo_v0.py +0 -0
  94. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/v1/fixtures/echo_v1.py +0 -0
  95. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/v1/fixtures/pyproject.toml +0 -0
  96. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  97. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/v1/test_color_codeword_tasks.py +0 -0
  98. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/v1/test_configs.py +0 -0
  99. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/v1/test_e2e.py +0 -0
  100. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/v1/test_envs.py +0 -0
  101. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/v1/test_graph.py +0 -0
  102. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/v1/test_judges.py +0 -0
  103. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/v1/test_legacy.py +0 -0
  104. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/v1/test_scoring.py +0 -0
  105. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/tests/v1/test_trace.py +0 -0
  106. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/__init__.py +0 -0
  107. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/cli/__init__.py +0 -0
  108. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/cli/commands/__init__.py +0 -0
  109. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/cli/commands/build.py +0 -0
  110. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/cli/commands/eval.py +0 -0
  111. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/cli/commands/gepa.py +0 -0
  112. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/cli/commands/init.py +0 -0
  113. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/cli/commands/install.py +0 -0
  114. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/cli/commands/setup.py +0 -0
  115. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/cli/plugins/__init__.py +0 -0
  116. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/cli/plugins/prime.py +0 -0
  117. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/cli/tui.py +0 -0
  118. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/clients/__init__.py +0 -0
  119. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/clients/anthropic_messages_client.py +0 -0
  120. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/clients/client.py +0 -0
  121. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  122. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/clients/openai_chat_completions_client.py +0 -0
  123. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  124. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/clients/openai_completions_client.py +0 -0
  125. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/clients/openai_responses_client.py +0 -0
  126. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/clients/renderer_client.py +0 -0
  127. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/decorators.py +0 -0
  128. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/AGENTS.md +0 -0
  129. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/__init__.py +0 -0
  130. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/env_group.py +0 -0
  131. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/environment.py +0 -0
  132. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/README.md +0 -0
  133. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/__init__.py +0 -0
  134. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  135. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/README.md +0 -0
  136. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/__init__.py +0 -0
  137. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/_filter.py +0 -0
  138. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  139. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/harness.py +0 -0
  140. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  141. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  142. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  143. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  144. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  145. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  146. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  147. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/task.py +0 -0
  148. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  149. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  150. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  151. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  152. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  153. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  154. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  155. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  156. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  157. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  158. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
  159. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
  160. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
  161. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
  162. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
  163. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
  164. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
  165. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
  166. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
  167. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
  168. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
  169. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
  170. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
  171. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
  172. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
  173. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
  174. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
  175. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
  176. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
  177. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
  178. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
  179. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
  180. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
  181. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
  182. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
  183. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
  184. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
  185. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
  186. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
  187. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  188. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  189. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  190. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  191. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  192. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  193. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  194. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  195. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  196. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  197. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  198. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  199. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  200. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  201. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  202. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  203. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  204. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  205. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  206. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  207. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  208. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  209. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  210. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  211. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/gym_env.py +0 -0
  212. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  213. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  214. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  215. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/mcp_env.py +0 -0
  216. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/opencode_env.py +0 -0
  217. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  218. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  219. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  220. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/utils/__init__.py +0 -0
  221. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  222. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  223. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/integrations/README.md +0 -0
  224. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/integrations/__init__.py +0 -0
  225. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/integrations/browser_env/README.md +0 -0
  226. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  227. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  228. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  229. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  230. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  231. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  232. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/integrations/openenv_env.py +0 -0
  233. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  234. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/integrations/textarena_env.py +0 -0
  235. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/multiturn_env.py +0 -0
  236. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/python_env.py +0 -0
  237. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/sandbox_env.py +0 -0
  238. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/singleturn_env.py +0 -0
  239. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/stateful_tool_env.py +0 -0
  240. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/envs/tool_env.py +0 -0
  241. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/errors.py +0 -0
  242. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/gepa/__init__.py +0 -0
  243. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/gepa/adapter.py +0 -0
  244. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/gepa/config.py +0 -0
  245. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/gepa/display.py +0 -0
  246. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/gepa/gepa_utils.py +0 -0
  247. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/parsers/__init__.py +0 -0
  248. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/parsers/maybe_think_parser.py +0 -0
  249. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/parsers/parser.py +0 -0
  250. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/parsers/think_parser.py +0 -0
  251. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/parsers/xml_parser.py +0 -0
  252. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/rubrics/__init__.py +0 -0
  253. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  254. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/rubrics/judge_rubric.py +0 -0
  255. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/rubrics/math_rubric.py +0 -0
  256. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/rubrics/rubric.py +0 -0
  257. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/rubrics/rubric_group.py +0 -0
  258. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/scripts/__init__.py +0 -0
  259. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/scripts/build.py +0 -0
  260. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/scripts/eval.py +0 -0
  261. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/scripts/gepa.py +0 -0
  262. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/scripts/init.py +0 -0
  263. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/scripts/install.py +0 -0
  264. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/scripts/setup.py +0 -0
  265. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/scripts/tui.py +0 -0
  266. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/serve/__init__.py +0 -0
  267. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/serve/client/env_client.py +0 -0
  268. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/serve/client/zmq_env_client.py +0 -0
  269. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/serve/server/__init__.py +0 -0
  270. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/serve/server/env_router.py +0 -0
  271. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/serve/server/env_server.py +0 -0
  272. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/serve/server/env_worker.py +0 -0
  273. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/serve/server/zmq_env_server.py +0 -0
  274. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/serve/types.py +0 -0
  275. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/types.py +0 -0
  276. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/__init__.py +0 -0
  277. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/async_utils.py +0 -0
  278. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/client_utils.py +0 -0
  279. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/config_utils.py +0 -0
  280. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/data_utils.py +0 -0
  281. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/display_utils.py +0 -0
  282. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/env_config_utils.py +0 -0
  283. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/env_utils.py +0 -0
  284. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/error_utils.py +0 -0
  285. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/eval_display.py +0 -0
  286. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/eval_utils.py +0 -0
  287. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/heartbeat.py +0 -0
  288. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/import_utils.py +0 -0
  289. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/install_utils.py +0 -0
  290. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/interception_utils.py +0 -0
  291. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/logging_utils.py +0 -0
  292. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/message_utils.py +0 -0
  293. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/metric_utils.py +0 -0
  294. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/path_utils.py +0 -0
  295. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/pricing_utils.py +0 -0
  296. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/process_utils.py +0 -0
  297. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/response_utils.py +0 -0
  298. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/save_utils.py +0 -0
  299. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/serve_utils.py +0 -0
  300. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/thread_utils.py +0 -0
  301. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/threaded_sandbox_client.py +0 -0
  302. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/tool_utils.py +0 -0
  303. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/usage_utils.py +0 -0
  304. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/utils/version_utils.py +0 -0
  305. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/__init__.py +0 -0
  306. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/cli/__init__.py +0 -0
  307. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  308. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/cli/dashboard/base.py +0 -0
  309. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/cli/dashboard/eval.py +0 -0
  310. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/cli/dashboard/replay.py +0 -0
  311. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/cli/dashboard/validate.py +0 -0
  312. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/cli/eval/__init__.py +0 -0
  313. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/cli/eval/resume.py +0 -0
  314. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/cli/init.py +0 -0
  315. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/cli/output.py +0 -0
  316. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/cli/resolve.py +0 -0
  317. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/cli/serve.py +0 -0
  318. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/clients/__init__.py +0 -0
  319. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/clients/client.py +0 -0
  320. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/clients/config.py +0 -0
  321. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/clients/eval.py +0 -0
  322. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/clients/train.py +0 -0
  323. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/configs/__init__.py +0 -0
  324. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/configs/debug.py +0 -0
  325. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/configs/eval.py +0 -0
  326. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/configs/init.py +0 -0
  327. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/configs/replay.py +0 -0
  328. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/configs/serve.py +0 -0
  329. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/configs/validate.py +0 -0
  330. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/decorators.py +0 -0
  331. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/dialects/__init__.py +0 -0
  332. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/dialects/anthropic.py +0 -0
  333. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/dialects/base.py +0 -0
  334. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/dialects/chat.py +0 -0
  335. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/dialects/responses.py +0 -0
  336. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/env.py +0 -0
  337. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/episode.py +0 -0
  338. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/errors.py +0 -0
  339. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/graph.py +0 -0
  340. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/harness.py +0 -0
  341. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/harnesses/__init__.py +0 -0
  342. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  343. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/harnesses/default/__init__.py +0 -0
  344. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/harnesses/default/harness.py +0 -0
  345. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/harnesses/default/program.py +0 -0
  346. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  347. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  348. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  349. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  350. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  351. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/harnesses/null/__init__.py +0 -0
  352. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/harnesses/null/harness.py +0 -0
  353. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/harnesses/null/program.py +0 -0
  354. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  355. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  356. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  357. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  358. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  359. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/interception/__init__.py +0 -0
  360. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/interception/pool.py +0 -0
  361. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/interception/server.py +0 -0
  362. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/judge.py +0 -0
  363. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/judges/__init__.py +0 -0
  364. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/judges/reference.py +0 -0
  365. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/judges/reference.txt +0 -0
  366. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/judges/rubric.py +0 -0
  367. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/judges/rubric.txt +0 -0
  368. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/loaders.py +0 -0
  369. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/mcp/__init__.py +0 -0
  370. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/mcp/launch.py +0 -0
  371. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/mcp/server.py +0 -0
  372. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/mcp/toolset.py +0 -0
  373. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/mcp/user.py +0 -0
  374. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/push.py +0 -0
  375. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/retries.py +0 -0
  376. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/rollout.py +0 -0
  377. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/runtimes/__init__.py +0 -0
  378. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/runtimes/base.py +0 -0
  379. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/runtimes/docker.py +0 -0
  380. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/runtimes/limiters.py +0 -0
  381. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/runtimes/modal.py +0 -0
  382. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/runtimes/prime.py +0 -0
  383. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/runtimes/subprocess.py +0 -0
  384. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/scoring.py +0 -0
  385. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/serve/__init__.py +0 -0
  386. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/serve/client.py +0 -0
  387. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/serve/pool.py +0 -0
  388. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/serve/server.py +0 -0
  389. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/serve/types.py +0 -0
  390. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/state.py +0 -0
  391. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/task.py +0 -0
  392. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/taskset.py +0 -0
  393. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/tasksets/__init__.py +0 -0
  394. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  395. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  396. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  397. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  398. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  399. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  400. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  401. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/trace.py +0 -0
  402. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/types.py +0 -0
  403. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/utils/__init__.py +0 -0
  404. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/utils/aio.py +0 -0
  405. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/utils/format.py +0 -0
  406. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/utils/generic.py +0 -0
  407. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/utils/install.py +0 -0
  408. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/utils/logging.py +0 -0
  409. {verifiers-0.2.1.dev5 → verifiers-0.2.1.dev7}/verifiers/v1/utils/memory.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.2.1.dev5
3
+ Version: 0.2.1.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
@@ -170,6 +170,7 @@ debug = "verifiers.v1.cli.debug:main"
170
170
  replay = "verifiers.v1.cli.replay:main"
171
171
  serve = "verifiers.v1.cli.serve:main"
172
172
  init = "verifiers.v1.cli.init:main"
173
+ gepa = "verifiers.v1.cli.gepa:main"
173
174
  vf-gepa = "verifiers.scripts.gepa:main"
174
175
  vf-init = "verifiers.scripts.init:main"
175
176
  vf-install = "verifiers.scripts.install:main"
@@ -3,9 +3,7 @@
3
3
  import asyncio
4
4
  import contextlib
5
5
  import logging
6
- import random
7
6
  import shlex
8
- import signal
9
7
  import sys
10
8
  import time
11
9
  import traceback
@@ -30,7 +28,9 @@ from verifiers.v1.runtimes import ProgramResult, Runtime, make_runtime
30
28
  from verifiers.v1.state import state_cls
31
29
  from verifiers.v1.task import Task
32
30
  from verifiers.v1.trace import Error, Trace, TraceTask
31
+ from verifiers.v1.utils.interrupt import install_interrupt
33
32
  from verifiers.v1.utils.logging import setup_logging
33
+ from verifiers.v1.utils.sampling import sample
34
34
 
35
35
  logger = logging.getLogger(__name__)
36
36
 
@@ -267,11 +267,7 @@ async def debug_task(task: Task, config: DebugConfig) -> tuple[Trace, bool]:
267
267
 
268
268
  async def run_debug(config: DebugConfig) -> list[Trace]:
269
269
  taskset = vf.load_taskset(config.taskset)
270
- tasks = taskset.load()
271
- if config.shuffle:
272
- random.Random(0).shuffle(tasks)
273
- if config.num_tasks is not None:
274
- tasks = tasks[: config.num_tasks]
270
+ tasks = sample(taskset.load(), config.shuffle, config.num_tasks)
275
271
  if isinstance(config.runtime, vf.SubprocessConfig) and any(
276
272
  type(t).NEEDS_CONTAINER or t.data.image for t in tasks
277
273
  ):
@@ -327,8 +323,9 @@ def main(argv: list[str] | None = None) -> None:
327
323
  sys.argv = [sys.argv[0], *argv]
328
324
  config = cli(config_type)
329
325
  setup_logging("DEBUG" if config.verbose else "INFO")
330
- # Translate SIGTERM so async finally blocks still tear down their resources.
331
- signal.signal(signal.SIGTERM, lambda *_: (_ for _ in ()).throw(KeyboardInterrupt()))
326
+ # Graceful shutdown: first Ctrl-C/SIGTERM unwinds each task's teardown `finally`;
327
+ # a second is swallowed so it can't orphan containers/sandboxes mid-cleanup.
328
+ install_interrupt()
332
329
  asyncio.run(run_debug(config))
333
330
 
334
331
 
@@ -7,7 +7,7 @@ import sys
7
7
  from pydantic_config import cli
8
8
 
9
9
  import verifiers.v1 as vf
10
- from verifiers.v1.utils.interrupt import install as install_interrupt
10
+ from verifiers.v1.utils.interrupt import install_interrupt
11
11
  from verifiers.v1.utils.logging import setup_logging
12
12
  from verifiers.v1.cli.output import output_path, write_config
13
13
  from verifiers.v1.cli.resolve import (
@@ -3,7 +3,6 @@
3
3
  import asyncio
4
4
  import contextlib
5
5
  import logging
6
- import random
7
6
  import time
8
7
 
9
8
  from verifiers.v1.clients import ModelContext, resolve_client
@@ -14,21 +13,15 @@ from verifiers.v1.cli.output import append_trace, output_path, save_config
14
13
  from verifiers.v1.decorators import discover_decorated
15
14
  from verifiers.v1.env import Environment
16
15
  from verifiers.v1.trace import Trace
16
+ from verifiers.v1.utils.sampling import sample
17
17
 
18
18
  logger = logging.getLogger(__name__)
19
19
 
20
- _SHUFFLE_SEED = (
21
- 0 # fixed so `--shuffle` samples the same tasks every run (reproducible)
22
- )
23
-
24
20
 
25
21
  async def run_eval(env: Environment, config: EvalConfig) -> list[Trace]:
26
22
  logger.info("eval config:\n%s", config.model_dump_json(indent=2))
27
23
  client = resolve_client(config.client)
28
- tasks = env.taskset.load()
29
- if config.shuffle:
30
- random.Random(_SHUFFLE_SEED).shuffle(tasks)
31
- tasks = tasks if config.num_tasks is None else tasks[: config.num_tasks]
24
+ tasks = sample(env.taskset.load(), config.shuffle, config.num_tasks)
32
25
  ctx = ModelContext(client=client, model=config.model, sampling=config.sampling)
33
26
  # One episode of `num_rollouts` rollouts per task; the shared semaphore bounds total
34
27
  # concurrent rollouts (across episodes), so group rewards still see their whole episode.
@@ -169,11 +162,7 @@ async def run_eval_server(config: EvalConfig) -> list[Trace]:
169
162
  await client.wait_for_server_startup(timeout=600)
170
163
  info = await client.info()
171
164
  group_scored = info.requires_group_scoring
172
- idxs = list(range(info.num_tasks))
173
- if config.shuffle:
174
- random.Random(_SHUFFLE_SEED).shuffle(idxs)
175
- if config.num_tasks is not None:
176
- idxs = idxs[: config.num_tasks]
165
+ idxs = sample(list(range(info.num_tasks)), config.shuffle, config.num_tasks)
177
166
  out = output_path(config)
178
167
  finished: list[Trace] = []
179
168
  if config.resume is not None:
@@ -0,0 +1,74 @@
1
+ """The GEPA entrypoint: `uv run gepa [<taskset-id>] --model <model> [options]`.
2
+
3
+ Registered as the `gepa` console script. Optimizes a v1 taskset's `Task.system_prompt` via
4
+ GEPA (Genetic-Pareto): alternating rollouts with a teacher LM reflecting on results — see
5
+ `verifiers.v1.gepa`. CLI resolution mirrors `eval`/`serve` (`verifiers.v1.cli.resolve`): a
6
+ leading bare token is the taskset id, the taskset/harness subconfigs are narrowed from their
7
+ `id`s so `--taskset.*` / `--harness.*` stay typed and `-h` renders them, `@ file.toml` loads,
8
+ and the actual parse is `pydantic_config.cli`. v1-native tasksets only — a legacy (v0) env is
9
+ rejected; run those through the existing `vf-gepa` command instead.
10
+ """
11
+
12
+ import logging
13
+ import sys
14
+
15
+ from pydantic_config import cli
16
+
17
+ import verifiers.v1 as vf
18
+ from verifiers.v1.cli.output import output_path, write_config
19
+ from verifiers.v1.cli.resolve import (
20
+ extract_id,
21
+ narrow_config,
22
+ references_config_file,
23
+ with_positional_taskset,
24
+ )
25
+ from verifiers.v1.gepa import GEPAConfig, run_gepa
26
+ from verifiers.v1.utils.interrupt import install_interrupt
27
+ from verifiers.v1.utils.logging import setup_logging
28
+
29
+ logger = logging.getLogger(__name__)
30
+
31
+ USAGE = "usage: uv run gepa [<taskset-id>] [--harness.id <id>] --model <model> [options] [@ file.toml]"
32
+
33
+
34
+ def main(argv: list[str] | None = None) -> None:
35
+ argv = with_positional_taskset(list(sys.argv[1:]) if argv is None else list(argv))
36
+
37
+ if not argv or any(arg in ("-h", "--help") for arg in argv):
38
+ print(USAGE)
39
+ sys.argv = [sys.argv[0], "--help"]
40
+ cli(
41
+ narrow_config(GEPAConfig, argv)
42
+ ) # full option help, narrowed to the given ids
43
+ return
44
+ if not extract_id(argv, "taskset") and not references_config_file(argv):
45
+ raise SystemExit(
46
+ USAGE
47
+ ) # need a taskset (positional / --taskset.id) or a @ file.toml
48
+
49
+ config_type = narrow_config(GEPAConfig, argv)
50
+ sys.argv = [sys.argv[0], *argv] # let prime-pydantic-config render help/errors
51
+ config = cli(config_type)
52
+ if config.is_legacy:
53
+ raise SystemExit(
54
+ "gepa optimizes native v1 tasksets; run a legacy (v0) environment through "
55
+ "`vf-gepa` instead of `gepa`."
56
+ )
57
+ setup_logging("DEBUG" if config.verbose else "INFO")
58
+ if config.dry_run: # resolved + validated; write it to the output dir and exit
59
+ logger.info("wrote config to %s", write_config(config, output_path(config)))
60
+ return
61
+
62
+ # First Ctrl-C / SIGTERM warns and raises KeyboardInterrupt so a killed/timed-out run still
63
+ # runs the runner's `serving()` teardown (interception pool / tool-server runtimes); further
64
+ # signals during that cleanup are swallowed so an impatient second Ctrl-C can't orphan them.
65
+ install_interrupt()
66
+
67
+ env = vf.Environment(config)
68
+ try:
69
+ result = run_gepa(env, config)
70
+ except KeyboardInterrupt:
71
+ # Graceful cleanup already ran (run_gepa's finally tore down serving); exit on the
72
+ # conventional Ctrl-C code without dumping a traceback.
73
+ raise SystemExit(130)
74
+ print(f"best system prompt:\n{result.best_candidate.get('system_prompt', '')}")
@@ -10,7 +10,6 @@ config is the base for replay-specific overrides.
10
10
  import asyncio
11
11
  import contextlib
12
12
  import logging
13
- import signal
14
13
  import sys
15
14
  import time
16
15
  import tomllib
@@ -31,6 +30,7 @@ from verifiers.v1.configs.replay import ReplayConfig
31
30
  from verifiers.v1.state import state_cls
32
31
  from verifiers.v1.task import Task, WireTaskData, task_data_cls
33
32
  from verifiers.v1.trace import Trace
33
+ from verifiers.v1.utils.interrupt import install_interrupt
34
34
  from verifiers.v1.utils.logging import setup_logging
35
35
 
36
36
  logger = logging.getLogger(__name__)
@@ -220,8 +220,9 @@ def main(argv: list[str] | None = None) -> None:
220
220
  logging.lastResort = None
221
221
  else:
222
222
  setup_logging(level, log_file=log_file, console=True)
223
- # Translate SIGTERM so async finally blocks still tear down their resources.
224
- signal.signal(signal.SIGTERM, lambda *_: (_ for _ in ()).throw(KeyboardInterrupt()))
223
+ # Graceful shutdown: first Ctrl-C/SIGTERM unwinds the scoring teardown `finally`;
224
+ # a second is swallowed so it can't orphan resources mid-cleanup.
225
+ install_interrupt()
225
226
  asyncio.run(run_replay(config, source, out))
226
227
 
227
228
 
@@ -3,8 +3,6 @@
3
3
  import asyncio
4
4
  import contextlib
5
5
  import logging
6
- import random
7
- import signal
8
6
  import sys
9
7
  import time
10
8
  from typing import Any
@@ -26,7 +24,9 @@ from verifiers.v1.runtimes import make_runtime
26
24
  from verifiers.v1.state import state_cls
27
25
  from verifiers.v1.task import Task
28
26
  from verifiers.v1.trace import Trace, TraceTask
27
+ from verifiers.v1.utils.interrupt import install_interrupt
29
28
  from verifiers.v1.utils.logging import setup_logging
29
+ from verifiers.v1.utils.sampling import sample
30
30
 
31
31
  logger = logging.getLogger(__name__)
32
32
 
@@ -198,11 +198,7 @@ async def _validate_task(task: Task, config: ValidateConfig) -> ResultRow:
198
198
 
199
199
  async def run_validate(config: ValidateConfig) -> list[dict]:
200
200
  taskset = vf.load_taskset(config.taskset)
201
- tasks = taskset.load()
202
- if config.shuffle:
203
- random.Random(0).shuffle(tasks)
204
- if config.num_tasks is not None:
205
- tasks = tasks[: config.num_tasks]
201
+ tasks = sample(taskset.load(), config.shuffle, config.num_tasks)
206
202
  if isinstance(config.runtime, vf.SubprocessConfig) and any(
207
203
  type(t).NEEDS_CONTAINER or t.data.image for t in tasks
208
204
  ):
@@ -273,9 +269,9 @@ def main(argv: list[str] | None = None) -> None:
273
269
  setup_logging("DEBUG" if config.verbose else "INFO", console=not config.rich)
274
270
  if config.rich:
275
271
  logging.lastResort = None # drop stdlib records that bypass loguru
276
- # Make SIGTERM behave like Ctrl-C so a killed run still runs each task's `finally`
277
- # (tears down containers/sandboxes) and the atexit backstop catches the rest.
278
- signal.signal(signal.SIGTERM, lambda *_: (_ for _ in ()).throw(KeyboardInterrupt()))
272
+ # Graceful shutdown: first Ctrl-C/SIGTERM unwinds each task's teardown `finally`
273
+ # (containers/sandboxes); a second is swallowed so it can't orphan them mid-cleanup.
274
+ install_interrupt()
279
275
  asyncio.run(run_validate(config))
280
276
 
281
277
 
@@ -0,0 +1,12 @@
1
+ """GEPA (Genetic-Pareto) system-prompt optimization for native v1 environments.
2
+
3
+ `run_gepa(env, config)` drives the third-party `gepa` optimizer against a v1 `Environment`
4
+ via `GEPAAdapter`, seeding from and improving `Task.system_prompt`. The `gepa` console
5
+ script (`verifiers.v1.cli.gepa`) is a thin entrypoint over this package.
6
+ """
7
+
8
+ from verifiers.v1.gepa.adapter import GEPAAdapter
9
+ from verifiers.v1.gepa.config import GEPAConfig
10
+ from verifiers.v1.gepa.runner import run_gepa
11
+
12
+ __all__ = ["GEPAAdapter", "GEPAConfig", "run_gepa"]
@@ -0,0 +1,112 @@
1
+ """The GEPA <-> v1 bridge: run a candidate system prompt over a batch of tasks and score it.
2
+
3
+ GEPA's adapter protocol (`evaluate`, `make_reflective_dataset`) is synchronous and
4
+ `gepa.api.optimize` blocks, but v1 rollouts are async. The runner manages one event loop by
5
+ hand: it enters `env.serving()` on that loop and runs the blocking `optimize()` on the main
6
+ thread, so each synchronous `evaluate()` drives its batch of rollouts with
7
+ `loop.run_until_complete` — the one sync↔async hop. (Mirrors how v0 vf-gepa bridged; no worker
8
+ thread, so a Ctrl-C unwinds straight through `optimize()` into the runner's teardown.)
9
+ """
10
+
11
+ import asyncio
12
+ from collections.abc import Awaitable
13
+ from dataclasses import dataclass, field
14
+ from typing import Any, Callable, Mapping, Sequence
15
+
16
+ from gepa.core.adapter import EvaluationBatch
17
+ from pydantic_core import to_jsonable_python
18
+
19
+ from verifiers.v1.clients import ModelContext
20
+ from verifiers.v1.env import Environment
21
+ from verifiers.v1.task import Task
22
+ from verifiers.v1.trace import Trace
23
+
24
+ Candidate = dict[str, str]
25
+
26
+
27
+ @dataclass
28
+ class GEPAAdapter:
29
+ """Bridges GEPA's optimization loop with a native v1 `Environment`. `tasks` covers only the
30
+ trainset + valset tasks GEPA was given (not the whole taskset), keyed by `task.data.idx` —
31
+ GEPA's `batch` is a list of those idxs, and injecting the candidate rebuilds each `Task`
32
+ around a `data` row carrying the new `system_prompt`. `loop` is the runner's persistent event
33
+ loop (which holds `env.serving()` open); `evaluate` drives its rollouts on it with
34
+ `run_until_complete`."""
35
+
36
+ env: Environment
37
+ ctx: ModelContext
38
+ tasks: dict[int, Task]
39
+ loop: asyncio.AbstractEventLoop
40
+ semaphore: asyncio.Semaphore | None = None
41
+ on_complete: Callable[[Trace], Awaitable[None]] | None = None
42
+ """Called with each rollout's trace as it finalizes — the runner's persist hook that
43
+ streams traces to `traces.jsonl`, exactly as `run_eval` does."""
44
+ reflection_columns: list[str] = field(default_factory=list)
45
+ propose_new_texts: Callable[..., Candidate] | None = None
46
+ """Part of GEPA's adapter protocol — its proposer reads this attribute on every reflection
47
+ step. None = use GEPA's default reflection-LM proposer (the AttributeError from leaving it
48
+ undeclared silently disables all mutation proposals)."""
49
+
50
+ def evaluate(
51
+ self,
52
+ batch: list[int],
53
+ candidate: Candidate,
54
+ capture_traces: bool = False,
55
+ ) -> EvaluationBatch[Trace, Trace]:
56
+ """Run `candidate`'s system prompt on the tasks named by `batch` (`Task.idx` values)
57
+ and score them. Called synchronously by GEPA on the main thread; each batch's rollouts
58
+ run on the runner's persistent loop via `run_until_complete`."""
59
+ system_prompt = candidate.get("system_prompt", "")
60
+ traces = self.loop.run_until_complete(self._run_batch(batch, system_prompt))
61
+ scores = [trace.reward for trace in traces]
62
+ return EvaluationBatch(
63
+ outputs=traces,
64
+ scores=scores,
65
+ trajectories=traces if capture_traces else None,
66
+ )
67
+
68
+ async def _run_batch(self, batch: list[int], system_prompt: str) -> list[Trace]:
69
+ # Inject the candidate by rebuilding each Task around a data row with the new
70
+ # system_prompt (TaskData is frozen; behavior/config carry over unchanged).
71
+ tasks = [
72
+ type(t)(
73
+ t.data.model_copy(update={"system_prompt": system_prompt}), t.config
74
+ )
75
+ for t in (self.tasks[idx] for idx in batch)
76
+ ]
77
+ episodes = [self.env.episode(task, self.ctx, n=1) for task in tasks]
78
+ results = await asyncio.gather(
79
+ *(episode.run(self.semaphore, self.on_complete) for episode in episodes)
80
+ )
81
+ return [trace for episode_traces in results for trace in episode_traces]
82
+
83
+ def make_reflective_dataset(
84
+ self,
85
+ candidate: Candidate, # noqa: ARG002 - required by GEPA's adapter protocol
86
+ eval_batch: EvaluationBatch[Trace, Trace],
87
+ components_to_update: list[str],
88
+ ) -> Mapping[str, Sequence[Mapping[str, Any]]]:
89
+ """Build the reflective dataset the teacher LM reads to propose a new system prompt,
90
+ from `eval_batch.trajectories` (traces captured by a prior `evaluate(capture_traces=True)`
91
+ on the same batch)."""
92
+ traces = eval_batch.trajectories or []
93
+ records = []
94
+ for trace, score in zip(traces, eval_batch.scores):
95
+ record: dict[str, Any] = {
96
+ "query": trace.task.data.prompt_text,
97
+ "completion": trace.last_reply,
98
+ "reward": score,
99
+ }
100
+ if trace.has_error:
101
+ record["error"] = str(trace.error)
102
+ if trace.stop_condition:
103
+ record["stop_condition"] = trace.stop_condition
104
+ for column in self.reflection_columns:
105
+ if column in trace.info:
106
+ record[column] = to_jsonable_python(trace.info[column])
107
+ elif hasattr(trace.task.data, column):
108
+ record[column] = to_jsonable_python(
109
+ getattr(trace.task.data, column)
110
+ )
111
+ records.append(record)
112
+ return {comp: records for comp in components_to_update}
@@ -0,0 +1,78 @@
1
+ """The `GEPAConfig`: the single config object the `gepa` CLI parses.
2
+
3
+ GEPA optimizes one taskset's `Task.system_prompt` by alternating rollouts (`evaluate`) with a
4
+ teacher LM reflecting on the reflective dataset (`make_reflective_dataset`) — see
5
+ `verifiers.v1.gepa.adapter.GEPAAdapter`. This inherits `EnvConfig`'s fields (`taskset`,
6
+ `harness`, `max_turns`, token limits, timeouts) as top-level flags, the same way `EvalConfig`
7
+ does, and adds the optimization loop's own knobs (model, reflection model, train/val split,
8
+ budget). There is no worker pool here (`EnvServerConfig` is not a base) — GEPA always runs
9
+ in-process, since its adapter protocol is itself synchronous (see `GEPAAdapter`)."""
10
+
11
+ from pathlib import Path
12
+ from uuid import uuid4
13
+
14
+ from pydantic import AliasChoices, Field
15
+
16
+ from verifiers.v1.clients import EvalClientConfig
17
+ from verifiers.v1.env import EnvConfig
18
+ from verifiers.v1.types import SamplingConfig
19
+
20
+
21
+ class GEPAConfig(EnvConfig):
22
+ """The GEPA run plus its environment. `model` runs the rollouts under optimization;
23
+ `reflection_model` (defaults to `model`) proposes new system prompts from the reflective
24
+ dataset. No default for `model` — a GEPA run can spend a large eval budget, so pick it
25
+ explicitly rather than silently optimizing (and spending) against a fallback."""
26
+
27
+ uuid: str = Field(default_factory=lambda: str(uuid4()), exclude=True)
28
+ """Auto-generated run id — the leaf of the output dir, so runs never overwrite.
29
+ Excluded from the saved config so re-running `@ config.toml` lands in a fresh dir."""
30
+ model: str = Field(..., validation_alias=AliasChoices("model", "m"))
31
+ """Model id for rollouts under optimization."""
32
+ client: EvalClientConfig = EvalClientConfig()
33
+ sampling: SamplingConfig = SamplingConfig()
34
+ reflection_model: str | None = None
35
+ """Teacher model that proposes new system prompts. None = reuse `model`."""
36
+ reflection_client: EvalClientConfig | None = None
37
+ """Endpoint for `reflection_model`. None = reuse `client`."""
38
+
39
+ num_train: int = Field(100, ge=1)
40
+ """Tasks reserved for reflection minibatches (GEPA never scores the full trainset at once)."""
41
+ num_val: int = Field(50, ge=1)
42
+ """Tasks held out to score each candidate system prompt for the pareto frontier."""
43
+ shuffle: bool = Field(True, validation_alias=AliasChoices("shuffle", "s"))
44
+ """Shuffle tasks before splitting into train/val — v1 tasksets have no generic train/val
45
+ split, so GEPA carves one out of `taskset.load()` the way `run_eval` samples (fixed
46
+ seed, so the split is reproducible across runs)."""
47
+ seed: int = 0
48
+ """Seed for GEPA's optimizer (candidate selection / minibatch sampling). Task shuffling
49
+ uses a fixed seed, matching eval — so this doesn't change the train/val split."""
50
+
51
+ max_metric_calls: int = Field(
52
+ 500, validation_alias=AliasChoices("max_metric_calls", "B")
53
+ )
54
+ """Total rollouts GEPA may spend across the whole optimization run."""
55
+ reflection_minibatch_size: int = 3
56
+ """Train tasks sampled per reflection step."""
57
+ perfect_score: float | None = None
58
+ """Skip reflecting on a minibatch that already scores this well."""
59
+ reflection_columns: list[str] = Field(default_factory=list)
60
+ """Extra per-trace fields (from `trace.info`, else `task`) to surface to the teacher LM."""
61
+ initial_prompt: str | None = None
62
+ """Seed system prompt. None = the first loaded task's `Task.system_prompt`, if any task
63
+ sets one (see `resolve_gepa_seed_prompt`)."""
64
+
65
+ max_concurrent: int | None = Field(
66
+ 128, validation_alias=AliasChoices("max_concurrent", "c")
67
+ )
68
+ """Max rollouts in flight at once, across the whole run."""
69
+ output_dir: Path | None = Field(
70
+ None, validation_alias=AliasChoices("output_dir", "o")
71
+ )
72
+ """Where to write results (config.toml + the streamed traces.jsonl, alongside GEPA's own
73
+ candidates.json / run_log.json). None = a fresh per-run dir under
74
+ `outputs/<taskset>--<model>--<harness>/<uuid>` (via `output_path`)."""
75
+ save_results: bool = True
76
+ verbose: bool = Field(False, validation_alias=AliasChoices("verbose", "v"))
77
+ dry_run: bool = False
78
+ """Resolve + validate the config and dump it, then exit."""
@@ -0,0 +1,63 @@
1
+ """Train/val split and upfront validation for a GEPA run.
2
+
3
+ v1 tasksets have no generic train/val split concept (`TasksetConfig` has no `split` field;
4
+ individual tasksets define ad hoc ones inconsistently), so GEPA carves one out of
5
+ `taskset.load()` itself: the shared fixed-seed shuffle (`verifiers.v1.utils.sampling.sample`,
6
+ reproducible across runs like every other entrypoint), then two disjoint slices.
7
+ """
8
+
9
+ from verifiers.v1.decorators import discover_decorated
10
+ from verifiers.v1.task import Task
11
+ from verifiers.v1.utils.sampling import sample
12
+
13
+
14
+ def reject_group_reward_tasksets(tasks: list[Task]) -> None:
15
+ """GEPA scores one rollout per task (`n=1`) to get the per-task scalar its pareto frontier
16
+ needs, but `@group_reward`s compare a task's rollouts and need >=2 — so a group-reward
17
+ taskset can't be optimized this way (`Environment.episode` would raise on the first batch).
18
+ Reject it up front with a clear message instead of crashing mid-run. A taskset loads one task
19
+ type, so the first task is representative (as `run_eval` also assumes)."""
20
+ if tasks and discover_decorated(tasks[0], "group_reward"):
21
+ raise ValueError(
22
+ "this taskset defines @group_reward(s), which compare >=2 rollouts of a task; GEPA "
23
+ "optimizes a single system prompt from per-task scalar scores (one rollout per task) "
24
+ "and can't score group rewards. Optimize a taskset without @group_reward instead."
25
+ )
26
+
27
+
28
+ def split_tasks(
29
+ tasks: list[Task], num_train: int, num_val: int, shuffle: bool
30
+ ) -> tuple[list[Task], list[Task]]:
31
+ """The taskset's tasks, split into disjoint `(train, val)` slices (`train` feeds reflection
32
+ minibatches; `val` scores each candidate for the pareto frontier)."""
33
+ pool = sample(
34
+ tasks, shuffle
35
+ ) # shared fixed-seed shuffle; GEPA does its own slicing below
36
+ if num_train + num_val > len(pool):
37
+ raise ValueError(
38
+ f"requested {num_train} train + {num_val} val tasks, but the taskset only "
39
+ f"loaded {len(pool)}"
40
+ )
41
+ return pool[:num_train], pool[num_train : num_train + num_val]
42
+
43
+
44
+ def resolve_gepa_seed_prompt(tasks: list[Task], initial_prompt: str | None) -> str:
45
+ """The system prompt GEPA starts optimizing from: `initial_prompt` if given, else the first
46
+ task that sets `system_prompt`. Some tasksets (e.g. `gsm8k-v1`) bake instructions into
47
+ `prompt` rather than `system_prompt` and can't be optimized this way — pass `--initial-prompt`
48
+ to seed one explicitly.
49
+
50
+ How the resolved prompt reaches the model at rollout time — a real system message vs. folded
51
+ into the user prompt — is the harness's call: `Harness.resolve_prompt` owns that policy and
52
+ warns when it folds, so it isn't re-policed here."""
53
+ if initial_prompt is not None:
54
+ return initial_prompt
55
+ for task in tasks:
56
+ if task.data.system_prompt is not None:
57
+ return task.data.system_prompt
58
+ raise ValueError(
59
+ "no task in this taskset sets Task.system_prompt — some tasksets bake instructions "
60
+ "directly into `prompt` instead (e.g. gsm8k-v1) and can't be optimized this way. Pass "
61
+ "--initial-prompt to seed one explicitly, or pick a taskset whose load() sets "
62
+ "system_prompt on its task data (e.g. reverse-text-v1, lean, textarena)."
63
+ )
@@ -0,0 +1,28 @@
1
+ """The reflection (teacher) LM: GEPA's proposer calls this synchronously to turn a prompt into
2
+ text. Backed by a vf `Judge` — `Judge.complete` owns the model client (same key / header /
3
+ Prime-billing resolution rollouts use), so we never build one here. GEPA calls it from the
4
+ worker thread running `optimize()`, so each call drives the async `complete` on a private loop.
5
+ """
6
+
7
+ import asyncio
8
+ from typing import Callable
9
+
10
+ from verifiers.v1.gepa.config import GEPAConfig
11
+ from verifiers.v1.judge import Judge, JudgeConfig
12
+
13
+
14
+ def build_reflection_lm(config: GEPAConfig) -> Callable[[str], str]:
15
+ client = config.reflection_client or config.client
16
+ judge = Judge(
17
+ JudgeConfig(
18
+ model=config.reflection_model or config.model,
19
+ base_url=client.base_url,
20
+ api_key_var=client.api_key_var,
21
+ headers=client.headers,
22
+ )
23
+ )
24
+
25
+ def reflection_lm(prompt: str) -> str:
26
+ return asyncio.run(judge.complete(prompt)).text
27
+
28
+ return reflection_lm