verifiers 0.2.2.dev50__tar.gz → 0.2.2.dev52__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/PKG-INFO +1 -1
  2. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/conftest.py +4 -9
  3. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/test_color_codeword_tasks.py +1 -3
  4. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/test_e2e.py +1 -1
  5. verifiers-0.2.2.dev52/tests/v1/test_taskset.py +93 -0
  6. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/debug.py +8 -1
  7. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/eval/runner.py +18 -4
  8. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/validate.py +8 -1
  9. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/taskset.py +2 -2
  10. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/env.py +2 -2
  11. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/gepa/runner.py +4 -1
  12. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/judge.py +2 -2
  13. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/loaders.py +4 -4
  14. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/mcp/server.py +2 -2
  15. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/state.py +2 -2
  16. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/task.py +31 -33
  17. verifiers-0.2.2.dev52/verifiers/v1/taskset.py +116 -0
  18. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/generic.py +1 -1
  19. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/sampling.py +4 -5
  20. verifiers-0.2.2.dev50/tests/v1/test_taskset.py +0 -71
  21. verifiers-0.2.2.dev50/verifiers/v1/taskset.py +0 -103
  22. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/.gitignore +0 -0
  23. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/LICENSE +0 -0
  24. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/README.md +0 -0
  25. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/pyproject.toml +0 -0
  26. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/__init__.py +0 -0
  27. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/conftest.py +0 -0
  28. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_browser_env.py +0 -0
  29. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_build_script.py +0 -0
  30. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_cli_agent_env.py +0 -0
  31. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_client_auth_errors.py +0 -0
  32. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_client_config.py +0 -0
  33. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_client_multimodal_types.py +0 -0
  34. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_composable_env.py +0 -0
  35. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_context_token_metrics.py +0 -0
  36. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_decorator_ranks.py +0 -0
  37. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_endpoint_registry.py +0 -0
  38. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_env_group.py +0 -0
  39. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_env_server.py +0 -0
  40. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_environment.py +0 -0
  41. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_environment_extra.py +0 -0
  42. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_error_chain.py +0 -0
  43. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_eval_display.py +0 -0
  44. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_eval_utils.py +0 -0
  45. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_gepa_cli.py +0 -0
  46. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_gepa_utils.py +0 -0
  47. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_gym_env.py +0 -0
  48. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_harbor_env_mcp.py +0 -0
  49. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_imports.py +0 -0
  50. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_init_script.py +0 -0
  51. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_install_utils.py +0 -0
  52. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_interception_utils.py +0 -0
  53. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_logging.py +0 -0
  54. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_math_rubric.py +0 -0
  55. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_maybe_think_parser.py +0 -0
  56. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_message_utils.py +0 -0
  57. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_message_utils_multimodal.py +0 -0
  58. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_multiturn_env.py +0 -0
  59. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_nemorl_client.py +0 -0
  60. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_openai_chat_completions_token_client.py +0 -0
  61. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_openai_responses_client.py +0 -0
  62. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_opencode_rlm_env.py +0 -0
  63. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_openenv_client.py +0 -0
  64. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_parser.py +0 -0
  65. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_path_utils.py +0 -0
  66. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_per_turn_timing.py +0 -0
  67. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_pricing_utils.py +0 -0
  68. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_prime_plugin.py +0 -0
  69. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_renderer_client.py +0 -0
  70. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_renderer_e2e.py +0 -0
  71. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_rlm_composable_env.py +0 -0
  72. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_rubric.py +0 -0
  73. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_rubric_group.py +0 -0
  74. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_sandbox_debug_env.py +0 -0
  75. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_sandbox_env.py +0 -0
  76. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_sandbox_mixin.py +0 -0
  77. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_save_utils.py +0 -0
  78. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_setup_script.py +0 -0
  79. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_singleturn_env.py +0 -0
  80. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_stateful_tool_env.py +0 -0
  81. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_think_parser.py +0 -0
  82. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_tool_env.py +0 -0
  83. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_tool_utils.py +0 -0
  84. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_trajectory_processing.py +0 -0
  85. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_tui_info_formatting.py +0 -0
  86. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_types.py +0 -0
  87. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_xml_parser.py +0 -0
  88. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  89. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/duet_v1.py +0 -0
  90. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  91. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  92. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  93. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  94. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  95. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/echo_v0.py +0 -0
  96. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/echo_v1.py +0 -0
  97. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/pyproject.toml +0 -0
  98. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  99. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/test_configs.py +0 -0
  100. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/test_envs.py +0 -0
  101. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/test_graph.py +0 -0
  102. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/test_judges.py +0 -0
  103. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/test_legacy.py +0 -0
  104. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/test_scoring.py +0 -0
  105. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/test_trace.py +0 -0
  106. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/__init__.py +0 -0
  107. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/__init__.py +0 -0
  108. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/commands/__init__.py +0 -0
  109. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/commands/build.py +0 -0
  110. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/commands/eval.py +0 -0
  111. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/commands/gepa.py +0 -0
  112. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/commands/init.py +0 -0
  113. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/commands/install.py +0 -0
  114. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/commands/setup.py +0 -0
  115. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/plugins/__init__.py +0 -0
  116. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/plugins/prime.py +0 -0
  117. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/tui.py +0 -0
  118. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/clients/__init__.py +0 -0
  119. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/clients/anthropic_messages_client.py +0 -0
  120. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/clients/client.py +0 -0
  121. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  122. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/clients/openai_chat_completions_client.py +0 -0
  123. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  124. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/clients/openai_completions_client.py +0 -0
  125. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/clients/openai_responses_client.py +0 -0
  126. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/clients/renderer_client.py +0 -0
  127. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/decorators.py +0 -0
  128. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/__init__.py +0 -0
  129. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/env_group.py +0 -0
  130. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/environment.py +0 -0
  131. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/README.md +0 -0
  132. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/__init__.py +0 -0
  133. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  134. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/README.md +0 -0
  135. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/__init__.py +0 -0
  136. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/_filter.py +0 -0
  137. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  138. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/harness.py +0 -0
  139. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  140. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  141. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  142. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  143. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  144. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  145. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  146. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/task.py +0 -0
  147. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  148. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  149. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  150. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  151. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  152. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  153. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  154. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  155. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  156. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  157. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  158. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  159. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  160. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  161. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  162. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  163. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  164. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  165. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  166. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  167. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  168. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  169. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  170. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  171. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  172. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  173. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  174. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  175. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  176. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  177. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  178. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  179. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  180. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  181. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/gym_env.py +0 -0
  182. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  183. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  184. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  185. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/mcp_env.py +0 -0
  186. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/opencode_env.py +0 -0
  187. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  188. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  189. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  190. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/utils/__init__.py +0 -0
  191. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  192. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  193. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/README.md +0 -0
  194. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/__init__.py +0 -0
  195. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/browser_env/README.md +0 -0
  196. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  197. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  198. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  199. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  200. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  201. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  202. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/openenv_env.py +0 -0
  203. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  204. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/textarena_env.py +0 -0
  205. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/multiturn_env.py +0 -0
  206. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/python_env.py +0 -0
  207. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/sandbox_env.py +0 -0
  208. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/singleturn_env.py +0 -0
  209. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/stateful_tool_env.py +0 -0
  210. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/tool_env.py +0 -0
  211. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/errors.py +0 -0
  212. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/gepa/__init__.py +0 -0
  213. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/gepa/adapter.py +0 -0
  214. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/gepa/config.py +0 -0
  215. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/gepa/display.py +0 -0
  216. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/gepa/gepa_utils.py +0 -0
  217. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/parsers/__init__.py +0 -0
  218. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/parsers/maybe_think_parser.py +0 -0
  219. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/parsers/parser.py +0 -0
  220. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/parsers/think_parser.py +0 -0
  221. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/parsers/xml_parser.py +0 -0
  222. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/rubrics/__init__.py +0 -0
  223. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  224. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/rubrics/judge_rubric.py +0 -0
  225. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/rubrics/math_rubric.py +0 -0
  226. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/rubrics/rubric.py +0 -0
  227. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/rubrics/rubric_group.py +0 -0
  228. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/scripts/__init__.py +0 -0
  229. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/scripts/build.py +0 -0
  230. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/scripts/eval.py +0 -0
  231. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/scripts/gepa.py +0 -0
  232. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/scripts/init.py +0 -0
  233. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/scripts/install.py +0 -0
  234. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/scripts/setup.py +0 -0
  235. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/scripts/tui.py +0 -0
  236. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/serve/__init__.py +0 -0
  237. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/serve/client/env_client.py +0 -0
  238. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/serve/client/zmq_env_client.py +0 -0
  239. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/serve/server/__init__.py +0 -0
  240. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/serve/server/env_router.py +0 -0
  241. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/serve/server/env_server.py +0 -0
  242. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/serve/server/env_worker.py +0 -0
  243. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/serve/server/zmq_env_server.py +0 -0
  244. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/serve/types.py +0 -0
  245. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/types.py +0 -0
  246. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/__init__.py +0 -0
  247. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/async_utils.py +0 -0
  248. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/client_utils.py +0 -0
  249. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/config_utils.py +0 -0
  250. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/data_utils.py +0 -0
  251. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/display_utils.py +0 -0
  252. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/env_config_utils.py +0 -0
  253. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/env_utils.py +0 -0
  254. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/error_utils.py +0 -0
  255. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/eval_display.py +0 -0
  256. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/eval_utils.py +0 -0
  257. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/heartbeat.py +0 -0
  258. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/import_utils.py +0 -0
  259. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/install_utils.py +0 -0
  260. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/interception_utils.py +0 -0
  261. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/logging_utils.py +0 -0
  262. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/message_utils.py +0 -0
  263. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/metric_utils.py +0 -0
  264. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/path_utils.py +0 -0
  265. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/pricing_utils.py +0 -0
  266. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/process_utils.py +0 -0
  267. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/response_utils.py +0 -0
  268. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/save_utils.py +0 -0
  269. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/serve_utils.py +0 -0
  270. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/thread_utils.py +0 -0
  271. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/threaded_sandbox_client.py +0 -0
  272. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/tool_utils.py +0 -0
  273. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/usage_utils.py +0 -0
  274. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/version_utils.py +0 -0
  275. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/__init__.py +0 -0
  276. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/acp/__init__.py +0 -0
  277. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/acp/_runner.py +0 -0
  278. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/agent.py +0 -0
  279. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/__init__.py +0 -0
  280. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  281. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/dashboard/base.py +0 -0
  282. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/dashboard/eval.py +0 -0
  283. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/dashboard/replay.py +0 -0
  284. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/dashboard/validate.py +0 -0
  285. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/eval/__init__.py +0 -0
  286. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/eval/main.py +0 -0
  287. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/eval/resume.py +0 -0
  288. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/gepa.py +0 -0
  289. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/init.py +0 -0
  290. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/output.py +0 -0
  291. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/replay.py +0 -0
  292. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/resolve.py +0 -0
  293. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/serve.py +0 -0
  294. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/clients/__init__.py +0 -0
  295. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/clients/client.py +0 -0
  296. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/clients/config.py +0 -0
  297. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/clients/eval.py +0 -0
  298. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/clients/train.py +0 -0
  299. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/__init__.py +0 -0
  300. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/agent.py +0 -0
  301. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/cli/__init__.py +0 -0
  302. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/cli/debug.py +0 -0
  303. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/cli/env.py +0 -0
  304. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/cli/eval.py +0 -0
  305. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/cli/init.py +0 -0
  306. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/cli/replay.py +0 -0
  307. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/cli/serve.py +0 -0
  308. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/cli/validate.py +0 -0
  309. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/env.py +0 -0
  310. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/harness.py +0 -0
  311. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/judge.py +0 -0
  312. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/legacy.py +0 -0
  313. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/retries.py +0 -0
  314. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/serve.py +0 -0
  315. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/task.py +0 -0
  316. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/decorators.py +0 -0
  317. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/dialects/__init__.py +0 -0
  318. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/dialects/anthropic.py +0 -0
  319. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/dialects/base.py +0 -0
  320. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/dialects/chat.py +0 -0
  321. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/dialects/responses.py +0 -0
  322. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/envs/__init__.py +0 -0
  323. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  324. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  325. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  326. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/envs/best_of_n/env.py +0 -0
  327. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  328. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/envs/single_agent/env.py +0 -0
  329. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  330. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/envs/user_sim/env.py +0 -0
  331. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/episode.py +0 -0
  332. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/errors.py +0 -0
  333. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/gepa/__init__.py +0 -0
  334. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/gepa/adapter.py +0 -0
  335. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/gepa/config.py +0 -0
  336. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/gepa/dataset.py +0 -0
  337. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/gepa/reflection.py +0 -0
  338. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/graph.py +0 -0
  339. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harness.py +0 -0
  340. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/__init__.py +0 -0
  341. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  342. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/bash/harness.py +0 -0
  343. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/bash/program.py +0 -0
  344. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  345. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  346. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  347. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/codex/harness.py +0 -0
  348. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  349. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  350. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  351. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  352. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  353. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/null/__init__.py +0 -0
  354. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/null/harness.py +0 -0
  355. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/null/program.py +0 -0
  356. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  357. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/pi/harness.py +0 -0
  358. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  359. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/pool/harness.py +0 -0
  360. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  361. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  362. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  363. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  364. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  365. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/interception/__init__.py +0 -0
  366. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/interception/base.py +0 -0
  367. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/interception/pool.py +0 -0
  368. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/interception/server.py +0 -0
  369. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  370. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/interception/tunnel/base.py +0 -0
  371. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/interception/tunnel/custom.py +0 -0
  372. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/interception/tunnel/prime.py +0 -0
  373. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/judges/__init__.py +0 -0
  374. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/judges/reference.py +0 -0
  375. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/judges/reference.txt +0 -0
  376. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/judges/rubric.py +0 -0
  377. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/judges/rubric.txt +0 -0
  378. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/legacy.py +0 -0
  379. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/mcp/__init__.py +0 -0
  380. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/mcp/launch.py +0 -0
  381. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/mcp/toolset.py +0 -0
  382. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/push.py +0 -0
  383. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/retries.py +0 -0
  384. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/rollout.py +0 -0
  385. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/runtimes/__init__.py +0 -0
  386. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/runtimes/base.py +0 -0
  387. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  388. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/runtimes/docker/egress.py +0 -0
  389. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/runtimes/limiters.py +0 -0
  390. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/runtimes/modal.py +0 -0
  391. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/runtimes/prime.py +0 -0
  392. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/runtimes/subprocess.py +0 -0
  393. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/scoring.py +0 -0
  394. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/serve/__init__.py +0 -0
  395. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/serve/client.py +0 -0
  396. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/serve/pool.py +0 -0
  397. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/serve/server.py +0 -0
  398. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/serve/types.py +0 -0
  399. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/session.py +0 -0
  400. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/tasksets/__init__.py +0 -0
  401. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  402. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  403. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  404. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  405. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  406. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  407. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  408. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  409. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  410. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/trace.py +0 -0
  411. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/types.py +0 -0
  412. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/__init__.py +0 -0
  413. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/aio.py +0 -0
  414. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/compile.py +0 -0
  415. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/format.py +0 -0
  416. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/git.py +0 -0
  417. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/image.py +0 -0
  418. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/install.py +0 -0
  419. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/interrupt.py +0 -0
  420. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/logging.py +0 -0
  421. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/memory.py +0 -0
  422. {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.2.2.dev50
3
+ Version: 0.2.2.dev52
4
4
  Summary: Verifiers: Environments for LLM Reinforcement Learning
5
5
  Project-URL: Homepage, https://github.com/primeintellect-ai/verifiers
6
6
  Project-URL: Documentation, https://github.com/primeintellect-ai/verifiers
@@ -135,10 +135,6 @@ def _eval_config(
135
135
  `{id: ...}` config; `runtime` places the `agent` seat's harness (an agent field, not a
136
136
  harness one); `model` overrides the default text model (e.g. a VLM for an image task).
137
137
 
138
- `temperature=0` (greedy) makes the run reproducible; `max_tokens` is generous headroom,
139
- not a target — these trivial tasks finish in a few hundred tokens, so capping tighter only
140
- risks truncating the reasoning before the answer (which tanks the reward).
141
-
142
138
  `harness=None` leaves every seat on its own story — the multi-agent case: there
143
139
  is no run-level harness, so a single-agent test's `harness` lands on the `agent`
144
140
  seat and a multi-agent test pins its seats through `env` role fields instead."""
@@ -175,7 +171,6 @@ def _eval_config(
175
171
  num_rollouts=n,
176
172
  sampling={
177
173
  "max_tokens": max_tokens,
178
- "temperature": 0,
179
174
  "reasoning_effort": reasoning_effort,
180
175
  },
181
176
  rich=False,
@@ -219,8 +214,8 @@ def run_v1_server():
219
214
 
220
215
  @pytest.fixture
221
216
  async def live_ctx():
222
- """A live `ModelContext` (the e2e default model + endpoint, greedy) for driving
223
- `Agent` directly — the agent-surface counterpart of `run_v1`."""
217
+ """A live `ModelContext` (the e2e default model + endpoint, provider-default
218
+ sampling) for driving `Agent` directly — the agent-surface counterpart of `run_v1`."""
224
219
  from verifiers.v1.clients import EvalClientConfig, ModelContext, resolve_client
225
220
  from verifiers.v1.types import SamplingConfig
226
221
 
@@ -229,7 +224,7 @@ async def live_ctx():
229
224
  yield ModelContext(
230
225
  model="deepseek/deepseek-v4-flash",
231
226
  client=client,
232
- sampling=SamplingConfig(max_tokens=2048, temperature=0),
227
+ sampling=SamplingConfig(max_tokens=2048),
233
228
  )
234
229
  finally:
235
230
  await client.close()
@@ -252,7 +247,7 @@ def run_v0():
252
247
  legacy={"id": env_id, "args": args or {}},
253
248
  num_tasks=1,
254
249
  num_rollouts=n,
255
- sampling={"max_tokens": max_tokens, "temperature": 0},
250
+ sampling={"max_tokens": max_tokens},
256
251
  rich=False,
257
252
  output_dir=output_dir,
258
253
  )
@@ -10,9 +10,7 @@ def test_color_images_are_rendered_once(monkeypatch) -> None:
10
10
  return render(image)
11
11
 
12
12
  monkeypatch.setattr(taskset, "image_data_url", counted)
13
- tasks = taskset.ColorCodewordTaskset(taskset.ColorCodewordConfig()).select(
14
- num_tasks=100
15
- )
13
+ tasks = list(taskset.ColorCodewordTaskset(taskset.ColorCodewordConfig()).head(100))
16
14
 
17
15
  assert len(tasks) == 100
18
16
  assert calls == list(taskset.COLOR_RGB.values())
@@ -109,7 +109,7 @@ async def test_single_turn(run_v1, harness, harness_runtime, tmp_path):
109
109
  assert trace.stop_condition == "agent_completed"
110
110
  assert trace.reward == 1.0
111
111
  # The seat's resolved identity rides the trace (policy metadata for trainers).
112
- assert trace.agent is not None and trace.agent.config.sampling.temperature == 0
112
+ assert trace.agent is not None and trace.agent.config.sampling.max_tokens == 2048
113
113
  # Every sampled turn has one per-call record, linked to its assistant node.
114
114
  sampled = [i for i, n in enumerate(trace.nodes) if n.sampled]
115
115
  assert [c.node for c in trace.calls if c.error is None] == sampled
@@ -0,0 +1,93 @@
1
+ """`Taskset` iteration and the `head`/`shuffle` views over list, generator,
2
+ and `INFINITE` `load` implementations."""
3
+
4
+ import itertools
5
+
6
+ import pytest
7
+
8
+ import verifiers.v1 as vf
9
+
10
+
11
+ class CountTask(vf.Task[vf.TaskData]):
12
+ pass
13
+
14
+
15
+ class InfiniteTaskset(vf.Taskset[CountTask, vf.TasksetConfig]):
16
+ INFINITE = True
17
+
18
+ def load(self):
19
+ for i in itertools.count():
20
+ yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
21
+
22
+
23
+ class FiniteTaskset(vf.Taskset[CountTask, vf.TasksetConfig]):
24
+ def load(self):
25
+ for i in range(10):
26
+ yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
27
+
28
+
29
+ def idxs(tasks) -> list[int]:
30
+ return [task.data.idx for task in tasks]
31
+
32
+
33
+ def test_head_bounds_an_infinite_taskset() -> None:
34
+ tasks = list(InfiniteTaskset(vf.TasksetConfig()).head(5))
35
+ assert idxs(tasks) == [0, 1, 2, 3, 4]
36
+
37
+
38
+ def test_iteration_materializes_a_finite_taskset() -> None:
39
+ taskset = FiniteTaskset(vf.TasksetConfig())
40
+ assert len(list(taskset)) == 10
41
+ assert idxs(taskset.head(4)) == [0, 1, 2, 3]
42
+
43
+
44
+ def test_head_returns_the_same_taskset_type() -> None:
45
+ view = FiniteTaskset(vf.TasksetConfig()).head(4)
46
+ assert isinstance(view, FiniteTaskset)
47
+ assert view.task_type() is CountTask
48
+
49
+
50
+ def test_shuffle_samples_the_whole_taskset_reproducibly() -> None:
51
+ taskset = FiniteTaskset(vf.TasksetConfig())
52
+ first = idxs(taskset.shuffle().head(5))
53
+ assert first == idxs(taskset.shuffle().head(5))
54
+ assert len(first) == 5 and set(first) <= set(range(10))
55
+ assert first != [0, 1, 2, 3, 4] # sampled from the whole set, not the head
56
+
57
+
58
+ def test_shuffle_seed_changes_the_sample() -> None:
59
+ taskset = FiniteTaskset(vf.TasksetConfig())
60
+ seeded = idxs(taskset.shuffle(seed=7).head(5))
61
+ assert seeded == idxs(taskset.shuffle(seed=7).head(5)) # reproducible per seed
62
+ assert seeded != idxs(taskset.shuffle().head(5)) # differs from the default seed
63
+
64
+
65
+ def test_shuffle_raises_on_infinite() -> None:
66
+ with pytest.raises(ValueError, match="infinite"):
67
+ InfiniteTaskset(vf.TasksetConfig()).shuffle()
68
+
69
+
70
+ def test_head_then_shuffle_bounds_an_infinite_taskset() -> None:
71
+ head = idxs(InfiniteTaskset(vf.TasksetConfig()).head(5).shuffle())
72
+ assert sorted(head) == [0, 1, 2, 3, 4]
73
+ assert head != [0, 1, 2, 3, 4] # shuffled within the bounded head
74
+
75
+
76
+ def test_head_only_builds_what_the_run_takes() -> None:
77
+ built: list[int] = []
78
+
79
+ class RecordingTaskset(InfiniteTaskset):
80
+ def load(self):
81
+ for i in itertools.count():
82
+ built.append(i)
83
+ yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
84
+
85
+ list(RecordingTaskset(vf.TasksetConfig()).head(3))
86
+ assert built == [0, 1, 2]
87
+
88
+
89
+ def test_views_do_not_mutate_the_base_taskset() -> None:
90
+ taskset = InfiniteTaskset(vf.TasksetConfig())
91
+ view = taskset.head(3)
92
+ assert view.INFINITE is False and taskset.INFINITE is True
93
+ assert idxs(taskset.head(2)) == [0, 1] # base iterates untransformed
@@ -263,7 +263,14 @@ async def debug_task(task: Task, config: DebugConfig) -> tuple[Trace, bool]:
263
263
 
264
264
  async def run_debug(config: DebugConfig) -> list[Trace]:
265
265
  taskset = vf.load_taskset(config.taskset)
266
- tasks = taskset.select(config.num_tasks, config.shuffle)
266
+ if config.num_tasks is None and taskset.INFINITE:
267
+ raise ValueError(
268
+ f"{type(taskset).__name__} is infinite - bound the run with -n"
269
+ )
270
+ selected = taskset.shuffle() if config.shuffle else taskset
271
+ if config.num_tasks is not None:
272
+ selected = selected.head(config.num_tasks)
273
+ tasks = list(selected)
267
274
  if isinstance(config.runtime, vf.SubprocessConfig) and any(
268
275
  type(t).NEEDS_CONTAINER or t.data.image for t in tasks
269
276
  ):
@@ -26,7 +26,15 @@ logger = logging.getLogger(__name__)
26
26
  async def run_eval(env: Env, config: EvalConfig) -> list[Episode]:
27
27
  logger.info("eval config:\n%s", config.model_dump_json(indent=2))
28
28
  client = resolve_client(config.client)
29
- tasks = env.taskset.select(config.num_tasks, config.shuffle)
29
+ taskset = env.taskset
30
+ if config.num_tasks is None and taskset.INFINITE:
31
+ raise ValueError(
32
+ f"{type(taskset).__name__} is infinite - bound the run with -n"
33
+ )
34
+ selected = taskset.shuffle() if config.shuffle else taskset
35
+ if config.num_tasks is not None:
36
+ selected = selected.head(config.num_tasks)
37
+ tasks = list(selected)
30
38
  ctx = ModelContext(client=client, model=config.model, sampling=config.sampling)
31
39
  semaphore = (
32
40
  asyncio.Semaphore(config.max_concurrent) if config.max_concurrent else None
@@ -132,9 +140,15 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
132
140
 
133
141
  # The client owns the taskset: load it here, once — the server (and its pool
134
142
  # workers) never load data, they rebuild each dispatched task from its request.
135
- tasks = load_taskset(config.env.taskset).select(
136
- config.num_tasks, config.shuffle
137
- )
143
+ taskset = load_taskset(config.env.taskset)
144
+ if config.num_tasks is None and taskset.INFINITE:
145
+ raise ValueError(
146
+ f"{type(taskset).__name__} is infinite - bound the run with -n"
147
+ )
148
+ selected = taskset.shuffle() if config.shuffle else taskset
149
+ if config.num_tasks is not None:
150
+ selected = selected.head(config.num_tasks)
151
+ tasks = list(selected)
138
152
  # Spawned processes inherit no logging — hand them the main process's setup so
139
153
  # their rollout logs land in the output dir.
140
154
  level = "DEBUG" if config.verbose else "INFO"
@@ -203,7 +203,14 @@ async def _validate_task(task: Task, config: ValidateConfig) -> ResultRow:
203
203
 
204
204
  async def run_validate(config: ValidateConfig) -> list[dict]:
205
205
  taskset = vf.load_taskset(config.taskset)
206
- tasks = taskset.select(config.num_tasks, config.shuffle)
206
+ if config.num_tasks is None and taskset.INFINITE:
207
+ raise ValueError(
208
+ f"{type(taskset).__name__} is infinite - bound the run with -n"
209
+ )
210
+ selected = taskset.shuffle() if config.shuffle else taskset
211
+ if config.num_tasks is not None:
212
+ selected = selected.head(config.num_tasks)
213
+ tasks = list(selected)
207
214
  if isinstance(config.runtime, vf.SubprocessConfig) and any(
208
215
  type(t).NEEDS_CONTAINER or t.data.image for t in tasks
209
216
  ):
@@ -17,8 +17,8 @@ class TasksetConfig(BaseConfig):
17
17
  task: SerializeAsAny[TaskConfig] = TaskConfig()
18
18
  """Config passed to each task, under `--env.taskset.task.*`."""
19
19
  system_prompt: Path | None = None
20
- """File whose text overrides each task's `TaskData.system_prompt` in
21
- `Taskset.select` (e.g. a GEPA `best_system_prompt.txt`)."""
20
+ """File whose text overrides each task's `TaskData.system_prompt` on
21
+ iteration (e.g. a GEPA `best_system_prompt.txt`)."""
22
22
 
23
23
  @property
24
24
  def name(self) -> str:
@@ -33,7 +33,7 @@ from verifiers.v1.retries import run_episode_with_retry
33
33
  from verifiers.v1.runtimes import SubprocessConfig, runtime_is_local
34
34
  from verifiers.v1.task import Task, resolve_server_config
35
35
  from verifiers.v1.trace import Error, Trace
36
- from verifiers.v1.utils.generic import generic_type
36
+ from verifiers.v1.utils.generic import concrete_type
37
37
  from verifiers.v1.utils.memory import trim_memory_periodically
38
38
 
39
39
  logger = logging.getLogger(__name__)
@@ -83,7 +83,7 @@ class Env(ABC, Generic[ConfigT]):
83
83
  def __init__(self, config: ConfigT) -> None:
84
84
  from verifiers.v1.loaders import load_harness, load_taskset
85
85
 
86
- config_cls = generic_type(type(self), EnvConfig, origin=Env) or EnvConfig
86
+ config_cls = concrete_type(type(self), EnvConfig, origin=Env) or EnvConfig
87
87
  if not isinstance(config, config_cls):
88
88
  raise TypeError(
89
89
  f"{type(self).__name__} declares Env[{config_cls.__name__}], "
@@ -37,7 +37,10 @@ class _GEPALog:
37
37
 
38
38
  def run_gepa(env: Env, config: GEPAConfig) -> GEPAResult:
39
39
  logger.info("gepa config:\n%s", config.model_dump_json(indent=2))
40
- all_tasks = env.taskset.select(config.num_train + config.num_val, config.shuffle)
40
+ # Global shuffle: an infinite taskset raises here — run it with
41
+ # shuffle=false (there is no whole set to sample from).
42
+ taskset = env.taskset.shuffle() if config.shuffle else env.taskset
43
+ all_tasks = list(taskset.head(config.num_train + config.num_val))
41
44
  train_tasks, val_tasks = split_tasks(all_tasks, config.num_train, config.num_val)
42
45
  selected_tasks = [*train_tasks, *val_tasks]
43
46
  # Seed from the tasks GEPA actually evaluates (train ∪ val), not the full pre-split pool —
@@ -63,7 +63,7 @@ from verifiers.v1.configs.judge import (
63
63
  from verifiers.v1.dialects.chat import message_to_wire
64
64
  from verifiers.v1.scoring import parse_judge_choice
65
65
  from verifiers.v1.types import Messages, StrictBaseModel, Usage
66
- from verifiers.v1.utils.generic import generic_type
66
+ from verifiers.v1.utils.generic import concrete_type
67
67
 
68
68
  if TYPE_CHECKING:
69
69
  from verifiers.v1.task import TaskData
@@ -111,7 +111,7 @@ ConfigT = TypeVar("ConfigT", bound=JudgeConfig, default=JudgeConfig)
111
111
 
112
112
  def judge_config_cls(cls: type) -> type[JudgeConfig]:
113
113
  """Resolve a judge's config specialization through its MRO, else `JudgeConfig`."""
114
- return generic_type(cls, JudgeConfig) or JudgeConfig
114
+ return concrete_type(cls, JudgeConfig) or JudgeConfig
115
115
 
116
116
 
117
117
  class Judge(Generic[ParsedT, ConfigT]):
@@ -20,7 +20,7 @@ from verifiers.v1.harness import Harness
20
20
  from verifiers.v1.judge import Judge, judge_config_cls
21
21
  from verifiers.v1.task import Task
22
22
  from verifiers.v1.taskset import Taskset
23
- from verifiers.v1.utils.generic import generic_type, prefix_validation_error
23
+ from verifiers.v1.utils.generic import concrete_type, prefix_validation_error
24
24
  from verifiers.v1.utils.install import ensure_installed
25
25
 
26
26
 
@@ -208,7 +208,7 @@ def load_judge(config: JudgeConfig) -> Judge:
208
208
  def taskset_config_type(taskset_id: str) -> type[TasksetConfig]:
209
209
  """Resolve the taskset's config specialization through its MRO."""
210
210
  return (
211
- generic_type(taskset_class(taskset_id), TasksetConfig, origin=Taskset)
211
+ concrete_type(taskset_class(taskset_id), TasksetConfig, origin=Taskset)
212
212
  or TasksetConfig
213
213
  )
214
214
 
@@ -216,7 +216,7 @@ def taskset_config_type(taskset_id: str) -> type[TasksetConfig]:
216
216
  def harness_config_type(harness_id: str) -> type[HarnessConfig]:
217
217
  """Resolve the harness's config specialization through its MRO."""
218
218
  return (
219
- generic_type(harness_class(harness_id), HarnessConfig, origin=Harness)
219
+ concrete_type(harness_class(harness_id), HarnessConfig, origin=Harness)
220
220
  or HarnessConfig
221
221
  )
222
222
 
@@ -231,7 +231,7 @@ def env_config_type(taskset_id: str, env_id: str = "") -> type[EnvConfig]:
231
231
  its MRO — `SingleAgentEnvConfig` for a plain taskset. The run's `env` field
232
232
  narrows to this, which is what gives `--env.<role>.model` addressing."""
233
233
  return (
234
- generic_type(environment_class(taskset_id, env_id), EnvConfig, origin=Env)
234
+ concrete_type(environment_class(taskset_id, env_id), EnvConfig, origin=Env)
235
235
  or EnvConfig
236
236
  )
237
237
 
@@ -13,7 +13,7 @@ from pydantic import TypeAdapter, ValidationError
13
13
  from pydantic_config import BaseConfig
14
14
 
15
15
  from verifiers.v1.state import State, StateT, state_cls
16
- from verifiers.v1.utils.generic import generic_type
16
+ from verifiers.v1.utils.generic import concrete_type
17
17
 
18
18
  if TYPE_CHECKING:
19
19
  from httpx import AsyncClient, Response
@@ -286,7 +286,7 @@ class ServerBase(Generic[ConfigT, StateT]):
286
286
  @classmethod
287
287
  def _config_cls(cls) -> type[BaseConfig]:
288
288
  """Resolve the server's config specialization through its MRO."""
289
- if config_cls := generic_type(cls, BaseConfig):
289
+ if config_cls := concrete_type(cls, BaseConfig):
290
290
  return config_cls
291
291
  raise TypeError(
292
292
  f"{cls.__name__} must parameterize its config, e.g. Toolset[MyConfig]"
@@ -8,7 +8,7 @@ from pydantic import ConfigDict
8
8
  from typing_extensions import TypeVar
9
9
 
10
10
  from verifiers.v1.types import StrictBaseModel
11
- from verifiers.v1.utils.generic import generic_type
11
+ from verifiers.v1.utils.generic import concrete_type
12
12
 
13
13
 
14
14
  class State(StrictBaseModel):
@@ -20,4 +20,4 @@ StateT = TypeVar("StateT", bound=State, default=State)
20
20
 
21
21
  def state_cls(cls: type) -> type[State]:
22
22
  """Resolve a class's `State` specialization through its MRO, else `State`."""
23
- return generic_type(cls, State) or State
23
+ return concrete_type(cls, State) or State
@@ -39,7 +39,7 @@ from verifiers.v1.decorators import discover_decorated, invoke_all
39
39
  from verifiers.v1.errors import TaskError, boundary
40
40
  from verifiers.v1.state import StateT
41
41
  from verifiers.v1.types import Messages, StrictBaseModel, content_text
42
- from verifiers.v1.utils.generic import generic_type
42
+ from verifiers.v1.utils.generic import concrete_type
43
43
 
44
44
  if TYPE_CHECKING:
45
45
  from verifiers.v1.judge import Judge
@@ -50,27 +50,6 @@ if TYPE_CHECKING:
50
50
  logger = logging.getLogger(__name__)
51
51
 
52
52
 
53
- def _requires_runtime(fn) -> bool:
54
- param = inspect.signature(fn).parameters.get("runtime")
55
- # A defaulted runtime parameter can still be called offline with None.
56
- return param is not None and param.default is inspect.Parameter.empty
57
-
58
-
59
- def _record_result(
60
- trace: Trace,
61
- name: str,
62
- result,
63
- weight: float | None = None,
64
- ) -> None:
65
- """Record a scalar or keyed scoring result."""
66
- values = list(result.items()) if isinstance(result, Mapping) else [(name, result)]
67
- for key, value in values:
68
- if weight is None:
69
- trace.record_metric(key, value)
70
- else:
71
- trace.record_reward(key, value, weight)
72
-
73
-
74
53
  class TaskResources(StrictBaseModel):
75
54
  model_config = ConfigDict(frozen=True)
76
55
 
@@ -149,12 +128,12 @@ ConfigT = TypeVar("ConfigT", bound=TaskConfig, default=TaskConfig)
149
128
 
150
129
  def task_data_cls(cls: type) -> type[TaskData]:
151
130
  """Resolve a task's `TaskData` specialization through its MRO, else `TaskData`."""
152
- return generic_type(cls, TaskData) or TaskData
131
+ return concrete_type(cls, TaskData) or TaskData
153
132
 
154
133
 
155
134
  def task_config_cls(cls: type) -> type[TaskConfig]:
156
135
  """Resolve a task's `TaskConfig` specialization through its MRO, else `TaskConfig`."""
157
- return generic_type(cls, TaskConfig) or TaskConfig
136
+ return concrete_type(cls, TaskConfig) or TaskConfig
158
137
 
159
138
 
160
139
  def resolve_server_config(
@@ -239,6 +218,11 @@ class Task(Generic[DataT, StateT, ConfigT]):
239
218
  trace: Trace,
240
219
  runtime: Runtime | None = None,
241
220
  ) -> None:
221
+ def requires_runtime(fn) -> bool:
222
+ param = inspect.signature(fn).parameters.get("runtime")
223
+ # A defaulted runtime parameter can still be called offline with None.
224
+ return param is not None and param.default is inspect.Parameter.empty
225
+
242
226
  judges = self.plugged_judges()
243
227
  available = {"task": self.data, "trace": trace}
244
228
  if runtime is not None:
@@ -249,36 +233,50 @@ class Task(Generic[DataT, StateT, ConfigT]):
249
233
  rewards = discover_decorated(self, "reward")
250
234
  if runtime is None:
251
235
  skipped = [
252
- fn.__name__ for fn in (*metrics, *rewards) if _requires_runtime(fn)
236
+ fn.__name__ for fn in (*metrics, *rewards) if requires_runtime(fn)
253
237
  ] + [
254
238
  judge.reward_name
255
239
  for judge in judges
256
- if _requires_runtime(judge.score)
240
+ if requires_runtime(judge.score)
257
241
  ]
258
242
  if skipped:
259
243
  logger.info(
260
244
  "score: no runtime — skipped runtime-dependent signals: %s",
261
245
  skipped,
262
246
  )
263
- metrics = [fn for fn in metrics if not _requires_runtime(fn)]
264
- rewards = [fn for fn in rewards if not _requires_runtime(fn)]
247
+ metrics = [fn for fn in metrics if not requires_runtime(fn)]
248
+ rewards = [fn for fn in rewards if not requires_runtime(fn)]
265
249
  judges = [
266
- judge for judge in judges if not _requires_runtime(judge.score)
250
+ judge for judge in judges if not requires_runtime(judge.score)
267
251
  ]
268
252
 
269
253
  metric_results = await invoke_all(metrics, available)
270
254
  for fn, result in zip(metrics, metric_results):
271
- _record_result(trace, fn.__name__, result)
255
+ if isinstance(result, Mapping):
256
+ trace.record_metrics(result)
257
+ else:
258
+ trace.record_metric(fn.__name__, result)
272
259
  reward_results = await invoke_all(rewards, available)
273
260
  for fn, result in zip(rewards, reward_results):
274
- _record_result(
275
- trace, fn.__name__, result, getattr(fn, "_vf_weight", 1.0)
261
+ weight = getattr(fn, "_vf_weight", 1.0)
262
+ items = (
263
+ result.items()
264
+ if isinstance(result, Mapping)
265
+ else [(fn.__name__, result)]
276
266
  )
267
+ for key, value in items:
268
+ trace.record_reward(key, value, weight)
277
269
  judge_results = await invoke_all(
278
270
  [judge.score for judge in judges], available
279
271
  )
280
272
  for judge, result in zip(judges, judge_results):
281
- _record_result(trace, judge.reward_name, result, judge.config.weight)
273
+ items = (
274
+ result.items()
275
+ if isinstance(result, Mapping)
276
+ else [(judge.reward_name, result)]
277
+ )
278
+ for key, value in items:
279
+ trace.record_reward(key, value, judge.config.weight)
282
280
 
283
281
 
284
282
  TaskT = TypeVar("TaskT", bound=Task)
@@ -0,0 +1,116 @@
1
+ """The taskset: a thin loader that yields typed tasks.
2
+
3
+ A `Taskset` is the data half of an environment: config in, tasks out. `load()` is
4
+ the main hook that builds each task:
5
+
6
+ def load(self) -> Iterable[MyTask]:
7
+ for i in ...:
8
+ yield MyTask(MyData(idx=i, ...), self.config.task)
9
+
10
+ `load` may also be a generator for infinite tasksets. There is a one-to-one
11
+ mapping between taskset and task type, i.e. a taskset may only yield one task
12
+ type.
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ import copy
18
+ import itertools
19
+ import random
20
+ from abc import ABC, abstractmethod
21
+ from collections.abc import Callable, Iterable, Iterator
22
+ from typing import TYPE_CHECKING, ClassVar, Generic, Self
23
+
24
+ from pydantic_config import BaseConfig
25
+ from typing_extensions import TypeVar
26
+
27
+ from verifiers.v1.configs.taskset import TasksetConfig
28
+ from verifiers.v1.task import Task, TaskT, resolve_server_config
29
+ from verifiers.v1.utils.generic import concrete_type
30
+ from verifiers.v1.utils.sampling import SEED
31
+
32
+ if TYPE_CHECKING:
33
+ from verifiers.v1.mcp import Toolset
34
+
35
+ TasksetConfigT = TypeVar("TasksetConfigT", bound=TasksetConfig, default=TasksetConfig)
36
+
37
+
38
+ class Taskset(ABC, Generic[TaskT, TasksetConfigT]):
39
+ INFINITE: bool = False
40
+ """Whether the taskset is infinite (yields tasks forever). Class-declared;
41
+ a `head(n)` view shadows it per instance (bounded by construction)."""
42
+
43
+ tools: ClassVar[tuple[type[Toolset], ...]] = ()
44
+ """Tool servers shared by all tasks in the taskset. The environment will
45
+ spawn a single, global instance, reused across tasks."""
46
+
47
+ def __init__(self, config: TasksetConfigT) -> None:
48
+ self.config = config
49
+ override = config.system_prompt
50
+ self.system_prompt = override.read_text() if override is not None else None
51
+ self.transform: Callable[[Iterator[TaskT]], Iterator[TaskT]] | None = None
52
+ """Iteration transform carried by `head`/`shuffle` views (see `view`)."""
53
+
54
+ @abstractmethod
55
+ def load(self) -> Iterable[TaskT]:
56
+ """Build and yield the taskset's tasks; may be a generator (see module doc)."""
57
+
58
+ def __iter__(self) -> Iterator[TaskT]:
59
+ """Lazily iterate `load()` with the config-layer system prompt applied and
60
+ any view transform on top — the read path; `load` is the subclass hook."""
61
+ prompt = self.system_prompt
62
+ tasks = (
63
+ task.with_system_prompt(prompt) if prompt is not None else task
64
+ for task in self.load()
65
+ )
66
+ yield from self.transform(tasks) if self.transform is not None else tasks
67
+
68
+ def view(self, transform: Callable[[Iterator[TaskT]], Iterator[TaskT]]) -> Self:
69
+ """A shallow copy of this taskset iterating through `transform`, composed
70
+ onto any transform this taskset already carries."""
71
+ clone = copy.copy(self)
72
+ prev = self.transform
73
+ clone.transform = (
74
+ transform if prev is None else lambda tasks: transform(prev(tasks))
75
+ )
76
+ return clone
77
+
78
+ def head(self, num_tasks: int) -> Self:
79
+ """A lazy, always-finite view of the first `num_tasks` tasks."""
80
+ view = self.view(lambda tasks: itertools.islice(tasks, num_tasks))
81
+ view.INFINITE = False
82
+ return view
83
+
84
+ def shuffle(self, seed: int | None = None) -> Self:
85
+ """A shuffled view under `seed` — the shared fixed seed when None, so runs
86
+ sample reproducibly (materializes the receiver on iteration); raises on an
87
+ infinite taskset — bound it first (`head(n).shuffle()`)."""
88
+ if self.INFINITE:
89
+ raise ValueError(
90
+ f"{type(self).__name__} is infinite - cannot shuffle; "
91
+ "bound it first with head(num_tasks)"
92
+ )
93
+
94
+ def shuffled(tasks: Iterator[TaskT]) -> Iterator[TaskT]:
95
+ materialized = list(tasks)
96
+ random.Random(SEED if seed is None else seed).shuffle(materialized)
97
+ return iter(materialized)
98
+
99
+ return self.view(shuffled)
100
+
101
+ @classmethod
102
+ def task_type(cls) -> type[Task]:
103
+ return concrete_type(cls, Task, origin=Taskset) or Task
104
+
105
+ def server_config(self, server_cls: type) -> BaseConfig:
106
+ """The config a `tools` entry is built with, resolved off `self.config` (the
107
+ taskset config; see `resolve_server_config`). Override to pair explicitly."""
108
+ return resolve_server_config(
109
+ type(self).__name__,
110
+ self.config,
111
+ server_cls,
112
+ sole=len(set(type(self).tools)) == 1,
113
+ )
114
+
115
+ def tool_servers(self) -> list[Toolset]:
116
+ return [cls(self.server_config(cls)) for cls in type(self).tools]
@@ -39,7 +39,7 @@ def deep_merge(base: dict, override: dict) -> dict:
39
39
  return merged
40
40
 
41
41
 
42
- def generic_type(
42
+ def concrete_type(
43
43
  cls: type, bound: type[T], *, origin: type | None = None
44
44
  ) -> type[T] | None:
45
45
  """Find a concrete bounded type through `cls`'s MRO, most-derived first."""
@@ -1,10 +1,9 @@
1
1
  """Shared sampling: an optional fixed-seed shuffle, then an optional head-slice.
2
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.
3
+ With `--shuffle`, a shuffle under the fixed `SEED` so the sampled subset is the *same*
4
+ every run (reproducible), then an optional slice to the first `limit`. Used by the paths
5
+ that sample plain index lists (the server eval path and the legacy bridge); tasksets
6
+ shuffle themselves (`Taskset.shuffle`, same default seed).
8
7
  """
9
8
 
10
9
  import random