verifiers 0.3.1.dev43__tar.gz → 0.3.1.dev52__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.3.1.dev43 → verifiers-0.3.1.dev52}/PKG-INFO +3 -3
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/pyproject.toml +1 -1
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/conftest.py +4 -5
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/agent.py +2 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/debug.py +1 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/validate.py +2 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/dialects/anthropic.py +49 -13
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/dialects/base.py +84 -5
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/dialects/chat.py +4 -3
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/dialects/responses.py +51 -21
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/interception/server.py +3 -1
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/mcp/launch.py +7 -2
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/rollout.py +18 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/runtimes/__init__.py +4 -1
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/runtimes/base.py +9 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/runtimes/docker/__init__.py +9 -3
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/runtimes/modal.py +3 -2
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/runtimes/prime.py +4 -3
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/runtimes/subprocess.py +3 -3
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/task.py +4 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/harbor/env.py +4 -1
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/harbor/taskset.py +72 -24
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/.gitignore +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/LICENSE +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/README.md +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/conftest.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_browser_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_build_script.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_client_config.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_composable_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_env_group.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_env_server.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_environment.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_environment_extra.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_error_chain.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_eval_display.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_eval_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_gym_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_imports.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_init_script.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_install_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_interception_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_logging.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_math_rubric.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_message_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_openenv_client.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_parser.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_path_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_renderer_client.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_rubric.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_rubric_group.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_save_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_setup_script.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_think_parser.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_tool_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_tool_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_types.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/test_xml_parser.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/fixtures/duet_v1.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/test_configs.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/test_envs.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/test_graph.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/test_judges.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/test_taskset.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/tests/v1/test_trace.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/cli/tui.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/clients/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/clients/client.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/clients/openai_completions_client.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/clients/openai_responses_client.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/clients/renderer_client.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/decorators.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/env_group.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/environment.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/README.md +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/README.md +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/task.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/gym_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/README.md +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/multiturn_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/python_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/sandbox_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/singleturn_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/stateful_tool_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/envs/tool_env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/errors.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/gepa/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/gepa/adapter.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/gepa/config.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/gepa/display.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/gepa/gepa_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/parsers/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/parsers/parser.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/parsers/think_parser.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/parsers/xml_parser.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/rubrics/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/rubrics/judge_rubric.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/rubrics/math_rubric.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/rubrics/rubric.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/rubrics/rubric_group.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/scripts/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/scripts/build.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/scripts/eval.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/scripts/gepa.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/scripts/init.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/scripts/install.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/scripts/setup.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/scripts/tui.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/serve/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/serve/client/env_client.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/serve/server/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/serve/server/env_router.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/serve/server/env_server.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/serve/server/env_worker.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/serve/types.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/types.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/async_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/client_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/config_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/data_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/display_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/env_config_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/env_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/error_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/eval_display.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/eval_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/heartbeat.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/import_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/install_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/interception_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/logging_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/message_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/metric_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/path_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/pricing_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/process_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/response_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/save_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/serve_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/thread_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/tool_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/usage_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/legacy/utils/version_utils.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/acp/runner.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/cli/resume.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/clients/base.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/agent.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/cli/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/cli/debug.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/cli/env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/cli/eval.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/cli/init.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/cli/replay.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/cli/validate.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/client.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/harness.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/judge.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/retries.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/runtime.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/task.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/configs/taskset.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/envs/agentic_judge/env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/envs/user_sim/env.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/episode.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/errors.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/graph.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harness.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/bash/program.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/browser_use/program.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/node.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/pool/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/pool/harness.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/interception/tool.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/judge.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/serve/encoding.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/session.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/state.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/trace.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/types.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/artifacts.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/compile.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/decorators.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/loaders.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/paths.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/platform.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/prime.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/retries.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/score.py +0 -0
- {verifiers-0.3.1.dev43 → verifiers-0.3.1.dev52}/verifiers/v1/utils/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.3.1.
|
|
3
|
+
Version: 0.3.1.dev52
|
|
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
|
|
@@ -34,7 +34,7 @@ Requires-Dist: msgpack>=1.1.2
|
|
|
34
34
|
Requires-Dist: numpy>=2.1.0
|
|
35
35
|
Requires-Dist: openai-agents>=0.8.2
|
|
36
36
|
Requires-Dist: openai>=2.9.0
|
|
37
|
-
Requires-Dist: prime-pydantic-config[toml]>=0.4.
|
|
37
|
+
Requires-Dist: prime-pydantic-config[toml]>=0.4.3
|
|
38
38
|
Requires-Dist: prime-sandboxes>=0.2.37
|
|
39
39
|
Requires-Dist: prime-tunnel>=0.1.8
|
|
40
40
|
Requires-Dist: pydantic>=2.12.3
|
|
@@ -47,7 +47,7 @@ dependencies = [
|
|
|
47
47
|
"setproctitle>=1.3.0",
|
|
48
48
|
"httpx>=0.27.0",
|
|
49
49
|
"aiohttp>=3.9.0",
|
|
50
|
-
"prime-pydantic-config[toml]>=0.4.
|
|
50
|
+
"prime-pydantic-config[toml]>=0.4.3",
|
|
51
51
|
"uvloop>=0.21.0; sys_platform != 'win32' and sys_platform != 'cygwin' and platform_python_implementation != 'PyPy'",
|
|
52
52
|
"loguru>=0.7.0",
|
|
53
53
|
"tomli-w>=1.0.0",
|
|
@@ -154,6 +154,8 @@ def _eval_config(
|
|
|
154
154
|
runtime_cfg = dict(runtime)
|
|
155
155
|
_configure_prime_runtimes(runtime_cfg)
|
|
156
156
|
env_cfg.setdefault("agent", {})["runtime"] = runtime_cfg
|
|
157
|
+
retries = {"max_retries": 2, "include": ["ProviderError", "HarnessError"]}
|
|
158
|
+
env_cfg.setdefault("retries", retries)
|
|
157
159
|
# Per-run caps live on the seats: resolve the env's declared roles and cap
|
|
158
160
|
# each one (a test's own seat dict wins over the shared defaults).
|
|
159
161
|
config_cls = vf.env_config_type(taskset, env_cfg.get("id", ""))
|
|
@@ -167,11 +169,8 @@ def _eval_config(
|
|
|
167
169
|
seat_cfg.setdefault("max_turns", max_turns)
|
|
168
170
|
seat_cfg.setdefault("max_output_tokens", max_tokens)
|
|
169
171
|
seat_cfg.setdefault("timeout", {"rollout": rollout_timeout, "scoring": 60})
|
|
170
|
-
#
|
|
171
|
-
seat_cfg.setdefault(
|
|
172
|
-
"retries",
|
|
173
|
-
{"max_retries": 2, "include": ["ProviderError", "HarnessError"]},
|
|
174
|
-
)
|
|
172
|
+
# Agent runs retry locally; interactions retry with their whole episode.
|
|
173
|
+
seat_cfg.setdefault("retries", retries)
|
|
175
174
|
return EvalConfig(
|
|
176
175
|
env={
|
|
177
176
|
"taskset": taskset_cfg,
|
|
@@ -548,6 +548,8 @@ class Agent:
|
|
|
548
548
|
else self.runtime_config
|
|
549
549
|
)
|
|
550
550
|
async with provision_runtime(config) as runtime:
|
|
551
|
+
# Keep sandbox startup task-neutral: this box may later host another task.
|
|
552
|
+
runtime.env = dict(task.runtime_env()) if task is not None else {}
|
|
551
553
|
yield runtime
|
|
552
554
|
|
|
553
555
|
|
|
@@ -224,6 +224,7 @@ async def debug_task(task: Task, config: DebugConfig) -> tuple[Trace, bool]:
|
|
|
224
224
|
else task.data.timeout.setup
|
|
225
225
|
)
|
|
226
226
|
try:
|
|
227
|
+
runtime.env = dict(task.runtime_env())
|
|
227
228
|
trace.timing.boot.start = time.time()
|
|
228
229
|
await runtime.start()
|
|
229
230
|
now = time.time()
|
|
@@ -235,6 +235,7 @@ async def _run_gold(task: Task, config: ValidateConfig) -> ResultRow:
|
|
|
235
235
|
)
|
|
236
236
|
valid, exc = False, None
|
|
237
237
|
try:
|
|
238
|
+
runtime.env = dict(task.runtime_env())
|
|
238
239
|
trace = Trace(
|
|
239
240
|
task=TraceTask(
|
|
240
241
|
type=type(task).__name__, data=task.data, key=task.key, hash=task.hash
|
|
@@ -278,6 +279,7 @@ async def _run_setup(task: Task, config: ValidateConfig) -> ResultRow:
|
|
|
278
279
|
)
|
|
279
280
|
valid, exc = False, None
|
|
280
281
|
try:
|
|
282
|
+
runtime.env = dict(task.runtime_env())
|
|
281
283
|
trace = Trace(
|
|
282
284
|
task=TraceTask(
|
|
283
285
|
type=type(task).__name__, data=task.data, key=task.key, hash=task.hash
|
|
@@ -16,12 +16,14 @@ from anthropic.types import Message as AnthropicMessage
|
|
|
16
16
|
from anthropic.types import MessageCreateParams
|
|
17
17
|
from anthropic.types import Usage as AnthropicUsage
|
|
18
18
|
|
|
19
|
+
from verifiers.v1.configs.runtime import NetworkPolicyConfig
|
|
19
20
|
from verifiers.v1.dialects.base import (
|
|
20
21
|
Dialect,
|
|
21
22
|
StreamParser,
|
|
22
23
|
append_user_notice,
|
|
23
24
|
blocked_url,
|
|
24
25
|
parse_sse_event,
|
|
26
|
+
provider_allowed_domains,
|
|
25
27
|
)
|
|
26
28
|
from verifiers.v1.types import (
|
|
27
29
|
AssistantMessage,
|
|
@@ -56,6 +58,7 @@ THINKING = ("redacted_thinking", "thinking")
|
|
|
56
58
|
# at the provider. Anchoring the pattern keeps new versions client-side without treating an
|
|
57
59
|
# arbitrary dated provider tool as safe.
|
|
58
60
|
_CLIENT_TOOL_TYPE = re.compile(r"(?:bash|text_editor|computer|memory)_\d{8}").fullmatch
|
|
61
|
+
_WEB_TOOL_TYPE = re.compile(r"web_(?:search|fetch)_\d{8}").fullmatch
|
|
59
62
|
_CONTENT_WRAPPERS = (
|
|
60
63
|
"tool_result",
|
|
61
64
|
"code_execution_tool_result",
|
|
@@ -126,10 +129,10 @@ def parse_content(content) -> str | list[ContentPart]:
|
|
|
126
129
|
return parts
|
|
127
130
|
|
|
128
131
|
|
|
129
|
-
def blocked_content_path(value, path: str) -> str | None:
|
|
132
|
+
def blocked_content_path(value, path: str, policy: NetworkPolicyConfig) -> str | None:
|
|
130
133
|
if isinstance(value, list):
|
|
131
134
|
for index, item in enumerate(value):
|
|
132
|
-
if blocked := blocked_content_path(item, f"{path}[{index}]"):
|
|
135
|
+
if blocked := blocked_content_path(item, f"{path}[{index}]", policy):
|
|
133
136
|
return blocked
|
|
134
137
|
return None
|
|
135
138
|
if not isinstance(value, dict):
|
|
@@ -148,10 +151,12 @@ def blocked_content_path(value, path: str) -> str | None:
|
|
|
148
151
|
return source_path
|
|
149
152
|
source_kind = source.get("type")
|
|
150
153
|
if source_kind == "content":
|
|
151
|
-
return blocked_content_path(
|
|
154
|
+
return blocked_content_path(
|
|
155
|
+
source.get("content"), f"{source_path}.content", policy
|
|
156
|
+
)
|
|
152
157
|
if source_kind == "url":
|
|
153
158
|
url = source.get("url")
|
|
154
|
-
if not isinstance(url, str) or blocked_url(url):
|
|
159
|
+
if not isinstance(url, str) or blocked_url(url, policy):
|
|
155
160
|
return f"{source_path}.url"
|
|
156
161
|
if source_kind == "file":
|
|
157
162
|
return (
|
|
@@ -169,13 +174,13 @@ def blocked_content_path(value, path: str) -> str | None:
|
|
|
169
174
|
) and value.get("file_id"):
|
|
170
175
|
return f"{path}.file_id"
|
|
171
176
|
if kind in _CONTENT_WRAPPERS:
|
|
172
|
-
return blocked_content_path(value.get("content"), f"{path}.content")
|
|
177
|
+
return blocked_content_path(value.get("content"), f"{path}.content", policy)
|
|
173
178
|
return None if kind in _SAFE_CONTENT_TYPES else f"{path}.type"
|
|
174
179
|
|
|
175
180
|
|
|
176
|
-
def mediate_content(value, path: str):
|
|
181
|
+
def mediate_content(value, path: str, policy: NetworkPolicyConfig):
|
|
177
182
|
if not isinstance(value, list):
|
|
178
|
-
blocked = blocked_content_path(value, path)
|
|
183
|
+
blocked = blocked_content_path(value, path, policy)
|
|
179
184
|
return ("", [blocked]) if blocked else (value, [])
|
|
180
185
|
|
|
181
186
|
mediated = []
|
|
@@ -183,16 +188,18 @@ def mediate_content(value, path: str):
|
|
|
183
188
|
for index, block in enumerate(value):
|
|
184
189
|
item_path = f"{path}[{index}]"
|
|
185
190
|
if isinstance(block, dict) and block.get("type") in _CONTENT_WRAPPERS:
|
|
186
|
-
if blocked := blocked_content_path(
|
|
191
|
+
if blocked := blocked_content_path(
|
|
192
|
+
{**block, "content": []}, item_path, policy
|
|
193
|
+
):
|
|
187
194
|
capabilities.append(blocked)
|
|
188
195
|
continue
|
|
189
196
|
content, removed = mediate_content(
|
|
190
|
-
block.get("content"), f"{item_path}.content"
|
|
197
|
+
block.get("content"), f"{item_path}.content", policy
|
|
191
198
|
)
|
|
192
199
|
if removed:
|
|
193
200
|
block["content"] = content or ""
|
|
194
201
|
capabilities.extend(removed)
|
|
195
|
-
elif blocked := blocked_content_path(block, item_path):
|
|
202
|
+
elif blocked := blocked_content_path(block, item_path, policy):
|
|
196
203
|
capabilities.append(blocked)
|
|
197
204
|
continue
|
|
198
205
|
mediated.append(block)
|
|
@@ -448,7 +455,7 @@ class AnthropicDialect(Dialect[MessageCreateParams, AnthropicMessage]):
|
|
|
448
455
|
response_type = ModdedAnthropicMessage
|
|
449
456
|
|
|
450
457
|
def mediate_external_capabilities(
|
|
451
|
-
self, body: MessageCreateParams
|
|
458
|
+
self, body: MessageCreateParams, policy: NetworkPolicyConfig
|
|
452
459
|
) -> tuple[MessageCreateParams, list[str]]:
|
|
453
460
|
mediated = body
|
|
454
461
|
capabilities: list[str] = []
|
|
@@ -457,7 +464,7 @@ class AnthropicDialect(Dialect[MessageCreateParams, AnthropicMessage]):
|
|
|
457
464
|
if mediated.pop(key, None):
|
|
458
465
|
capabilities.append(key)
|
|
459
466
|
|
|
460
|
-
system, removed = mediate_content(mediated.get("system"), "system")
|
|
467
|
+
system, removed = mediate_content(mediated.get("system"), "system", policy)
|
|
461
468
|
capabilities.extend(removed)
|
|
462
469
|
if removed:
|
|
463
470
|
if system:
|
|
@@ -469,7 +476,9 @@ class AnthropicDialect(Dialect[MessageCreateParams, AnthropicMessage]):
|
|
|
469
476
|
if not isinstance(message, dict):
|
|
470
477
|
continue
|
|
471
478
|
content, removed = mediate_content(
|
|
472
|
-
message.get("content"),
|
|
479
|
+
message.get("content"),
|
|
480
|
+
f"messages[{message_index}].content",
|
|
481
|
+
policy,
|
|
473
482
|
)
|
|
474
483
|
capabilities.extend(removed)
|
|
475
484
|
if removed:
|
|
@@ -482,6 +491,33 @@ class AnthropicDialect(Dialect[MessageCreateParams, AnthropicMessage]):
|
|
|
482
491
|
tools = []
|
|
483
492
|
for index, tool in enumerate(tool_items):
|
|
484
493
|
kind = tool.get("type") if isinstance(tool, dict) else None
|
|
494
|
+
if (
|
|
495
|
+
isinstance(tool, dict)
|
|
496
|
+
and isinstance(kind, str)
|
|
497
|
+
and _WEB_TOOL_TYPE(kind)
|
|
498
|
+
):
|
|
499
|
+
callers = tool.get("allowed_callers")
|
|
500
|
+
domains = (
|
|
501
|
+
provider_allowed_domains(policy, tool.get("allowed_domains"))
|
|
502
|
+
if tool.get("blocked_domains") in (None, [])
|
|
503
|
+
and (
|
|
504
|
+
callers is None
|
|
505
|
+
or isinstance(callers, list)
|
|
506
|
+
and "direct" in callers
|
|
507
|
+
)
|
|
508
|
+
else []
|
|
509
|
+
)
|
|
510
|
+
if domains:
|
|
511
|
+
web_tool = {
|
|
512
|
+
**tool,
|
|
513
|
+
"allowed_domains": domains,
|
|
514
|
+
"allowed_callers": ["direct"],
|
|
515
|
+
}
|
|
516
|
+
web_tool.pop("blocked_domains", None)
|
|
517
|
+
tools.append(web_tool)
|
|
518
|
+
continue
|
|
519
|
+
capabilities.append(f"tools[{index}].type")
|
|
520
|
+
continue
|
|
485
521
|
if isinstance(tool, dict) and (
|
|
486
522
|
(isinstance(kind, str) and _CLIENT_TOOL_TYPE(kind))
|
|
487
523
|
or (kind in (None, "custom") and "input_schema" in tool)
|
|
@@ -16,16 +16,19 @@ import logging
|
|
|
16
16
|
from abc import ABC, abstractmethod
|
|
17
17
|
from collections.abc import Callable, Iterator, Mapping
|
|
18
18
|
from typing import ClassVar, Generic, TypeVar
|
|
19
|
+
from urllib.parse import urlsplit
|
|
19
20
|
|
|
20
|
-
from pydantic import BaseModel
|
|
21
|
+
from pydantic import AnyHttpUrl, BaseModel, TypeAdapter, ValidationError
|
|
21
22
|
from pydantic_core import from_json
|
|
22
23
|
|
|
24
|
+
from verifiers.v1.configs.runtime import NetworkPolicyConfig, network_rule_matches
|
|
23
25
|
from verifiers.v1.types import Request, Response, Sampling, SamplingConfig
|
|
24
26
|
|
|
25
27
|
ReqT = TypeVar("ReqT")
|
|
26
28
|
RespT = TypeVar("RespT", bound=BaseModel)
|
|
27
29
|
|
|
28
30
|
logger = logging.getLogger(__name__)
|
|
31
|
+
HTTP_URL_ADAPTER = TypeAdapter(AnyHttpUrl)
|
|
29
32
|
|
|
30
33
|
PROVIDER_CAPABILITY_POLICY_CODE = "provider_capability_unavailable"
|
|
31
34
|
CAPABILITY_NOTICE = (
|
|
@@ -35,9 +38,83 @@ CAPABILITY_NOTICE = (
|
|
|
35
38
|
)
|
|
36
39
|
|
|
37
40
|
|
|
38
|
-
def blocked_url(value: str) -> bool:
|
|
39
|
-
"""Whether a provider-resolved resource is
|
|
40
|
-
|
|
41
|
+
def blocked_url(value: str, policy: NetworkPolicyConfig) -> bool:
|
|
42
|
+
"""Whether a provider-resolved resource is neither inline nor policy-permitted."""
|
|
43
|
+
if value.lower().startswith("data:"):
|
|
44
|
+
return False
|
|
45
|
+
try:
|
|
46
|
+
url = HTTP_URL_ADAPTER.validate_python(value)
|
|
47
|
+
except ValidationError:
|
|
48
|
+
return True
|
|
49
|
+
host = url.host.lower().rstrip(".").strip("[]")
|
|
50
|
+
return any(
|
|
51
|
+
network_rule_matches(rule, url.scheme, host, url.port) for rule in policy.block
|
|
52
|
+
) or not any(
|
|
53
|
+
network_rule_matches(rule, url.scheme, host, url.port) for rule in policy.allow
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def provider_allowed_domains(
|
|
58
|
+
policy: NetworkPolicyConfig, requested: object = None
|
|
59
|
+
) -> list[str]:
|
|
60
|
+
"""Translate a network policy to provider domain-filter semantics without widening it."""
|
|
61
|
+
if policy.block or not policy.allow or "*" in policy.allow:
|
|
62
|
+
return []
|
|
63
|
+
domains = []
|
|
64
|
+
for rule in policy.allow:
|
|
65
|
+
try:
|
|
66
|
+
url = urlsplit(rule if "://" in rule else f"//{rule}")
|
|
67
|
+
port = url.port
|
|
68
|
+
except ValueError:
|
|
69
|
+
return []
|
|
70
|
+
host = (url.hostname or "").lower().rstrip(".")
|
|
71
|
+
domain = host.removeprefix("*.")
|
|
72
|
+
if (
|
|
73
|
+
url.scheme
|
|
74
|
+
or port is not None
|
|
75
|
+
or not host.startswith("*.")
|
|
76
|
+
or not domain
|
|
77
|
+
or "*" in domain
|
|
78
|
+
or not domain.isascii()
|
|
79
|
+
):
|
|
80
|
+
return []
|
|
81
|
+
domains.append(domain)
|
|
82
|
+
domains = list(dict.fromkeys(domains))
|
|
83
|
+
if requested is None:
|
|
84
|
+
return domains
|
|
85
|
+
if not isinstance(requested, list):
|
|
86
|
+
return []
|
|
87
|
+
requested_domains = []
|
|
88
|
+
for domain in requested:
|
|
89
|
+
if not isinstance(domain, str):
|
|
90
|
+
return []
|
|
91
|
+
try:
|
|
92
|
+
url = urlsplit(domain if "://" in domain else f"//{domain}")
|
|
93
|
+
port = url.port
|
|
94
|
+
except ValueError:
|
|
95
|
+
return []
|
|
96
|
+
host = (url.hostname or "").lower().rstrip(".")
|
|
97
|
+
if (
|
|
98
|
+
url.scheme
|
|
99
|
+
or port is not None
|
|
100
|
+
or url.username is not None
|
|
101
|
+
or url.path
|
|
102
|
+
or url.query
|
|
103
|
+
or url.fragment
|
|
104
|
+
or not host
|
|
105
|
+
or "*" in host
|
|
106
|
+
or not host.isascii()
|
|
107
|
+
):
|
|
108
|
+
return []
|
|
109
|
+
requested_domains.append(host)
|
|
110
|
+
intersection = []
|
|
111
|
+
for allowed in domains:
|
|
112
|
+
for requested_domain in requested_domains:
|
|
113
|
+
if allowed == requested_domain or allowed.endswith(f".{requested_domain}"):
|
|
114
|
+
intersection.append(allowed)
|
|
115
|
+
elif requested_domain.endswith(f".{allowed}"):
|
|
116
|
+
intersection.append(requested_domain)
|
|
117
|
+
return list(dict.fromkeys(intersection))
|
|
41
118
|
|
|
42
119
|
|
|
43
120
|
def append_user_notice(
|
|
@@ -187,7 +264,9 @@ class Dialect(ABC, Generic[ReqT, RespT]):
|
|
|
187
264
|
return {"error": {"message": message, "type": "invalid_request_error"}}
|
|
188
265
|
|
|
189
266
|
@abstractmethod
|
|
190
|
-
def mediate_external_capabilities(
|
|
267
|
+
def mediate_external_capabilities(
|
|
268
|
+
self, body: ReqT, policy: NetworkPolicyConfig
|
|
269
|
+
) -> tuple[ReqT, list[str]]:
|
|
191
270
|
"""Remove provider-side capabilities during restricted execution. Implementations add
|
|
192
271
|
the same policy context on every call because the agent does not retain injected request
|
|
193
272
|
content. Returned paths never contain request values."""
|
|
@@ -17,6 +17,7 @@ from urllib.parse import urlsplit
|
|
|
17
17
|
from openai.types.chat import ChatCompletion
|
|
18
18
|
from openai.types.chat.completion_create_params import CompletionCreateParams
|
|
19
19
|
|
|
20
|
+
from verifiers.v1.configs.runtime import NetworkPolicyConfig
|
|
20
21
|
from verifiers.v1.dialects.base import (
|
|
21
22
|
Dialect,
|
|
22
23
|
StreamParser,
|
|
@@ -356,7 +357,7 @@ class ChatDialect(Dialect[CompletionCreateParams, ChatCompletion]):
|
|
|
356
357
|
response_type = ModdedChatCompletion
|
|
357
358
|
|
|
358
359
|
def mediate_external_capabilities(
|
|
359
|
-
self, body: CompletionCreateParams
|
|
360
|
+
self, body: CompletionCreateParams, policy: NetworkPolicyConfig
|
|
360
361
|
) -> tuple[CompletionCreateParams, list[str]]:
|
|
361
362
|
mediated = body
|
|
362
363
|
capabilities: list[str] = []
|
|
@@ -446,7 +447,7 @@ class ChatDialect(Dialect[CompletionCreateParams, ChatCompletion]):
|
|
|
446
447
|
elif kind == "image_url":
|
|
447
448
|
image = part.get("image_url") or {}
|
|
448
449
|
url = image.get("url") if isinstance(image, dict) else image
|
|
449
|
-
if not isinstance(url, str) or blocked_url(url):
|
|
450
|
+
if not isinstance(url, str) or blocked_url(url, policy):
|
|
450
451
|
capability = f"{path}.image_url.url"
|
|
451
452
|
elif kind == "file":
|
|
452
453
|
file = part.get("file")
|
|
@@ -465,7 +466,7 @@ class ChatDialect(Dialect[CompletionCreateParams, ChatCompletion]):
|
|
|
465
466
|
capability = f"{path}.file.file_data"
|
|
466
467
|
else:
|
|
467
468
|
if (parsed.scheme or parsed.netloc) and blocked_url(
|
|
468
|
-
file_data
|
|
469
|
+
file_data, policy
|
|
469
470
|
):
|
|
470
471
|
capability = f"{path}.file.file_data"
|
|
471
472
|
if capability is None:
|
|
@@ -8,6 +8,7 @@ parsing reads the `output` items. Relay-only: the eval client forwards the progr
|
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
import json
|
|
11
|
+
import re
|
|
11
12
|
from collections import deque
|
|
12
13
|
from typing import cast
|
|
13
14
|
|
|
@@ -17,12 +18,14 @@ from openai.types.responses import (
|
|
|
17
18
|
from openai.types.responses.response_create_params import ResponseCreateParams
|
|
18
19
|
from pydantic import BaseModel, ConfigDict
|
|
19
20
|
|
|
21
|
+
from verifiers.v1.configs.runtime import NetworkPolicyConfig
|
|
20
22
|
from verifiers.v1.dialects.base import (
|
|
21
23
|
Dialect,
|
|
22
24
|
StreamParser,
|
|
23
25
|
append_user_notice,
|
|
24
26
|
blocked_url,
|
|
25
27
|
iter_sse_reverse,
|
|
28
|
+
provider_allowed_domains,
|
|
26
29
|
)
|
|
27
30
|
from verifiers.v1.errors import OverlongPromptError, model_error
|
|
28
31
|
from verifiers.v1.types import (
|
|
@@ -65,6 +68,7 @@ _CLIENT_TOOL_TYPES = (
|
|
|
65
68
|
"computer_use_preview",
|
|
66
69
|
)
|
|
67
70
|
_CLIENT_TOOL_CHOICES = (*_CLIENT_TOOL_TYPES, "namespace", "tool_search", "shell")
|
|
71
|
+
_WEB_SEARCH_TOOL_TYPE = re.compile(r"web_search(?:_\d{4}_\d{2}_\d{2})?").fullmatch
|
|
68
72
|
_SAFE_INPUT_TYPES = (
|
|
69
73
|
"input_text",
|
|
70
74
|
"input_file",
|
|
@@ -142,7 +146,9 @@ def parse_content(content) -> str | list[ContentPart]:
|
|
|
142
146
|
return parts
|
|
143
147
|
|
|
144
148
|
|
|
145
|
-
def mediate_tools(
|
|
149
|
+
def mediate_tools(
|
|
150
|
+
tools, path: str, policy: NetworkPolicyConfig
|
|
151
|
+
) -> tuple[list[dict], list[str]]:
|
|
146
152
|
if tools is not None and not isinstance(tools, list):
|
|
147
153
|
return [], [path]
|
|
148
154
|
mediated = []
|
|
@@ -153,11 +159,27 @@ def mediate_tools(tools, path: str) -> tuple[list[dict], list[str]]:
|
|
|
153
159
|
capabilities.append(item_path)
|
|
154
160
|
continue
|
|
155
161
|
kind = tool.get("type")
|
|
162
|
+
if isinstance(kind, str) and _WEB_SEARCH_TOOL_TYPE(kind):
|
|
163
|
+
raw_filters = tool.get("filters")
|
|
164
|
+
if raw_filters is None or isinstance(raw_filters, dict):
|
|
165
|
+
requested = raw_filters.get("allowed_domains") if raw_filters else None
|
|
166
|
+
domains = provider_allowed_domains(policy, requested)
|
|
167
|
+
else:
|
|
168
|
+
domains = []
|
|
169
|
+
if domains:
|
|
170
|
+
filters = dict(raw_filters) if isinstance(raw_filters, dict) else {}
|
|
171
|
+
filters["allowed_domains"] = domains
|
|
172
|
+
mediated.append({**tool, "filters": filters})
|
|
173
|
+
continue
|
|
174
|
+
capabilities.append(f"{item_path}.type")
|
|
175
|
+
continue
|
|
156
176
|
if kind in _CLIENT_TOOL_TYPES:
|
|
157
177
|
mediated.append(tool)
|
|
158
178
|
continue
|
|
159
179
|
if kind == "namespace":
|
|
160
|
-
nested, removed = mediate_tools(
|
|
180
|
+
nested, removed = mediate_tools(
|
|
181
|
+
tool.get("tools"), f"{item_path}.tools", policy
|
|
182
|
+
)
|
|
161
183
|
capabilities.extend(removed)
|
|
162
184
|
if nested:
|
|
163
185
|
mediated.append({**tool, "tools": nested})
|
|
@@ -177,10 +199,10 @@ def mediate_tools(tools, path: str) -> tuple[list[dict], list[str]]:
|
|
|
177
199
|
return mediated, capabilities
|
|
178
200
|
|
|
179
201
|
|
|
180
|
-
def blocked_content_path(value, path: str) -> str | None:
|
|
202
|
+
def blocked_content_path(value, path: str, policy: NetworkPolicyConfig) -> str | None:
|
|
181
203
|
if isinstance(value, list):
|
|
182
204
|
for index, item in enumerate(value):
|
|
183
|
-
if blocked := blocked_content_path(item, f"{path}[{index}]"):
|
|
205
|
+
if blocked := blocked_content_path(item, f"{path}[{index}]", policy):
|
|
184
206
|
return blocked
|
|
185
207
|
return None
|
|
186
208
|
if not isinstance(value, dict):
|
|
@@ -196,7 +218,9 @@ def blocked_content_path(value, path: str) -> str | None:
|
|
|
196
218
|
if value.get("file_id"):
|
|
197
219
|
return f"{path}.file_id"
|
|
198
220
|
if "file_url" in value:
|
|
199
|
-
if not isinstance(value["file_url"], str) or blocked_url(
|
|
221
|
+
if not isinstance(value["file_url"], str) or blocked_url(
|
|
222
|
+
value["file_url"], policy
|
|
223
|
+
):
|
|
200
224
|
return f"{path}.file_url"
|
|
201
225
|
elif not isinstance(value.get("file_data"), str):
|
|
202
226
|
return f"{path}.file_data"
|
|
@@ -204,7 +228,7 @@ def blocked_content_path(value, path: str) -> str | None:
|
|
|
204
228
|
if value.get("file_id"):
|
|
205
229
|
return f"{path}.file_id"
|
|
206
230
|
if not isinstance(value.get("image_url"), str) or blocked_url(
|
|
207
|
-
value["image_url"]
|
|
231
|
+
value["image_url"], policy
|
|
208
232
|
):
|
|
209
233
|
return f"{path}.image_url"
|
|
210
234
|
|
|
@@ -222,7 +246,7 @@ def blocked_content_path(value, path: str) -> str | None:
|
|
|
222
246
|
if kind in ("additional_tools", "tool_search_output"):
|
|
223
247
|
if kind == "tool_search_output" and value.get("execution") != "client":
|
|
224
248
|
return f"{path}.execution"
|
|
225
|
-
_, removed = mediate_tools(value.get("tools"), f"{path}.tools")
|
|
249
|
+
_, removed = mediate_tools(value.get("tools"), f"{path}.tools", policy)
|
|
226
250
|
return removed[0] if removed else None
|
|
227
251
|
|
|
228
252
|
if kind in (
|
|
@@ -230,21 +254,21 @@ def blocked_content_path(value, path: str) -> str | None:
|
|
|
230
254
|
"function_call_output",
|
|
231
255
|
"custom_tool_call_output",
|
|
232
256
|
):
|
|
233
|
-
return blocked_content_path(value.get("output"), f"{path}.output")
|
|
257
|
+
return blocked_content_path(value.get("output"), f"{path}.output", policy)
|
|
234
258
|
if kind in (None, "message") and "role" in value and "content" in value:
|
|
235
|
-
return blocked_content_path(value["content"], f"{path}.content")
|
|
259
|
+
return blocked_content_path(value["content"], f"{path}.content", policy)
|
|
236
260
|
return None if kind in _SAFE_INPUT_TYPES else f"{path}.type"
|
|
237
261
|
|
|
238
262
|
|
|
239
|
-
def mediate_content(value, path: str):
|
|
263
|
+
def mediate_content(value, path: str, policy: NetworkPolicyConfig):
|
|
240
264
|
if not isinstance(value, list):
|
|
241
|
-
blocked = blocked_content_path(value, path)
|
|
265
|
+
blocked = blocked_content_path(value, path, policy)
|
|
242
266
|
return ("", [blocked]) if blocked else (value, [])
|
|
243
267
|
|
|
244
268
|
mediated = []
|
|
245
269
|
capabilities = []
|
|
246
270
|
for index, part in enumerate(value):
|
|
247
|
-
if blocked := blocked_content_path(part, f"{path}[{index}]"):
|
|
271
|
+
if blocked := blocked_content_path(part, f"{path}[{index}]", policy):
|
|
248
272
|
capabilities.append(blocked)
|
|
249
273
|
continue
|
|
250
274
|
mediated.append(part)
|
|
@@ -415,7 +439,7 @@ class ResponsesDialect(Dialect[ResponseCreateParams, OpenAIResponse]):
|
|
|
415
439
|
response_type = OpenAIResponse
|
|
416
440
|
|
|
417
441
|
def mediate_external_capabilities(
|
|
418
|
-
self, body: ResponseCreateParams
|
|
442
|
+
self, body: ResponseCreateParams, policy: NetworkPolicyConfig
|
|
419
443
|
) -> tuple[ResponseCreateParams, list[str]]:
|
|
420
444
|
mediated = body
|
|
421
445
|
capabilities: list[str] = []
|
|
@@ -440,12 +464,12 @@ class ResponsesDialect(Dialect[ResponseCreateParams, OpenAIResponse]):
|
|
|
440
464
|
kind = item.get("type")
|
|
441
465
|
if kind in ("additional_tools", "tool_search_output"):
|
|
442
466
|
if blocked := blocked_content_path(
|
|
443
|
-
{**item, "tools": []}, item_path
|
|
467
|
+
{**item, "tools": []}, item_path, policy
|
|
444
468
|
):
|
|
445
469
|
capabilities.append(blocked)
|
|
446
470
|
continue
|
|
447
471
|
item["tools"], removed = mediate_tools(
|
|
448
|
-
item.get("tools"), f"{item_path}.tools"
|
|
472
|
+
item.get("tools"), f"{item_path}.tools", policy
|
|
449
473
|
)
|
|
450
474
|
capabilities.extend(removed)
|
|
451
475
|
if kind == "tool_search_output" or item["tools"]:
|
|
@@ -459,14 +483,16 @@ class ResponsesDialect(Dialect[ResponseCreateParams, OpenAIResponse]):
|
|
|
459
483
|
|
|
460
484
|
if content_field:
|
|
461
485
|
content, removed = mediate_content(
|
|
462
|
-
item.get(content_field),
|
|
486
|
+
item.get(content_field),
|
|
487
|
+
f"{item_path}.{content_field}",
|
|
488
|
+
policy,
|
|
463
489
|
)
|
|
464
490
|
capabilities.extend(removed)
|
|
465
491
|
if removed:
|
|
466
492
|
item[content_field] = content or ""
|
|
467
493
|
|
|
468
494
|
scan = {**item, content_field: []} if content_field else item
|
|
469
|
-
blocked = blocked_content_path(scan, item_path)
|
|
495
|
+
blocked = blocked_content_path(scan, item_path, policy)
|
|
470
496
|
if blocked is None:
|
|
471
497
|
safe_input.append(item)
|
|
472
498
|
else:
|
|
@@ -480,11 +506,11 @@ class ResponsesDialect(Dialect[ResponseCreateParams, OpenAIResponse]):
|
|
|
480
506
|
}
|
|
481
507
|
safe_input.append(item)
|
|
482
508
|
mediated["input"] = safe_input
|
|
483
|
-
elif blocked := blocked_content_path(raw_input, "input"):
|
|
509
|
+
elif blocked := blocked_content_path(raw_input, "input", policy):
|
|
484
510
|
capabilities.append(blocked)
|
|
485
511
|
mediated["input"] = []
|
|
486
512
|
|
|
487
|
-
tools, tool_capabilities = mediate_tools(mediated.get("tools"), "tools")
|
|
513
|
+
tools, tool_capabilities = mediate_tools(mediated.get("tools"), "tools", policy)
|
|
488
514
|
capabilities.extend(tool_capabilities)
|
|
489
515
|
if "tools" in mediated:
|
|
490
516
|
mediated["tools"] = tools
|
|
@@ -497,14 +523,18 @@ class ResponsesDialect(Dialect[ResponseCreateParams, OpenAIResponse]):
|
|
|
497
523
|
)
|
|
498
524
|
if isinstance(choice, dict):
|
|
499
525
|
kind = choice.get("type")
|
|
500
|
-
valid_choice =
|
|
526
|
+
valid_choice = (
|
|
527
|
+
kind in _CLIENT_TOOL_CHOICES
|
|
528
|
+
or isinstance(kind, str)
|
|
529
|
+
and _WEB_SEARCH_TOOL_TYPE(kind)
|
|
530
|
+
) and any(
|
|
501
531
|
tool.get("type") == kind
|
|
502
532
|
and ("name" not in choice or tool.get("name") == choice["name"])
|
|
503
533
|
for tool in tools
|
|
504
534
|
)
|
|
505
535
|
if kind == "allowed_tools":
|
|
506
536
|
choice_tools, choice_capabilities = mediate_tools(
|
|
507
|
-
choice.get("tools"), "tool_choice.tools"
|
|
537
|
+
choice.get("tools"), "tool_choice.tools", policy
|
|
508
538
|
)
|
|
509
539
|
valid_choice = not choice_capabilities
|
|
510
540
|
mediated["tool_choice"] = {**choice, "tools": choice_tools}
|
|
@@ -280,7 +280,9 @@ class InterceptionServer(Interception):
|
|
|
280
280
|
) -> tuple[dict, list[str]]:
|
|
281
281
|
if not session.network_policy.network_restricted:
|
|
282
282
|
return body, []
|
|
283
|
-
mediated, capabilities = dialect.mediate_external_capabilities(
|
|
283
|
+
mediated, capabilities = dialect.mediate_external_capabilities(
|
|
284
|
+
body, session.network_policy
|
|
285
|
+
)
|
|
284
286
|
capabilities = list(dict.fromkeys(capabilities))
|
|
285
287
|
if capabilities:
|
|
286
288
|
logger.warning(
|
|
@@ -279,7 +279,12 @@ async def serve_in_runtime(
|
|
|
279
279
|
env["MCP_PORT_FILE"] = port_file
|
|
280
280
|
python = sys.executable
|
|
281
281
|
if runtime.type != "subprocess":
|
|
282
|
-
|
|
282
|
+
# Prebuilt runtime images may already contain the server and its Python
|
|
283
|
+
# environment. Let those servers bypass redundant per-launch source
|
|
284
|
+
# uploads and installation while preserving the existing default.
|
|
285
|
+
python = getattr(type(server), "RUNTIME_PYTHON", None)
|
|
286
|
+
if python is None:
|
|
287
|
+
python = await _install_in_sandbox(server, runtime)
|
|
283
288
|
command = [python, "-m", type(server).__module__]
|
|
284
289
|
if runtime.type != "subprocess":
|
|
285
290
|
# Providers may invoke uv after the install shell exits, so preserve its PATH.
|
|
@@ -298,7 +303,7 @@ async def serve_in_runtime(
|
|
|
298
303
|
except ToolsetError as e:
|
|
299
304
|
raise ToolsetError(f"{e}: {await log_tail(runtime, log)}") from e
|
|
300
305
|
probe = await runtime.run(
|
|
301
|
-
[
|
|
306
|
+
[python, "-c", _PROBE, f"http://127.0.0.1:{port}/mcp"], {}
|
|
302
307
|
)
|
|
303
308
|
if probe.exit_code != 0:
|
|
304
309
|
raise ToolsetError(
|