verifiers 0.1.15.dev157__tar.gz → 0.1.15.dev159__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 (326) hide show
  1. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/PKG-INFO +9 -9
  2. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/pyproject.toml +8 -8
  3. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_imports.py +3 -0
  4. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_init_script.py +1 -1
  5. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_v1_config_extension.py +92 -0
  6. verifiers-0.1.15.dev159/tests/test_v1_replay_harness.py +327 -0
  7. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_v1_runtime_lifecycle.py +107 -1
  8. verifiers-0.1.15.dev159/tests/test_v1_taskset_utils.py +120 -0
  9. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/scripts/init.py +1 -1
  10. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/env_utils.py +48 -7
  11. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/harness.py +5 -3
  12. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/runtime.py +142 -68
  13. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/taskset.py +1 -1
  14. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/taskset_utils.py +13 -3
  15. verifiers-0.1.15.dev157/tests/test_v1_taskset_utils.py +0 -46
  16. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/.gitignore +0 -0
  17. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/LICENSE +0 -0
  18. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/README.md +0 -0
  19. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/AGENTS.md +0 -0
  20. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/README.md +0 -0
  21. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/__init__.py +0 -0
  22. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/conftest.py +0 -0
  23. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_browser_env.py +0 -0
  24. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_build_script.py +0 -0
  25. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_cli_agent_env.py +0 -0
  26. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_client_auth_errors.py +0 -0
  27. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_client_config.py +0 -0
  28. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_client_multimodal_types.py +0 -0
  29. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_composable_env.py +0 -0
  30. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_context_token_metrics.py +0 -0
  31. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_decorator_ranks.py +0 -0
  32. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_endpoint_registry.py +0 -0
  33. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_env_group.py +0 -0
  34. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_env_server.py +0 -0
  35. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_environment.py +0 -0
  36. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_environment_extra.py +0 -0
  37. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_envs.py +0 -0
  38. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_error_chain.py +0 -0
  39. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_eval_cli.py +0 -0
  40. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_eval_display.py +0 -0
  41. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_eval_utils.py +0 -0
  42. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_gepa_cli.py +0 -0
  43. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_gepa_utils.py +0 -0
  44. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_gym_env.py +0 -0
  45. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_harbor_env_mcp.py +0 -0
  46. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_install_utils.py +0 -0
  47. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_interception_utils.py +0 -0
  48. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_langchain_deep_agents_wikispeedia.py +0 -0
  49. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_lean_task.py +0 -0
  50. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_logging.py +0 -0
  51. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_math_rubric.py +0 -0
  52. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_maybe_think_parser.py +0 -0
  53. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_mcp_search_env.py +0 -0
  54. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_message_utils.py +0 -0
  55. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_message_utils_multimodal.py +0 -0
  56. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_multiturn_env.py +0 -0
  57. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_nemorl_client.py +0 -0
  58. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_openai_chat_completions_token_client.py +0 -0
  59. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_openai_responses_client.py +0 -0
  60. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_opencode_harbor.py +0 -0
  61. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_opencode_rlm_env.py +0 -0
  62. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_openenv_client.py +0 -0
  63. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_parser.py +0 -0
  64. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_path_utils.py +0 -0
  65. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_per_turn_timing.py +0 -0
  66. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_pricing_utils.py +0 -0
  67. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_prime_plugin.py +0 -0
  68. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_renderer_client.py +0 -0
  69. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_renderer_e2e.py +0 -0
  70. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_rlm_composable_env.py +0 -0
  71. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_rlm_env.py +0 -0
  72. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_rubric.py +0 -0
  73. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_rubric_group.py +0 -0
  74. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_sandbox_env.py +0 -0
  75. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_sandbox_mixin.py +0 -0
  76. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_save_utils.py +0 -0
  77. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_setup_script.py +0 -0
  78. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_singleturn_env.py +0 -0
  79. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_stateful_tool_env.py +0 -0
  80. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_think_parser.py +0 -0
  81. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_tool_env.py +0 -0
  82. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_tool_utils.py +0 -0
  83. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_trajectory_processing.py +0 -0
  84. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_tui_info_formatting.py +0 -0
  85. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_types.py +0 -0
  86. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_v1_bfcl.py +0 -0
  87. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_v1_empty_completions.py +0 -0
  88. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_v1_endpoint_protocols.py +0 -0
  89. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_v1_example_counts.py +0 -0
  90. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_v1_group_reward_env.py +0 -0
  91. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_v1_harbor_cli.py +0 -0
  92. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_v1_mini_swe_agent.py +0 -0
  93. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_v1_nemo_gym_harness.py +0 -0
  94. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_v1_openenv_taskset.py +0 -0
  95. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_v1_openreward_taskset.py +0 -0
  96. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_v1_rlm_swe.py +0 -0
  97. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_v1_scoring_functions.py +0 -0
  98. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_v1_taskset_bindings.py +0 -0
  99. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_v1_textarena_taskset.py +0 -0
  100. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_wiki_search_v1.py +0 -0
  101. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_wordle_env.py +0 -0
  102. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_wordle_v1_env.py +0 -0
  103. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/tests/test_xml_parser.py +0 -0
  104. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/AGENTS.md +0 -0
  105. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/__init__.py +0 -0
  106. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/cli/__init__.py +0 -0
  107. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/cli/commands/__init__.py +0 -0
  108. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/cli/commands/build.py +0 -0
  109. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/cli/commands/eval.py +0 -0
  110. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/cli/commands/gepa.py +0 -0
  111. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/cli/commands/init.py +0 -0
  112. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/cli/commands/install.py +0 -0
  113. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/cli/commands/setup.py +0 -0
  114. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/cli/plugins/__init__.py +0 -0
  115. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/cli/plugins/prime.py +0 -0
  116. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/cli/tui.py +0 -0
  117. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/clients/__init__.py +0 -0
  118. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/clients/anthropic_messages_client.py +0 -0
  119. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/clients/client.py +0 -0
  120. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  121. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/clients/openai_chat_completions_client.py +0 -0
  122. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  123. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/clients/openai_completions_client.py +0 -0
  124. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/clients/openai_responses_client.py +0 -0
  125. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/clients/renderer_client.py +0 -0
  126. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/decorators.py +0 -0
  127. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/AGENTS.md +0 -0
  128. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/__init__.py +0 -0
  129. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/env_group.py +0 -0
  130. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/environment.py +0 -0
  131. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/README.md +0 -0
  132. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/__init__.py +0 -0
  133. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  134. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/README.md +0 -0
  135. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/__init__.py +0 -0
  136. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/_filter.py +0 -0
  137. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  138. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/harness.py +0 -0
  139. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  140. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  141. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  142. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  143. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  144. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  145. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/task.py +0 -0
  146. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  147. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  148. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  149. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  150. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  151. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  152. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/lean/__init__.py +0 -0
  153. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/lean/lean_task.py +0 -0
  154. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  155. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  156. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  157. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  158. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  159. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  160. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  161. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  162. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  163. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  164. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  165. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  166. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  167. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  168. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  169. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  170. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  171. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  172. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  173. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  174. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  175. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  176. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  177. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  178. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  179. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/gym_env.py +0 -0
  180. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  181. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  182. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  183. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/mcp_env.py +0 -0
  184. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/opencode_env.py +0 -0
  185. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  186. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  187. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/rlm_env.py +0 -0
  188. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  189. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/utils/__init__.py +0 -0
  190. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  191. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  192. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/integrations/README.md +0 -0
  193. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/integrations/__init__.py +0 -0
  194. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/integrations/browser_env/README.md +0 -0
  195. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  196. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  197. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  198. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  199. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  200. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  201. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/integrations/openenv_env.py +0 -0
  202. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  203. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/integrations/textarena_env.py +0 -0
  204. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/multiturn_env.py +0 -0
  205. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/python_env.py +0 -0
  206. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/sandbox_env.py +0 -0
  207. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/singleturn_env.py +0 -0
  208. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/stateful_tool_env.py +0 -0
  209. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/envs/tool_env.py +0 -0
  210. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/errors.py +0 -0
  211. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/gepa/__init__.py +0 -0
  212. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/gepa/adapter.py +0 -0
  213. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/gepa/config.py +0 -0
  214. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/gepa/display.py +0 -0
  215. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/gepa/gepa_utils.py +0 -0
  216. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/parsers/__init__.py +0 -0
  217. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/parsers/maybe_think_parser.py +0 -0
  218. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/parsers/parser.py +0 -0
  219. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/parsers/think_parser.py +0 -0
  220. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/parsers/xml_parser.py +0 -0
  221. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/rl/README.md +0 -0
  222. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/rl/__init__.py +0 -0
  223. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/rl/inference/__init__.py +0 -0
  224. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/rl/inference/client.py +0 -0
  225. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/rl/inference/server.py +0 -0
  226. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/rl/trainer/__init__.py +0 -0
  227. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/rl/trainer/config.py +0 -0
  228. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/rl/trainer/orchestrator.py +0 -0
  229. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/rl/trainer/trainer.py +0 -0
  230. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/rl/trainer/utils.py +0 -0
  231. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/rubrics/__init__.py +0 -0
  232. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  233. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/rubrics/judge_rubric.py +0 -0
  234. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/rubrics/math_rubric.py +0 -0
  235. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/rubrics/rubric.py +0 -0
  236. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/rubrics/rubric_group.py +0 -0
  237. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/scripts/__init__.py +0 -0
  238. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/scripts/build.py +0 -0
  239. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/scripts/eval.py +0 -0
  240. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/scripts/gepa.py +0 -0
  241. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/scripts/install.py +0 -0
  242. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/scripts/rl.py +0 -0
  243. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/scripts/setup.py +0 -0
  244. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/scripts/train.py +0 -0
  245. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/scripts/tui.py +0 -0
  246. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/scripts/vllm.py +0 -0
  247. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/serve/__init__.py +0 -0
  248. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/serve/client/env_client.py +0 -0
  249. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/serve/client/zmq_env_client.py +0 -0
  250. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/serve/server/__init__.py +0 -0
  251. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/serve/server/env_router.py +0 -0
  252. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/serve/server/env_server.py +0 -0
  253. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/serve/server/env_worker.py +0 -0
  254. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/serve/server/zmq_env_server.py +0 -0
  255. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/serve/types.py +0 -0
  256. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/types.py +0 -0
  257. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/__init__.py +0 -0
  258. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/async_utils.py +0 -0
  259. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/client_utils.py +0 -0
  260. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/config_utils.py +0 -0
  261. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/data_utils.py +0 -0
  262. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/display_utils.py +0 -0
  263. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/env_config_utils.py +0 -0
  264. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/error_utils.py +0 -0
  265. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/eval_display.py +0 -0
  266. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/eval_utils.py +0 -0
  267. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/heartbeat.py +0 -0
  268. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/import_utils.py +0 -0
  269. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/install_utils.py +0 -0
  270. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/interception_utils.py +0 -0
  271. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/logging_utils.py +0 -0
  272. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/message_utils.py +0 -0
  273. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/metric_utils.py +0 -0
  274. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/path_utils.py +0 -0
  275. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/pricing_utils.py +0 -0
  276. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/process_utils.py +0 -0
  277. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/response_utils.py +0 -0
  278. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/save_utils.py +0 -0
  279. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/serve_utils.py +0 -0
  280. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/thread_utils.py +0 -0
  281. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/threaded_sandbox_client.py +0 -0
  282. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/tool_utils.py +0 -0
  283. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/usage_utils.py +0 -0
  284. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/utils/version_utils.py +0 -0
  285. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/ENVIRONMENT_BEST_PRACTICES.md +0 -0
  286. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/README.md +0 -0
  287. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/RE_MIGRATION.md +0 -0
  288. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/__init__.py +0 -0
  289. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/artifact.py +0 -0
  290. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/config.py +0 -0
  291. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/env.py +0 -0
  292. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/model.py +0 -0
  293. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/program.py +0 -0
  294. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/runtime_handles.py +0 -0
  295. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/sandbox.py +0 -0
  296. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/state.py +0 -0
  297. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/task.py +0 -0
  298. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/toolset.py +0 -0
  299. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/types.py +0 -0
  300. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/user.py +0 -0
  301. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/__init__.py +0 -0
  302. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/binding_utils.py +0 -0
  303. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/config_callable_utils.py +0 -0
  304. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/config_utils.py +0 -0
  305. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/endpoint_utils.py +0 -0
  306. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/json_utils.py +0 -0
  307. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/judge_utils.py +0 -0
  308. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/lifecycle_utils.py +0 -0
  309. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/logging_utils.py +0 -0
  310. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/mcp_proxy_utils.py +0 -0
  311. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/mcp_utils.py +0 -0
  312. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/object_utils.py +0 -0
  313. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/program_utils.py +0 -0
  314. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/prompt_utils.py +0 -0
  315. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/runtime_owner_utils.py +0 -0
  316. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/runtime_registry.py +0 -0
  317. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/sandbox_program_utils.py +0 -0
  318. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/sandbox_python_utils.py +0 -0
  319. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/sandbox_utils.py +0 -0
  320. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/scoring_utils.py +0 -0
  321. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/serialization_utils.py +0 -0
  322. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/task_freeze_utils.py +0 -0
  323. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/tool_utils.py +0 -0
  324. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/toolset_utils.py +0 -0
  325. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/trajectory_utils.py +0 -0
  326. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev159}/verifiers/v1/utils/usage_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.1.15.dev157
3
+ Version: 0.1.15.dev159
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
@@ -54,17 +54,17 @@ Requires-Dist: aiohttp>=3.9.0; extra == 'browser'
54
54
  Requires-Dist: python-dotenv>=1.0.0; extra == 'browser'
55
55
  Requires-Dist: stagehand>=3.0.0; extra == 'browser'
56
56
  Provides-Extra: harnesses
57
- Requires-Dist: harnesses>=0.1.1; extra == 'harnesses'
57
+ Requires-Dist: harnesses>=0.1.2; extra == 'harnesses'
58
58
  Provides-Extra: nemogym
59
- Requires-Dist: harnesses[nemogym]>=0.1.1; extra == 'nemogym'
60
- Requires-Dist: tasksets[nemogym]>=0.1.1; extra == 'nemogym'
59
+ Requires-Dist: harnesses[nemogym]>=0.1.2; extra == 'nemogym'
60
+ Requires-Dist: tasksets[nemogym]>=0.1.5; extra == 'nemogym'
61
61
  Provides-Extra: openenv
62
- Requires-Dist: tasksets[openenv]>=0.1.1; extra == 'openenv'
62
+ Requires-Dist: tasksets[openenv]>=0.1.5; extra == 'openenv'
63
63
  Provides-Extra: openreward
64
- Requires-Dist: tasksets[openreward]>=0.1.1; extra == 'openreward'
64
+ Requires-Dist: tasksets[openreward]>=0.1.5; extra == 'openreward'
65
65
  Provides-Extra: packages
66
- Requires-Dist: harnesses>=0.1.1; extra == 'packages'
67
- Requires-Dist: tasksets[openenv,openreward,ta]>=0.1.1; extra == 'packages'
66
+ Requires-Dist: harnesses>=0.1.2; extra == 'packages'
67
+ Requires-Dist: tasksets[openenv,openreward,ta]>=0.1.5; extra == 'packages'
68
68
  Provides-Extra: renderers
69
69
  Requires-Dist: renderers>=0.1.8.dev28; extra == 'renderers'
70
70
  Provides-Extra: rg
@@ -84,7 +84,7 @@ Provides-Extra: ta
84
84
  Requires-Dist: nltk; extra == 'ta'
85
85
  Requires-Dist: textarena; extra == 'ta'
86
86
  Provides-Extra: tasksets
87
- Requires-Dist: tasksets[openenv,openreward,ta]>=0.1.1; extra == 'tasksets'
87
+ Requires-Dist: tasksets[openenv,openreward,ta]>=0.1.5; extra == 'tasksets'
88
88
  Description-Content-Type: text/markdown
89
89
 
90
90
  <p align="center">
@@ -89,14 +89,14 @@ ta = [
89
89
  "textarena",
90
90
  ]
91
91
  tasksets = [
92
- "tasksets[openenv,openreward,ta]>=0.1.1",
92
+ "tasksets[openenv,openreward,ta]>=0.1.5",
93
93
  ]
94
94
  harnesses = [
95
- "harnesses>=0.1.1",
95
+ "harnesses>=0.1.2",
96
96
  ]
97
97
  packages = [
98
- "harnesses>=0.1.1",
99
- "tasksets[openenv,openreward,ta]>=0.1.1",
98
+ "harnesses>=0.1.2",
99
+ "tasksets[openenv,openreward,ta]>=0.1.5",
100
100
  ]
101
101
  browser = [
102
102
  "stagehand>=3.0.0",
@@ -104,14 +104,14 @@ browser = [
104
104
  "python-dotenv>=1.0.0",
105
105
  ]
106
106
  openenv = [
107
- "tasksets[openenv]>=0.1.1",
107
+ "tasksets[openenv]>=0.1.5",
108
108
  ]
109
109
  openreward = [
110
- "tasksets[openreward]>=0.1.1",
110
+ "tasksets[openreward]>=0.1.5",
111
111
  ]
112
112
  nemogym = [
113
- "harnesses[nemogym]>=0.1.1",
114
- "tasksets[nemogym]>=0.1.1",
113
+ "harnesses[nemogym]>=0.1.2",
114
+ "tasksets[nemogym]>=0.1.5",
115
115
  ]
116
116
  renderers = [
117
117
  "renderers>=0.1.8.dev28",
@@ -17,6 +17,9 @@ PACKAGE_SYMBOLS = {
17
17
  "OpenCodeConfig",
18
18
  "Pi",
19
19
  "PiConfig",
20
+ "ReplayHarness",
21
+ "ReplayTaskset",
22
+ "ReplayTasksetConfig",
20
23
  "RLM",
21
24
  "RLMConfig",
22
25
  "Terminus2",
@@ -106,7 +106,7 @@ def test_init_openenv_writes_v1_taskset_template(tmp_path: Path) -> None:
106
106
  assert "taskset=vf.load_taskset(config=config.taskset)" in content
107
107
  assert "harness=vf.load_harness(config=config.harness)" in content
108
108
  assert "vf.OpenEnvEnv" not in content
109
- assert '"tasksets[openenv]>=0.1.1"' in pyproject
109
+ assert '"tasksets[openenv]>=0.1.5"' in pyproject
110
110
 
111
111
 
112
112
  def test_init_openenv_multifile_exports_taskset_loader(tmp_path: Path) -> None:
@@ -2738,6 +2738,68 @@ def test_load_environment_validates_typed_env_config_arg(
2738
2738
  }
2739
2739
 
2740
2740
 
2741
+ def test_load_environment_accepts_top_level_taskset_harness_shorthand(
2742
+ monkeypatch: pytest.MonkeyPatch,
2743
+ ) -> None:
2744
+ module_name = "typed_env_config_shorthand"
2745
+ module = types.ModuleType(module_name)
2746
+ seen: dict[str, object] = {}
2747
+
2748
+ def load_environment(split: str = "train", *, config: EnvConfig) -> Env:
2749
+ seen["split"] = split
2750
+ seen["config"] = config
2751
+ return Env(
2752
+ taskset=make_taskset(config=config.taskset),
2753
+ harness=make_harness(config=config.harness),
2754
+ )
2755
+
2756
+ module.load_environment = load_environment
2757
+ monkeypatch.setitem(sys.modules, module_name, module)
2758
+
2759
+ env = vf.load_environment(
2760
+ "typed-env-config-shorthand",
2761
+ split="test",
2762
+ taskset={"taskset_id": "top-level"},
2763
+ harness={"model": {"name": "top-level-model"}},
2764
+ )
2765
+
2766
+ assert seen["split"] == "test"
2767
+ config = seen["config"]
2768
+ assert isinstance(config, EnvConfig)
2769
+ assert config.taskset.taskset_id == "top-level"
2770
+ assert config.harness.model.name == "top-level-model"
2771
+ assert env.taskset.config.taskset_id == "top-level"
2772
+ assert env.harness.config.model.name == "top-level-model"
2773
+ assert env.env_args == {
2774
+ "split": "test",
2775
+ "taskset": {"taskset_id": "top-level"},
2776
+ "harness": {"model": {"name": "top-level-model"}},
2777
+ }
2778
+
2779
+
2780
+ def test_load_environment_rejects_duplicate_top_level_config_shorthand(
2781
+ monkeypatch: pytest.MonkeyPatch,
2782
+ ) -> None:
2783
+ module_name = "typed_env_config_duplicate_shorthand"
2784
+ module = types.ModuleType(module_name)
2785
+
2786
+ def load_environment(config: EnvConfig) -> Env:
2787
+ return Env(
2788
+ taskset=make_taskset(config=config.taskset),
2789
+ harness=make_harness(config=config.harness),
2790
+ )
2791
+
2792
+ module.load_environment = load_environment
2793
+ monkeypatch.setitem(sys.modules, module_name, module)
2794
+
2795
+ with pytest.raises(RuntimeError, match="not both"):
2796
+ vf.load_environment(
2797
+ "typed-env-config-duplicate-shorthand",
2798
+ config={"taskset": {"taskset_id": "nested"}},
2799
+ taskset={"taskset_id": "top-level"},
2800
+ )
2801
+
2802
+
2741
2803
  def test_load_environment_validates_env_config_subclass_sections(
2742
2804
  monkeypatch: pytest.MonkeyPatch,
2743
2805
  ) -> None:
@@ -3099,6 +3161,36 @@ def test_load_environment_composes_component_package_without_root_loader(
3099
3161
  assert env.harness.config.max_turns == 3
3100
3162
 
3101
3163
 
3164
+ def test_load_environment_component_package_accepts_top_level_config_shorthand(
3165
+ monkeypatch: pytest.MonkeyPatch,
3166
+ ) -> None:
3167
+ module_name = "component_only_taskset_shorthand"
3168
+ module = types.ModuleType(module_name)
3169
+
3170
+ class LocalTasksetConfig(TasksetConfig):
3171
+ answer: str = "configured"
3172
+
3173
+ class LocalTaskset(Taskset[LocalTasksetConfig]):
3174
+ def load_tasks(self, split: vf.TaskSplit = "train") -> vf.Tasks:
3175
+ return [{"prompt": [], "answer": f"{split}:{self.config.answer}"}]
3176
+
3177
+ def load_taskset(config: LocalTasksetConfig) -> LocalTaskset:
3178
+ return LocalTaskset(config=config)
3179
+
3180
+ module.load_taskset = load_taskset
3181
+ monkeypatch.setitem(sys.modules, module_name, module)
3182
+
3183
+ env = vf.load_environment(
3184
+ "component-only-taskset-shorthand",
3185
+ taskset={"answer": "top-level"},
3186
+ harness={"max_turns": 2},
3187
+ )
3188
+
3189
+ assert env.taskset.get_dataset()[0]["answer"] == "train:top-level"
3190
+ assert type(env.harness) is Harness
3191
+ assert env.harness.config.max_turns == 2
3192
+
3193
+
3102
3194
  def test_load_environment_delegates_missing_child_loaders_by_config_id(
3103
3195
  monkeypatch: pytest.MonkeyPatch,
3104
3196
  ) -> None:
@@ -0,0 +1,327 @@
1
+ import json
2
+ from pathlib import Path
3
+
4
+ import pytest
5
+
6
+ import verifiers as vf
7
+ from harnesses import ReplayHarness
8
+ from tasksets import ReplayTaskset, ReplayTasksetConfig
9
+ from tasksets.replay import replay_task_record
10
+
11
+
12
+ class NoModelClient:
13
+ def __init__(self) -> None:
14
+ self.requests = 0
15
+
16
+ async def get_response(self, **kwargs: object) -> object:
17
+ _ = kwargs
18
+ self.requests += 1
19
+ raise AssertionError("ReplayHarness must not request model completions.")
20
+
21
+
22
+ class InlineReplayTaskset(ReplayTaskset):
23
+ def load_tasks(self, split: vf.TaskSplit = "train") -> vf.Tasks:
24
+ if split == "eval":
25
+ return []
26
+ return [
27
+ {
28
+ "messages": [
29
+ {"role": "user", "content": "Reverse abc."},
30
+ {"role": "assistant", "content": "cba"},
31
+ {"role": "user", "content": "Now uppercase it."},
32
+ {
33
+ "role": "assistant",
34
+ "content": "CBA",
35
+ "reasoning_content": "uppercased the prior answer",
36
+ },
37
+ {"role": "user", "content": "Thanks."},
38
+ ],
39
+ }
40
+ ]
41
+
42
+
43
+ class ManyTurnReplayTaskset(ReplayTaskset):
44
+ def load_tasks(self, split: vf.TaskSplit = "train") -> vf.Tasks:
45
+ if split == "eval":
46
+ return []
47
+ messages = []
48
+ for index in range(11):
49
+ messages.append({"role": "user", "content": f"Turn {index}?"})
50
+ messages.append({"role": "assistant", "content": f"reply {index}"})
51
+ return [{"messages": messages}]
52
+
53
+
54
+ @pytest.mark.asyncio
55
+ async def test_replay_harness_prints_assistant_messages_into_trajectory() -> None:
56
+ env = vf.Env(
57
+ taskset=InlineReplayTaskset(),
58
+ harness=ReplayHarness(config=vf.HarnessConfig()),
59
+ )
60
+ client = NoModelClient()
61
+
62
+ state = await env.rollout(
63
+ dict(env.get_dataset()[0]),
64
+ client=client,
65
+ model="mock-model",
66
+ )
67
+
68
+ assert client.requests == 0
69
+ assert state["stop_condition"] == "replayed_messages"
70
+ assert state["num_model_requests"] == 2
71
+ assert state["prompt"] == [{"role": "user", "content": "Reverse abc."}]
72
+ assert state["completion"] == [
73
+ {"role": "assistant", "content": "cba"},
74
+ {"role": "user", "content": "Now uppercase it."},
75
+ {
76
+ "role": "assistant",
77
+ "content": "CBA",
78
+ "reasoning_content": "uppercased the prior answer",
79
+ },
80
+ ]
81
+ assert state["completion"][-1]["role"] == "assistant"
82
+
83
+ first, second = state["trajectory"]
84
+ assert first["prompt"] == [{"role": "user", "content": "Reverse abc."}]
85
+ assert first["completion"] == [{"role": "assistant", "content": "cba"}]
86
+ assert first["tokens"] is None
87
+ assert "tokens" not in first["response"]["message"]
88
+
89
+ assert second["prompt"] == [
90
+ {"role": "user", "content": "Reverse abc."},
91
+ {"role": "assistant", "content": "cba"},
92
+ {"role": "user", "content": "Now uppercase it."},
93
+ ]
94
+ assert second["completion"] == [
95
+ {
96
+ "role": "assistant",
97
+ "content": "CBA",
98
+ "reasoning_content": "uppercased the prior answer",
99
+ }
100
+ ]
101
+ assert second["tokens"] is None
102
+ assert "tokens" not in second["response"]["message"]
103
+
104
+
105
+ @pytest.mark.asyncio
106
+ async def test_replay_harness_marks_partial_replay_as_truncated() -> None:
107
+ env = vf.Env(
108
+ taskset=InlineReplayTaskset(),
109
+ harness=ReplayHarness(config=vf.HarnessConfig(max_turns=1)),
110
+ )
111
+
112
+ state = await env.rollout(
113
+ dict(env.get_dataset()[0]),
114
+ client=NoModelClient(),
115
+ model="mock-model",
116
+ )
117
+
118
+ assert state["stop_condition"] == "max_turns_reached"
119
+ assert state["is_truncated"] is True
120
+ assert state["num_model_requests"] == 1
121
+ assert state["completion"] == [{"role": "assistant", "content": "cba"}]
122
+ step = state["trajectory"][0]
123
+ assert step["is_truncated"] is True
124
+ assert step["response"]["message"]["is_truncated"] is True
125
+
126
+
127
+ @pytest.mark.asyncio
128
+ async def test_replay_harness_defaults_to_all_assistant_messages() -> None:
129
+ assert vf.HarnessConfig().max_turns == -1
130
+ env = vf.Env(
131
+ taskset=ManyTurnReplayTaskset(),
132
+ harness=ReplayHarness(config=vf.HarnessConfig()),
133
+ )
134
+
135
+ state = await env.rollout(
136
+ dict(env.get_dataset()[0]),
137
+ client=NoModelClient(),
138
+ model="mock-model",
139
+ )
140
+
141
+ assert state["stop_condition"] == "replayed_messages"
142
+ assert state["is_truncated"] is False
143
+ assert state["num_model_requests"] == 11
144
+ assert len(state["trajectory"]) == 11
145
+ assert state["completion"][-1] == {"role": "assistant", "content": "reply 10"}
146
+
147
+
148
+ def test_replay_taskset_loads_configured_local_jsonl_data(tmp_path: Path) -> None:
149
+ data_dir = tmp_path / "data"
150
+ data_dir.mkdir(parents=True)
151
+ (data_dir / "examples.jsonl").write_text(
152
+ "\n".join(
153
+ [
154
+ json.dumps(
155
+ {
156
+ "messages": [
157
+ {"role": "user", "content": "Say ok."},
158
+ {"role": "assistant", "content": "ok"},
159
+ ]
160
+ }
161
+ ),
162
+ json.dumps(
163
+ {
164
+ "messages": [
165
+ {"role": "user", "content": "Say yes."},
166
+ {"role": "assistant", "content": "yes"},
167
+ ]
168
+ }
169
+ ),
170
+ ]
171
+ )
172
+ + "\n",
173
+ encoding="utf-8",
174
+ )
175
+
176
+ taskset = ReplayTaskset(config=ReplayTasksetConfig(data_dir=str(data_dir)))
177
+
178
+ assert taskset.load_tasks() == [
179
+ {
180
+ "messages": [
181
+ {"role": "user", "content": "Say ok."},
182
+ {"role": "assistant", "content": "ok"},
183
+ ]
184
+ },
185
+ {
186
+ "messages": [
187
+ {"role": "user", "content": "Say yes."},
188
+ {"role": "assistant", "content": "yes"},
189
+ ]
190
+ },
191
+ ]
192
+
193
+
194
+ def test_replay_taskset_loads_subclass_local_jsonl_data(tmp_path: Path) -> None:
195
+ data_dir = tmp_path / "data"
196
+ data_dir.mkdir(parents=True)
197
+ (data_dir / "example.jsonl").write_text(
198
+ json.dumps(
199
+ {
200
+ "messages": [
201
+ {"role": "user", "content": "Say ok."},
202
+ {"role": "assistant", "content": "ok"},
203
+ ]
204
+ }
205
+ )
206
+ + "\n",
207
+ encoding="utf-8",
208
+ )
209
+ local_taskset_type = type(
210
+ "LocalReplayTaskset",
211
+ (ReplayTaskset,),
212
+ {"data_dir": str(data_dir)},
213
+ )
214
+ taskset = local_taskset_type(config=ReplayTasksetConfig())
215
+
216
+ assert taskset.load_tasks() == [
217
+ {
218
+ "messages": [
219
+ {"role": "user", "content": "Say ok."},
220
+ {"role": "assistant", "content": "ok"},
221
+ ]
222
+ }
223
+ ]
224
+
225
+
226
+ def test_replay_taskset_rejects_missing_local_source() -> None:
227
+ taskset = ReplayTaskset(config=ReplayTasksetConfig())
228
+
229
+ with pytest.raises(FileNotFoundError, match="requires dataset or data_dir"):
230
+ taskset.load_tasks()
231
+
232
+
233
+ def test_replay_taskset_rejects_conflicting_sources(tmp_path: Path) -> None:
234
+ taskset = ReplayTaskset(
235
+ config=ReplayTasksetConfig(dataset="owner/dataset", data_dir=str(tmp_path))
236
+ )
237
+
238
+ with pytest.raises(ValueError, match="cannot set both dataset and data_dir"):
239
+ taskset.load_tasks()
240
+
241
+
242
+ def test_replay_taskset_rejects_empty_local_data_dir(tmp_path: Path) -> None:
243
+ data_dir = tmp_path / "data"
244
+ data_dir.mkdir(parents=True)
245
+
246
+ taskset = ReplayTaskset(config=ReplayTasksetConfig(data_dir=str(data_dir)))
247
+
248
+ with pytest.raises(FileNotFoundError, match="must contain at least one JSONL"):
249
+ taskset.load_tasks()
250
+
251
+
252
+ def test_replay_taskset_rejects_json_files(tmp_path: Path) -> None:
253
+ data_dir = tmp_path / "data"
254
+ data_dir.mkdir(parents=True)
255
+ (data_dir / "example.json").write_text(
256
+ json.dumps(
257
+ {
258
+ "messages": [
259
+ {"role": "user", "content": "Say ok."},
260
+ {"role": "assistant", "content": "ok"},
261
+ ]
262
+ }
263
+ ),
264
+ encoding="utf-8",
265
+ )
266
+
267
+ taskset = ReplayTaskset(config=ReplayTasksetConfig(data_dir=str(data_dir)))
268
+
269
+ with pytest.raises(ValueError, match=r"accepts only \.jsonl files"):
270
+ taskset.load_tasks()
271
+
272
+
273
+ def test_replay_taskset_rejects_non_object_jsonl_rows(tmp_path: Path) -> None:
274
+ data_dir = tmp_path / "data"
275
+ data_dir.mkdir(parents=True)
276
+ (data_dir / "example.jsonl").write_text("[]\n", encoding="utf-8")
277
+
278
+ taskset = ReplayTaskset(config=ReplayTasksetConfig(data_dir=str(data_dir)))
279
+
280
+ with pytest.raises(TypeError, match="example.jsonl:1 must contain one JSON object"):
281
+ taskset.load_tasks()
282
+
283
+
284
+ def test_replay_taskset_canonicalizes_messages() -> None:
285
+ task = replay_task_record(
286
+ {
287
+ "messages": [
288
+ {"role": "user", "content": "Use the tool."},
289
+ {
290
+ "role": "assistant",
291
+ "content": None,
292
+ "tool_calls": [
293
+ {
294
+ "id": "call_1",
295
+ "type": "function",
296
+ "function": {
297
+ "name": "search",
298
+ "arguments": {"query": "abc"},
299
+ },
300
+ }
301
+ ],
302
+ },
303
+ ]
304
+ }
305
+ )
306
+
307
+ assert task["messages"] == [
308
+ {"role": "user", "content": "Use the tool."},
309
+ {
310
+ "role": "assistant",
311
+ "tool_calls": [
312
+ {
313
+ "id": "call_1",
314
+ "name": "search",
315
+ "arguments": '{"query": "abc"}',
316
+ }
317
+ ],
318
+ },
319
+ ]
320
+
321
+
322
+ def test_replay_taskset_rejects_invalid_messages() -> None:
323
+ with pytest.raises(TypeError, match="messages must be a list"):
324
+ replay_task_record({"messages": "not a transcript"})
325
+
326
+ with pytest.raises(ValueError, match="Unknown role"):
327
+ replay_task_record({"messages": [{"role": "assistantish", "content": "no"}]})
@@ -18,7 +18,7 @@ from pydantic import BaseModel
18
18
 
19
19
  import verifiers as vf
20
20
  from verifiers.clients import Client
21
- from verifiers.types import ClientConfig
21
+ from verifiers.types import ClientConfig, Messages
22
22
  from verifiers.types import Response, ResponseMessage, ToolCall
23
23
  from verifiers.types import Tool
24
24
  from verifiers.types import Usage
@@ -98,6 +98,18 @@ class CapturingModelClient(FakeModelClient):
98
98
  return await super().get_response(**kwargs)
99
99
 
100
100
 
101
+ class BlockingModelClient(CapturingModelClient):
102
+ def __init__(self, responses: list[Response]):
103
+ super().__init__(responses)
104
+ self.entered = asyncio.Event()
105
+ self.release = asyncio.Event()
106
+
107
+ async def get_response(self, **kwargs: object) -> Response:
108
+ self.entered.set()
109
+ await self.release.wait()
110
+ return await super().get_response(**kwargs)
111
+
112
+
101
113
  class FakeCreateSandboxRequest:
102
114
  def __init__(self, **kwargs: object):
103
115
  self.kwargs = kwargs
@@ -537,6 +549,37 @@ async def endpoint_trajectory_program(task, state):
537
549
  return state
538
550
 
539
551
 
552
+ async def concurrent_endpoint_program(task, state):
553
+ _ = task
554
+ root = state["endpoint_root_url"].rstrip("/")
555
+ config = state.get_endpoint_config(api="chat")
556
+ endpoint_client = cast(OpenAI, state.get_client(api="chat", sync=True))
557
+ api_key = endpoint_client.api_key
558
+ endpoint_client.close()
559
+
560
+ def post_chat(content: str) -> dict[str, object]:
561
+ payload = {
562
+ "model": config.model,
563
+ "messages": [{"role": "user", "content": content}],
564
+ }
565
+ request = urllib.request.Request(
566
+ f"{root}/v1/chat/completions",
567
+ data=json.dumps(payload).encode(),
568
+ headers={
569
+ "content-type": "application/json",
570
+ "Authorization": f"Bearer {api_key}",
571
+ },
572
+ )
573
+ with urllib.request.urlopen(request) as response:
574
+ return json.loads(response.read().decode())
575
+
576
+ state["endpoint_concurrent_responses"] = await asyncio.gather(
577
+ asyncio.to_thread(post_chat, "first"),
578
+ asyncio.to_thread(post_chat, "second"),
579
+ )
580
+ return state
581
+
582
+
540
583
  async def mcp_proxy_program(task, state):
541
584
  _ = task
542
585
  from mcp import ClientSession, StdioServerParameters
@@ -683,6 +726,7 @@ for _name, _value in {
683
726
  "child_reads_program_sandbox": child_reads_program_sandbox,
684
727
  "endpoint_program": endpoint_program,
685
728
  "endpoint_trajectory_program": endpoint_trajectory_program,
729
+ "concurrent_endpoint_program": concurrent_endpoint_program,
686
730
  "mcp_proxy_program": mcp_proxy_program,
687
731
  "child_program": child_program,
688
732
  "parent_program": parent_program,
@@ -808,6 +852,36 @@ async def test_endpoint_request_can_hide_internal_model_call_from_trajectory() -
808
852
  )
809
853
 
810
854
 
855
+ @pytest.mark.asyncio
856
+ async def test_endpoint_max_turns_counts_inflight_visible_requests() -> None:
857
+ client = BlockingModelClient(
858
+ [fake_response("allowed"), fake_response("unexpected")]
859
+ )
860
+ harness = make_harness(
861
+ program={"fn": program_ref("concurrent_endpoint_program")},
862
+ client=client,
863
+ model="test-model",
864
+ max_turns=1,
865
+ )
866
+ task = vf.Task({"prompt": [{"role": "user", "content": "hi"}]}).freeze()
867
+
868
+ run_task = asyncio.create_task(harness.run(task))
869
+ await asyncio.wait_for(client.entered.wait(), timeout=1.0)
870
+ await asyncio.sleep(0.05)
871
+ client.release.set()
872
+ state = await run_task
873
+ await harness.teardown()
874
+
875
+ contents = [
876
+ response["choices"][0]["message"]["content"]
877
+ for response in state["endpoint_concurrent_responses"]
878
+ ]
879
+ assert sorted(contents) == ["", "allowed"]
880
+ assert len(client.requests) == 1
881
+ assert len(state["trajectory"]) == 1
882
+ assert state["stop_condition"] == "max_turns_reached"
883
+
884
+
811
885
  @pytest.mark.asyncio
812
886
  async def test_state_helpers_load_runtime_tools_while_rollout_is_active() -> None:
813
887
  harness = make_harness(
@@ -950,6 +1024,38 @@ async def test_base_program_submits_system_prompt_before_prompt() -> None:
950
1024
  assert state["completion"][-1]["content"] == "ok"
951
1025
 
952
1026
 
1027
+ @pytest.mark.asyncio
1028
+ async def test_base_program_max_turns_uses_stop_condition() -> None:
1029
+ client = CapturingModelClient(
1030
+ [fake_response(content="done"), fake_response(content="unexpected")]
1031
+ )
1032
+ harness = make_harness(client=cast(Client, client), model="fake", max_turns=1)
1033
+ task = vf.Task({"prompt": [{"role": "user", "content": "hi"}]}).freeze()
1034
+
1035
+ state = await harness.run(task)
1036
+
1037
+ assert len(client.requests) == 1
1038
+ assert len(state["trajectory"]) == 1
1039
+ assert state["stop_condition"] == "max_turns_reached"
1040
+
1041
+
1042
+ @pytest.mark.asyncio
1043
+ async def test_model_request_reservation_released_when_client_resolution_fails() -> (
1044
+ None
1045
+ ):
1046
+ harness = make_harness(model="fake", max_turns=1)
1047
+ task = vf.Task({"prompt": [{"role": "user", "content": "hi"}]}).freeze()
1048
+ state = await harness.setup_state(task, vf.State.for_task(task))
1049
+
1050
+ with pytest.raises(RuntimeError, match="no model client"):
1051
+ await harness.runtime.submit_model_request(
1052
+ cast(Messages, state["prompt"]), task, state
1053
+ )
1054
+
1055
+ assert harness.runtime.visible_model_requests(state) == 0
1056
+ assert state["trajectory"] == []
1057
+
1058
+
953
1059
  @pytest.mark.asyncio
954
1060
  async def test_taskset_setup_initializes_base_harness_prompt_and_sampling() -> None:
955
1061
  class SetupRuntimeTaskset(vf.Taskset):