verifiers 0.1.15.dev165__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.dev165 → verifiers-0.1.15.dev166}/PKG-INFO +1 -1
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_environment.py +4 -4
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_v1_config_extension.py +6 -3
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_v1_runtime_lifecycle.py +7 -2
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/cli_agent_env.py +3 -3
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/types.py +21 -6
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/async_utils.py +3 -3
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/env_utils.py +24 -9
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/error_utils.py +58 -9
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/logging_utils.py +2 -2
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/save_utils.py +4 -19
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/harness.py +2 -2
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/model.py +6 -3
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/program.py +0 -2
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/runtime.py +3 -3
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/binding_utils.py +7 -3
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/config_utils.py +7 -5
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/endpoint_utils.py +24 -16
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/logging_utils.py +6 -2
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/program_utils.py +53 -24
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/runtime_owner_utils.py +12 -4
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/sandbox_program_utils.py +29 -6
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/sandbox_utils.py +11 -3
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/toolset_utils.py +2 -2
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/.gitignore +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/LICENSE +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/README.md +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/pyproject.toml +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/AGENTS.md +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/README.md +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/conftest.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_browser_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_build_script.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_client_config.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_composable_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_env_group.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_env_server.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_environment_extra.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_envs.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_error_chain.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_eval_cli.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_eval_display.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_eval_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_gym_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_imports.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_init_script.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_install_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_interception_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_langchain_deep_agents_wikispeedia.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_lean_task.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_logging.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_math_rubric.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_mcp_search_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_message_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_opencode_harbor.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_openenv_client.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_parser.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_path_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_renderer_client.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_rubric.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_rubric_group.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_save_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_setup_script.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_think_parser.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_tool_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_tool_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_types.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_v1_bfcl.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_v1_empty_completions.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_v1_endpoint_protocols.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_v1_example_counts.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_v1_group_reward_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_v1_harbor_cli.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_v1_mini_swe_agent.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_v1_nemo_gym_harness.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_v1_openenv_taskset.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_v1_openreward_taskset.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_v1_replay_harness.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_v1_rlm_swe.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_v1_scoring_functions.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_v1_taskset_bindings.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_v1_taskset_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_v1_textarena_taskset.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_wiki_search_v1.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_wordle_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_wordle_v1_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/tests/test_xml_parser.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/AGENTS.md +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/cli/tui.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/clients/client.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/decorators.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/environment.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/lean/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/lean/lean_task.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/errors.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/gepa/config.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/gepa/display.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/rl/README.md +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/rl/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/rl/inference/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/rl/inference/client.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/rl/inference/server.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/rl/trainer/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/rl/trainer/config.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/rl/trainer/orchestrator.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/rl/trainer/trainer.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/rl/trainer/utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/scripts/build.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/scripts/init.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/scripts/install.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/scripts/rl.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/scripts/train.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/scripts/vllm.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/serve/types.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/ENVIRONMENT_BEST_PRACTICES.md +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/README.md +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/RE_MIGRATION.md +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/artifact.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/config.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/env.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/runtime_handles.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/sandbox.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/state.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/task.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/toolset.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/types.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/user.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/config_callable_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/json_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/judge_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/lifecycle_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/mcp_proxy_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/mcp_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/object_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/prompt_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/runtime_registry.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/sandbox_python_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/scoring_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/serialization_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/task_freeze_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/taskset_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/tool_utils.py +0 -0
- {verifiers-0.1.15.dev165 → verifiers-0.1.15.dev166}/verifiers/v1/utils/trajectory_utils.py +0 -0
- {verifiers-0.1.15.dev165 → 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
|
|
@@ -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.dev165 → 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
|
|
@@ -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
|
+
)
|
|
@@ -10,7 +10,7 @@ from rich.table import Table
|
|
|
10
10
|
from rich.text import Text
|
|
11
11
|
|
|
12
12
|
from verifiers.errors import Error
|
|
13
|
-
from verifiers.types import
|
|
13
|
+
from verifiers.types import ErrorData, Messages
|
|
14
14
|
from verifiers.utils.error_utils import ErrorChain
|
|
15
15
|
|
|
16
16
|
LOGGER_NAME = "verifiers"
|
|
@@ -156,7 +156,7 @@ def quiet_verifiers():
|
|
|
156
156
|
def print_prompt_completions_sample(
|
|
157
157
|
prompts: list[Messages],
|
|
158
158
|
completions: list[Messages],
|
|
159
|
-
errors: list[Error |
|
|
159
|
+
errors: list[Error | ErrorData | None],
|
|
160
160
|
rewards: list[float],
|
|
161
161
|
step: int,
|
|
162
162
|
num_samples: int = 1,
|
|
@@ -13,7 +13,6 @@ from pydantic import BaseModel
|
|
|
13
13
|
|
|
14
14
|
from verifiers.types import (
|
|
15
15
|
ClientConfig,
|
|
16
|
-
ErrorInfo,
|
|
17
16
|
GenerateMetadata,
|
|
18
17
|
GenerateOutputs,
|
|
19
18
|
Response,
|
|
@@ -23,7 +22,7 @@ from verifiers.types import (
|
|
|
23
22
|
TokenUsage,
|
|
24
23
|
Tool,
|
|
25
24
|
)
|
|
26
|
-
from verifiers.utils.error_utils import
|
|
25
|
+
from verifiers.utils.error_utils import error_data, validate_error_data
|
|
27
26
|
from verifiers.utils.message_utils import (
|
|
28
27
|
sanitize_tool_calls,
|
|
29
28
|
serialize_messages_for_output,
|
|
@@ -280,26 +279,12 @@ def state_to_output(
|
|
|
280
279
|
serialize_messages_for_output(completion)
|
|
281
280
|
)
|
|
282
281
|
output["completion"] = output_completion
|
|
283
|
-
# use repr for error
|
|
284
282
|
error = state.get("error")
|
|
285
283
|
if error is not None:
|
|
286
|
-
if isinstance(error,
|
|
287
|
-
"error"
|
|
288
|
-
"error_chain_repr",
|
|
289
|
-
"error_chain_str",
|
|
290
|
-
} <= set(error):
|
|
291
|
-
output["error"] = ErrorInfo(
|
|
292
|
-
error=str(error["error"]),
|
|
293
|
-
error_chain_repr=str(error["error_chain_repr"]),
|
|
294
|
-
error_chain_str=str(error["error_chain_str"]),
|
|
295
|
-
)
|
|
284
|
+
if isinstance(error, BaseException):
|
|
285
|
+
output["error"] = error_data(error)
|
|
296
286
|
else:
|
|
297
|
-
|
|
298
|
-
output["error"] = ErrorInfo(
|
|
299
|
-
error=type(error).__name__,
|
|
300
|
-
error_chain_repr=repr(error_chain),
|
|
301
|
-
error_chain_str=str(error_chain),
|
|
302
|
-
)
|
|
287
|
+
output["error"] = validate_error_data(error)
|
|
303
288
|
output["error_chain"] = output["error"]["error_chain_repr"]
|
|
304
289
|
output["long_error_chain"] = output["error"]["error_chain_str"]
|
|
305
290
|
# only include optional fields if non-empty
|
|
@@ -15,7 +15,6 @@ from verifiers.types import (
|
|
|
15
15
|
ToolMessage,
|
|
16
16
|
)
|
|
17
17
|
from verifiers.utils.async_utils import maybe_call_with_named_args
|
|
18
|
-
from verifiers.utils.error_utils import error_info
|
|
19
18
|
from verifiers.utils.message_utils import normalize_messages
|
|
20
19
|
from verifiers.utils.response_utils import parse_response_message
|
|
21
20
|
from verifiers.utils.tool_utils import is_valid_tool_content_parts
|
|
@@ -277,6 +276,7 @@ class Harness(RuntimeOwnerMixin[ConfigT], Generic[ConfigT]):
|
|
|
277
276
|
else:
|
|
278
277
|
state.strip_runtime_handles()
|
|
279
278
|
elif completed:
|
|
279
|
+
state.serialize_error()
|
|
280
280
|
state.assert_serializable()
|
|
281
281
|
log_rollout_finish(state)
|
|
282
282
|
return state
|
|
@@ -287,7 +287,7 @@ class Harness(RuntimeOwnerMixin[ConfigT], Generic[ConfigT]):
|
|
|
287
287
|
state._set_truncated(True)
|
|
288
288
|
state._set_stop_condition("prompt_too_long", overwrite=True)
|
|
289
289
|
return
|
|
290
|
-
state._set_error(
|
|
290
|
+
state._set_error(error)
|
|
291
291
|
state._set_stop_condition("has_error", overwrite=True)
|
|
292
292
|
|
|
293
293
|
async def score_group(self, tasks: list[Task], states: list[State]) -> list[State]:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import TYPE_CHECKING, cast
|
|
1
|
+
from typing import TYPE_CHECKING, TypeAlias, cast
|
|
2
2
|
|
|
3
3
|
from verifiers.types import ClientConfig, SamplingArgs
|
|
4
4
|
|
|
@@ -28,7 +28,10 @@ class ModelConfig(Config):
|
|
|
28
28
|
raise TypeError("model.client must resolve to a Client or ClientConfig.")
|
|
29
29
|
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
ModelConfigSource: TypeAlias = ModelConfig | str | ConfigData | None
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def model_config_from_value(value: ModelConfigSource = None) -> ModelConfig:
|
|
32
35
|
if isinstance(value, ModelConfig):
|
|
33
36
|
return value
|
|
34
37
|
if isinstance(value, str):
|
|
@@ -40,7 +43,7 @@ def model_config_from_value(value: object = None) -> ModelConfig:
|
|
|
40
43
|
raise TypeError("model must be a string or mapping.")
|
|
41
44
|
|
|
42
45
|
|
|
43
|
-
def model_config_data(value:
|
|
46
|
+
def model_config_data(value: ModelConfigSource = None) -> ConfigData:
|
|
44
47
|
return cast(
|
|
45
48
|
ConfigData, model_config_from_value(value).model_dump(exclude_none=True)
|
|
46
49
|
)
|
|
@@ -277,8 +277,6 @@ def program_list_items(
|
|
|
277
277
|
return []
|
|
278
278
|
if isinstance(value, list):
|
|
279
279
|
return cast(list[ProgramValue], list(value))
|
|
280
|
-
if isinstance(value, tuple):
|
|
281
|
-
return cast(list[ProgramValue], list(value))
|
|
282
280
|
if isinstance(value, str) or isinstance(value, dict):
|
|
283
281
|
return [cast(ProgramValue, value)]
|
|
284
282
|
raise TypeError(f"{field_name} must be a string, mapping, or list.")
|
|
@@ -1730,7 +1730,7 @@ class Runtime:
|
|
|
1730
1730
|
source_root = binding_source_root(source)
|
|
1731
1731
|
validate_binding_source(source, f"User binding {name!r}")
|
|
1732
1732
|
if source_root == "objects":
|
|
1733
|
-
object_name = binding_object_name(source)
|
|
1733
|
+
object_name = binding_object_name(cast(str, source))
|
|
1734
1734
|
if object_name not in user.objects:
|
|
1735
1735
|
raise KeyError(
|
|
1736
1736
|
f"User binding {name!r} references unknown User object "
|
|
@@ -1778,7 +1778,7 @@ class Runtime:
|
|
|
1778
1778
|
)
|
|
1779
1779
|
source_root = binding_source_root(source)
|
|
1780
1780
|
if source_root == "objects":
|
|
1781
|
-
object_name = binding_object_name(source)
|
|
1781
|
+
object_name = binding_object_name(cast(str, source))
|
|
1782
1782
|
if object_name not in owner.objects:
|
|
1783
1783
|
raise KeyError(
|
|
1784
1784
|
f"Binding {binding_key!r} references unknown object "
|
|
@@ -1818,7 +1818,7 @@ class Runtime:
|
|
|
1818
1818
|
"for callable tools owned by the same Toolset."
|
|
1819
1819
|
)
|
|
1820
1820
|
if source_root == "objects":
|
|
1821
|
-
object_name = binding_object_name(source)
|
|
1821
|
+
object_name = binding_object_name(cast(str, source))
|
|
1822
1822
|
if object_name not in toolset.objects:
|
|
1823
1823
|
raise KeyError(
|
|
1824
1824
|
f"Binding {binding_key!r} references unknown Toolset object "
|
|
@@ -190,8 +190,12 @@ def validate_binding_source(
|
|
|
190
190
|
root = binding_source_root(source)
|
|
191
191
|
validate_binding_source_root(root, context, allow_objects=allow_objects)
|
|
192
192
|
if root == "objects":
|
|
193
|
+
if not isinstance(source, str):
|
|
194
|
+
raise TypeError(f"{context} must be a string source.")
|
|
193
195
|
binding_object_name(source)
|
|
194
196
|
if root in {"taskset", "harness"}:
|
|
197
|
+
if not isinstance(source, str):
|
|
198
|
+
raise TypeError(f"{context} must be a string source.")
|
|
195
199
|
owner_object_name(source)
|
|
196
200
|
if isinstance(source, dict):
|
|
197
201
|
validate_callable_source(cast(ConfigData, source), context)
|
|
@@ -212,7 +216,7 @@ def function_name(fn: Handler) -> str:
|
|
|
212
216
|
return name
|
|
213
217
|
|
|
214
218
|
|
|
215
|
-
def binding_key_parts(key:
|
|
219
|
+
def binding_key_parts(key: str) -> tuple[str, str]:
|
|
216
220
|
if not isinstance(key, str):
|
|
217
221
|
raise TypeError("Binding keys must be strings.")
|
|
218
222
|
target, separator, arg_name = key.partition(".")
|
|
@@ -242,7 +246,7 @@ def validate_binding_source_root(
|
|
|
242
246
|
raise ValueError(f"{context} cannot use objects.* sources.")
|
|
243
247
|
|
|
244
248
|
|
|
245
|
-
def binding_object_name(source:
|
|
249
|
+
def binding_object_name(source: str) -> str:
|
|
246
250
|
if not isinstance(source, str):
|
|
247
251
|
raise TypeError("Object binding source must be a string.")
|
|
248
252
|
root, separator, tail = source.partition(".")
|
|
@@ -254,7 +258,7 @@ def binding_object_name(source: object) -> str:
|
|
|
254
258
|
return name
|
|
255
259
|
|
|
256
260
|
|
|
257
|
-
def owner_object_name(source:
|
|
261
|
+
def owner_object_name(source: str) -> str:
|
|
258
262
|
if not isinstance(source, str):
|
|
259
263
|
raise TypeError("Owner object binding source must be a string.")
|
|
260
264
|
root, separator, tail = source.partition(".")
|
|
@@ -31,7 +31,7 @@ _CONFIG_REF_MODULE: ContextVar[str | None] = ContextVar(
|
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
def explicit_config_data(
|
|
34
|
-
value:
|
|
34
|
+
value: BaseModel | ConfigData | None, target: type[BaseModel] | None = None
|
|
35
35
|
) -> ConfigData:
|
|
36
36
|
if value is None:
|
|
37
37
|
data: ConfigData = {}
|
|
@@ -48,7 +48,9 @@ def explicit_config_data(
|
|
|
48
48
|
return data
|
|
49
49
|
|
|
50
50
|
|
|
51
|
-
def coerce_config(
|
|
51
|
+
def coerce_config(
|
|
52
|
+
config_cls: type[ConfigT], value: BaseModel | ConfigData | None = None
|
|
53
|
+
) -> ConfigT:
|
|
52
54
|
if value is None:
|
|
53
55
|
return config_cls()
|
|
54
56
|
if isinstance(value, config_cls):
|
|
@@ -168,7 +170,7 @@ def resolve_config_annotation(owner_type: ConfigOwner, annotation: object) -> ob
|
|
|
168
170
|
|
|
169
171
|
|
|
170
172
|
def resolved_config_data(
|
|
171
|
-
value:
|
|
173
|
+
value: BaseModel | ConfigData | None, target: type[BaseModel] | None = None
|
|
172
174
|
) -> ConfigData:
|
|
173
175
|
if value is None:
|
|
174
176
|
data: ConfigData = {}
|
|
@@ -248,7 +250,7 @@ def config_ref_parts(ref: str) -> tuple[str, str]:
|
|
|
248
250
|
|
|
249
251
|
|
|
250
252
|
@contextmanager
|
|
251
|
-
def config_ref_context(config:
|
|
253
|
+
def config_ref_context(config: BaseModel | ConfigData | None) -> Iterator[None]:
|
|
252
254
|
module_name = config_ref_module(config)
|
|
253
255
|
if module_name is None:
|
|
254
256
|
yield
|
|
@@ -260,7 +262,7 @@ def config_ref_context(config: object) -> Iterator[None]:
|
|
|
260
262
|
_CONFIG_REF_MODULE.reset(token)
|
|
261
263
|
|
|
262
264
|
|
|
263
|
-
def config_ref_module(config:
|
|
265
|
+
def config_ref_module(config: BaseModel | ConfigData | None) -> str | None:
|
|
264
266
|
if isinstance(config, BaseModel):
|
|
265
267
|
module_name = type(config).__module__
|
|
266
268
|
if module_name not in FRAMEWORK_CONFIG_MODULES:
|