verifiers 0.3.1.dev24__tar.gz → 0.3.1.dev25__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.dev24 → verifiers-0.3.1.dev25}/PKG-INFO +1 -1
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/__init__.py +2 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/agent.py +1 -1
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/clients/client.py +6 -9
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/clients/eval.py +3 -6
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/clients/train.py +3 -3
- verifiers-0.3.1.dev25/verifiers/v1/configs/runtime.py +66 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/dialects/anthropic.py +207 -6
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/dialects/base.py +47 -2
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/dialects/chat.py +152 -9
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/dialects/responses.py +294 -6
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/interception/server.py +62 -17
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/mcp/launch.py +1 -1
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/rollout.py +18 -1
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/runtimes/__init__.py +1 -1
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/runtimes/base.py +2 -44
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/runtimes/docker/__init__.py +1 -1
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/runtimes/docker/egress.py +14 -27
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/runtimes/prime.py +1 -1
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/session.py +3 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/task.py +3 -2
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/trace.py +12 -1
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/compile.py +1 -1
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/.gitignore +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/LICENSE +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/README.md +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/pyproject.toml +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/conftest.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_browser_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_build_script.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_client_config.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_composable_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_env_group.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_env_server.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_environment.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_environment_extra.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_error_chain.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_eval_display.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_eval_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_gym_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_imports.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_init_script.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_install_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_interception_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_logging.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_math_rubric.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_message_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_openenv_client.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_parser.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_path_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_renderer_client.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_rubric.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_rubric_group.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_save_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_setup_script.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_think_parser.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_tool_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_tool_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_types.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/test_xml_parser.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/v1/conftest.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/v1/fixtures/duet_v1.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/v1/test_configs.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/v1/test_envs.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/v1/test_graph.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/v1/test_judges.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/v1/test_taskset.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/tests/v1/test_trace.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/cli/tui.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/clients/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/clients/client.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/clients/openai_completions_client.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/clients/openai_responses_client.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/clients/renderer_client.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/decorators.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/env_group.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/environment.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/README.md +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/README.md +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/task.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/gym_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/integrations/README.md +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/integrations/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/multiturn_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/python_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/sandbox_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/singleturn_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/stateful_tool_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/envs/tool_env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/errors.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/gepa/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/gepa/adapter.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/gepa/config.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/gepa/display.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/gepa/gepa_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/parsers/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/parsers/parser.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/parsers/think_parser.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/parsers/xml_parser.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/rubrics/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/rubrics/judge_rubric.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/rubrics/math_rubric.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/rubrics/rubric.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/rubrics/rubric_group.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/scripts/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/scripts/build.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/scripts/eval.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/scripts/gepa.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/scripts/init.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/scripts/install.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/scripts/setup.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/scripts/tui.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/serve/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/serve/client/env_client.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/serve/server/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/serve/server/env_router.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/serve/server/env_server.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/serve/server/env_worker.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/serve/types.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/types.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/async_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/client_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/config_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/data_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/display_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/env_config_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/env_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/error_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/eval_display.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/eval_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/heartbeat.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/import_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/install_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/interception_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/logging_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/message_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/metric_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/path_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/pricing_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/process_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/response_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/save_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/serve_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/thread_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/tool_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/usage_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/legacy/utils/version_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/acp/runner.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/cli/resume.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/clients/base.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/configs/agent.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/configs/cli/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/configs/cli/debug.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/configs/cli/env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/configs/cli/eval.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/configs/cli/init.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/configs/cli/replay.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/configs/cli/validate.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/configs/client.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/configs/harness.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/configs/judge.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/configs/retries.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/configs/task.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/configs/taskset.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/envs/agentic_judge/env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/envs/user_sim/env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/episode.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/errors.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/graph.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harness.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/bash/program.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/browser_use/program.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/node.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/pool/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/pool/harness.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/judge.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/serve/encoding.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/state.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/tasksets/harbor/env.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/types.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/artifacts.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/decorators.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/install_utils.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/loaders.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/paths.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/platform.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/prime_config.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/retries.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/score.py +0 -0
- {verifiers-0.3.1.dev24 → verifiers-0.3.1.dev25}/verifiers/v1/utils/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.3.1.
|
|
3
|
+
Version: 0.3.1.dev25
|
|
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
|
|
@@ -81,6 +81,7 @@ from verifiers.v1.trace import (
|
|
|
81
81
|
Error,
|
|
82
82
|
EvalRunInfo,
|
|
83
83
|
ModelCall,
|
|
84
|
+
PolicyEvent,
|
|
84
85
|
Reward,
|
|
85
86
|
RunInfo,
|
|
86
87
|
TimeSpan,
|
|
@@ -204,6 +205,7 @@ __all__ = [ # noqa: RUF022 - grouped by public API area
|
|
|
204
205
|
"RunInfo",
|
|
205
206
|
"EvalRunInfo",
|
|
206
207
|
"ModelCall",
|
|
208
|
+
"PolicyEvent",
|
|
207
209
|
"TrainRunInfo",
|
|
208
210
|
"VersionInfo",
|
|
209
211
|
"State",
|
|
@@ -19,13 +19,13 @@ from verifiers.v1.clients import (
|
|
|
19
19
|
ModelContext,
|
|
20
20
|
)
|
|
21
21
|
from verifiers.v1.configs.agent import AgentConfig, TimeoutConfig
|
|
22
|
+
from verifiers.v1.configs.runtime import NetworkPolicyConfig
|
|
22
23
|
from verifiers.v1.dialects import parse_message
|
|
23
24
|
from verifiers.v1.harness import Harness
|
|
24
25
|
from verifiers.v1.interception import Interception, InterceptionServer
|
|
25
26
|
from verifiers.v1.mcp import SharedToolServer
|
|
26
27
|
from verifiers.v1.rollout import Rollout, RolloutTimeouts
|
|
27
28
|
from verifiers.v1.runtimes import (
|
|
28
|
-
NetworkPolicyConfig,
|
|
29
29
|
Runtime,
|
|
30
30
|
RuntimeConfig,
|
|
31
31
|
SubprocessConfig,
|
|
@@ -33,14 +33,14 @@ class Client(ABC):
|
|
|
33
33
|
self,
|
|
34
34
|
dialect: Dialect,
|
|
35
35
|
body: dict,
|
|
36
|
-
|
|
37
|
-
sampling_args: SamplingConfig,
|
|
36
|
+
sampling: SamplingConfig,
|
|
38
37
|
session_id: str | None = None,
|
|
39
38
|
turn: PendingTurn | None = None,
|
|
40
39
|
headers: Mapping[str, str] | None = None,
|
|
41
40
|
) -> Response:
|
|
42
|
-
"""Run one completion -> a vf `Response`.
|
|
43
|
-
|
|
41
|
+
"""Run one completion -> a vf `Response`. `body` is the final effective native
|
|
42
|
+
request after overrides and policy mediation: the eval client forwards it unchanged,
|
|
43
|
+
while the train client renders it to token ids using the resolved `sampling` config.
|
|
44
44
|
`session_id` is the rollout's trace id (sent as `SESSION_ID_HEADER`); `turn` is the
|
|
45
45
|
graph-resolved prompt prefix, used by train clients for renderer bridging."""
|
|
46
46
|
|
|
@@ -48,14 +48,11 @@ class Client(ABC):
|
|
|
48
48
|
self,
|
|
49
49
|
dialect: Dialect,
|
|
50
50
|
body: dict,
|
|
51
|
-
model: str,
|
|
52
|
-
sampling_args: SamplingConfig,
|
|
53
51
|
session_id: str | None = None,
|
|
54
52
|
headers: Mapping[str, str] | None = None,
|
|
55
53
|
) -> RelayReply:
|
|
56
|
-
"""Stream a
|
|
57
|
-
|
|
58
|
-
generates and cannot stream."""
|
|
54
|
+
"""Stream a response for the final effective `body`, relaying the provider's bytes.
|
|
55
|
+
Only the relay (eval) client supports it; the renderer generates and cannot stream."""
|
|
59
56
|
raise NotImplementedError(f"{type(self).__name__} does not support streaming")
|
|
60
57
|
|
|
61
58
|
async def relay_aux(
|
|
@@ -70,15 +70,14 @@ class EvalClient(Client):
|
|
|
70
70
|
self,
|
|
71
71
|
dialect: Dialect,
|
|
72
72
|
body: dict,
|
|
73
|
-
|
|
74
|
-
sampling_args: SamplingConfig,
|
|
73
|
+
sampling: SamplingConfig,
|
|
75
74
|
session_id: str | None = None,
|
|
76
75
|
turn: PendingTurn | None = None,
|
|
77
76
|
headers: Mapping[str, str] | None = None,
|
|
78
77
|
) -> Response:
|
|
79
78
|
resp = await self._request(
|
|
80
79
|
join_url(self.base_url, dialect.upstream_path),
|
|
81
|
-
|
|
80
|
+
body,
|
|
82
81
|
self._headers(dialect, headers, session_id),
|
|
83
82
|
)
|
|
84
83
|
# A corrupted response (e.g. an HTML error page or a truncated body on a
|
|
@@ -164,8 +163,6 @@ class EvalClient(Client):
|
|
|
164
163
|
self,
|
|
165
164
|
dialect: Dialect,
|
|
166
165
|
body: dict,
|
|
167
|
-
model: str,
|
|
168
|
-
sampling_args: SamplingConfig,
|
|
169
166
|
session_id: str | None = None,
|
|
170
167
|
headers: Mapping[str, str] | None = None,
|
|
171
168
|
) -> RelayReply:
|
|
@@ -173,7 +170,7 @@ class EvalClient(Client):
|
|
|
173
170
|
# between them. Error responses are mapped before any event is handed back.
|
|
174
171
|
resp = await self._request(
|
|
175
172
|
join_url(self.base_url, dialect.upstream_path),
|
|
176
|
-
|
|
173
|
+
body,
|
|
177
174
|
self._headers(dialect, headers, session_id),
|
|
178
175
|
stream=True,
|
|
179
176
|
)
|
|
@@ -319,8 +319,7 @@ class TrainClient(Client):
|
|
|
319
319
|
self,
|
|
320
320
|
dialect: Dialect,
|
|
321
321
|
body: dict,
|
|
322
|
-
|
|
323
|
-
sampling_args: SamplingConfig,
|
|
322
|
+
sampling: SamplingConfig,
|
|
324
323
|
session_id: str | None = None,
|
|
325
324
|
turn: PendingTurn | None = None,
|
|
326
325
|
headers: Mapping[str, str] | None = None,
|
|
@@ -353,7 +352,8 @@ class TrainClient(Client):
|
|
|
353
352
|
prompt_ids: list[int] | None = None
|
|
354
353
|
multi_modal_data = None
|
|
355
354
|
prompt_attribution: RenderedTokens | None = None
|
|
356
|
-
|
|
355
|
+
model = body["model"]
|
|
356
|
+
raw_sampling = sampling.model_dump(exclude_none=True)
|
|
357
357
|
sampling_params: dict[str, Any] = dict(
|
|
358
358
|
raw_sampling.pop("extra_body", None) or {}
|
|
359
359
|
)
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""Shared configuration for execution-time network policy."""
|
|
2
|
+
|
|
3
|
+
from fnmatch import fnmatchcase
|
|
4
|
+
from typing import Self
|
|
5
|
+
from urllib.parse import urlsplit
|
|
6
|
+
|
|
7
|
+
from pydantic import Field, model_validator
|
|
8
|
+
from pydantic_config import BaseConfig
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def network_rule_matches(rule: str, scheme: str, host: str, port: int) -> bool:
|
|
12
|
+
"""Match a network-policy host pattern or URL origin. Paths are ignored."""
|
|
13
|
+
value = rule.lower().rstrip("/")
|
|
14
|
+
try:
|
|
15
|
+
parsed = urlsplit(value if "://" in value else f"//{value}")
|
|
16
|
+
rule_port = parsed.port
|
|
17
|
+
except ValueError:
|
|
18
|
+
return False
|
|
19
|
+
pattern = (parsed.hostname or "").rstrip(".")
|
|
20
|
+
if not pattern or (parsed.scheme and parsed.scheme != scheme):
|
|
21
|
+
return False
|
|
22
|
+
if parsed.scheme and rule_port is None:
|
|
23
|
+
rule_port = 443 if parsed.scheme == "https" else 80
|
|
24
|
+
if rule_port is not None and rule_port != port:
|
|
25
|
+
return False
|
|
26
|
+
host = host.lower().rstrip(".")
|
|
27
|
+
return fnmatchcase(host, pattern) or (
|
|
28
|
+
pattern.startswith("*.") and host == pattern[2:]
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class NetworkPolicyConfig(BaseConfig):
|
|
33
|
+
"""Shared execution-time policy surface for runtimes that support it."""
|
|
34
|
+
|
|
35
|
+
allow: list[str] = Field(default_factory=lambda: ["*"])
|
|
36
|
+
"""Destinations allowed during execution; `*` is unrestricted and `[]` is
|
|
37
|
+
framework-only."""
|
|
38
|
+
block: list[str] = Field(default_factory=list)
|
|
39
|
+
"""Destinations denied during execution; any `*` makes the policy framework-only."""
|
|
40
|
+
|
|
41
|
+
@model_validator(mode="after")
|
|
42
|
+
def validate_network_policy(self) -> Self:
|
|
43
|
+
if not self.allow or "*" in self.block:
|
|
44
|
+
# Empty allowlists and wildcard blocks both mean framework-only access.
|
|
45
|
+
self.allow = []
|
|
46
|
+
self.block = ["*"]
|
|
47
|
+
elif self.allow != ["*"] and self.block:
|
|
48
|
+
raise ValueError(
|
|
49
|
+
"non-empty concrete allow and block egress lists are mutually exclusive"
|
|
50
|
+
)
|
|
51
|
+
return self
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def network_restricted(self) -> bool:
|
|
55
|
+
return "*" not in self.allow or bool(self.block)
|
|
56
|
+
|
|
57
|
+
def with_task_network_policy(self, allow: list[str], block: list[str]) -> Self:
|
|
58
|
+
values = self.model_dump()
|
|
59
|
+
if "*" in allow:
|
|
60
|
+
allow = self.allow
|
|
61
|
+
elif "*" not in self.allow:
|
|
62
|
+
# Rules are opaque: guessing overlap between different globs could widen the policy.
|
|
63
|
+
runtime_allow = set(self.allow)
|
|
64
|
+
allow = [rule for rule in allow if rule in runtime_allow]
|
|
65
|
+
block = list(dict.fromkeys([*block, *self.block]))
|
|
66
|
+
return type(self).model_validate({**values, "allow": allow, "block": block})
|
|
@@ -7,13 +7,22 @@ trace. `count_tokens` is relayed as native JSON (an `aux_route`), never recorded
|
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
9
|
import json
|
|
10
|
+
import re
|
|
10
11
|
from collections.abc import Callable, Mapping
|
|
11
12
|
from dataclasses import dataclass, field
|
|
13
|
+
from typing import cast
|
|
12
14
|
|
|
13
15
|
from anthropic.types import Message as AnthropicMessage
|
|
16
|
+
from anthropic.types import MessageCreateParams
|
|
14
17
|
from anthropic.types import Usage as AnthropicUsage
|
|
15
18
|
|
|
16
|
-
from verifiers.v1.dialects.base import
|
|
19
|
+
from verifiers.v1.dialects.base import (
|
|
20
|
+
Dialect,
|
|
21
|
+
StreamParser,
|
|
22
|
+
append_user_notice,
|
|
23
|
+
blocked_url,
|
|
24
|
+
parse_sse_event,
|
|
25
|
+
)
|
|
17
26
|
from verifiers.v1.types import (
|
|
18
27
|
AssistantMessage,
|
|
19
28
|
ContentPart,
|
|
@@ -42,6 +51,54 @@ STOP_REASONS = {
|
|
|
42
51
|
}
|
|
43
52
|
# Claude may reorder mixed thinking block types between a response and its replay.
|
|
44
53
|
THINKING = ("redacted_thinking", "thinking")
|
|
54
|
+
# These versioned tool families return calls to the harness; every other typed tool may execute
|
|
55
|
+
# at the provider. Anchoring the pattern keeps new versions client-side without treating an
|
|
56
|
+
# arbitrary dated provider tool as safe.
|
|
57
|
+
_CLIENT_TOOL_TYPE = re.compile(r"(?:bash|text_editor|computer|memory)_\d{8}").fullmatch
|
|
58
|
+
_CONTENT_WRAPPERS = (
|
|
59
|
+
"tool_result",
|
|
60
|
+
"code_execution_tool_result",
|
|
61
|
+
"bash_code_execution_tool_result",
|
|
62
|
+
"text_editor_code_execution_tool_result",
|
|
63
|
+
"web_search_tool_result",
|
|
64
|
+
"web_fetch_tool_result",
|
|
65
|
+
"tool_search_tool_result",
|
|
66
|
+
"mcp_tool_result",
|
|
67
|
+
"advisor_tool_result",
|
|
68
|
+
"code_execution_result",
|
|
69
|
+
"bash_code_execution_result",
|
|
70
|
+
"encrypted_code_execution_result",
|
|
71
|
+
"web_fetch_result",
|
|
72
|
+
)
|
|
73
|
+
_SAFE_CONTENT_TYPES = (
|
|
74
|
+
"text",
|
|
75
|
+
"image",
|
|
76
|
+
"document",
|
|
77
|
+
"tool_reference",
|
|
78
|
+
"thinking",
|
|
79
|
+
"redacted_thinking",
|
|
80
|
+
"tool_use",
|
|
81
|
+
"search_result",
|
|
82
|
+
"server_tool_use",
|
|
83
|
+
"mid_conv_system",
|
|
84
|
+
"compaction",
|
|
85
|
+
"fallback",
|
|
86
|
+
"mcp_tool_use",
|
|
87
|
+
"web_search_result",
|
|
88
|
+
"web_search_tool_result_error",
|
|
89
|
+
"web_fetch_tool_result_error",
|
|
90
|
+
"tool_search_tool_search_result",
|
|
91
|
+
"tool_search_tool_result_error",
|
|
92
|
+
"code_execution_tool_result_error",
|
|
93
|
+
"bash_code_execution_tool_result_error",
|
|
94
|
+
"text_editor_code_execution_tool_result_error",
|
|
95
|
+
"text_editor_code_execution_create_result",
|
|
96
|
+
"text_editor_code_execution_str_replace_result",
|
|
97
|
+
"text_editor_code_execution_view_result",
|
|
98
|
+
"advisor_result",
|
|
99
|
+
"advisor_redacted_result",
|
|
100
|
+
"advisor_tool_result_error",
|
|
101
|
+
)
|
|
45
102
|
|
|
46
103
|
|
|
47
104
|
def parse_content(content) -> str | list[ContentPart]:
|
|
@@ -68,6 +125,79 @@ def parse_content(content) -> str | list[ContentPart]:
|
|
|
68
125
|
return parts
|
|
69
126
|
|
|
70
127
|
|
|
128
|
+
def blocked_content_path(value, path: str) -> str | None:
|
|
129
|
+
if isinstance(value, list):
|
|
130
|
+
for index, item in enumerate(value):
|
|
131
|
+
if blocked := blocked_content_path(item, f"{path}[{index}]"):
|
|
132
|
+
return blocked
|
|
133
|
+
return None
|
|
134
|
+
if not isinstance(value, dict):
|
|
135
|
+
return None
|
|
136
|
+
|
|
137
|
+
kind = value.get("type")
|
|
138
|
+
caller = value.get("caller")
|
|
139
|
+
if caller is not None and not (
|
|
140
|
+
isinstance(caller, dict) and caller.get("type") == "direct"
|
|
141
|
+
):
|
|
142
|
+
return f"{path}.caller.type"
|
|
143
|
+
if kind in ("image", "document"):
|
|
144
|
+
source_path = f"{path}.source"
|
|
145
|
+
source = value.get("source") or {}
|
|
146
|
+
if not isinstance(source, dict):
|
|
147
|
+
return source_path
|
|
148
|
+
source_kind = source.get("type")
|
|
149
|
+
if source_kind == "content":
|
|
150
|
+
return blocked_content_path(source.get("content"), f"{source_path}.content")
|
|
151
|
+
if source_kind == "url":
|
|
152
|
+
url = source.get("url")
|
|
153
|
+
if not isinstance(url, str) or blocked_url(url):
|
|
154
|
+
return f"{source_path}.url"
|
|
155
|
+
if source_kind == "file":
|
|
156
|
+
return (
|
|
157
|
+
f"{source_path}.file_id"
|
|
158
|
+
if source.get("file_id")
|
|
159
|
+
else f"{source_path}.type"
|
|
160
|
+
)
|
|
161
|
+
if source_kind not in ("base64", "text", "url"):
|
|
162
|
+
return f"{source_path}.type"
|
|
163
|
+
|
|
164
|
+
if kind in (
|
|
165
|
+
"container_upload",
|
|
166
|
+
"code_execution_output",
|
|
167
|
+
"bash_code_execution_output",
|
|
168
|
+
) and value.get("file_id"):
|
|
169
|
+
return f"{path}.file_id"
|
|
170
|
+
if kind in _CONTENT_WRAPPERS:
|
|
171
|
+
return blocked_content_path(value.get("content"), f"{path}.content")
|
|
172
|
+
return None if kind in _SAFE_CONTENT_TYPES else f"{path}.type"
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def mediate_content(value, path: str):
|
|
176
|
+
if not isinstance(value, list):
|
|
177
|
+
blocked = blocked_content_path(value, path)
|
|
178
|
+
return ("", [blocked]) if blocked else (value, [])
|
|
179
|
+
|
|
180
|
+
mediated = []
|
|
181
|
+
capabilities = []
|
|
182
|
+
for index, block in enumerate(value):
|
|
183
|
+
item_path = f"{path}[{index}]"
|
|
184
|
+
if isinstance(block, dict) and block.get("type") in _CONTENT_WRAPPERS:
|
|
185
|
+
if blocked := blocked_content_path({**block, "content": []}, item_path):
|
|
186
|
+
capabilities.append(blocked)
|
|
187
|
+
continue
|
|
188
|
+
content, removed = mediate_content(
|
|
189
|
+
block.get("content"), f"{item_path}.content"
|
|
190
|
+
)
|
|
191
|
+
if removed:
|
|
192
|
+
block["content"] = content or ""
|
|
193
|
+
capabilities.extend(removed)
|
|
194
|
+
elif blocked := blocked_content_path(block, item_path):
|
|
195
|
+
capabilities.append(blocked)
|
|
196
|
+
continue
|
|
197
|
+
mediated.append(block)
|
|
198
|
+
return mediated, capabilities
|
|
199
|
+
|
|
200
|
+
|
|
71
201
|
def parse_messages(body: dict) -> Messages:
|
|
72
202
|
"""The request's top-level `system` + `messages` -> typed messages. Assistant turns fold
|
|
73
203
|
their blocks into one message (thinking -> reasoning, tool_use -> tool calls); a user turn's
|
|
@@ -265,7 +395,7 @@ class ModdedAnthropicMessage(AnthropicMessage):
|
|
|
265
395
|
usage: ModdedUsage # type: ignore[assignment]
|
|
266
396
|
|
|
267
397
|
|
|
268
|
-
class AnthropicDialect(Dialect[
|
|
398
|
+
class AnthropicDialect(Dialect[MessageCreateParams, AnthropicMessage]):
|
|
269
399
|
sampling_fields = frozenset(
|
|
270
400
|
{
|
|
271
401
|
"temperature",
|
|
@@ -283,6 +413,73 @@ class AnthropicDialect(Dialect[dict, AnthropicMessage]):
|
|
|
283
413
|
upstream_path = "/v1/messages"
|
|
284
414
|
response_type = ModdedAnthropicMessage
|
|
285
415
|
|
|
416
|
+
def mediate_external_capabilities(
|
|
417
|
+
self, body: MessageCreateParams
|
|
418
|
+
) -> tuple[MessageCreateParams, list[str]]:
|
|
419
|
+
mediated = body
|
|
420
|
+
capabilities: list[str] = []
|
|
421
|
+
|
|
422
|
+
for key in ("container", "mcp_servers"):
|
|
423
|
+
if mediated.pop(key, None):
|
|
424
|
+
capabilities.append(key)
|
|
425
|
+
|
|
426
|
+
system, removed = mediate_content(mediated.get("system"), "system")
|
|
427
|
+
capabilities.extend(removed)
|
|
428
|
+
if removed:
|
|
429
|
+
if system:
|
|
430
|
+
mediated["system"] = system
|
|
431
|
+
else:
|
|
432
|
+
mediated.pop("system")
|
|
433
|
+
|
|
434
|
+
for message_index, message in enumerate(mediated.get("messages") or []):
|
|
435
|
+
if not isinstance(message, dict):
|
|
436
|
+
continue
|
|
437
|
+
content, removed = mediate_content(
|
|
438
|
+
message.get("content"), f"messages[{message_index}].content"
|
|
439
|
+
)
|
|
440
|
+
capabilities.extend(removed)
|
|
441
|
+
if removed:
|
|
442
|
+
message["content"] = content or ""
|
|
443
|
+
|
|
444
|
+
raw_tools = mediated.get("tools")
|
|
445
|
+
tool_items = raw_tools if isinstance(raw_tools, list) else []
|
|
446
|
+
if raw_tools is not None and not isinstance(raw_tools, list):
|
|
447
|
+
capabilities.append("tools")
|
|
448
|
+
tools = []
|
|
449
|
+
for index, tool in enumerate(tool_items):
|
|
450
|
+
kind = tool.get("type") if isinstance(tool, dict) else None
|
|
451
|
+
if isinstance(tool, dict) and (
|
|
452
|
+
(isinstance(kind, str) and _CLIENT_TOOL_TYPE(kind))
|
|
453
|
+
or (kind in (None, "custom") and "input_schema" in tool)
|
|
454
|
+
):
|
|
455
|
+
tools.append(tool)
|
|
456
|
+
continue
|
|
457
|
+
capabilities.append(f"tools[{index}].type")
|
|
458
|
+
if "tools" in mediated:
|
|
459
|
+
mediated["tools"] = tools
|
|
460
|
+
|
|
461
|
+
choice = mediated.get("tool_choice")
|
|
462
|
+
valid_choice = choice is None
|
|
463
|
+
if isinstance(choice, dict):
|
|
464
|
+
kind = choice.get("type")
|
|
465
|
+
valid_choice = (
|
|
466
|
+
kind == "none"
|
|
467
|
+
or bool(tools)
|
|
468
|
+
and (
|
|
469
|
+
kind in ("auto", "any")
|
|
470
|
+
or kind == "tool"
|
|
471
|
+
and any(tool.get("name") == choice.get("name") for tool in tools)
|
|
472
|
+
)
|
|
473
|
+
)
|
|
474
|
+
if not valid_choice:
|
|
475
|
+
capabilities.append(
|
|
476
|
+
"tool_choice.type" if isinstance(choice, dict) else "tool_choice"
|
|
477
|
+
)
|
|
478
|
+
mediated.pop("tool_choice", None)
|
|
479
|
+
|
|
480
|
+
append_user_notice(mediated.setdefault("messages", []))
|
|
481
|
+
return mediated, capabilities
|
|
482
|
+
|
|
286
483
|
def auth_headers(self, api_key: str) -> dict[str, str]:
|
|
287
484
|
return {"x-api-key": api_key, "anthropic-version": "2023-06-01"}
|
|
288
485
|
|
|
@@ -296,7 +493,9 @@ class AnthropicDialect(Dialect[dict, AnthropicMessage]):
|
|
|
296
493
|
"error": {"type": "invalid_request_error", "message": message},
|
|
297
494
|
}
|
|
298
495
|
|
|
299
|
-
def parse_request(
|
|
496
|
+
def parse_request(
|
|
497
|
+
self, body: MessageCreateParams
|
|
498
|
+
) -> tuple[Messages, list[Tool] | None]:
|
|
300
499
|
tools = [
|
|
301
500
|
Tool(
|
|
302
501
|
name=t["name"],
|
|
@@ -314,7 +513,7 @@ class AnthropicDialect(Dialect[dict, AnthropicMessage]):
|
|
|
314
513
|
def stream_parser(self) -> StreamParser:
|
|
315
514
|
return AnthropicStreamParser(self.validate_response)
|
|
316
515
|
|
|
317
|
-
def parse_sampling(self, body:
|
|
516
|
+
def parse_sampling(self, body: MessageCreateParams) -> Sampling:
|
|
318
517
|
settings = {k: v for k, v in body.items() if k in self.sampling_fields}
|
|
319
518
|
# Lift `output_config.effort` (where `apply_overrides` puts the eval's
|
|
320
519
|
# reasoning effort) onto the typed knob; keep any other output-config keys.
|
|
@@ -328,7 +527,9 @@ class AnthropicDialect(Dialect[dict, AnthropicMessage]):
|
|
|
328
527
|
settings.pop("output_config")
|
|
329
528
|
return Sampling.model_validate(settings)
|
|
330
529
|
|
|
331
|
-
def apply_overrides(
|
|
530
|
+
def apply_overrides(
|
|
531
|
+
self, body: MessageCreateParams, model: str, sampling: SamplingConfig
|
|
532
|
+
) -> MessageCreateParams:
|
|
332
533
|
# Preserve native fields except the eval's model + sampling. `temperature`/`top_p` are
|
|
333
534
|
# authoritative (always dropped, the eval's applied if set); `max_tokens` is required by
|
|
334
535
|
# the API, so the program's is kept unless the eval sets one.
|
|
@@ -350,4 +551,4 @@ class AnthropicDialect(Dialect[dict, AnthropicMessage]):
|
|
|
350
551
|
for k, v in body.items()
|
|
351
552
|
if k not in ("temperature", "top_p") and k not in overrides
|
|
352
553
|
}
|
|
353
|
-
return {**steered, **overrides}
|
|
554
|
+
return cast(MessageCreateParams, {**steered, **overrides})
|
|
@@ -27,6 +27,45 @@ RespT = TypeVar("RespT", bound=BaseModel)
|
|
|
27
27
|
|
|
28
28
|
logger = logging.getLogger(__name__)
|
|
29
29
|
|
|
30
|
+
PROVIDER_CAPABILITY_POLICY_CODE = "provider_capability_unavailable"
|
|
31
|
+
CAPABILITY_NOTICE = (
|
|
32
|
+
"Network protocol blocked fetching a resource. Continue without those capabilities; "
|
|
33
|
+
"use local tools or inline data already present in the conversation, and do not retry "
|
|
34
|
+
"the blocked provider-side operation."
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def blocked_url(value: str) -> bool:
|
|
39
|
+
"""Whether a provider-resolved resource is not inline data."""
|
|
40
|
+
return not value.lower().startswith("data:")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def append_user_notice(
|
|
44
|
+
messages: list,
|
|
45
|
+
*,
|
|
46
|
+
text_type: str = "text",
|
|
47
|
+
message_type: str | None = None,
|
|
48
|
+
) -> None:
|
|
49
|
+
"""Add stable restricted-network context to the earliest user input."""
|
|
50
|
+
part = {"type": text_type, "text": CAPABILITY_NOTICE}
|
|
51
|
+
for message in messages:
|
|
52
|
+
if not isinstance(message, dict) or message.get("role") != "user":
|
|
53
|
+
continue
|
|
54
|
+
content = message.get("content")
|
|
55
|
+
if isinstance(content, list):
|
|
56
|
+
message["content"] = [*content, part]
|
|
57
|
+
elif isinstance(content, str):
|
|
58
|
+
message["content"] = (
|
|
59
|
+
f"{content}\n\n{CAPABILITY_NOTICE}" if content else CAPABILITY_NOTICE
|
|
60
|
+
)
|
|
61
|
+
else:
|
|
62
|
+
message["content"] = [part]
|
|
63
|
+
return
|
|
64
|
+
message = {"role": "user", "content": [part]}
|
|
65
|
+
if message_type is not None:
|
|
66
|
+
message["type"] = message_type
|
|
67
|
+
messages.append(message)
|
|
68
|
+
|
|
30
69
|
|
|
31
70
|
def is_sse_done_event(raw: bytes) -> bool:
|
|
32
71
|
"""Whether one complete SSE event carries the DONE sentinel."""
|
|
@@ -147,6 +186,12 @@ class Dialect(ABC, Generic[ReqT, RespT]):
|
|
|
147
186
|
"""An error payload in this format's error shape (OpenAI by default)."""
|
|
148
187
|
return {"error": {"message": message, "type": "invalid_request_error"}}
|
|
149
188
|
|
|
189
|
+
@abstractmethod
|
|
190
|
+
def mediate_external_capabilities(self, body: ReqT) -> tuple[ReqT, list[str]]:
|
|
191
|
+
"""Remove provider-side capabilities during restricted execution. Implementations add
|
|
192
|
+
the same policy context on every call because the agent does not retain injected request
|
|
193
|
+
content. Returned paths never contain request values."""
|
|
194
|
+
|
|
150
195
|
@abstractmethod
|
|
151
196
|
def parse_request(self, body: ReqT) -> tuple[Messages, list[Tool] | None]:
|
|
152
197
|
"""The native request -> vf prompt + tools (for the trace)."""
|
|
@@ -174,5 +219,5 @@ class Dialect(ABC, Generic[ReqT, RespT]):
|
|
|
174
219
|
@abstractmethod
|
|
175
220
|
def apply_overrides(self, body: ReqT, model: str, sampling: SamplingConfig) -> ReqT:
|
|
176
221
|
"""Return `body` with the eval's `model` + `sampling` imposed in this protocol's shape —
|
|
177
|
-
|
|
178
|
-
|
|
222
|
+
model overlays; sampling is authoritative (the program's sampling keys are dropped, the
|
|
223
|
+
eval's applied). Capability mediation may subsequently remove restricted fields."""
|