verifiers 0.1.15.dev157__tar.gz → 0.1.15.dev158__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 (324) hide show
  1. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/PKG-INFO +1 -1
  2. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_v1_runtime_lifecycle.py +107 -1
  3. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/harness.py +5 -3
  4. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/runtime.py +142 -68
  5. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/.gitignore +0 -0
  6. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/LICENSE +0 -0
  7. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/README.md +0 -0
  8. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/pyproject.toml +0 -0
  9. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/AGENTS.md +0 -0
  10. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/README.md +0 -0
  11. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/__init__.py +0 -0
  12. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/conftest.py +0 -0
  13. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_browser_env.py +0 -0
  14. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_build_script.py +0 -0
  15. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_cli_agent_env.py +0 -0
  16. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_client_auth_errors.py +0 -0
  17. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_client_config.py +0 -0
  18. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_client_multimodal_types.py +0 -0
  19. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_composable_env.py +0 -0
  20. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_context_token_metrics.py +0 -0
  21. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_decorator_ranks.py +0 -0
  22. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_endpoint_registry.py +0 -0
  23. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_env_group.py +0 -0
  24. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_env_server.py +0 -0
  25. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_environment.py +0 -0
  26. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_environment_extra.py +0 -0
  27. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_envs.py +0 -0
  28. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_error_chain.py +0 -0
  29. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_eval_cli.py +0 -0
  30. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_eval_display.py +0 -0
  31. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_eval_utils.py +0 -0
  32. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_gepa_cli.py +0 -0
  33. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_gepa_utils.py +0 -0
  34. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_gym_env.py +0 -0
  35. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_harbor_env_mcp.py +0 -0
  36. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_imports.py +0 -0
  37. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_init_script.py +0 -0
  38. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_install_utils.py +0 -0
  39. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_interception_utils.py +0 -0
  40. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_langchain_deep_agents_wikispeedia.py +0 -0
  41. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_lean_task.py +0 -0
  42. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_logging.py +0 -0
  43. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_math_rubric.py +0 -0
  44. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_maybe_think_parser.py +0 -0
  45. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_mcp_search_env.py +0 -0
  46. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_message_utils.py +0 -0
  47. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_message_utils_multimodal.py +0 -0
  48. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_multiturn_env.py +0 -0
  49. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_nemorl_client.py +0 -0
  50. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_openai_chat_completions_token_client.py +0 -0
  51. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_openai_responses_client.py +0 -0
  52. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_opencode_harbor.py +0 -0
  53. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_opencode_rlm_env.py +0 -0
  54. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_openenv_client.py +0 -0
  55. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_parser.py +0 -0
  56. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_path_utils.py +0 -0
  57. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_per_turn_timing.py +0 -0
  58. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_pricing_utils.py +0 -0
  59. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_prime_plugin.py +0 -0
  60. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_renderer_client.py +0 -0
  61. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_renderer_e2e.py +0 -0
  62. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_rlm_composable_env.py +0 -0
  63. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_rlm_env.py +0 -0
  64. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_rubric.py +0 -0
  65. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_rubric_group.py +0 -0
  66. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_sandbox_env.py +0 -0
  67. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_sandbox_mixin.py +0 -0
  68. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_save_utils.py +0 -0
  69. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_setup_script.py +0 -0
  70. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_singleturn_env.py +0 -0
  71. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_stateful_tool_env.py +0 -0
  72. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_think_parser.py +0 -0
  73. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_tool_env.py +0 -0
  74. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_tool_utils.py +0 -0
  75. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_trajectory_processing.py +0 -0
  76. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_tui_info_formatting.py +0 -0
  77. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_types.py +0 -0
  78. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_v1_bfcl.py +0 -0
  79. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_v1_config_extension.py +0 -0
  80. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_v1_empty_completions.py +0 -0
  81. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_v1_endpoint_protocols.py +0 -0
  82. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_v1_example_counts.py +0 -0
  83. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_v1_group_reward_env.py +0 -0
  84. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_v1_harbor_cli.py +0 -0
  85. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_v1_mini_swe_agent.py +0 -0
  86. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_v1_nemo_gym_harness.py +0 -0
  87. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_v1_openenv_taskset.py +0 -0
  88. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_v1_openreward_taskset.py +0 -0
  89. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_v1_rlm_swe.py +0 -0
  90. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_v1_scoring_functions.py +0 -0
  91. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_v1_taskset_bindings.py +0 -0
  92. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_v1_taskset_utils.py +0 -0
  93. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_v1_textarena_taskset.py +0 -0
  94. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_wiki_search_v1.py +0 -0
  95. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_wordle_env.py +0 -0
  96. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_wordle_v1_env.py +0 -0
  97. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/tests/test_xml_parser.py +0 -0
  98. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/AGENTS.md +0 -0
  99. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/__init__.py +0 -0
  100. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/cli/__init__.py +0 -0
  101. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/cli/commands/__init__.py +0 -0
  102. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/cli/commands/build.py +0 -0
  103. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/cli/commands/eval.py +0 -0
  104. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/cli/commands/gepa.py +0 -0
  105. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/cli/commands/init.py +0 -0
  106. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/cli/commands/install.py +0 -0
  107. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/cli/commands/setup.py +0 -0
  108. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/cli/plugins/__init__.py +0 -0
  109. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/cli/plugins/prime.py +0 -0
  110. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/cli/tui.py +0 -0
  111. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/clients/__init__.py +0 -0
  112. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/clients/anthropic_messages_client.py +0 -0
  113. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/clients/client.py +0 -0
  114. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  115. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/clients/openai_chat_completions_client.py +0 -0
  116. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  117. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/clients/openai_completions_client.py +0 -0
  118. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/clients/openai_responses_client.py +0 -0
  119. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/clients/renderer_client.py +0 -0
  120. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/decorators.py +0 -0
  121. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/AGENTS.md +0 -0
  122. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/__init__.py +0 -0
  123. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/env_group.py +0 -0
  124. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/environment.py +0 -0
  125. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/README.md +0 -0
  126. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/__init__.py +0 -0
  127. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  128. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/README.md +0 -0
  129. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/__init__.py +0 -0
  130. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/_filter.py +0 -0
  131. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  132. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/harness.py +0 -0
  133. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  134. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  135. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  136. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  137. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  138. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  139. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/task.py +0 -0
  140. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  141. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  142. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  143. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  144. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  145. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  146. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/lean/__init__.py +0 -0
  147. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/lean/lean_task.py +0 -0
  148. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  149. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  150. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  151. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  152. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  153. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  154. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  155. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  156. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  157. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  158. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  159. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  160. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  161. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  162. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  163. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  164. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  165. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  166. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  167. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  168. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  169. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  170. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  171. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  172. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  173. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/gym_env.py +0 -0
  174. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  175. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  176. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  177. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/mcp_env.py +0 -0
  178. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/opencode_env.py +0 -0
  179. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  180. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  181. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/rlm_env.py +0 -0
  182. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  183. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/utils/__init__.py +0 -0
  184. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  185. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  186. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/integrations/README.md +0 -0
  187. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/integrations/__init__.py +0 -0
  188. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/integrations/browser_env/README.md +0 -0
  189. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  190. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  191. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  192. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  193. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  194. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  195. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/integrations/openenv_env.py +0 -0
  196. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  197. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/integrations/textarena_env.py +0 -0
  198. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/multiturn_env.py +0 -0
  199. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/python_env.py +0 -0
  200. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/sandbox_env.py +0 -0
  201. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/singleturn_env.py +0 -0
  202. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/stateful_tool_env.py +0 -0
  203. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/envs/tool_env.py +0 -0
  204. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/errors.py +0 -0
  205. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/gepa/__init__.py +0 -0
  206. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/gepa/adapter.py +0 -0
  207. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/gepa/config.py +0 -0
  208. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/gepa/display.py +0 -0
  209. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/gepa/gepa_utils.py +0 -0
  210. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/parsers/__init__.py +0 -0
  211. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/parsers/maybe_think_parser.py +0 -0
  212. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/parsers/parser.py +0 -0
  213. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/parsers/think_parser.py +0 -0
  214. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/parsers/xml_parser.py +0 -0
  215. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/rl/README.md +0 -0
  216. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/rl/__init__.py +0 -0
  217. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/rl/inference/__init__.py +0 -0
  218. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/rl/inference/client.py +0 -0
  219. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/rl/inference/server.py +0 -0
  220. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/rl/trainer/__init__.py +0 -0
  221. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/rl/trainer/config.py +0 -0
  222. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/rl/trainer/orchestrator.py +0 -0
  223. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/rl/trainer/trainer.py +0 -0
  224. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/rl/trainer/utils.py +0 -0
  225. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/rubrics/__init__.py +0 -0
  226. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  227. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/rubrics/judge_rubric.py +0 -0
  228. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/rubrics/math_rubric.py +0 -0
  229. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/rubrics/rubric.py +0 -0
  230. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/rubrics/rubric_group.py +0 -0
  231. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/scripts/__init__.py +0 -0
  232. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/scripts/build.py +0 -0
  233. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/scripts/eval.py +0 -0
  234. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/scripts/gepa.py +0 -0
  235. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/scripts/init.py +0 -0
  236. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/scripts/install.py +0 -0
  237. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/scripts/rl.py +0 -0
  238. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/scripts/setup.py +0 -0
  239. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/scripts/train.py +0 -0
  240. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/scripts/tui.py +0 -0
  241. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/scripts/vllm.py +0 -0
  242. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/serve/__init__.py +0 -0
  243. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/serve/client/env_client.py +0 -0
  244. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/serve/client/zmq_env_client.py +0 -0
  245. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/serve/server/__init__.py +0 -0
  246. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/serve/server/env_router.py +0 -0
  247. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/serve/server/env_server.py +0 -0
  248. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/serve/server/env_worker.py +0 -0
  249. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/serve/server/zmq_env_server.py +0 -0
  250. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/serve/types.py +0 -0
  251. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/types.py +0 -0
  252. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/__init__.py +0 -0
  253. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/async_utils.py +0 -0
  254. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/client_utils.py +0 -0
  255. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/config_utils.py +0 -0
  256. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/data_utils.py +0 -0
  257. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/display_utils.py +0 -0
  258. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/env_config_utils.py +0 -0
  259. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/env_utils.py +0 -0
  260. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/error_utils.py +0 -0
  261. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/eval_display.py +0 -0
  262. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/eval_utils.py +0 -0
  263. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/heartbeat.py +0 -0
  264. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/import_utils.py +0 -0
  265. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/install_utils.py +0 -0
  266. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/interception_utils.py +0 -0
  267. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/logging_utils.py +0 -0
  268. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/message_utils.py +0 -0
  269. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/metric_utils.py +0 -0
  270. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/path_utils.py +0 -0
  271. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/pricing_utils.py +0 -0
  272. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/process_utils.py +0 -0
  273. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/response_utils.py +0 -0
  274. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/save_utils.py +0 -0
  275. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/serve_utils.py +0 -0
  276. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/thread_utils.py +0 -0
  277. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/threaded_sandbox_client.py +0 -0
  278. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/tool_utils.py +0 -0
  279. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/usage_utils.py +0 -0
  280. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/utils/version_utils.py +0 -0
  281. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/ENVIRONMENT_BEST_PRACTICES.md +0 -0
  282. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/README.md +0 -0
  283. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/RE_MIGRATION.md +0 -0
  284. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/__init__.py +0 -0
  285. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/artifact.py +0 -0
  286. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/config.py +0 -0
  287. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/env.py +0 -0
  288. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/model.py +0 -0
  289. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/program.py +0 -0
  290. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/runtime_handles.py +0 -0
  291. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/sandbox.py +0 -0
  292. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/state.py +0 -0
  293. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/task.py +0 -0
  294. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/taskset.py +0 -0
  295. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/toolset.py +0 -0
  296. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/types.py +0 -0
  297. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/user.py +0 -0
  298. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/__init__.py +0 -0
  299. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/binding_utils.py +0 -0
  300. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/config_callable_utils.py +0 -0
  301. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/config_utils.py +0 -0
  302. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/endpoint_utils.py +0 -0
  303. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/json_utils.py +0 -0
  304. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/judge_utils.py +0 -0
  305. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/lifecycle_utils.py +0 -0
  306. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/logging_utils.py +0 -0
  307. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/mcp_proxy_utils.py +0 -0
  308. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/mcp_utils.py +0 -0
  309. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/object_utils.py +0 -0
  310. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/program_utils.py +0 -0
  311. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/prompt_utils.py +0 -0
  312. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/runtime_owner_utils.py +0 -0
  313. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/runtime_registry.py +0 -0
  314. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/sandbox_program_utils.py +0 -0
  315. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/sandbox_python_utils.py +0 -0
  316. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/sandbox_utils.py +0 -0
  317. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/scoring_utils.py +0 -0
  318. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/serialization_utils.py +0 -0
  319. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/task_freeze_utils.py +0 -0
  320. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/taskset_utils.py +0 -0
  321. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/tool_utils.py +0 -0
  322. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/toolset_utils.py +0 -0
  323. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/verifiers/v1/utils/trajectory_utils.py +0 -0
  324. {verifiers-0.1.15.dev157 → verifiers-0.1.15.dev158}/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.dev158
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
@@ -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):
@@ -314,6 +314,11 @@ class Harness(RuntimeOwnerMixin[ConfigT], Generic[ConfigT]):
314
314
  raise TypeError("state.trajectory must be a list.")
315
315
  return float(len(trajectory))
316
316
 
317
+ @vf.stop
318
+ async def max_turns_reached(self, state: State) -> bool:
319
+ max_turns = state.get_max_turns(self.config.max_turns)
320
+ return max_turns > 0 and self.runtime.visible_model_requests(state) >= max_turns
321
+
317
322
  async def setup_state(self, task: Task, state: State) -> State:
318
323
  await self.setup_runtime_state(task, state)
319
324
  await self.setup_model_state(task, state)
@@ -547,9 +552,6 @@ class Harness(RuntimeOwnerMixin[ConfigT], Generic[ConfigT]):
547
552
  sync_completion()
548
553
  if await self.runtime.is_completed(task, state):
549
554
  return state
550
- if max_turns > 0 and turn >= max_turns:
551
- state._set_stop_condition("max_turns_reached", overwrite=True)
552
- return state
553
555
  return state
554
556
 
555
557
  def command_program(
@@ -21,7 +21,7 @@ from typing import (
21
21
  )
22
22
 
23
23
  from verifiers.clients import Client, resolve_client
24
- from verifiers.types import Messages, Response, Tool
24
+ from verifiers.types import Messages, Response, ResponseMessage, Tool
25
25
  from verifiers.types import ClientConfig, ClientType, SamplingArgs
26
26
  from verifiers.utils.async_utils import maybe_call_with_named_args
27
27
  from verifiers.utils.client_utils import resolve_client_config
@@ -226,40 +226,7 @@ class Runtime:
226
226
  if owner is not None:
227
227
  self.toolsets.extend(iter_toolsets(owner.toolsets))
228
228
  self.named_toolsets = self._collect_named_toolsets()
229
- self.scoped_tools: dict[tuple[int, str, str], list[ToolEntry]] = {}
230
- self.runtime_objects: dict[RuntimeObjectOwner, RuntimeObjectStore] = {
231
- "toolset": {},
232
- "user": {},
233
- "taskset": {},
234
- "harness": {},
235
- }
236
- self.model_clients: dict[str, Client] = {}
237
- self.owned_model_clients: set[str] = set()
238
- self._sandbox_client = None
239
- self.sandbox_leases: dict[tuple[str, str], SandboxLease] = {}
240
- self.sandbox_creation_tasks: dict[
241
- tuple[str, str], asyncio.Task[SandboxLease]
242
- ] = {}
243
- self.upload_archive_tasks: dict[tuple[str, str, str], asyncio.Task[Path]] = {}
244
- self.sandbox_lock = asyncio.Lock()
245
- sandbox_config = (
246
- self.harness.sandbox
247
- if self.harness is not None and self.harness.sandbox is not None
248
- else SandboxConfig()
249
- )
250
- create_concurrency = sandbox_config.create_concurrency
251
- create_rate = sandbox_config.create_rate_per_second
252
- delete_concurrency = sandbox_config.delete_concurrency
253
- delete_rate = sandbox_config.delete_rate_per_second
254
- self.sandbox_create_semaphore = asyncio.Semaphore(create_concurrency)
255
- self.sandbox_create_rate_limiter = AsyncRateLimiter(create_rate)
256
- self.sandbox_delete_semaphore = asyncio.Semaphore(delete_concurrency)
257
- self.sandbox_delete_rate_limiter = AsyncRateLimiter(delete_rate)
258
- self.mcp_exit_stacks: dict[str, AsyncExitStack] = {}
259
- self.mcp_tools: dict[str, RuntimeTools] = {}
260
- self.mcp_tool_parents: dict[str, dict[str, tuple[Toolset, ...]]] = {}
261
- self.trajectories: dict[str, list[JsonData]] = {}
262
- self.tool_handles: dict[str, tuple[Task, State, tuple[str, ...]]] = {}
229
+
263
230
  self.stop_conditions = collect_handlers(
264
231
  self._handler_owners(),
265
232
  "stop",
@@ -326,6 +293,46 @@ class Runtime:
326
293
  ),
327
294
  )
328
295
 
296
+ self.trajectories: dict[str, list[JsonData]] = {}
297
+ self.model_clients: dict[str, Client] = {}
298
+ self.owned_model_clients: set[str] = set()
299
+ self._model_request_locks: dict[str, asyncio.Lock] = {}
300
+ self._inflight_visible_model_requests: dict[str, int] = {}
301
+
302
+ self.scoped_tools: dict[tuple[int, str, str], list[ToolEntry]] = {}
303
+ self.tool_handles: dict[str, tuple[Task, State, tuple[str, ...]]] = {}
304
+ self.runtime_objects: dict[RuntimeObjectOwner, RuntimeObjectStore] = {
305
+ "toolset": {},
306
+ "user": {},
307
+ "taskset": {},
308
+ "harness": {},
309
+ }
310
+
311
+ self._sandbox_client = None
312
+ self.sandbox_leases: dict[tuple[str, str], SandboxLease] = {}
313
+ self.sandbox_creation_tasks: dict[
314
+ tuple[str, str], asyncio.Task[SandboxLease]
315
+ ] = {}
316
+ self.upload_archive_tasks: dict[tuple[str, str, str], asyncio.Task[Path]] = {}
317
+ self.sandbox_lock = asyncio.Lock()
318
+ sandbox_config = (
319
+ self.harness.sandbox
320
+ if self.harness is not None and self.harness.sandbox is not None
321
+ else SandboxConfig()
322
+ )
323
+ create_concurrency = sandbox_config.create_concurrency
324
+ create_rate = sandbox_config.create_rate_per_second
325
+ delete_concurrency = sandbox_config.delete_concurrency
326
+ delete_rate = sandbox_config.delete_rate_per_second
327
+ self.sandbox_create_semaphore = asyncio.Semaphore(create_concurrency)
328
+ self.sandbox_create_rate_limiter = AsyncRateLimiter(create_rate)
329
+ self.sandbox_delete_semaphore = asyncio.Semaphore(delete_concurrency)
330
+ self.sandbox_delete_rate_limiter = AsyncRateLimiter(delete_rate)
331
+
332
+ self.mcp_exit_stacks: dict[str, AsyncExitStack] = {}
333
+ self.mcp_tools: dict[str, RuntimeTools] = {}
334
+ self.mcp_tool_parents: dict[str, dict[str, tuple[Toolset, ...]]] = {}
335
+
329
336
  @property
330
337
  def has_group_signals(self) -> bool:
331
338
  return bool(self.group_signals)
@@ -438,6 +445,19 @@ class Runtime:
438
445
  list[JsonData], trajectory
439
446
  )
440
447
 
448
+ def visible_model_requests(self, state: State) -> int:
449
+ trajectory = state.get("trajectory") or []
450
+ if not isinstance(trajectory, list):
451
+ raise TypeError("state.trajectory must be a list.")
452
+ trajectory_id = str(state["trajectory_id"])
453
+ completed = sum(
454
+ 1
455
+ for step in trajectory
456
+ if isinstance(step, dict)
457
+ and str(step.get("trajectory_id")) == trajectory_id
458
+ )
459
+ return completed + self._inflight_visible_model_requests.get(trajectory_id, 0)
460
+
441
461
  def resolved_handles(self, state: State) -> ResolvedRuntimeHandlesConfig:
442
462
  runtime = state.runtime_state()
443
463
  resolved = runtime.get("resolved") or {}
@@ -858,41 +878,92 @@ class Runtime:
858
878
  context: ModelRequestContext | None = None,
859
879
  ) -> Response:
860
880
  context = context or ModelRequestContext()
861
- client = self.model_client(state)
862
- request_start = time.time()
863
- response = await client.get_response(
864
- prompt=prompt,
881
+ reserved = await self._reserve_model_request(task, state, context)
882
+ if not reserved:
883
+ return self._completed_model_response(state)
884
+ released = False
885
+ try:
886
+ client = self.model_client(state)
887
+ request_start = time.time()
888
+ response = await client.get_response(
889
+ prompt=prompt,
890
+ model=self.model(state),
891
+ tools=tool_defs,
892
+ sampling_args=self.sampling_args(state),
893
+ state=state,
894
+ )
895
+ request_end = time.time()
896
+ state.record_model_timing(request_start, request_end)
897
+ record_response_usage(state, response)
898
+ completion = await parse_response_message(response)
899
+ tokens = await parse_response_tokens(response)
900
+ is_truncated = response.message.is_truncated or (
901
+ tokens is not None and bool(tokens.get("is_truncated"))
902
+ )
903
+ step = {
904
+ "prompt": serializable(prompt),
905
+ "completion": serializable(completion),
906
+ "response": serializable(response),
907
+ "tokens": serializable(tokens),
908
+ "reward": None,
909
+ "advantage": None,
910
+ "is_truncated": bool(is_truncated),
911
+ "trajectory_id": str(state["trajectory_id"]),
912
+ "extras": context.extras(),
913
+ }
914
+ if context.trajectory_visibility == "append":
915
+ state["trajectory"].append(step)
916
+ self._release_model_request(state, context)
917
+ released = True
918
+ await self.is_completed(task, state)
919
+ elif context.trajectory_visibility != "hidden":
920
+ raise AssertionError(
921
+ f"Unknown trajectory visibility: {context.trajectory_visibility!r}"
922
+ )
923
+ return response
924
+ finally:
925
+ if not released:
926
+ self._release_model_request(state, context)
927
+
928
+ async def _reserve_model_request(
929
+ self, task: Task, state: State, context: ModelRequestContext
930
+ ) -> bool:
931
+ key = str(state["trajectory_id"])
932
+ lock = self._model_request_locks.setdefault(key, asyncio.Lock())
933
+ async with lock:
934
+ if await self.is_completed(task, state):
935
+ return False
936
+ if context.trajectory_visibility != "append":
937
+ return True
938
+ self._inflight_visible_model_requests[key] = (
939
+ self._inflight_visible_model_requests.get(key, 0) + 1
940
+ )
941
+ return True
942
+
943
+ def _release_model_request(
944
+ self, state: State, context: ModelRequestContext
945
+ ) -> None:
946
+ if context.trajectory_visibility != "append":
947
+ return
948
+ key = str(state["trajectory_id"])
949
+ count = self._inflight_visible_model_requests.get(key, 0)
950
+ if count <= 1:
951
+ self._inflight_visible_model_requests.pop(key, None)
952
+ else:
953
+ self._inflight_visible_model_requests[key] = count - 1
954
+
955
+ def _completed_model_response(self, state: State) -> Response:
956
+ return Response(
957
+ id=f"completed_{uuid.uuid4().hex}",
958
+ created=int(time.time()),
865
959
  model=self.model(state),
866
- tools=tool_defs,
867
- sampling_args=self.sampling_args(state),
868
- state=state,
869
- )
870
- request_end = time.time()
871
- state.record_model_timing(request_start, request_end)
872
- record_response_usage(state, response)
873
- completion = await parse_response_message(response)
874
- tokens = await parse_response_tokens(response)
875
- is_truncated = response.message.is_truncated or (
876
- tokens is not None and bool(tokens.get("is_truncated"))
960
+ message=ResponseMessage(
961
+ role="assistant",
962
+ content="",
963
+ finish_reason="stop",
964
+ is_truncated=False,
965
+ ),
877
966
  )
878
- step = {
879
- "prompt": serializable(prompt),
880
- "completion": serializable(completion),
881
- "response": serializable(response),
882
- "tokens": serializable(tokens),
883
- "reward": None,
884
- "advantage": None,
885
- "is_truncated": bool(is_truncated),
886
- "trajectory_id": str(state["trajectory_id"]),
887
- "extras": context.extras(),
888
- }
889
- if context.trajectory_visibility == "append":
890
- state["trajectory"].append(step)
891
- elif context.trajectory_visibility != "hidden":
892
- raise AssertionError(
893
- f"Unknown trajectory visibility: {context.trajectory_visibility!r}"
894
- )
895
- return response
896
967
 
897
968
  async def setup_rollout(
898
969
  self,
@@ -978,6 +1049,9 @@ class Runtime:
978
1049
  await self.close_mcp_tools(state)
979
1050
  self.release_scoped_tools("rollout", state)
980
1051
  await self.release_model_client(state)
1052
+ key = str(state["trajectory_id"])
1053
+ self._model_request_locks.pop(key, None)
1054
+ self._inflight_visible_model_requests.pop(key, None)
981
1055
  self.release_tool_handles(state)
982
1056
 
983
1057
  async def cleanup_group(self, tasks: list[Task], states: list[State]) -> None: