verifiers 0.1.15.dev164__tar.gz → 0.1.15.dev166__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.dev164 → verifiers-0.1.15.dev166}/PKG-INFO +1 -1
  2. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_composable_env.py +7 -12
  3. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_environment.py +4 -4
  4. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_config_extension.py +6 -3
  5. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_runtime_lifecycle.py +7 -2
  6. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/cli_agent_env.py +3 -3
  7. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/harnesses/__init__.py +4 -2
  8. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +54 -15
  9. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/harnesses/opencode.py +4 -21
  10. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/types.py +21 -6
  11. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/async_utils.py +3 -3
  12. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/env_utils.py +24 -9
  13. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/error_utils.py +58 -9
  14. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/logging_utils.py +2 -2
  15. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/save_utils.py +4 -19
  16. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/harness.py +2 -2
  17. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/model.py +6 -3
  18. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/program.py +0 -2
  19. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/runtime.py +3 -3
  20. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/binding_utils.py +7 -3
  21. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/config_utils.py +7 -5
  22. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/endpoint_utils.py +24 -16
  23. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/logging_utils.py +6 -2
  24. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/program_utils.py +53 -24
  25. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/runtime_owner_utils.py +12 -4
  26. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/sandbox_program_utils.py +29 -6
  27. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/sandbox_utils.py +11 -3
  28. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/toolset_utils.py +2 -2
  29. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/.gitignore +0 -0
  30. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/LICENSE +0 -0
  31. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/README.md +0 -0
  32. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/pyproject.toml +0 -0
  33. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/AGENTS.md +0 -0
  34. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/README.md +0 -0
  35. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/__init__.py +0 -0
  36. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/conftest.py +0 -0
  37. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_browser_env.py +0 -0
  38. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_build_script.py +0 -0
  39. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_cli_agent_env.py +0 -0
  40. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_client_auth_errors.py +0 -0
  41. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_client_config.py +0 -0
  42. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_client_multimodal_types.py +0 -0
  43. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_context_token_metrics.py +0 -0
  44. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_decorator_ranks.py +0 -0
  45. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_endpoint_registry.py +0 -0
  46. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_env_group.py +0 -0
  47. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_env_server.py +0 -0
  48. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_environment_extra.py +0 -0
  49. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_envs.py +0 -0
  50. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_error_chain.py +0 -0
  51. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_eval_cli.py +0 -0
  52. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_eval_display.py +0 -0
  53. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_eval_utils.py +0 -0
  54. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_gepa_cli.py +0 -0
  55. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_gepa_utils.py +0 -0
  56. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_gym_env.py +0 -0
  57. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_harbor_env_mcp.py +0 -0
  58. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_imports.py +0 -0
  59. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_init_script.py +0 -0
  60. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_install_utils.py +0 -0
  61. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_interception_utils.py +0 -0
  62. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_langchain_deep_agents_wikispeedia.py +0 -0
  63. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_lean_task.py +0 -0
  64. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_logging.py +0 -0
  65. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_math_rubric.py +0 -0
  66. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_maybe_think_parser.py +0 -0
  67. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_mcp_search_env.py +0 -0
  68. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_message_utils.py +0 -0
  69. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_message_utils_multimodal.py +0 -0
  70. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_multiturn_env.py +0 -0
  71. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_nemorl_client.py +0 -0
  72. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_openai_chat_completions_token_client.py +0 -0
  73. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_openai_responses_client.py +0 -0
  74. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_opencode_harbor.py +0 -0
  75. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_opencode_rlm_env.py +0 -0
  76. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_openenv_client.py +0 -0
  77. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_parser.py +0 -0
  78. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_path_utils.py +0 -0
  79. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_per_turn_timing.py +0 -0
  80. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_pricing_utils.py +0 -0
  81. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_prime_plugin.py +0 -0
  82. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_renderer_client.py +0 -0
  83. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_renderer_e2e.py +0 -0
  84. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_rlm_composable_env.py +0 -0
  85. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_rubric.py +0 -0
  86. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_rubric_group.py +0 -0
  87. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_sandbox_env.py +0 -0
  88. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_sandbox_mixin.py +0 -0
  89. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_save_utils.py +0 -0
  90. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_setup_script.py +0 -0
  91. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_singleturn_env.py +0 -0
  92. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_stateful_tool_env.py +0 -0
  93. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_think_parser.py +0 -0
  94. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_tool_env.py +0 -0
  95. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_tool_utils.py +0 -0
  96. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_trajectory_processing.py +0 -0
  97. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_tui_info_formatting.py +0 -0
  98. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_types.py +0 -0
  99. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_bfcl.py +0 -0
  100. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_empty_completions.py +0 -0
  101. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_endpoint_protocols.py +0 -0
  102. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_example_counts.py +0 -0
  103. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_group_reward_env.py +0 -0
  104. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_harbor_cli.py +0 -0
  105. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_mini_swe_agent.py +0 -0
  106. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_nemo_gym_harness.py +0 -0
  107. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_openenv_taskset.py +0 -0
  108. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_openreward_taskset.py +0 -0
  109. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_replay_harness.py +0 -0
  110. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_rlm_swe.py +0 -0
  111. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_scoring_functions.py +0 -0
  112. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_taskset_bindings.py +0 -0
  113. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_taskset_utils.py +0 -0
  114. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_textarena_taskset.py +0 -0
  115. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_wiki_search_v1.py +0 -0
  116. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_wordle_env.py +0 -0
  117. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_wordle_v1_env.py +0 -0
  118. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_xml_parser.py +0 -0
  119. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/AGENTS.md +0 -0
  120. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/__init__.py +0 -0
  121. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/__init__.py +0 -0
  122. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/commands/__init__.py +0 -0
  123. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/commands/build.py +0 -0
  124. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/commands/eval.py +0 -0
  125. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/commands/gepa.py +0 -0
  126. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/commands/init.py +0 -0
  127. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/commands/install.py +0 -0
  128. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/commands/setup.py +0 -0
  129. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/plugins/__init__.py +0 -0
  130. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/plugins/prime.py +0 -0
  131. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/tui.py +0 -0
  132. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/clients/__init__.py +0 -0
  133. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/clients/anthropic_messages_client.py +0 -0
  134. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/clients/client.py +0 -0
  135. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  136. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/clients/openai_chat_completions_client.py +0 -0
  137. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  138. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/clients/openai_completions_client.py +0 -0
  139. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/clients/openai_responses_client.py +0 -0
  140. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/clients/renderer_client.py +0 -0
  141. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/decorators.py +0 -0
  142. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/AGENTS.md +0 -0
  143. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/__init__.py +0 -0
  144. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/env_group.py +0 -0
  145. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/environment.py +0 -0
  146. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/README.md +0 -0
  147. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/__init__.py +0 -0
  148. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/README.md +0 -0
  149. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/__init__.py +0 -0
  150. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/_filter.py +0 -0
  151. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  152. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/harness.py +0 -0
  153. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  154. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  155. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  156. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/task.py +0 -0
  157. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  158. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  159. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  160. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  161. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  162. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  163. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/lean/__init__.py +0 -0
  164. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/lean/lean_task.py +0 -0
  165. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  166. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  167. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  168. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  169. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  170. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  171. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  172. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  173. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  174. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  175. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  176. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  177. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  178. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  179. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  180. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  181. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  182. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  183. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  184. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  185. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  186. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  187. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  188. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  189. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  190. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  191. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/gym_env.py +0 -0
  192. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  193. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  194. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  195. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/mcp_env.py +0 -0
  196. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/opencode_env.py +0 -0
  197. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  198. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  199. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  200. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/utils/__init__.py +0 -0
  201. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  202. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  203. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/README.md +0 -0
  204. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/__init__.py +0 -0
  205. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/README.md +0 -0
  206. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  207. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  208. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  209. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  210. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  211. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  212. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/openenv_env.py +0 -0
  213. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  214. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/textarena_env.py +0 -0
  215. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/multiturn_env.py +0 -0
  216. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/python_env.py +0 -0
  217. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/sandbox_env.py +0 -0
  218. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/singleturn_env.py +0 -0
  219. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/stateful_tool_env.py +0 -0
  220. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/tool_env.py +0 -0
  221. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/errors.py +0 -0
  222. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/gepa/__init__.py +0 -0
  223. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/gepa/adapter.py +0 -0
  224. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/gepa/config.py +0 -0
  225. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/gepa/display.py +0 -0
  226. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/gepa/gepa_utils.py +0 -0
  227. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/parsers/__init__.py +0 -0
  228. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/parsers/maybe_think_parser.py +0 -0
  229. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/parsers/parser.py +0 -0
  230. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/parsers/think_parser.py +0 -0
  231. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/parsers/xml_parser.py +0 -0
  232. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rl/README.md +0 -0
  233. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rl/__init__.py +0 -0
  234. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rl/inference/__init__.py +0 -0
  235. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rl/inference/client.py +0 -0
  236. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rl/inference/server.py +0 -0
  237. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rl/trainer/__init__.py +0 -0
  238. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rl/trainer/config.py +0 -0
  239. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rl/trainer/orchestrator.py +0 -0
  240. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rl/trainer/trainer.py +0 -0
  241. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rl/trainer/utils.py +0 -0
  242. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rubrics/__init__.py +0 -0
  243. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  244. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rubrics/judge_rubric.py +0 -0
  245. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rubrics/math_rubric.py +0 -0
  246. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rubrics/rubric.py +0 -0
  247. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rubrics/rubric_group.py +0 -0
  248. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/__init__.py +0 -0
  249. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/build.py +0 -0
  250. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/eval.py +0 -0
  251. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/gepa.py +0 -0
  252. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/init.py +0 -0
  253. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/install.py +0 -0
  254. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/rl.py +0 -0
  255. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/setup.py +0 -0
  256. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/train.py +0 -0
  257. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/tui.py +0 -0
  258. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/vllm.py +0 -0
  259. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/serve/__init__.py +0 -0
  260. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/serve/client/env_client.py +0 -0
  261. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/serve/client/zmq_env_client.py +0 -0
  262. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/serve/server/__init__.py +0 -0
  263. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/serve/server/env_router.py +0 -0
  264. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/serve/server/env_server.py +0 -0
  265. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/serve/server/env_worker.py +0 -0
  266. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/serve/server/zmq_env_server.py +0 -0
  267. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/serve/types.py +0 -0
  268. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/__init__.py +0 -0
  269. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/client_utils.py +0 -0
  270. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/config_utils.py +0 -0
  271. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/data_utils.py +0 -0
  272. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/display_utils.py +0 -0
  273. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/env_config_utils.py +0 -0
  274. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/eval_display.py +0 -0
  275. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/eval_utils.py +0 -0
  276. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/heartbeat.py +0 -0
  277. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/import_utils.py +0 -0
  278. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/install_utils.py +0 -0
  279. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/interception_utils.py +0 -0
  280. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/message_utils.py +0 -0
  281. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/metric_utils.py +0 -0
  282. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/path_utils.py +0 -0
  283. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/pricing_utils.py +0 -0
  284. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/process_utils.py +0 -0
  285. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/response_utils.py +0 -0
  286. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/serve_utils.py +0 -0
  287. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/thread_utils.py +0 -0
  288. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/threaded_sandbox_client.py +0 -0
  289. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/tool_utils.py +0 -0
  290. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/usage_utils.py +0 -0
  291. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/version_utils.py +0 -0
  292. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/ENVIRONMENT_BEST_PRACTICES.md +0 -0
  293. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/README.md +0 -0
  294. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/RE_MIGRATION.md +0 -0
  295. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/__init__.py +0 -0
  296. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/artifact.py +0 -0
  297. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/config.py +0 -0
  298. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/env.py +0 -0
  299. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/runtime_handles.py +0 -0
  300. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/sandbox.py +0 -0
  301. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/state.py +0 -0
  302. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/task.py +0 -0
  303. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/taskset.py +0 -0
  304. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/toolset.py +0 -0
  305. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/types.py +0 -0
  306. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/user.py +0 -0
  307. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/__init__.py +0 -0
  308. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/config_callable_utils.py +0 -0
  309. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/json_utils.py +0 -0
  310. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/judge_utils.py +0 -0
  311. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/lifecycle_utils.py +0 -0
  312. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/mcp_proxy_utils.py +0 -0
  313. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/mcp_utils.py +0 -0
  314. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/object_utils.py +0 -0
  315. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/prompt_utils.py +0 -0
  316. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/runtime_registry.py +0 -0
  317. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/sandbox_python_utils.py +0 -0
  318. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/scoring_utils.py +0 -0
  319. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/serialization_utils.py +0 -0
  320. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/task_freeze_utils.py +0 -0
  321. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/taskset_utils.py +0 -0
  322. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/tool_utils.py +0 -0
  323. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/trajectory_utils.py +0 -0
  324. {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/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.dev164
3
+ Version: 0.1.15.dev166
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
@@ -193,25 +193,20 @@ def test_taskset_repr():
193
193
  assert "3" in repr(ts)
194
194
 
195
195
 
196
- def test_composable_mini_swe_agent_unversioned_package_uses_unpinned_requirement():
197
- setup = build_mini_swe_agent_install_script(package=" mini-swe-agent ")
196
+ def test_composable_mini_swe_agent_install_script_uses_pip_requirement():
197
+ setup = build_mini_swe_agent_install_script()
198
198
 
199
- assert (
200
- "vf_python_install --target /opt/mini-swe-agent/prefix/site-packages mini-swe-agent"
201
- in setup
202
- )
203
- assert "mini-swe-agent==mini-swe-agent" not in setup
199
+ assert "mini-swe-agent==2.2.8" in setup
200
+ assert "files.pythonhosted.org" not in setup
204
201
 
205
202
 
206
- def test_composable_opencode_unversioned_release_uses_latest_download_url():
203
+ def test_composable_opencode_install_script_owns_release_download():
207
204
  setup = build_opencode_install_script(
208
- release=" PrimeIntellect-ai/opencode ",
209
205
  install_ripgrep=False,
210
206
  )
211
207
 
212
- assert "OPENCODE_RELEASE_REPO=PrimeIntellect-ai/opencode" in setup
213
- assert "OPENCODE_RELEASE_PATH=releases/latest/download" in setup
214
- assert "releases/download/vPrimeIntellect-ai/opencode" not in setup
208
+ assert "PrimeIntellect-ai/opencode/releases/download/v1.1.63-rl2" in setup
209
+ assert "tar -xzf /tmp/opencode.tar.gz" in setup
215
210
 
216
211
 
217
212
  @pytest.mark.asyncio
@@ -673,8 +673,8 @@ class TestMaybeRetry:
673
673
  rollout_outputs = outputs["outputs"]
674
674
  assert env.call_counts[0] == 1 # No retries for non-retryable error
675
675
  assert rollout_outputs[0].get("error") is not None
676
- error_info = rollout_outputs[0]["error"]
677
- assert "ToolError" == error_info["error"]
676
+ error_data = rollout_outputs[0]["error"]
677
+ assert "ToolError" == error_data["error"]
678
678
 
679
679
  @pytest.mark.asyncio
680
680
  async def test_error_in_state_after_max_retries_exhausted(
@@ -694,8 +694,8 @@ class TestMaybeRetry:
694
694
  rollout_outputs = outputs["outputs"]
695
695
  assert env.call_counts[0] == 3 # 1 initial + 2 retries
696
696
  assert rollout_outputs[0].get("error") is not None
697
- error_info = rollout_outputs[0]["error"]
698
- assert "InfraError" == error_info["error"]
697
+ error_data = rollout_outputs[0]["error"]
698
+ assert "InfraError" == error_data["error"]
699
699
 
700
700
 
701
701
  class TestEmptyModelResponseErrors:
@@ -1156,12 +1156,13 @@ def test_lifecycle_fields_are_framework_managed() -> None:
1156
1156
  task = Task({"prompt": [{"role": "user", "content": "hi"}]}).freeze()
1157
1157
  state = vf.State.for_task(task)
1158
1158
  assert state.uses_v1_contract is True
1159
+ error = vf.Error("boom")
1159
1160
 
1160
1161
  for key, value in {
1161
1162
  "is_completed": True,
1162
1163
  "stop_condition": "done",
1163
1164
  "is_truncated": True,
1164
- "error": {"message": "boom"},
1165
+ "error": error,
1165
1166
  }.items():
1166
1167
  assert State({key: value})[key] == value
1167
1168
  with pytest.raises(RuntimeError, match="framework-managed"):
@@ -1188,12 +1189,14 @@ def test_lifecycle_fields_are_framework_managed() -> None:
1188
1189
  state._set_completed(True)
1189
1190
  state._set_stop_condition("done")
1190
1191
  state._set_truncated(True)
1191
- state._set_error({"message": "boom"})
1192
+ with pytest.raises(TypeError, match="vf.Error"):
1193
+ state._set_error(cast(Any, {"message": "boom"}))
1194
+ state._set_error(error)
1192
1195
 
1193
1196
  assert state["is_completed"] is True
1194
1197
  assert state["stop_condition"] == "done"
1195
1198
  assert state["is_truncated"] is True
1196
- assert state["error"] == {"message": "boom"}
1199
+ assert state["error"] is error
1197
1200
 
1198
1201
 
1199
1202
  def test_toolsets_config_accepts_addressable_map_and_fn_tables() -> None:
@@ -1646,14 +1646,19 @@ def test_sandbox_program_patch_cannot_set_lifecycle_fields() -> None:
1646
1646
  patch = {
1647
1647
  "stop_condition": "no_tools",
1648
1648
  "is_truncated": True,
1649
- "error": {"message": "handled"},
1649
+ "error": vf.ErrorData(
1650
+ error="SandboxError",
1651
+ message="handled",
1652
+ error_chain_repr="SandboxError('handled')",
1653
+ error_chain_str="SandboxError",
1654
+ ),
1650
1655
  }
1651
1656
  apply_internal_state_patch(state, patch, mode="base")
1652
1657
 
1653
1658
  assert patch == {}
1654
1659
  assert state["stop_condition"] == "no_tools"
1655
1660
  assert state["is_truncated"] is True
1656
- assert state["error"] == {"message": "handled"}
1661
+ assert isinstance(state["error"], vf.SandboxError)
1657
1662
 
1658
1663
 
1659
1664
  def test_program_channels_mcp_injects_proxy_into_sandbox_program() -> None:
@@ -717,7 +717,7 @@ class CliAgentEnv(SandboxMixin, vf.MultiTurnEnv):
717
717
  num_turns = len(state.get("trajectory", []))
718
718
  stop_condition = state.get("stop_condition", "unknown")
719
719
  error = state.get("error")
720
- error_info = (
720
+ error_summary = (
721
721
  f"{type(error).__name__}: {truncate(str(error), 80)}" if error else None
722
722
  )
723
723
  exit_code = state.get("agent_exit_code")
@@ -741,8 +741,8 @@ class CliAgentEnv(SandboxMixin, vf.MultiTurnEnv):
741
741
  ]
742
742
  if timed_out:
743
743
  parts.append("timed_out=True")
744
- if error_info:
745
- parts.append(f"error={error_info}")
744
+ if error_summary:
745
+ parts.append(f"error={error_summary}")
746
746
  self.logger.info(" | ".join(parts))
747
747
 
748
748
  @vf.cleanup
@@ -9,7 +9,8 @@ from verifiers.envs.experimental.composable.harnesses.rlm import (
9
9
  )
10
10
  from verifiers.envs.experimental.composable.harnesses.opencode import (
11
11
  DEFAULT_DISABLED_TOOLS,
12
- DEFAULT_RELEASE,
12
+ DEFAULT_RELEASE_REPO,
13
+ DEFAULT_RELEASE_VERSION,
13
14
  DEFAULT_SYSTEM_PROMPT,
14
15
  OPENCODE_INSTALL_SCRIPT,
15
16
  build_install_script as build_opencode_install_script,
@@ -39,7 +40,8 @@ __all__ = [
39
40
  "build_opencode_run_command",
40
41
  "OPENCODE_INSTALL_SCRIPT",
41
42
  "DEFAULT_DISABLED_TOOLS",
42
- "DEFAULT_RELEASE",
43
+ "DEFAULT_RELEASE_REPO",
44
+ "DEFAULT_RELEASE_VERSION",
43
45
  "DEFAULT_SYSTEM_PROMPT",
44
46
  "mini_swe_agent_harness",
45
47
  "build_mini_swe_agent_install_script",
@@ -3,18 +3,15 @@
3
3
  from pathlib import PurePosixPath
4
4
  import shlex
5
5
 
6
- from harnesses.mini_swe_agent import (
7
- MINI_SWE_AGENT_DEFAULT_PACKAGE,
8
- build_mini_swe_agent_install_script as build_packaged_mini_swe_agent_install_script,
9
- )
10
-
11
6
  DEFAULT_INSTALL_DIR = "/opt/mini-swe-agent"
12
7
  DEFAULT_PREFIX_DIR = f"{DEFAULT_INSTALL_DIR}/prefix"
13
8
  DEFAULT_SITE_PACKAGES_DIR = f"{DEFAULT_PREFIX_DIR}/site-packages"
9
+ DEFAULT_UV_SITE_PACKAGES_DIR = f"{DEFAULT_INSTALL_DIR}/uv-site-packages"
14
10
  DEFAULT_MINI_BINARY = f"{DEFAULT_PREFIX_DIR}/bin/mini"
15
11
  MINI_SWE_AGENT_CLI_PACKAGE = "mini-swe-agent"
16
12
  MINI_SWE_AGENT_CLI_VERSION = "2.2.8"
17
- DEFAULT_PACKAGE = MINI_SWE_AGENT_DEFAULT_PACKAGE
13
+ MINI_SWE_AGENT_PYTHON_VERSION = "3.11"
14
+ UV_PACKAGE_VERSION = "0.11.7"
18
15
  DEFAULT_INSTRUCTION_PATH = "/mini-swe-agent/prompt.txt"
19
16
  DEFAULT_SYSTEM_PROMPT_PATH = "/mini-swe-agent/system.txt"
20
17
  DEFAULT_LOG_DIR = "/logs/agent"
@@ -27,14 +24,59 @@ DEFAULT_ENVIRONMENT_TIMEOUT = 120
27
24
 
28
25
 
29
26
  def build_mini_swe_agent_install_script(
30
- package: str = DEFAULT_PACKAGE,
31
27
  prefix_dir: str = DEFAULT_PREFIX_DIR,
28
+ install_python: bool = True,
32
29
  ) -> str:
33
30
  """Build the shell script that installs mini-SWE-agent."""
34
- return build_packaged_mini_swe_agent_install_script(
35
- package=package,
36
- prefix_dir=prefix_dir,
37
- )
31
+ install_tools = ""
32
+ if install_python:
33
+ # Acquire::Retries=3 mitigates transient archive.ubuntu.com CDN sync
34
+ # mismatches that fail fresh-sandbox apt-get update mid-rollout.
35
+ install_tools = """\
36
+ export DEBIAN_FRONTEND=noninteractive
37
+ if ! command -v python3 >/dev/null 2>&1 || ! python3 -m pip --version >/dev/null 2>&1; then
38
+ apt-get -o Acquire::Retries=3 update -qq
39
+ apt-get -o Acquire::Retries=3 install -y -qq python3 python3-pip ca-certificates
40
+ fi
41
+ """
42
+
43
+ quoted_prefix_dir = shlex.quote(prefix_dir)
44
+ site_packages_dir = f"{prefix_dir}/site-packages"
45
+ package_requirement = f"{MINI_SWE_AGENT_CLI_PACKAGE}=={MINI_SWE_AGENT_CLI_VERSION}"
46
+ quoted_site_packages_dir = shlex.quote(site_packages_dir)
47
+ quoted_install_dir = shlex.quote(DEFAULT_INSTALL_DIR)
48
+ quoted_uv_site_packages_dir = shlex.quote(DEFAULT_UV_SITE_PACKAGES_DIR)
49
+ quoted_package_requirement = shlex.quote(package_requirement)
50
+ return f"""\
51
+ set -e
52
+ {install_tools}
53
+ rm -rf {quoted_prefix_dir}
54
+ mkdir -p {quoted_install_dir} {quoted_prefix_dir}/bin {quoted_site_packages_dir} {quoted_uv_site_packages_dir} {shlex.quote(DEFAULT_LOG_DIR)} /mini-swe-agent
55
+ export PIP_CONFIG_FILE=/dev/null
56
+ export PIP_INDEX_URL=https://pypi.org/simple
57
+ export PIP_BREAK_SYSTEM_PACKAGES=1
58
+ unset PIP_EXTRA_INDEX_URL
59
+ PYTHON_BIN="$(command -v python3)"
60
+ MINI_SWE_AGENT_PYTHON="$PYTHON_BIN"
61
+ if ! "$PYTHON_BIN" -c 'import sys; raise SystemExit(sys.version_info < (3, 10))'; then
62
+ "$PYTHON_BIN" -m pip install --quiet --target {quoted_uv_site_packages_dir} uv=={UV_PACKAGE_VERSION}
63
+ env PYTHONPATH={quoted_uv_site_packages_dir} "$PYTHON_BIN" -m uv python install {MINI_SWE_AGENT_PYTHON_VERSION}
64
+ MINI_SWE_AGENT_PYTHON="$(env PYTHONPATH={quoted_uv_site_packages_dir} "$PYTHON_BIN" -m uv python find {MINI_SWE_AGENT_PYTHON_VERSION})"
65
+ fi
66
+ if [ "$MINI_SWE_AGENT_PYTHON" = "$PYTHON_BIN" ]; then
67
+ "$PYTHON_BIN" -m pip install --quiet --target {quoted_site_packages_dir} {quoted_package_requirement}
68
+ else
69
+ env PYTHONPATH={quoted_uv_site_packages_dir} "$PYTHON_BIN" -m uv pip install --python "$MINI_SWE_AGENT_PYTHON" --target {quoted_site_packages_dir} {quoted_package_requirement}
70
+ fi
71
+ echo "$MINI_SWE_AGENT_PYTHON" > {quoted_prefix_dir}/python
72
+ cat > {quoted_prefix_dir}/bin/mini <<'EOF'
73
+ #!/usr/bin/env sh
74
+ export PYTHONPATH={shlex.quote(site_packages_dir)}:${{PYTHONPATH:-}}
75
+ exec "$(cat {quoted_prefix_dir}/python)" -m minisweagent.run.mini "$@"
76
+ EOF
77
+ chmod +x {quoted_prefix_dir}/bin/mini
78
+ test -x {quoted_prefix_dir}/bin/mini
79
+ """
38
80
 
39
81
 
40
82
  def build_mini_swe_agent_run_command(
@@ -133,7 +175,6 @@ def mini_swe_agent_harness(
133
175
  system_prompt_path: str = DEFAULT_SYSTEM_PROMPT_PATH,
134
176
  log_path: str = DEFAULT_LOG_PATH,
135
177
  trajectory_path: str = DEFAULT_TRAJECTORY_PATH,
136
- package: str = DEFAULT_PACKAGE,
137
178
  config_spec: str = DEFAULT_CONFIG_SPEC,
138
179
  model_class: str = DEFAULT_MODEL_CLASS,
139
180
  environment_timeout: int = DEFAULT_ENVIRONMENT_TIMEOUT,
@@ -152,9 +193,7 @@ def mini_swe_agent_harness(
152
193
  # The system prompt is passed through ComposableEnv as a file and injected
153
194
  # into mini's agent.system_template at runtime.
154
195
  return Harness(
155
- install_script=build_mini_swe_agent_install_script(
156
- package=package,
157
- ),
196
+ install_script=build_mini_swe_agent_install_script(),
158
197
  run_command=build_mini_swe_agent_run_command(
159
198
  agent_workdir=agent_workdir,
160
199
  instruction_path=instruction_path,
@@ -13,11 +13,10 @@ import json
13
13
  import shlex
14
14
  from pathlib import Path, PurePosixPath
15
15
 
16
- from harnesses.utils import split_versioned_agent_spec
17
-
18
16
  # ── Defaults ─────────────────────────────────────────────────────────────
19
17
 
20
- DEFAULT_RELEASE = "PrimeIntellect-ai/opencode@1.1.63-rl2"
18
+ DEFAULT_RELEASE_REPO = "PrimeIntellect-ai/opencode"
19
+ DEFAULT_RELEASE_VERSION = "1.1.63-rl2"
21
20
  DEFAULT_SYSTEM_PROMPT = (Path(__file__).parent / "prompt.txt").read_text()
22
21
 
23
22
  DEFAULT_DISABLED_TOOLS = [
@@ -47,7 +46,6 @@ DEFAULT_DISABLED_TOOLS = [
47
46
 
48
47
 
49
48
  def build_install_script(
50
- release: str = DEFAULT_RELEASE,
51
49
  install_ripgrep: bool = True,
52
50
  ) -> str:
53
51
  """Build the shell script that installs OpenCode in a sandbox."""
@@ -56,15 +54,6 @@ def build_install_script(
56
54
  if install_ripgrep
57
55
  else ""
58
56
  )
59
- release_repo, release_version = split_versioned_agent_spec(release)
60
- release_path = "releases/latest/download"
61
- if release_version and release_version != "latest":
62
- release_tag = (
63
- release_version
64
- if release_version.startswith("v")
65
- else f"v{release_version}"
66
- )
67
- release_path = f"releases/download/{release_tag}"
68
57
  # Acquire::Retries=3 mitigates transient archive.ubuntu.com CDN sync mismatches
69
58
  # (e.g. "File has unexpected size ... Mirror sync in progress?"). See launchpad
70
59
  # bug #1876035. apt's default retries is 0, so one bad fetch fails the rollout.
@@ -73,9 +62,6 @@ set -e
73
62
  apt-get -o Acquire::Retries=3 update -qq && apt-get -o Acquire::Retries=3 install -y -qq curl tar > /dev/null 2>&1
74
63
  {rg_install}
75
64
 
76
- OPENCODE_RELEASE_REPO={shlex.quote(release_repo)}
77
- OPENCODE_RELEASE_PATH={shlex.quote(release_path)}
78
-
79
65
  case "$(uname -m)" in
80
66
  x86_64) OPENCODE_ARCH=x64 ;;
81
67
  aarch64|arm64) OPENCODE_ARCH=arm64 ;;
@@ -83,7 +69,7 @@ case "$(uname -m)" in
83
69
  esac
84
70
 
85
71
  OPENCODE_ASSET="opencode-linux-$OPENCODE_ARCH.tar.gz"
86
- OPENCODE_RELEASE_URL="https://github.com/$OPENCODE_RELEASE_REPO/$OPENCODE_RELEASE_PATH/$OPENCODE_ASSET"
72
+ OPENCODE_RELEASE_URL="https://github.com/{DEFAULT_RELEASE_REPO}/releases/download/v{DEFAULT_RELEASE_VERSION}/$OPENCODE_ASSET"
87
73
 
88
74
  mkdir -p "$HOME/.opencode/bin"
89
75
  if [ -x "$HOME/.opencode/bin/opencode" ]; then
@@ -248,7 +234,6 @@ def opencode_harness(
248
234
  agent_workdir: str = "/app",
249
235
  allow_git: bool = False,
250
236
  disable_compaction: bool = True,
251
- release: str = DEFAULT_RELEASE,
252
237
  instruction_path: str = "/opencode/prompt.txt",
253
238
  system_prompt_path: str = "/opencode/system.txt",
254
239
  log_path: str = "/opencode/logs.txt",
@@ -275,9 +260,7 @@ def opencode_harness(
275
260
  system_prompt = task_system_prompt
276
261
 
277
262
  return Harness(
278
- install_script=build_install_script(
279
- release=release,
280
- ),
263
+ install_script=build_install_script(),
281
264
  run_command=build_opencode_run_command(
282
265
  agent_workdir=agent_workdir,
283
266
  prompt_path=instruction_path,
@@ -17,6 +17,8 @@ from typing import (
17
17
  cast,
18
18
  )
19
19
 
20
+ from anthropic import Anthropic, AsyncAnthropic
21
+ from openai import AsyncOpenAI, OpenAI
20
22
  from pydantic import (
21
23
  AliasChoices,
22
24
  BaseModel,
@@ -26,6 +28,8 @@ from pydantic import (
26
28
  field_validator,
27
29
  )
28
30
 
31
+ from verifiers.errors import Error
32
+
29
33
  if TYPE_CHECKING:
30
34
  from anthropic.types import RedactedThinkingBlock
31
35
  from anthropic.types import ThinkingBlock as AnthropicThinkingBlock
@@ -33,7 +37,6 @@ if TYPE_CHECKING:
33
37
  from renderers import RendererConfig
34
38
 
35
39
  from verifiers.clients import Client
36
- from verifiers.errors import Error
37
40
  else:
38
41
  RedactedThinkingBlock = Any
39
42
  AnthropicThinkingBlock = Any
@@ -72,6 +75,7 @@ EndpointApi = Literal[
72
75
  "openai_responses",
73
76
  "anthropic_messages",
74
77
  ]
78
+ EndpointClient: TypeAlias = AsyncOpenAI | OpenAI | AsyncAnthropic | Anthropic
75
79
  MessageType = Literal["chat", "completion"] # deprecated
76
80
 
77
81
 
@@ -388,8 +392,9 @@ class RolloutTiming(CustomBaseModel):
388
392
  )
389
393
 
390
394
 
391
- class ErrorInfo(TypedDict):
395
+ class ErrorData(TypedDict):
392
396
  error: str
397
+ message: str
393
398
  error_chain_repr: str
394
399
  error_chain_str: str
395
400
 
@@ -420,7 +425,7 @@ class RolloutOutput(dict):
420
425
  # Optional fields
421
426
  answer: str
422
427
  info: Info
423
- error: ErrorInfo | None
428
+ error: ErrorData | None
424
429
  stop_condition: str | None
425
430
  trajectory: list["TrajectoryStep"]
426
431
  tool_defs: list[Tool]
@@ -489,7 +494,7 @@ class State(dict):
489
494
  advantage: float | None
490
495
  metrics: dict[str, float] | None
491
496
  timing: RolloutTiming | None
492
- error: "Error | ErrorInfo | None"
497
+ error: Error | None
493
498
  usage: TokenUsage | None
494
499
  usage_tracker: object
495
500
  _vf_state_contract: Literal["legacy", "v1"]
@@ -589,7 +594,9 @@ class State(dict):
589
594
  def _set_completed(self, value: bool = True) -> None:
590
595
  self._set_internal("is_completed", value)
591
596
 
592
- def _set_error(self, value: Any) -> None:
597
+ def _set_error(self, value: Error | None) -> None:
598
+ if value is not None and not isinstance(value, Error):
599
+ raise TypeError("state.error must be a vf.Error or None.")
593
600
  self._set_internal("error", value)
594
601
 
595
602
  def _set_stop_condition(
@@ -656,7 +663,7 @@ class State(dict):
656
663
  api: EndpointApi | ClientType = "chat_completions",
657
664
  *,
658
665
  sync: bool = False,
659
- ) -> object:
666
+ ) -> EndpointClient:
660
667
  from verifiers.v1.utils.endpoint_utils import client_from_state
661
668
 
662
669
  return client_from_state(self, api, sync=sync)
@@ -848,9 +855,17 @@ class State(dict):
848
855
 
849
856
  def finalize(self) -> "State":
850
857
  self.strip_runtime_handles()
858
+ self.serialize_error()
851
859
  self.assert_serializable()
852
860
  return self
853
861
 
862
+ def serialize_error(self) -> None:
863
+ error = self.get("error")
864
+ if isinstance(error, Error):
865
+ from verifiers.utils.error_utils import error_data
866
+
867
+ self._set_internal("error", error_data(error))
868
+
854
869
  @classmethod
855
870
  def _legacy_for_task(cls, task: Mapping[str, Any]) -> "State":
856
871
  state = cls(
@@ -13,7 +13,7 @@ from pydantic import BaseModel
13
13
 
14
14
  import verifiers as vf
15
15
  from verifiers.utils.error_utils import ErrorChain
16
- from verifiers.utils.error_utils import error_info_to_exception
16
+ from verifiers.utils.error_utils import error_data_to_exception
17
17
  from verifiers.utils.logging_utils import print_time
18
18
 
19
19
  logger = logging.getLogger(__name__)
@@ -168,7 +168,7 @@ def maybe_retry(
168
168
  if err and any(isinstance(err, err_type) for err_type in error_types):
169
169
  raise err
170
170
  if isinstance(err, Mapping):
171
- retry_error = error_info_to_exception(err, error_types)
171
+ retry_error = error_data_to_exception(err, error_types)
172
172
  if retry_error is not None:
173
173
  raise retry_error
174
174
  elif isinstance(result, list):
@@ -177,7 +177,7 @@ def maybe_retry(
177
177
  if err and any(isinstance(err, err_type) for err_type in error_types):
178
178
  raise err
179
179
  if isinstance(err, Mapping):
180
- retry_error = error_info_to_exception(err, error_types)
180
+ retry_error = error_data_to_exception(err, error_types)
181
181
  if retry_error is not None:
182
182
  raise retry_error
183
183
 
@@ -4,7 +4,15 @@ import logging
4
4
  import sys
5
5
  from collections.abc import Mapping
6
6
  from types import ModuleType, UnionType
7
- from typing import Callable, Union, cast, get_args, get_origin, get_type_hints
7
+ from typing import (
8
+ Callable,
9
+ TypeAlias,
10
+ Union,
11
+ cast,
12
+ get_args,
13
+ get_origin,
14
+ get_type_hints,
15
+ )
8
16
 
9
17
  from pydantic import BaseModel
10
18
  from verifiers.envs.environment import Environment
@@ -12,8 +20,13 @@ from verifiers.utils.config_utils import MissingKeyError
12
20
  from verifiers.v1.env import Env, EnvConfig
13
21
  from verifiers.v1.harness import Harness, HarnessConfig
14
22
  from verifiers.v1.taskset import Taskset, TasksetConfig
23
+ from verifiers.v1.types import ConfigData, ConfigValue
15
24
  from verifiers.v1.utils.config_utils import coerce_config, explicit_config_data
16
25
 
26
+ EnvConfigLoadData: TypeAlias = dict[str, ConfigValue | BaseModel]
27
+ EnvConfigChildInput: TypeAlias = ConfigData | EnvConfigLoadData
28
+ EnvConfigInput: TypeAlias = EnvConfig | ConfigData
29
+
17
30
 
18
31
  def load_environment(env_id: str, **env_args) -> Environment:
19
32
  logger = logging.getLogger("verifiers.utils.env_utils")
@@ -127,7 +140,7 @@ def caller_module() -> ModuleType:
127
140
  def load_taskset(
128
141
  env_id: str | None = None,
129
142
  *,
130
- config: TasksetConfig | Mapping[str, object] | None = None,
143
+ config: TasksetConfig | ConfigData | None = None,
131
144
  ) -> Taskset:
132
145
  module = caller_module() if env_id is None else import_env_module(env_id)
133
146
  return load_taskset_from_module(module, config=config)
@@ -136,7 +149,7 @@ def load_taskset(
136
149
  def load_harness(
137
150
  env_id: str | None = None,
138
151
  *,
139
- config: HarnessConfig | Mapping[str, object] | None = None,
152
+ config: HarnessConfig | ConfigData | None = None,
140
153
  ) -> Harness:
141
154
  module = caller_module() if env_id is None else import_env_module(env_id)
142
155
  return load_harness_from_module(module, config=config)
@@ -145,7 +158,7 @@ def load_harness(
145
158
  def load_taskset_from_module(
146
159
  module: ModuleType,
147
160
  *,
148
- config: TasksetConfig | Mapping[str, object] | None = None,
161
+ config: TasksetConfig | ConfigData | None = None,
149
162
  ) -> Taskset:
150
163
  factory = getattr(module, "load_taskset", None)
151
164
  if factory is None:
@@ -170,7 +183,7 @@ def load_taskset_from_module(
170
183
  def load_harness_from_module(
171
184
  module: ModuleType,
172
185
  *,
173
- config: HarnessConfig | Mapping[str, object] | None = None,
186
+ config: HarnessConfig | ConfigData | None = None,
174
187
  ) -> Harness:
175
188
  factory = getattr(module, "load_harness", None)
176
189
  if factory is None:
@@ -260,11 +273,11 @@ def env_config_type(annotation: object) -> type[EnvConfig] | None:
260
273
  def load_env_config(
261
274
  module: ModuleType,
262
275
  config_type: type[EnvConfig],
263
- value: object,
276
+ value: EnvConfigInput,
264
277
  *,
265
278
  child_types: Mapping[str, type[BaseModel]] | None = None,
266
279
  ) -> EnvConfig:
267
- data: dict[str, object]
280
+ data: EnvConfigLoadData
268
281
  if isinstance(value, config_type):
269
282
  data = dict(explicit_config_data(value))
270
283
  elif isinstance(value, BaseModel):
@@ -275,7 +288,7 @@ def load_env_config(
275
288
  elif not isinstance(value, Mapping):
276
289
  raise TypeError("load_environment config must be a mapping or EnvConfig.")
277
290
  else:
278
- data = dict(explicit_config_data(value))
291
+ data = dict(value)
279
292
  resolved_child_types = (
280
293
  env_config_child_types(module, config_type, data)
281
294
  if child_types is None
@@ -293,6 +306,8 @@ def load_env_config(
293
306
  continue
294
307
  if child is None:
295
308
  raise TypeError(f"config.{field_name} cannot be None.")
309
+ if not isinstance(child, BaseModel | dict):
310
+ raise TypeError(f"config.{field_name} must be a mapping or config object.")
296
311
  data[field_name] = child_type.model_validate(explicit_config_data(child))
297
312
  config = config_type.model_validate(data)
298
313
  for field_name, child_type in resolved_child_types.items():
@@ -308,7 +323,7 @@ def load_env_config(
308
323
  def env_config_child_types(
309
324
  module: ModuleType,
310
325
  config_type: type[EnvConfig],
311
- value: Mapping[str, object] | None = None,
326
+ value: EnvConfigChildInput | None = None,
312
327
  ) -> dict[str, type[BaseModel]]:
313
328
  child_types: dict[str, type[BaseModel]] = {}
314
329
  for field_name, id_field, factory_name, base_type in (
@@ -1,8 +1,7 @@
1
- from collections.abc import Mapping
2
- from typing import Callable, cast
1
+ from typing import Callable, TypeGuard, cast
3
2
 
4
3
  import verifiers as vf
5
- from verifiers.types import ErrorInfo
4
+ from verifiers.types import ErrorData
6
5
 
7
6
 
8
7
  def get_error_chain(
@@ -56,22 +55,72 @@ class ErrorChain:
56
55
  return " -> ".join([repr(e) for e in self.chain])
57
56
 
58
57
 
59
- def error_info(error: BaseException) -> ErrorInfo:
58
+ def error_data(error: BaseException) -> ErrorData:
60
59
  error_chain = ErrorChain(error)
61
- return ErrorInfo(
60
+ return ErrorData(
62
61
  error=type(error).__name__,
62
+ message=str(error) or type(error).__name__,
63
63
  error_chain_repr=repr(error_chain),
64
64
  error_chain_str=str(error_chain),
65
65
  )
66
66
 
67
67
 
68
- def error_info_to_exception(
69
- error: Mapping[str, object],
68
+ def is_error_data(value: object) -> TypeGuard[ErrorData]:
69
+ expected = {"error", "message", "error_chain_repr", "error_chain_str"}
70
+ if not isinstance(value, dict):
71
+ return False
72
+ match value:
73
+ case {
74
+ "error": str(),
75
+ "message": str(),
76
+ "error_chain_repr": str(),
77
+ "error_chain_str": str(),
78
+ }:
79
+ return set(value) == expected
80
+ return False
81
+
82
+
83
+ def validate_error_data(value: object) -> ErrorData:
84
+ if not is_error_data(value):
85
+ raise TypeError(
86
+ "ErrorData must contain string error, message, error_chain_repr, "
87
+ "and error_chain_str fields."
88
+ )
89
+ return value
90
+
91
+
92
+ def error_data_to_exception(
93
+ error: ErrorData,
70
94
  error_types: tuple[type[Exception], ...],
71
95
  ) -> Exception | None:
72
- chain = str(error.get("error_chain_str") or error.get("error") or "")
73
- detail = str(error.get("error_chain_repr") or error.get("error") or "")
96
+ chain = error["error_chain_str"] or error["error"]
97
+ detail = error["error_chain_repr"] or error["error"]
74
98
  for error_type in error_types:
75
99
  if error_type.__name__ in chain:
76
100
  return error_type(detail)
77
101
  return None
102
+
103
+
104
+ def error_from_data(error: ErrorData) -> vf.Error:
105
+ exception = error_data_to_exception(error, vf_error_types())
106
+ if isinstance(exception, vf.Error):
107
+ return exception
108
+ detail = error["error_chain_repr"] or error["error"]
109
+ return vf.Error(detail)
110
+
111
+
112
+ def vf_error_types() -> tuple[type[vf.Error], ...]:
113
+ return (
114
+ vf.BrowserSandboxError,
115
+ vf.SandboxError,
116
+ vf.TunnelError,
117
+ vf.InfraError,
118
+ vf.EmptyModelResponseError,
119
+ vf.InvalidModelResponseError,
120
+ vf.ModelError,
121
+ vf.ToolParseError,
122
+ vf.ToolCallError,
123
+ vf.ToolError,
124
+ vf.OverlongPromptError,
125
+ vf.Error,
126
+ )