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.
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/PKG-INFO +1 -1
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_composable_env.py +7 -12
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_environment.py +4 -4
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_config_extension.py +6 -3
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_runtime_lifecycle.py +7 -2
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/cli_agent_env.py +3 -3
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/harnesses/__init__.py +4 -2
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +54 -15
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/harnesses/opencode.py +4 -21
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/types.py +21 -6
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/async_utils.py +3 -3
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/env_utils.py +24 -9
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/error_utils.py +58 -9
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/logging_utils.py +2 -2
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/save_utils.py +4 -19
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/harness.py +2 -2
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/model.py +6 -3
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/program.py +0 -2
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/runtime.py +3 -3
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/binding_utils.py +7 -3
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/config_utils.py +7 -5
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/endpoint_utils.py +24 -16
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/logging_utils.py +6 -2
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/program_utils.py +53 -24
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/runtime_owner_utils.py +12 -4
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/sandbox_program_utils.py +29 -6
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/sandbox_utils.py +11 -3
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/toolset_utils.py +2 -2
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/.gitignore +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/LICENSE +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/README.md +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/pyproject.toml +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/AGENTS.md +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/README.md +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/conftest.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_browser_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_build_script.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_client_config.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_env_group.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_env_server.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_environment_extra.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_envs.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_error_chain.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_eval_cli.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_eval_display.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_eval_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_gym_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_imports.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_init_script.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_install_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_interception_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_langchain_deep_agents_wikispeedia.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_lean_task.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_logging.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_math_rubric.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_mcp_search_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_message_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_opencode_harbor.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_openenv_client.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_parser.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_path_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_renderer_client.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_rubric.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_rubric_group.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_save_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_setup_script.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_think_parser.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_tool_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_tool_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_types.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_bfcl.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_empty_completions.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_endpoint_protocols.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_example_counts.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_group_reward_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_harbor_cli.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_mini_swe_agent.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_nemo_gym_harness.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_openenv_taskset.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_openreward_taskset.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_replay_harness.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_rlm_swe.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_scoring_functions.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_taskset_bindings.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_taskset_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_v1_textarena_taskset.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_wiki_search_v1.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_wordle_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_wordle_v1_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/tests/test_xml_parser.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/AGENTS.md +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/cli/tui.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/clients/client.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/decorators.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/environment.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/lean/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/lean/lean_task.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/errors.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/gepa/config.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/gepa/display.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rl/README.md +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rl/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rl/inference/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rl/inference/client.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rl/inference/server.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rl/trainer/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rl/trainer/config.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rl/trainer/orchestrator.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rl/trainer/trainer.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rl/trainer/utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/build.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/init.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/install.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/rl.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/train.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/scripts/vllm.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/serve/types.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/ENVIRONMENT_BEST_PRACTICES.md +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/README.md +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/RE_MIGRATION.md +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/artifact.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/config.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/env.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/runtime_handles.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/sandbox.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/state.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/task.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/toolset.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/types.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/user.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/config_callable_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/json_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/judge_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/lifecycle_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/mcp_proxy_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/mcp_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/object_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/prompt_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/runtime_registry.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/sandbox_python_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/scoring_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/serialization_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/task_freeze_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/taskset_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/tool_utils.py +0 -0
- {verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/v1/utils/trajectory_utils.py +0 -0
- {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.
|
|
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
|
|
197
|
-
setup = build_mini_swe_agent_install_script(
|
|
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
|
-
|
|
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
|
|
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 "
|
|
213
|
-
assert "
|
|
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
|
-
|
|
677
|
-
assert "ToolError" ==
|
|
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
|
-
|
|
698
|
-
assert "InfraError" ==
|
|
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":
|
|
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
|
-
|
|
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"]
|
|
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":
|
|
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"]
|
|
1661
|
+
assert isinstance(state["error"], vf.SandboxError)
|
|
1657
1662
|
|
|
1658
1663
|
|
|
1659
1664
|
def test_program_channels_mcp_injects_proxy_into_sandbox_program() -> None:
|
{verifiers-0.1.15.dev164 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/cli_agent_env.py
RENAMED
|
@@ -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
|
-
|
|
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
|
|
745
|
-
parts.append(f"error={
|
|
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
|
-
|
|
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
|
-
"
|
|
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
|
-
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
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/$
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
) ->
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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:
|
|
276
|
+
value: EnvConfigInput,
|
|
264
277
|
*,
|
|
265
278
|
child_types: Mapping[str, type[BaseModel]] | None = None,
|
|
266
279
|
) -> EnvConfig:
|
|
267
|
-
data:
|
|
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(
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
58
|
+
def error_data(error: BaseException) -> ErrorData:
|
|
60
59
|
error_chain = ErrorChain(error)
|
|
61
|
-
return
|
|
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
|
|
69
|
-
error
|
|
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 =
|
|
73
|
-
detail =
|
|
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
|
+
)
|