verifiers 0.2.1.dev20__tar.gz → 0.2.1.dev21__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 (411) hide show
  1. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/PKG-INFO +1 -1
  2. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/test_color_codeword_tasks.py +3 -3
  3. verifiers-0.2.1.dev21/tests/v1/test_taskset.py +71 -0
  4. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/debug.py +1 -2
  5. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/eval/runner.py +15 -2
  6. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/validate.py +1 -2
  7. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/configs/debug.py +1 -0
  8. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/configs/eval.py +1 -0
  9. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/configs/validate.py +1 -0
  10. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/gepa/config.py +1 -1
  11. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/gepa/dataset.py +8 -12
  12. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/gepa/runner.py +2 -4
  13. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/legacy.py +1 -1
  14. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/serve/server.py +40 -8
  15. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/serve/types.py +5 -4
  16. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/taskset.py +46 -4
  17. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/textarena/taskset.py +7 -6
  18. verifiers-0.2.1.dev21/verifiers/v1/utils/sampling.py +25 -0
  19. verifiers-0.2.1.dev20/verifiers/v1/utils/sampling.py +0 -26
  20. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/.gitignore +0 -0
  21. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/LICENSE +0 -0
  22. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/README.md +0 -0
  23. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/pyproject.toml +0 -0
  24. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/AGENTS.md +0 -0
  25. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/__init__.py +0 -0
  26. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/conftest.py +0 -0
  27. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_browser_env.py +0 -0
  28. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_build_script.py +0 -0
  29. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_cli_agent_env.py +0 -0
  30. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_client_auth_errors.py +0 -0
  31. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_client_config.py +0 -0
  32. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_client_multimodal_types.py +0 -0
  33. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_composable_env.py +0 -0
  34. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_context_token_metrics.py +0 -0
  35. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_decorator_ranks.py +0 -0
  36. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_endpoint_registry.py +0 -0
  37. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_env_group.py +0 -0
  38. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_env_server.py +0 -0
  39. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_environment.py +0 -0
  40. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_environment_extra.py +0 -0
  41. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_envs.py +0 -0
  42. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_error_chain.py +0 -0
  43. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_eval_display.py +0 -0
  44. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_eval_utils.py +0 -0
  45. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_gepa_cli.py +0 -0
  46. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_gepa_utils.py +0 -0
  47. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_gym_env.py +0 -0
  48. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_harbor_env_mcp.py +0 -0
  49. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_imports.py +0 -0
  50. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_init_script.py +0 -0
  51. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_install_utils.py +0 -0
  52. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_interception_utils.py +0 -0
  53. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_logging.py +0 -0
  54. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_math_rubric.py +0 -0
  55. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_maybe_think_parser.py +0 -0
  56. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_message_utils.py +0 -0
  57. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_message_utils_multimodal.py +0 -0
  58. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_multiturn_env.py +0 -0
  59. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_nemorl_client.py +0 -0
  60. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_openai_chat_completions_token_client.py +0 -0
  61. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_openai_responses_client.py +0 -0
  62. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_opencode_rlm_env.py +0 -0
  63. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_openenv_client.py +0 -0
  64. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_parser.py +0 -0
  65. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_path_utils.py +0 -0
  66. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_per_turn_timing.py +0 -0
  67. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_pricing_utils.py +0 -0
  68. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_prime_plugin.py +0 -0
  69. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_renderer_client.py +0 -0
  70. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_renderer_e2e.py +0 -0
  71. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_rlm_composable_env.py +0 -0
  72. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_rubric.py +0 -0
  73. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_rubric_group.py +0 -0
  74. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_sandbox_debug_env.py +0 -0
  75. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_sandbox_env.py +0 -0
  76. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_sandbox_mixin.py +0 -0
  77. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_save_utils.py +0 -0
  78. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_setup_script.py +0 -0
  79. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_singleturn_env.py +0 -0
  80. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_stateful_tool_env.py +0 -0
  81. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_think_parser.py +0 -0
  82. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_tool_env.py +0 -0
  83. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_tool_utils.py +0 -0
  84. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_trajectory_processing.py +0 -0
  85. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_tui_info_formatting.py +0 -0
  86. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_types.py +0 -0
  87. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_wordle_env.py +0 -0
  88. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_xml_parser.py +0 -0
  89. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/conftest.py +0 -0
  90. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  91. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  92. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  93. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  94. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  95. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/fixtures/echo_v0.py +0 -0
  96. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/fixtures/echo_v1.py +0 -0
  97. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/fixtures/pyproject.toml +0 -0
  98. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  99. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/test_configs.py +0 -0
  100. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/test_e2e.py +0 -0
  101. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/test_envs.py +0 -0
  102. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/test_graph.py +0 -0
  103. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/test_judges.py +0 -0
  104. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/test_legacy.py +0 -0
  105. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/test_scoring.py +0 -0
  106. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/test_trace.py +0 -0
  107. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/__init__.py +0 -0
  108. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/__init__.py +0 -0
  109. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/commands/__init__.py +0 -0
  110. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/commands/build.py +0 -0
  111. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/commands/eval.py +0 -0
  112. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/commands/gepa.py +0 -0
  113. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/commands/init.py +0 -0
  114. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/commands/install.py +0 -0
  115. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/commands/setup.py +0 -0
  116. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/plugins/__init__.py +0 -0
  117. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/plugins/prime.py +0 -0
  118. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/tui.py +0 -0
  119. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/clients/__init__.py +0 -0
  120. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/clients/anthropic_messages_client.py +0 -0
  121. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/clients/client.py +0 -0
  122. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  123. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/clients/openai_chat_completions_client.py +0 -0
  124. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  125. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/clients/openai_completions_client.py +0 -0
  126. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/clients/openai_responses_client.py +0 -0
  127. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/clients/renderer_client.py +0 -0
  128. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/decorators.py +0 -0
  129. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/AGENTS.md +0 -0
  130. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/__init__.py +0 -0
  131. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/env_group.py +0 -0
  132. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/environment.py +0 -0
  133. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/README.md +0 -0
  134. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/__init__.py +0 -0
  135. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  136. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/README.md +0 -0
  137. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/__init__.py +0 -0
  138. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/_filter.py +0 -0
  139. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  140. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/harness.py +0 -0
  141. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  142. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  143. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  144. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  145. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  146. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  147. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  148. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/task.py +0 -0
  149. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  150. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  151. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  152. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  153. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  154. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  155. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  156. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  157. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  158. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  159. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
  160. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
  161. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
  162. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
  163. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
  164. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
  165. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
  166. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
  167. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
  168. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
  169. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
  170. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
  171. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
  172. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
  173. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
  174. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
  175. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
  176. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
  177. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
  178. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
  179. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
  180. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
  181. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
  182. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
  183. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
  184. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
  185. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
  186. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
  187. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
  188. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  189. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  190. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  191. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  192. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  193. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  194. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  195. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  196. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  197. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  198. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  199. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  200. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  201. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  202. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  203. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  204. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  205. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  206. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  207. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  208. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  209. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  210. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  211. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  212. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/gym_env.py +0 -0
  213. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  214. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  215. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  216. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/mcp_env.py +0 -0
  217. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/opencode_env.py +0 -0
  218. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  219. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  220. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  221. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/utils/__init__.py +0 -0
  222. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  223. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  224. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/README.md +0 -0
  225. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/__init__.py +0 -0
  226. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/README.md +0 -0
  227. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  228. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  229. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  230. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  231. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  232. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  233. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/openenv_env.py +0 -0
  234. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  235. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/textarena_env.py +0 -0
  236. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/multiturn_env.py +0 -0
  237. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/python_env.py +0 -0
  238. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/sandbox_env.py +0 -0
  239. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/singleturn_env.py +0 -0
  240. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/stateful_tool_env.py +0 -0
  241. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/tool_env.py +0 -0
  242. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/errors.py +0 -0
  243. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/gepa/__init__.py +0 -0
  244. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/gepa/adapter.py +0 -0
  245. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/gepa/config.py +0 -0
  246. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/gepa/display.py +0 -0
  247. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/gepa/gepa_utils.py +0 -0
  248. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/parsers/__init__.py +0 -0
  249. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/parsers/maybe_think_parser.py +0 -0
  250. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/parsers/parser.py +0 -0
  251. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/parsers/think_parser.py +0 -0
  252. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/parsers/xml_parser.py +0 -0
  253. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/rubrics/__init__.py +0 -0
  254. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  255. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/rubrics/judge_rubric.py +0 -0
  256. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/rubrics/math_rubric.py +0 -0
  257. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/rubrics/rubric.py +0 -0
  258. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/rubrics/rubric_group.py +0 -0
  259. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/scripts/__init__.py +0 -0
  260. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/scripts/build.py +0 -0
  261. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/scripts/eval.py +0 -0
  262. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/scripts/gepa.py +0 -0
  263. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/scripts/init.py +0 -0
  264. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/scripts/install.py +0 -0
  265. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/scripts/setup.py +0 -0
  266. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/scripts/tui.py +0 -0
  267. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/serve/__init__.py +0 -0
  268. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/serve/client/env_client.py +0 -0
  269. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/serve/client/zmq_env_client.py +0 -0
  270. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/serve/server/__init__.py +0 -0
  271. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/serve/server/env_router.py +0 -0
  272. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/serve/server/env_server.py +0 -0
  273. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/serve/server/env_worker.py +0 -0
  274. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/serve/server/zmq_env_server.py +0 -0
  275. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/serve/types.py +0 -0
  276. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/types.py +0 -0
  277. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/__init__.py +0 -0
  278. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/async_utils.py +0 -0
  279. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/client_utils.py +0 -0
  280. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/config_utils.py +0 -0
  281. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/data_utils.py +0 -0
  282. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/display_utils.py +0 -0
  283. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/env_config_utils.py +0 -0
  284. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/env_utils.py +0 -0
  285. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/error_utils.py +0 -0
  286. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/eval_display.py +0 -0
  287. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/eval_utils.py +0 -0
  288. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/heartbeat.py +0 -0
  289. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/import_utils.py +0 -0
  290. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/install_utils.py +0 -0
  291. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/interception_utils.py +0 -0
  292. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/logging_utils.py +0 -0
  293. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/message_utils.py +0 -0
  294. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/metric_utils.py +0 -0
  295. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/path_utils.py +0 -0
  296. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/pricing_utils.py +0 -0
  297. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/process_utils.py +0 -0
  298. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/response_utils.py +0 -0
  299. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/save_utils.py +0 -0
  300. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/serve_utils.py +0 -0
  301. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/thread_utils.py +0 -0
  302. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/threaded_sandbox_client.py +0 -0
  303. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/tool_utils.py +0 -0
  304. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/usage_utils.py +0 -0
  305. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/version_utils.py +0 -0
  306. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/__init__.py +0 -0
  307. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/__init__.py +0 -0
  308. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  309. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/dashboard/base.py +0 -0
  310. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/dashboard/eval.py +0 -0
  311. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/dashboard/replay.py +0 -0
  312. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/dashboard/validate.py +0 -0
  313. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/eval/__init__.py +0 -0
  314. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/eval/main.py +0 -0
  315. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/eval/resume.py +0 -0
  316. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/gepa.py +0 -0
  317. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/init.py +0 -0
  318. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/output.py +0 -0
  319. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/replay.py +0 -0
  320. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/resolve.py +0 -0
  321. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/serve.py +0 -0
  322. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/clients/__init__.py +0 -0
  323. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/clients/client.py +0 -0
  324. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/clients/config.py +0 -0
  325. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/clients/eval.py +0 -0
  326. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/clients/train.py +0 -0
  327. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/configs/__init__.py +0 -0
  328. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/configs/init.py +0 -0
  329. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/configs/replay.py +0 -0
  330. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/configs/serve.py +0 -0
  331. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/decorators.py +0 -0
  332. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/dialects/__init__.py +0 -0
  333. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/dialects/anthropic.py +0 -0
  334. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/dialects/base.py +0 -0
  335. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/dialects/chat.py +0 -0
  336. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/dialects/responses.py +0 -0
  337. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/env.py +0 -0
  338. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/episode.py +0 -0
  339. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/errors.py +0 -0
  340. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/gepa/__init__.py +0 -0
  341. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/gepa/adapter.py +0 -0
  342. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/gepa/reflection.py +0 -0
  343. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/graph.py +0 -0
  344. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harness.py +0 -0
  345. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/__init__.py +0 -0
  346. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  347. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/codex/harness.py +0 -0
  348. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/default/__init__.py +0 -0
  349. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/default/harness.py +0 -0
  350. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/default/program.py +0 -0
  351. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  352. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  353. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  354. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  355. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  356. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/null/__init__.py +0 -0
  357. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/null/harness.py +0 -0
  358. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/null/program.py +0 -0
  359. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  360. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  361. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  362. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  363. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  364. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/interception/__init__.py +0 -0
  365. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/interception/pool.py +0 -0
  366. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/interception/server.py +0 -0
  367. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/judge.py +0 -0
  368. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/judges/__init__.py +0 -0
  369. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/judges/reference.py +0 -0
  370. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/judges/reference.txt +0 -0
  371. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/judges/rubric.py +0 -0
  372. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/judges/rubric.txt +0 -0
  373. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/loaders.py +0 -0
  374. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/mcp/__init__.py +0 -0
  375. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/mcp/launch.py +0 -0
  376. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/mcp/server.py +0 -0
  377. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/mcp/toolset.py +0 -0
  378. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/mcp/user.py +0 -0
  379. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/push.py +0 -0
  380. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/retries.py +0 -0
  381. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/rollout.py +0 -0
  382. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/__init__.py +0 -0
  383. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/base.py +0 -0
  384. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/docker.py +0 -0
  385. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/limiters.py +0 -0
  386. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/modal.py +0 -0
  387. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/prime.py +0 -0
  388. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/subprocess.py +0 -0
  389. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/scoring.py +0 -0
  390. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/serve/__init__.py +0 -0
  391. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/serve/client.py +0 -0
  392. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/serve/pool.py +0 -0
  393. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/state.py +0 -0
  394. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/task.py +0 -0
  395. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/__init__.py +0 -0
  396. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  397. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  398. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  399. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  400. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  401. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  402. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/trace.py +0 -0
  403. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/types.py +0 -0
  404. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/utils/__init__.py +0 -0
  405. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/utils/aio.py +0 -0
  406. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/utils/format.py +0 -0
  407. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/utils/generic.py +0 -0
  408. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/utils/install.py +0 -0
  409. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/utils/interrupt.py +0 -0
  410. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/utils/logging.py +0 -0
  411. {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/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.dev20
3
+ Version: 0.2.1.dev21
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
@@ -10,9 +10,9 @@ def test_color_images_are_rendered_once(monkeypatch) -> None:
10
10
  return render(color, size)
11
11
 
12
12
  monkeypatch.setattr(taskset, "color_data_url", counted)
13
- tasks = taskset.ColorCodewordTaskset(
14
- taskset.ColorCodewordConfig(num_examples=100)
15
- ).load()
13
+ tasks = taskset.ColorCodewordTaskset(taskset.ColorCodewordConfig()).select(
14
+ num_tasks=100
15
+ )
16
16
 
17
17
  assert len(tasks) == 100
18
18
  assert calls == list(taskset.COLOR_MAP)
@@ -0,0 +1,71 @@
1
+ """`Taskset.select` over list, generator, and `INFINITE` `load` implementations."""
2
+
3
+ import itertools
4
+
5
+ import pytest
6
+
7
+ import verifiers.v1 as vf
8
+
9
+
10
+ class CountTask(vf.Task[vf.TaskData]):
11
+ pass
12
+
13
+
14
+ class InfiniteTaskset(vf.Taskset[CountTask, vf.TasksetConfig]):
15
+ INFINITE = True
16
+
17
+ def load(self):
18
+ for i in itertools.count():
19
+ yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
20
+
21
+
22
+ class FiniteTaskset(vf.Taskset[CountTask, vf.TasksetConfig]):
23
+ def load(self):
24
+ for i in range(10):
25
+ yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
26
+
27
+
28
+ def idxs(tasks: list[CountTask]) -> list[int]:
29
+ return [task.data.idx for task in tasks]
30
+
31
+
32
+ def test_select_bounds_an_infinite_taskset() -> None:
33
+ tasks = InfiniteTaskset(vf.TasksetConfig()).select(num_tasks=5)
34
+ assert idxs(tasks) == [0, 1, 2, 3, 4]
35
+
36
+
37
+ def test_select_infinite_requires_num_tasks() -> None:
38
+ with pytest.raises(ValueError, match="infinite"):
39
+ InfiniteTaskset(vf.TasksetConfig()).select()
40
+
41
+
42
+ def test_select_infinite_ignores_shuffle() -> None:
43
+ tasks = InfiniteTaskset(vf.TasksetConfig()).select(num_tasks=3, shuffle=True)
44
+ assert idxs(tasks) == [0, 1, 2]
45
+
46
+
47
+ def test_select_finite() -> None:
48
+ taskset = FiniteTaskset(vf.TasksetConfig())
49
+ assert len(taskset.select()) == 10
50
+ assert idxs(taskset.select(num_tasks=4)) == [0, 1, 2, 3]
51
+
52
+
53
+ def test_select_shuffle_samples_the_whole_taskset_reproducibly() -> None:
54
+ taskset = FiniteTaskset(vf.TasksetConfig())
55
+ first = idxs(taskset.select(num_tasks=5, shuffle=True))
56
+ assert first == idxs(taskset.select(num_tasks=5, shuffle=True))
57
+ assert len(first) == 5 and set(first) <= set(range(10))
58
+ assert first != [0, 1, 2, 3, 4] # sampled from the whole set, not the head
59
+
60
+
61
+ def test_select_only_builds_what_the_run_takes() -> None:
62
+ built: list[int] = []
63
+
64
+ class RecordingTaskset(InfiniteTaskset):
65
+ def load(self):
66
+ for i in itertools.count():
67
+ built.append(i)
68
+ yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
69
+
70
+ RecordingTaskset(vf.TasksetConfig()).select(num_tasks=3)
71
+ assert built == [0, 1, 2]
@@ -30,7 +30,6 @@ from verifiers.v1.task import Task
30
30
  from verifiers.v1.trace import Error, Trace, TraceTask
31
31
  from verifiers.v1.utils.interrupt import install_interrupt
32
32
  from verifiers.v1.utils.logging import setup_logging
33
- from verifiers.v1.utils.sampling import sample
34
33
 
35
34
  logger = logging.getLogger(__name__)
36
35
 
@@ -274,7 +273,7 @@ async def debug_task(task: Task, config: DebugConfig) -> tuple[Trace, bool]:
274
273
 
275
274
  async def run_debug(config: DebugConfig) -> list[Trace]:
276
275
  taskset = vf.load_taskset(config.taskset)
277
- tasks = sample(taskset.load(), config.shuffle, config.num_tasks)
276
+ tasks = taskset.select(config.num_tasks, config.shuffle)
278
277
  if isinstance(config.runtime, vf.SubprocessConfig) and any(
279
278
  type(t).NEEDS_CONTAINER or t.data.image for t in tasks
280
279
  ):
@@ -21,7 +21,7 @@ logger = logging.getLogger(__name__)
21
21
  async def run_eval(env: Environment, config: EvalConfig) -> list[Trace]:
22
22
  logger.info("eval config:\n%s", config.model_dump_json(indent=2))
23
23
  client = resolve_client(config.client)
24
- tasks = sample(env.taskset.load(), config.shuffle, config.num_tasks)
24
+ tasks = env.taskset.select(config.num_tasks, config.shuffle)
25
25
  ctx = ModelContext(client=client, model=config.model, sampling=config.sampling)
26
26
  # One episode of `num_rollouts` rollouts per task; the shared semaphore bounds total
27
27
  # concurrent rollouts (across episodes), so group rewards still see their whole episode.
@@ -162,7 +162,20 @@ async def run_eval_server(config: EvalConfig) -> list[Trace]:
162
162
  await client.wait_for_server_startup(timeout=600)
163
163
  info = await client.info()
164
164
  group_scored = info.requires_group_scoring
165
- idxs = sample(list(range(info.num_tasks)), config.shuffle, config.num_tasks)
165
+ if info.num_tasks is None: # infinite taskset - the run must be bounded
166
+ if config.num_tasks is None:
167
+ raise ValueError(
168
+ f"{config.env_id} is infinite - bound the run with -n/--num-tasks"
169
+ )
170
+ if config.shuffle:
171
+ logger.warning(
172
+ "shuffle is a no-op on an infinite taskset - "
173
+ "taking the first %d generated tasks",
174
+ config.num_tasks,
175
+ )
176
+ idxs = list(range(config.num_tasks))
177
+ else:
178
+ idxs = sample(list(range(info.num_tasks)), config.shuffle, config.num_tasks)
166
179
  out = output_path(config)
167
180
  finished: list[Trace] = []
168
181
  if config.resume is not None:
@@ -26,7 +26,6 @@ from verifiers.v1.task import Task
26
26
  from verifiers.v1.trace import Trace, TraceTask
27
27
  from verifiers.v1.utils.interrupt import install_interrupt
28
28
  from verifiers.v1.utils.logging import setup_logging
29
- from verifiers.v1.utils.sampling import sample
30
29
 
31
30
  logger = logging.getLogger(__name__)
32
31
 
@@ -198,7 +197,7 @@ async def _validate_task(task: Task, config: ValidateConfig) -> ResultRow:
198
197
 
199
198
  async def run_validate(config: ValidateConfig) -> list[dict]:
200
199
  taskset = vf.load_taskset(config.taskset)
201
- tasks = sample(taskset.load(), config.shuffle, config.num_tasks)
200
+ tasks = taskset.select(config.num_tasks, config.shuffle)
202
201
  if isinstance(config.runtime, vf.SubprocessConfig) and any(
203
202
  type(t).NEEDS_CONTAINER or t.data.image for t in tasks
204
203
  ):
@@ -28,6 +28,7 @@ class DebugConfig(BaseConfig):
28
28
  for the debug command/script."""
29
29
  num_tasks: int | None = Field(
30
30
  None,
31
+ ge=1,
31
32
  validation_alias=AliasChoices("num_tasks", "n", "num_examples", "batch_size"),
32
33
  )
33
34
  """How many tasks to debug (None = all)."""
@@ -22,6 +22,7 @@ class EvalConfig(EnvServerConfig):
22
22
  sampling: SamplingConfig = SamplingConfig()
23
23
  num_tasks: int | None = Field(
24
24
  None,
25
+ ge=1,
25
26
  validation_alias=AliasChoices("batch_size", "num_examples", "num_tasks", "n"),
26
27
  )
27
28
  """How many tasks to evaluate (None = all)."""
@@ -26,6 +26,7 @@ class ValidateConfig(BaseConfig):
26
26
  """Run only `Task.setup` and `Task.validate`."""
27
27
  num_tasks: int | None = Field(
28
28
  None,
29
+ ge=1,
29
30
  validation_alias=AliasChoices("num_tasks", "n", "num_examples", "batch_size"),
30
31
  )
31
32
  """How many tasks to validate (None = all)."""
@@ -42,7 +42,7 @@ class GEPAConfig(EnvConfig):
42
42
  """Tasks held out to score each candidate system prompt for the pareto frontier."""
43
43
  shuffle: bool = Field(True, validation_alias=AliasChoices("shuffle", "s"))
44
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
45
+ split, so GEPA carves one out of `Taskset.select` the way `run_eval` samples (fixed
46
46
  seed, so the split is reproducible across runs)."""
47
47
  seed: int = 0
48
48
  """Seed for GEPA's optimizer (candidate selection / minibatch sampling). Task shuffling
@@ -1,14 +1,13 @@
1
1
  """Train/val split and upfront validation for a GEPA run.
2
2
 
3
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.
4
+ individual tasksets define ad hoc ones inconsistently), so GEPA carves one out of the tasks
5
+ `Taskset.select` hands it (the shared fixed-seed shuffle, reproducible across runs like every
6
+ other entrypoint): two disjoint slices.
7
7
  """
8
8
 
9
9
  from verifiers.v1.decorators import discover_decorated
10
10
  from verifiers.v1.task import Task
11
- from verifiers.v1.utils.sampling import sample
12
11
 
13
12
 
14
13
  def reject_group_reward_tasksets(tasks: list[Task]) -> None:
@@ -26,19 +25,16 @@ def reject_group_reward_tasksets(tasks: list[Task]) -> None:
26
25
 
27
26
 
28
27
  def split_tasks(
29
- tasks: list[Task], num_train: int, num_val: int, shuffle: bool
28
+ tasks: list[Task], num_train: int, num_val: int
30
29
  ) -> tuple[list[Task], list[Task]]:
31
- """The taskset's tasks, split into disjoint `(train, val)` slices (`train` feeds reflection
30
+ """The selected tasks, split into disjoint `(train, val)` slices (`train` feeds reflection
32
31
  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):
32
+ if num_train + num_val > len(tasks):
37
33
  raise ValueError(
38
34
  f"requested {num_train} train + {num_val} val tasks, but the taskset only "
39
- f"loaded {len(pool)}"
35
+ f"loaded {len(tasks)}"
40
36
  )
41
- return pool[:num_train], pool[num_train : num_train + num_val]
37
+ return tasks[:num_train], tasks[num_train : num_train + num_val]
42
38
 
43
39
 
44
40
  def resolve_gepa_seed_prompt(tasks: list[Task], initial_prompt: str | None) -> str:
@@ -38,10 +38,8 @@ class _GEPALog:
38
38
 
39
39
  def run_gepa(env: Environment, config: GEPAConfig) -> GEPAResult:
40
40
  logger.info("gepa config:\n%s", config.model_dump_json(indent=2))
41
- all_tasks = env.taskset.load()
42
- train_tasks, val_tasks = split_tasks(
43
- all_tasks, config.num_train, config.num_val, config.shuffle
44
- )
41
+ all_tasks = env.taskset.select(config.num_train + config.num_val, config.shuffle)
42
+ train_tasks, val_tasks = split_tasks(all_tasks, config.num_train, config.num_val)
45
43
  selected_tasks = [*train_tasks, *val_tasks]
46
44
  reject_group_reward_tasksets(
47
45
  selected_tasks
@@ -329,7 +329,7 @@ class LegacyEnvServer(EnvServer):
329
329
  self.dataset = self.env.get_dataset()
330
330
  except ValueError:
331
331
  self.dataset = self.env.get_eval_dataset()
332
- self.tasks = self.dataset # `len(self.tasks)` drives the `info` response
332
+ self.num_tasks: int | None = len(self.dataset) # drives the `info` response
333
333
  self.requires_group_scoring = self.env.requires_group_rollouts
334
334
  self._clients: dict[tuple[str, str], Any] = {}
335
335
 
@@ -26,6 +26,9 @@ from verifiers.v1.types import SamplingConfig
26
26
 
27
27
  logger = logging.getLogger(__name__)
28
28
 
29
+ MAX_LAZY_TASKS = 1_000_000
30
+ """Most tasks an infinite taskset's generator is willing to build (and cache) per worker."""
31
+
29
32
 
30
33
  class EnvServer:
31
34
  def __init__(
@@ -34,11 +37,20 @@ class EnvServer:
34
37
  self.address = address
35
38
  self.taskset_id = config.taskset.id
36
39
  self.env = Environment(config)
37
- self.tasks = self.env.taskset.load()
40
+ # A finite taskset is materialized up front (its count is served via `info`); an
41
+ # infinite one is pulled off its generator on demand (see `_task`), so
42
+ # `num_tasks=None` on the wire ⟺ the taskset is infinite.
43
+ self._task_iter = iter(self.env.taskset.load())
44
+ self._tasks: list = []
45
+ self.num_tasks: int | None = None
46
+ if not type(self.env.taskset).INFINITE:
47
+ self._tasks = list(self._task_iter)
48
+ self.num_tasks = len(self._tasks)
38
49
  # One task type per taskset (the authoring contract; its `load()` constructs it),
39
50
  # so group scoring is a run-wide property.
40
- self.requires_group_scoring = bool(self.tasks) and bool(
41
- discover_decorated(self.tasks[0], "group_reward")
51
+ first = self._task(0) if self.num_tasks != 0 else None
52
+ self.requires_group_scoring = first is not None and bool(
53
+ discover_decorated(first, "group_reward")
42
54
  )
43
55
  self._clients: dict[
44
56
  tuple[str, str], Client
@@ -73,6 +85,26 @@ class EnvServer:
73
85
  # of a spurious multiprocessing traceback, matching serve_env's own handling.
74
86
  pass
75
87
 
88
+ def _task(self, idx: int):
89
+ """The task at `idx`; an infinite taskset is generated (and cached) up to `idx`
90
+ on demand. Generation must be deterministic — every pool worker runs its own
91
+ `load()`, so idx-addressing relies on all of them producing the same sequence.
92
+ Lazy generation is capped at `MAX_LAZY_TASKS`: an idx that far ahead is a
93
+ runaway driver, and generating (and caching) toward it would hang the worker
94
+ and exhaust memory instead of failing the one request."""
95
+ while len(self._tasks) <= idx:
96
+ if idx >= MAX_LAZY_TASKS:
97
+ raise IndexError(
98
+ f"task_idx {idx} exceeds the lazy-generation cap ({MAX_LAZY_TASKS})"
99
+ )
100
+ try:
101
+ self._tasks.append(next(self._task_iter))
102
+ except StopIteration:
103
+ raise IndexError(
104
+ f"task_idx {idx} out of range ({len(self._tasks)} tasks)"
105
+ ) from None
106
+ return self._tasks[idx]
107
+
76
108
  def _client(self, client_config: ClientConfig, model: str) -> Client:
77
109
  """Cache clients because renderer initialization builds a tokenizer pool."""
78
110
  key = (client_config.model_dump_json(), model)
@@ -96,14 +128,14 @@ class EnvServer:
96
128
 
97
129
  async def _run_rollout(self, req: RunRolloutRequest) -> RunRolloutResponse:
98
130
  ctx = self._context(req.client, req.model, req.sampling)
99
- episode = self.env.episode(self.tasks[req.task_idx], ctx, n=1)
131
+ episode = self.env.episode(self._task(req.task_idx), ctx, n=1)
100
132
  traces = await episode.run()
101
133
  # Trust the concrete trace; serialize it once before client-side re-typing.
102
134
  return RunRolloutResponse.model_construct(trace=traces[0])
103
135
 
104
136
  async def _run_group(self, req: RunGroupRequest) -> RunGroupResponse:
105
137
  ctx = self._context(req.client, req.model, req.sampling)
106
- episode = self.env.episode(self.tasks[req.task_idx], ctx, n=req.n)
138
+ episode = self.env.episode(self._task(req.task_idx), ctx, n=req.n)
107
139
  traces = await episode.run()
108
140
  # Avoid a dump-and-validate copy for every trusted trace in the group.
109
141
  return RunGroupResponse.model_construct(traces=traces)
@@ -118,7 +150,7 @@ class EnvServer:
118
150
  response: BaseResponse = HealthResponse()
119
151
  elif route == "info":
120
152
  response = InfoResponse(
121
- num_tasks=len(self.tasks),
153
+ num_tasks=self.num_tasks,
122
154
  requires_group_scoring=self.requires_group_scoring,
123
155
  )
124
156
  elif route == "run_rollout":
@@ -151,10 +183,10 @@ class EnvServer:
151
183
 
152
184
  async def run(self) -> None:
153
185
  logger.info(
154
- "EnvServer up: taskset=%s address=%s tasks=%d group_scoring=%s",
186
+ "EnvServer up: taskset=%s address=%s tasks=%s group_scoring=%s",
155
187
  self.taskset_id,
156
188
  self.address,
157
- len(self.tasks),
189
+ self.num_tasks if self.num_tasks is not None else "infinite",
158
190
  self.requires_group_scoring,
159
191
  )
160
192
  poller = zmq.asyncio.Poller()
@@ -1,6 +1,6 @@
1
1
  from typing import ClassVar
2
2
 
3
- from pydantic import BaseModel, field_serializer
3
+ from pydantic import BaseModel, Field, field_serializer
4
4
 
5
5
  from verifiers.v1.clients.config import ClientConfig
6
6
  from verifiers.v1.task import WireTaskData
@@ -32,14 +32,15 @@ class InfoRequest(BaseRequest):
32
32
 
33
33
 
34
34
  class InfoResponse(BaseResponse):
35
- num_tasks: int = 0
35
+ num_tasks: int | None = None
36
+ """Task count; `None` means the taskset is infinite (bound runs with `num_tasks`)."""
36
37
  requires_group_scoring: bool = False
37
38
  """Whether tasks must be run and resumed as whole groups."""
38
39
 
39
40
 
40
41
  class RunRolloutRequest(BaseRequest):
41
42
  method: ClassVar[str] = "run_rollout"
42
- task_idx: int
43
+ task_idx: int = Field(ge=0)
43
44
  client: ClientConfig
44
45
  model: str
45
46
  sampling: SamplingConfig
@@ -56,7 +57,7 @@ class RunRolloutResponse(BaseResponse):
56
57
 
57
58
  class RunGroupRequest(BaseRequest):
58
59
  method: ClassVar[str] = "run_group"
59
- task_idx: int
60
+ task_idx: int = Field(ge=0)
60
61
  n: int
61
62
  client: ClientConfig
62
63
  model: str
@@ -1,12 +1,17 @@
1
1
  """The taskset: a thin loader that yields typed tasks.
2
2
 
3
3
  A `Taskset` is the data half of an environment: config in, tasks out. `load()` — the one
4
- subclass hook, and the one method consumers call — builds each row's `TaskData` and wraps
5
- it in the task type with the config's task-facing subtree:
4
+ subclass hook — builds each row's `TaskData` and wraps it in the task type with the
5
+ config's task-facing subtree:
6
6
 
7
- def load(self) -> list[MyTask]:
7
+ def load(self) -> Iterable[MyTask]:
8
8
  return [MyTask(MyData(idx=i, ...), self.config.task) for i in ...]
9
9
 
10
+ `load` may also be a generator — yielding each task as it's built, possibly forever (a
11
+ procedural taskset; declare `INFINITE = True`). Runs materialize the tasks they need
12
+ through `select`, which pulls only that many off a generator; the env server instead
13
+ pulls `load` on demand, task by task.
14
+
10
15
  Load-time knobs (dataset, split, seed) live on the taskset config; the task-facing knobs
11
16
  under its `task` subtree (`TasksetConfig.task`, a `TaskConfig`, everything under
12
17
  `--taskset.task.*`); a worker-scoped shared tool server is declared on `tools` with its knobs
@@ -22,6 +27,9 @@ replay can rebuild every saved row as the declared type's data and re-wrap it.
22
27
 
23
28
  from __future__ import annotations
24
29
 
30
+ import itertools
31
+ import logging
32
+ from collections.abc import Iterable
25
33
  from typing import TYPE_CHECKING, ClassVar, Generic
26
34
 
27
35
  from pydantic import SerializeAsAny
@@ -31,10 +39,13 @@ from typing_extensions import TypeVar
31
39
  from verifiers.v1.task import TaskConfig, TaskT, resolve_server_config
32
40
  from verifiers.v1.types import ID
33
41
  from verifiers.v1.utils.install import env_name
42
+ from verifiers.v1.utils.sampling import sample
34
43
 
35
44
  if TYPE_CHECKING:
36
45
  from verifiers.v1.mcp import Toolset
37
46
 
47
+ logger = logging.getLogger(__name__)
48
+
38
49
 
39
50
  class TasksetConfig(BaseConfig):
40
51
  id: ID = ""
@@ -51,15 +62,46 @@ TasksetConfigT = TypeVar("TasksetConfigT", bound=TasksetConfig, default=TasksetC
51
62
 
52
63
 
53
64
  class Taskset(Generic[TaskT, TasksetConfigT]):
65
+ INFINITE: ClassVar[bool] = False
66
+ """Whether `load` yields tasks forever (a procedural generator). Infinity is inherent
67
+ to the taskset, not a config knob: consumers bound a run with `select(num_tasks)`
68
+ (`-n` on the CLI), and shuffle is impossible."""
69
+
54
70
  tools: ClassVar[tuple[type[Toolset], ...]] = ()
55
71
  """Tool server classes shared by one environment worker's rollouts."""
56
72
 
57
73
  def __init__(self, config: TasksetConfigT) -> None:
58
74
  self.config = config
59
75
 
60
- def load(self) -> list[TaskT]:
76
+ def load(self) -> Iterable[TaskT]:
61
77
  raise NotImplementedError
62
78
 
79
+ def select(
80
+ self, num_tasks: int | None = None, shuffle: bool = False
81
+ ) -> list[TaskT]:
82
+ """Materialize the tasks a run needs: the first `num_tasks` off `load` (all of
83
+ them when `None`), pulled lazily — a generator `load` only builds what the run
84
+ takes. `shuffle` samples the subset from the whole taskset instead (the shared
85
+ fixed-seed shuffle, `verifiers.v1.utils.sampling`), which materializes everything
86
+ first; on an `INFINITE` taskset it's a no-op (warned) — the first `num_tasks`
87
+ generated tasks are already an arbitrary sample."""
88
+ if type(self).INFINITE:
89
+ if num_tasks is None:
90
+ raise ValueError(
91
+ f"{type(self).__name__} is infinite - select a bounded subset "
92
+ "with num_tasks (-n on the CLI)"
93
+ )
94
+ if shuffle:
95
+ logger.warning(
96
+ "shuffle is a no-op on an infinite taskset - "
97
+ "taking the first %d generated tasks",
98
+ num_tasks,
99
+ )
100
+ return list(itertools.islice(self.load(), num_tasks))
101
+ if shuffle:
102
+ return sample(self.load(), shuffle=True, limit=num_tasks)
103
+ return list(itertools.islice(self.load(), num_tasks))
104
+
63
105
  def server_config(self, server_cls: type) -> BaseConfig:
64
106
  """The config a `tools` entry is built with, resolved off `self.config` (the
65
107
  taskset config; see `resolve_server_config`). Override to pair explicitly."""
@@ -6,8 +6,10 @@ outcome there; scoring reads that file instead of trusting conversational text.
6
6
  """
7
7
 
8
8
  import copy
9
+ import itertools
9
10
  import json
10
11
  import random
12
+ from collections.abc import Iterator
11
13
  from typing import Literal
12
14
 
13
15
  import verifiers.v1 as vf
@@ -88,7 +90,6 @@ class TextArenaConfig(vf.TasksetConfig):
88
90
  "WordLadder-v0",
89
91
  "WordSearch-v0",
90
92
  ]
91
- num_tasks: int = 1000
92
93
  task: TextArenaTaskConfig = TextArenaTaskConfig()
93
94
 
94
95
 
@@ -115,7 +116,9 @@ class TextArenaTask(vf.Task[TextArenaData, TextArenaState, TextArenaTaskConfig])
115
116
 
116
117
 
117
118
  class TextArenaTaskset(vf.Taskset[TextArenaTask, TextArenaConfig]):
118
- def load(self) -> list[TextArenaTask]:
119
+ INFINITE = True
120
+
121
+ def load(self) -> Iterator[TextArenaTask]:
119
122
  nltk.download("words", quiet=True)
120
123
  nltk.download("averaged_perceptron_tagger_eng", quiet=True)
121
124
  template = ta.make(env_id=self.config.game)
@@ -130,8 +133,8 @@ class TextArenaTaskset(vf.Taskset[TextArenaTask, TextArenaConfig]):
130
133
  # seed-invariant; otherwise each task must expose its seeded board.
131
134
  first = observation(0)
132
135
  seed_specific = observation(1) != first
133
- return [
134
- TextArenaTask(
136
+ for i in itertools.count():
137
+ yield TextArenaTask(
135
138
  TextArenaData(
136
139
  idx=i,
137
140
  name=f"{self.config.game}#{i}",
@@ -141,8 +144,6 @@ class TextArenaTaskset(vf.Taskset[TextArenaTask, TextArenaConfig]):
141
144
  ),
142
145
  self.config.task,
143
146
  )
144
- for i in range(self.config.num_tasks)
145
- ]
146
147
 
147
148
 
148
149
  if __name__ == "__main__":
@@ -0,0 +1,25 @@
1
+ """Shared sampling: an optional fixed-seed shuffle, then an optional head-slice.
2
+
3
+ Every entrypoint narrows its items the same way: with `--shuffle`, a shuffle under a fixed
4
+ seed so the sampled subset is the *same* every run (reproducible), then an optional slice to
5
+ the first `limit`. Taskset entrypoints (eval, validate, debug, GEPA) go through
6
+ `Taskset.select`, which shares this shuffle; the server eval path and the legacy bridge
7
+ sample plain index lists here directly.
8
+ """
9
+
10
+ import random
11
+ from collections.abc import Iterable
12
+ from typing import TypeVar
13
+
14
+ SEED = 0 # fixed so `--shuffle` samples the same items every run (reproducible)
15
+
16
+ T = TypeVar("T")
17
+
18
+
19
+ def sample(items: Iterable[T], shuffle: bool, limit: int | None = None) -> list[T]:
20
+ """`items` optionally shuffled under the fixed seed, then optionally sliced to the first
21
+ `limit`. Returns a new list; the input is left untouched."""
22
+ items = list(items)
23
+ if shuffle:
24
+ random.Random(SEED).shuffle(items)
25
+ return items if limit is None else items[:limit]
@@ -1,26 +0,0 @@
1
- """Shared task sampling: an optional fixed-seed shuffle, then an optional head-slice.
2
-
3
- Every taskset entrypoint — eval, server eval, debug, validate, legacy eval, and GEPA — narrows
4
- the loaded tasks (or their indices) the same way: with `--shuffle`, a shuffle under a fixed seed
5
- so the sampled subset is the *same* every run (reproducible), then an optional slice to the
6
- first `limit`. GEPA layers its disjoint train/val split on top of this shuffle (see
7
- `verifiers.v1.gepa.dataset`).
8
- """
9
-
10
- import random
11
- from typing import TypeVar
12
-
13
- _SHUFFLE_SEED = (
14
- 0 # fixed so `--shuffle` samples the same items every run (reproducible)
15
- )
16
-
17
- T = TypeVar("T")
18
-
19
-
20
- def sample(items: list[T], shuffle: bool, limit: int | None = None) -> list[T]:
21
- """`items` optionally shuffled under the fixed seed, then optionally sliced to the first
22
- `limit`. Returns a new list; the input is left untouched."""
23
- items = list(items)
24
- if shuffle:
25
- random.Random(_SHUFFLE_SEED).shuffle(items)
26
- return items if limit is None else items[:limit]
File without changes