verifiers 0.2.2.dev22__tar.gz → 0.2.2.dev24__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.2.2.dev22 → verifiers-0.2.2.dev24}/PKG-INFO +2 -2
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/pyproject.toml +1 -1
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/pyproject.toml +1 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/agent.py +15 -9
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/mcp/launch.py +7 -7
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/push.py +45 -1
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/runtimes/__init__.py +2 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/runtimes/base.py +43 -3
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/runtimes/docker/__init__.py +8 -35
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/runtimes/prime.py +57 -4
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/task.py +3 -3
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/compile.py +6 -12
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/.gitignore +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/LICENSE +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/README.md +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/conftest.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_build_script.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_client_config.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_env_group.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_env_server.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_environment.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_imports.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_init_script.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_logging.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_parser.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_rubric.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_types.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/conftest.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/duet_v1.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/test_configs.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/test_envs.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/test_graph.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/test_judges.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/test_taskset.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/test_trace.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/decorators.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/errors.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/types.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/acp/_runner.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/configs/debug.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/configs/replay.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/envs/agentic_judge/env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/envs/user_sim/env.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/episode.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/errors.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/graph.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harness.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/bash/program.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/pool/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/pool/harness.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/judge.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/retries.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/session.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/state.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/trace.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/types.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/sampling.py +0 -0
- {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.2.2.
|
|
3
|
+
Version: 0.2.2.dev24
|
|
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
|
|
@@ -35,7 +35,7 @@ Requires-Dist: numpy>=2.1.0
|
|
|
35
35
|
Requires-Dist: openai-agents>=0.8.2
|
|
36
36
|
Requires-Dist: openai>=2.9.0
|
|
37
37
|
Requires-Dist: prime-pydantic-config[toml]>=0.4.2
|
|
38
|
-
Requires-Dist: prime-sandboxes>=0.2.
|
|
38
|
+
Requires-Dist: prime-sandboxes>=0.2.33
|
|
39
39
|
Requires-Dist: prime-tunnel>=0.1.8
|
|
40
40
|
Requires-Dist: pydantic>=2.12.3
|
|
41
41
|
Requires-Dist: pyzmq>=27.1.0
|
|
@@ -30,7 +30,7 @@ from verifiers.v1.mcp import SharedToolServer
|
|
|
30
30
|
from verifiers.v1.retries import RetryConfig, backoff, trace_should_retry
|
|
31
31
|
from verifiers.v1.rollout import RolloutRun, _as_messages
|
|
32
32
|
from verifiers.v1.runtimes import (
|
|
33
|
-
|
|
33
|
+
NetworkPolicyConfig,
|
|
34
34
|
Runtime,
|
|
35
35
|
RuntimeConfig,
|
|
36
36
|
SubprocessConfig,
|
|
@@ -114,20 +114,26 @@ def _check_borrowed_placement(
|
|
|
114
114
|
be honored. Reject requirements that cannot be applied to the running box; an
|
|
115
115
|
image mismatch on a container only warns, since sharing its world is the point."""
|
|
116
116
|
task_policy = "*" not in task.data.network_allow or bool(task.data.network_block)
|
|
117
|
-
|
|
118
|
-
if task_policy or (
|
|
117
|
+
base_policy = base_config if isinstance(base_config, NetworkPolicyConfig) else None
|
|
118
|
+
if task_policy or (base_policy is not None and base_policy.network_restricted):
|
|
119
119
|
config = runtime.config
|
|
120
|
-
if not isinstance(config,
|
|
120
|
+
if not isinstance(config, NetworkPolicyConfig):
|
|
121
121
|
raise ValueError(
|
|
122
|
-
f"task {task.data.idx!r} requires a
|
|
123
|
-
f"borrowed runtime {runtime.name!r}
|
|
122
|
+
f"task {task.data.idx!r} requires a framework-aware network policy, "
|
|
123
|
+
f"but borrowed runtime {runtime.name!r} does not support one; use "
|
|
124
124
|
"agent.provision(task)"
|
|
125
125
|
)
|
|
126
|
-
|
|
127
|
-
|
|
126
|
+
if base_policy is not None and type(config) is not type(base_policy):
|
|
127
|
+
raise ValueError(
|
|
128
|
+
f"the configured {base_policy.type} network policy cannot be applied "
|
|
129
|
+
f"to borrowed {config.type} runtime {runtime.name!r}; use "
|
|
130
|
+
"agent.provision(task)"
|
|
131
|
+
)
|
|
132
|
+
policy_base = base_policy or config.model_copy(
|
|
133
|
+
update={"allow": ["*"], "block": []}
|
|
128
134
|
)
|
|
129
135
|
expected = resolve_runtime_config(policy_base, task)
|
|
130
|
-
assert isinstance(expected,
|
|
136
|
+
assert isinstance(expected, NetworkPolicyConfig)
|
|
131
137
|
# Do not inherit extra destinations from a box provisioned for another task.
|
|
132
138
|
if set(config.allow) != set(expected.allow) or set(config.block) != set(
|
|
133
139
|
expected.block
|
|
@@ -20,7 +20,7 @@ from verifiers.v1.errors import ToolsetError
|
|
|
20
20
|
from verifiers.v1.interception.tunnel import PrimeTunnel
|
|
21
21
|
from verifiers.v1.mcp.server import STATE_SECRET_PARAM, STATE_URL_PARAM, ServerBase
|
|
22
22
|
from verifiers.v1.runtimes import (
|
|
23
|
-
|
|
23
|
+
NetworkPolicyConfig,
|
|
24
24
|
Runtime,
|
|
25
25
|
make_runtime,
|
|
26
26
|
runtime_is_local,
|
|
@@ -253,17 +253,17 @@ async def serve(
|
|
|
253
253
|
colocated = getattr(cfg, "colocated", False)
|
|
254
254
|
async with contextlib.AsyncExitStack() as stack:
|
|
255
255
|
# Colocated servers inherit the harness cut. A separately provisioned filtered
|
|
256
|
-
#
|
|
256
|
+
# server has neither that lifecycle nor a published port after isolation;
|
|
257
257
|
# reject it instead of silently leaving its requested policy unenforced.
|
|
258
258
|
if (
|
|
259
|
-
isinstance(cfg.runtime,
|
|
260
|
-
and cfg.runtime.
|
|
259
|
+
isinstance(cfg.runtime, NetworkPolicyConfig)
|
|
260
|
+
and cfg.runtime.network_restricted
|
|
261
261
|
and not (colocated and harness_runtime is not None)
|
|
262
262
|
):
|
|
263
263
|
raise ToolsetError(
|
|
264
|
-
"
|
|
264
|
+
"Runtime network policies are supported on the harness runtime; "
|
|
265
265
|
f"server {server.server_name!r} must be colocated or use an "
|
|
266
|
-
"unrestricted
|
|
266
|
+
"unrestricted runtime"
|
|
267
267
|
)
|
|
268
268
|
if colocated and harness_runtime is not None:
|
|
269
269
|
runtime = harness_runtime
|
|
@@ -303,7 +303,7 @@ async def serve(
|
|
|
303
303
|
runtime, port, colocated=colocated, consumer_is_local=consumer_is_local
|
|
304
304
|
)
|
|
305
305
|
)
|
|
306
|
-
if colocated and harness_runtime is not None and runtime.
|
|
306
|
+
if colocated and harness_runtime is not None and runtime.network_restricted:
|
|
307
307
|
base = base.replace("127.0.0.1", "localhost", 1)
|
|
308
308
|
elif not colocated and harness_runtime is not None:
|
|
309
309
|
base = harness_runtime.host_url(base)
|
|
@@ -6,6 +6,7 @@ contract as `prime eval push`, done inline at the end of a run. Auth + base URL
|
|
|
6
6
|
come from `$PRIME_API_KEY` / `~/.prime/config.json`.
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
+
import json
|
|
9
10
|
import logging
|
|
10
11
|
import os
|
|
11
12
|
from dataclasses import dataclass
|
|
@@ -22,6 +23,8 @@ logger = logging.getLogger(__name__)
|
|
|
22
23
|
|
|
23
24
|
DEFAULT_API_URL = "https://api.primeintellect.ai"
|
|
24
25
|
DEFAULT_FRONTEND_URL = "https://app.primeintellect.ai"
|
|
26
|
+
# Repeated /samples posts append; match the Prime Evals client's request ceiling.
|
|
27
|
+
_MAX_SAMPLES_PAYLOAD_BYTES = 25 * 1024 * 1024
|
|
25
28
|
|
|
26
29
|
|
|
27
30
|
@dataclass
|
|
@@ -200,6 +203,36 @@ def push_traces(
|
|
|
200
203
|
# The run is done and its results saved; a network blip here must not crash it
|
|
201
204
|
# — log and skip the upload instead.
|
|
202
205
|
try:
|
|
206
|
+
batches: list[list[dict[str, Any]]] = []
|
|
207
|
+
batch: list[dict[str, Any]] = []
|
|
208
|
+
payload_bytes = len(b'{"samples":[]}')
|
|
209
|
+
for i, sample in enumerate(samples):
|
|
210
|
+
sample_bytes = len(
|
|
211
|
+
json.dumps(
|
|
212
|
+
sample,
|
|
213
|
+
ensure_ascii=False,
|
|
214
|
+
separators=(",", ":"),
|
|
215
|
+
allow_nan=False,
|
|
216
|
+
).encode("utf-8")
|
|
217
|
+
)
|
|
218
|
+
sample_payload_bytes = len(b'{"samples":[]}') + sample_bytes
|
|
219
|
+
if sample_payload_bytes > _MAX_SAMPLES_PAYLOAD_BYTES:
|
|
220
|
+
raise ValueError(
|
|
221
|
+
f"sample {i} is too large to upload "
|
|
222
|
+
f"({sample_payload_bytes} > "
|
|
223
|
+
f"{_MAX_SAMPLES_PAYLOAD_BYTES} bytes)"
|
|
224
|
+
)
|
|
225
|
+
next_payload_bytes = payload_bytes + (1 if batch else 0) + sample_bytes
|
|
226
|
+
if batch and next_payload_bytes > _MAX_SAMPLES_PAYLOAD_BYTES:
|
|
227
|
+
batches.append(batch)
|
|
228
|
+
batch = []
|
|
229
|
+
payload_bytes = len(b'{"samples":[]}')
|
|
230
|
+
next_payload_bytes = payload_bytes + sample_bytes
|
|
231
|
+
batch.append(sample)
|
|
232
|
+
payload_bytes = next_payload_bytes
|
|
233
|
+
if batch or not samples:
|
|
234
|
+
batches.append(batch)
|
|
235
|
+
|
|
203
236
|
with httpx.Client(headers=headers, timeout=300.0) as client:
|
|
204
237
|
|
|
205
238
|
def post(path: str, body: dict) -> dict:
|
|
@@ -224,7 +257,18 @@ def push_traces(
|
|
|
224
257
|
**team,
|
|
225
258
|
},
|
|
226
259
|
)["evaluation_id"]
|
|
227
|
-
|
|
260
|
+
for batch in batches:
|
|
261
|
+
body = json.dumps(
|
|
262
|
+
{"samples": batch},
|
|
263
|
+
ensure_ascii=False,
|
|
264
|
+
separators=(",", ":"),
|
|
265
|
+
allow_nan=False,
|
|
266
|
+
).encode("utf-8")
|
|
267
|
+
resp = client.post(
|
|
268
|
+
f"{api}/evaluations/{eval_id}/samples",
|
|
269
|
+
content=body,
|
|
270
|
+
)
|
|
271
|
+
resp.raise_for_status()
|
|
228
272
|
post(f"/evaluations/{eval_id}/finalize", {"metrics": metrics})
|
|
229
273
|
except Exception as e:
|
|
230
274
|
logger.warning("--push: upload failed (%s: %s); skipping", type(e).__name__, e)
|
|
@@ -4,6 +4,7 @@ from pydantic import Field
|
|
|
4
4
|
|
|
5
5
|
from verifiers.v1.runtimes.base import (
|
|
6
6
|
BaseRuntimeInfo,
|
|
7
|
+
NetworkPolicyConfig,
|
|
7
8
|
ProgramResult,
|
|
8
9
|
Runtime,
|
|
9
10
|
register,
|
|
@@ -56,6 +57,7 @@ __all__ = [
|
|
|
56
57
|
"RuntimeConfig",
|
|
57
58
|
"RuntimeInfo",
|
|
58
59
|
"BaseRuntimeInfo",
|
|
60
|
+
"NetworkPolicyConfig",
|
|
59
61
|
"make_runtime",
|
|
60
62
|
"runtime_is_local",
|
|
61
63
|
"SubprocessConfig",
|
|
@@ -11,10 +11,11 @@ import weakref
|
|
|
11
11
|
from abc import ABC, abstractmethod
|
|
12
12
|
from dataclasses import dataclass
|
|
13
13
|
from pathlib import PurePosixPath
|
|
14
|
-
from typing import ClassVar
|
|
14
|
+
from typing import ClassVar, Self
|
|
15
15
|
|
|
16
16
|
from pydantic_config import BaseConfig
|
|
17
17
|
|
|
18
|
+
from verifiers.v1.errors import SandboxError
|
|
18
19
|
from verifiers.v1.utils.aio import run_shielded
|
|
19
20
|
|
|
20
21
|
logger = logging.getLogger(__name__)
|
|
@@ -94,6 +95,33 @@ def cleanup_at_exit() -> None:
|
|
|
94
95
|
runtime.cleanup()
|
|
95
96
|
|
|
96
97
|
|
|
98
|
+
class NetworkPolicyConfig(BaseConfig):
|
|
99
|
+
"""Shared execution-time policy surface for runtimes that support it."""
|
|
100
|
+
|
|
101
|
+
allow: list[str] = ["*"]
|
|
102
|
+
"""Destinations allowed during execution; `*` leaves egress unrestricted."""
|
|
103
|
+
block: list[str] = []
|
|
104
|
+
"""Destinations denied during execution."""
|
|
105
|
+
|
|
106
|
+
@property
|
|
107
|
+
def network_restricted(self) -> bool:
|
|
108
|
+
return "*" not in self.allow or bool(self.block)
|
|
109
|
+
|
|
110
|
+
def with_task_network_policy(self, allow: list[str], block: list[str]) -> Self:
|
|
111
|
+
if "*" not in allow:
|
|
112
|
+
allow = (
|
|
113
|
+
allow
|
|
114
|
+
if "*" in self.allow
|
|
115
|
+
else list(dict.fromkeys([*allow, *self.allow]))
|
|
116
|
+
)
|
|
117
|
+
else:
|
|
118
|
+
allow = self.allow
|
|
119
|
+
block = list(dict.fromkeys([*block, *self.block]))
|
|
120
|
+
return type(self).model_validate(
|
|
121
|
+
{**self.model_dump(), "allow": allow, "block": block}
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
|
|
97
125
|
class BaseRuntimeInfo(BaseConfig):
|
|
98
126
|
id: str | None = None
|
|
99
127
|
borrowed: bool = False
|
|
@@ -113,6 +141,7 @@ class Runtime(ABC):
|
|
|
113
141
|
self.name = name or f"vf-{uuid.uuid4().hex[:12]}"
|
|
114
142
|
self._uv_interpreters: dict[str, str] = {}
|
|
115
143
|
self._uv_script_locks: dict[str, asyncio.Lock] = {}
|
|
144
|
+
self._setup_claimed = False
|
|
116
145
|
self.stopped = False
|
|
117
146
|
"""Whether teardown has begun (set by `stop`). A stopped runtime is dead: a rollout
|
|
118
147
|
refuses to borrow one — the owner tore it down, so any use is a lifetime bug in the
|
|
@@ -244,15 +273,26 @@ class Runtime(ABC):
|
|
|
244
273
|
|
|
245
274
|
async def prepare_setup(self) -> None:
|
|
246
275
|
"""Claim the runtime for trusted setup; restricted runtimes may reject reuse."""
|
|
276
|
+
if not self.network_restricted:
|
|
277
|
+
return
|
|
278
|
+
if self._setup_claimed:
|
|
279
|
+
raise SandboxError(
|
|
280
|
+
f"network-filtered {self.type} runtimes are single-rollout; "
|
|
281
|
+
"provision a fresh runtime instead of reusing this one"
|
|
282
|
+
)
|
|
283
|
+
self._setup_claimed = True
|
|
247
284
|
|
|
248
285
|
async def prepare_execution(self, routes: list[str]) -> None:
|
|
249
286
|
"""Last setup step, right before the agent starts. Restricted runtimes enforce
|
|
250
287
|
their policy here while keeping the interception and MCP `routes` reachable."""
|
|
251
288
|
|
|
252
289
|
@property
|
|
253
|
-
def
|
|
290
|
+
def network_restricted(self) -> bool:
|
|
254
291
|
"""Whether the agent phase uses filtered networking (see `prepare_execution`)."""
|
|
255
|
-
return
|
|
292
|
+
return (
|
|
293
|
+
isinstance(self.config, NetworkPolicyConfig)
|
|
294
|
+
and self.config.network_restricted
|
|
295
|
+
)
|
|
256
296
|
|
|
257
297
|
@property
|
|
258
298
|
def published_port(self) -> int | None:
|
|
@@ -13,11 +13,10 @@ from pathlib import PurePosixPath
|
|
|
13
13
|
from typing import Literal
|
|
14
14
|
from urllib.parse import urlsplit
|
|
15
15
|
|
|
16
|
-
from pydantic_config import BaseConfig
|
|
17
|
-
|
|
18
16
|
from verifiers.v1.errors import SandboxError
|
|
19
17
|
from verifiers.v1.runtimes.base import (
|
|
20
18
|
BaseRuntimeInfo,
|
|
19
|
+
NetworkPolicyConfig,
|
|
21
20
|
ProgramResult,
|
|
22
21
|
Runtime,
|
|
23
22
|
parse_gpu,
|
|
@@ -27,7 +26,7 @@ from verifiers.v1.runtimes.docker.egress import HOST_ALIAS, EgressProxy, Network
|
|
|
27
26
|
logger = logging.getLogger(__name__)
|
|
28
27
|
|
|
29
28
|
|
|
30
|
-
class DockerConfig(
|
|
29
|
+
class DockerConfig(NetworkPolicyConfig):
|
|
31
30
|
type: Literal["docker"] = "docker"
|
|
32
31
|
image: str = "python:3.11-slim"
|
|
33
32
|
workdir: str = "/app"
|
|
@@ -42,17 +41,6 @@ class DockerConfig(BaseConfig):
|
|
|
42
41
|
disk: float | None = None
|
|
43
42
|
"""Advisory disk request in GB. Docker has no portable per-container size limit, so
|
|
44
43
|
this is accepted (so a task can declare it without a warning) but not enforced."""
|
|
45
|
-
allow: list[str] = []
|
|
46
|
-
"""URL origins or host patterns the agent may reach during execution. Framework
|
|
47
|
-
routes are always added; an empty list allows only those routes and `*` allows all."""
|
|
48
|
-
block: list[str] = []
|
|
49
|
-
"""URL origins or host patterns denied during execution. Block rules win over
|
|
50
|
-
`allow`; framework interception and MCP routes always remain reachable."""
|
|
51
|
-
|
|
52
|
-
@property
|
|
53
|
-
def network_isolated(self) -> bool:
|
|
54
|
-
"""True unless a bare wildcard permits every destination without exceptions."""
|
|
55
|
-
return "*" not in self.allow or bool(self.block)
|
|
56
44
|
|
|
57
45
|
|
|
58
46
|
class DockerRuntimeInfo(DockerConfig, BaseRuntimeInfo):
|
|
@@ -96,7 +84,6 @@ class DockerRuntime(Runtime):
|
|
|
96
84
|
self._proxy: EgressProxy | None = None
|
|
97
85
|
self._proxy_host_ip: str | None = None
|
|
98
86
|
self._stopped = False
|
|
99
|
-
self._setup_claimed = False
|
|
100
87
|
self._cut = False
|
|
101
88
|
|
|
102
89
|
async def start(self) -> None:
|
|
@@ -127,8 +114,8 @@ class DockerRuntime(Runtime):
|
|
|
127
114
|
_, gpu_count = parse_gpu(self.config.gpu)
|
|
128
115
|
if gpu_count:
|
|
129
116
|
limits += ["--gpus", str(gpu_count)]
|
|
130
|
-
|
|
131
|
-
if
|
|
117
|
+
restricted = self.network_restricted
|
|
118
|
+
if restricted:
|
|
132
119
|
network = [
|
|
133
120
|
"--network",
|
|
134
121
|
"bridge",
|
|
@@ -164,7 +151,7 @@ class DockerRuntime(Runtime):
|
|
|
164
151
|
self.info.id = run.stdout.strip()[
|
|
165
152
|
:12
|
|
166
153
|
] # `docker run -d` prints the container id
|
|
167
|
-
if
|
|
154
|
+
if restricted:
|
|
168
155
|
# Setup is trusted; colocated servers fetch their task from host interception
|
|
169
156
|
# before the final framework routes are known.
|
|
170
157
|
self._proxy = EgressProxy(
|
|
@@ -236,33 +223,19 @@ class DockerRuntime(Runtime):
|
|
|
236
223
|
host = urlsplit(url).hostname
|
|
237
224
|
# Keep numeric loopback container-local; the proxy maps this reserved name to
|
|
238
225
|
# the Verifiers process's loopback for interception and host-local MCP routes.
|
|
239
|
-
if self.
|
|
226
|
+
if self.network_restricted and host in ("127.0.0.1", "localhost"):
|
|
240
227
|
return url.replace(host, HOST_ALIAS, 1)
|
|
241
228
|
if (
|
|
242
|
-
not self.
|
|
229
|
+
not self.network_restricted
|
|
243
230
|
and sys.platform != "linux"
|
|
244
231
|
and host in ("127.0.0.1", "localhost")
|
|
245
232
|
):
|
|
246
233
|
return url.replace(host, "host.docker.internal", 1)
|
|
247
234
|
return url
|
|
248
235
|
|
|
249
|
-
@property
|
|
250
|
-
def network_isolated(self) -> bool:
|
|
251
|
-
return self.config.network_isolated
|
|
252
|
-
|
|
253
|
-
async def prepare_setup(self) -> None:
|
|
254
|
-
if not self.network_isolated:
|
|
255
|
-
return
|
|
256
|
-
if self._setup_claimed:
|
|
257
|
-
raise SandboxError(
|
|
258
|
-
"network-filtered Docker runtimes are single-rollout; provision a "
|
|
259
|
-
"fresh runtime instead of reusing this one"
|
|
260
|
-
)
|
|
261
|
-
self._setup_claimed = True
|
|
262
|
-
|
|
263
236
|
async def prepare_execution(self, routes: list[str]) -> None:
|
|
264
237
|
"""Allow the declared framework routes, then leave the proxy as the only route."""
|
|
265
|
-
if not self.
|
|
238
|
+
if not self.network_restricted:
|
|
266
239
|
return
|
|
267
240
|
assert self._proxy is not None
|
|
268
241
|
framework = [
|
|
@@ -14,14 +14,15 @@ import shlex
|
|
|
14
14
|
import tempfile
|
|
15
15
|
from pathlib import Path, PurePosixPath
|
|
16
16
|
from typing import ClassVar, Literal
|
|
17
|
+
from urllib.parse import urlsplit
|
|
17
18
|
|
|
18
19
|
from pydantic import model_validator
|
|
19
|
-
from pydantic_config import BaseConfig
|
|
20
20
|
|
|
21
21
|
from verifiers.v1.errors import SandboxError
|
|
22
22
|
from verifiers.v1.runtimes.base import (
|
|
23
23
|
SERVICE_PORT,
|
|
24
24
|
BaseRuntimeInfo,
|
|
25
|
+
NetworkPolicyConfig,
|
|
25
26
|
ProgramResult,
|
|
26
27
|
Runtime,
|
|
27
28
|
parse_gpu,
|
|
@@ -34,7 +35,7 @@ MAX_LIFETIME = 24 * 60 * 60
|
|
|
34
35
|
"""Prime's fixed cap (seconds) on any sandbox's total lifetime."""
|
|
35
36
|
|
|
36
37
|
|
|
37
|
-
class PrimeConfig(
|
|
38
|
+
class PrimeConfig(NetworkPolicyConfig):
|
|
38
39
|
type: Literal["prime"] = "prime"
|
|
39
40
|
image: str = "python:3.11-slim"
|
|
40
41
|
"""Docker image to run. Any pullable ref works: on the first use of an image, the
|
|
@@ -42,7 +43,6 @@ class PrimeConfig(BaseConfig):
|
|
|
42
43
|
~10 minutes) and caches the result, so later sandboxes on the same ref start in
|
|
43
44
|
seconds."""
|
|
44
45
|
workdir: str = "/app"
|
|
45
|
-
network_access: bool = True
|
|
46
46
|
vm: bool = False
|
|
47
47
|
"""Run as a micro-VM rather than a container (kernel features / stronger isolation)."""
|
|
48
48
|
guaranteed: bool = False
|
|
@@ -67,6 +67,22 @@ class PrimeConfig(BaseConfig):
|
|
|
67
67
|
env-server worker process (None/<= 0 disables it). (Tunnel creation is limited separately
|
|
68
68
|
and globally — see interception.tunnel.prime.TUNNEL_LIMITER.)"""
|
|
69
69
|
|
|
70
|
+
@model_validator(mode="after")
|
|
71
|
+
def _validate_egress(self) -> "PrimeConfig":
|
|
72
|
+
if not self.network_restricted:
|
|
73
|
+
return self
|
|
74
|
+
if not self.vm:
|
|
75
|
+
raise ValueError(
|
|
76
|
+
"Prime allow/block egress lists require a VM sandbox (vm=true)"
|
|
77
|
+
)
|
|
78
|
+
from prime_sandboxes.models import validate_egress_lists
|
|
79
|
+
|
|
80
|
+
allow = None if self.allow == ["*"] else self.allow
|
|
81
|
+
block = self.block or None
|
|
82
|
+
if allow is not None or block != ["*"]:
|
|
83
|
+
validate_egress_lists(allow, block)
|
|
84
|
+
return self
|
|
85
|
+
|
|
70
86
|
@model_validator(mode="after")
|
|
71
87
|
def _validate_idle_timeout(self) -> "PrimeConfig":
|
|
72
88
|
if self.idle_timeout is not None and self.idle_timeout > MAX_LIFETIME:
|
|
@@ -133,7 +149,6 @@ class PrimeRuntime(Runtime):
|
|
|
133
149
|
name=self.name,
|
|
134
150
|
labels=self.config.labels,
|
|
135
151
|
docker_image=self.config.image,
|
|
136
|
-
network_access=self.config.network_access,
|
|
137
152
|
vm=self.config.vm,
|
|
138
153
|
guaranteed=self.config.guaranteed,
|
|
139
154
|
**{k: v for k, v in options.items() if v is not None},
|
|
@@ -165,6 +180,44 @@ class PrimeRuntime(Runtime):
|
|
|
165
180
|
) as e: # provisioning failure is one rollout's problem, not the eval's
|
|
166
181
|
raise SandboxError(f"prime sandbox provisioning failed: {e}") from e
|
|
167
182
|
|
|
183
|
+
async def prepare_execution(self, routes: list[str]) -> None:
|
|
184
|
+
"""Apply the host policy after setup and wait until the platform enforces it."""
|
|
185
|
+
if not self.network_restricted:
|
|
186
|
+
return
|
|
187
|
+
try:
|
|
188
|
+
if self.config.allow == ["*"]:
|
|
189
|
+
policy = {"deny": self.config.block}
|
|
190
|
+
else:
|
|
191
|
+
hosts = [h for h in (urlsplit(route).hostname for route in routes) if h]
|
|
192
|
+
entries = list(dict.fromkeys([*hosts, *self.config.allow]))
|
|
193
|
+
from prime_sandboxes.models import validate_egress_lists
|
|
194
|
+
|
|
195
|
+
validate_egress_lists(entries, None)
|
|
196
|
+
policy = {"allow": entries} if entries else {"deny": ["*"]}
|
|
197
|
+
status = await self._client.set_network(self.info.id, **policy)
|
|
198
|
+
try:
|
|
199
|
+
async with asyncio.timeout(60):
|
|
200
|
+
delay = 0.1
|
|
201
|
+
while not status.applied:
|
|
202
|
+
await asyncio.sleep(delay)
|
|
203
|
+
delay = min(delay * 2, 3)
|
|
204
|
+
status = await self._client.get_network(self.info.id)
|
|
205
|
+
except TimeoutError as e:
|
|
206
|
+
raise SandboxError(
|
|
207
|
+
"prime egress policy was not applied within 60s on sandbox "
|
|
208
|
+
f"{self.info.id}; refusing to start the agent unrestricted"
|
|
209
|
+
) from e
|
|
210
|
+
except SandboxError:
|
|
211
|
+
raise
|
|
212
|
+
except Exception as e:
|
|
213
|
+
raise SandboxError(f"prime egress policy failed: {e}") from e
|
|
214
|
+
logger.info(
|
|
215
|
+
"prime: egress policy applied on sandbox %s (allow=%s block=%s)",
|
|
216
|
+
self.info.id,
|
|
217
|
+
self.config.allow,
|
|
218
|
+
self.config.block,
|
|
219
|
+
)
|
|
220
|
+
|
|
168
221
|
async def run(self, argv: list[str], env: dict[str, str]) -> ProgramResult:
|
|
169
222
|
try:
|
|
170
223
|
# Poll directly so the rollout stage owns the execution timeout; the SDK helper
|
|
@@ -140,11 +140,11 @@ class TaskData(StrictBaseModel):
|
|
|
140
140
|
workdir: str | None = None
|
|
141
141
|
network_allow: list[str] = ["*"]
|
|
142
142
|
"""Execution-time destinations requested by this task. `*` leaves the runtime
|
|
143
|
-
allowlist unchanged; a concrete list replaces a wildcard or combines with
|
|
144
|
-
|
|
143
|
+
allowlist unchanged; a concrete list replaces a wildcard or combines with existing
|
|
144
|
+
entries. Prime runtimes accept host-level entries and require `vm=true`."""
|
|
145
145
|
network_block: list[str] = []
|
|
146
146
|
"""Execution-time destinations denied by this task and combined with runtime
|
|
147
|
-
blocks."""
|
|
147
|
+
blocks. Prime runtimes cannot combine an allowlist and a blocklist."""
|
|
148
148
|
timeout: TaskTimeout = TaskTimeout()
|
|
149
149
|
resources: TaskResources = TaskResources()
|
|
150
150
|
|
|
@@ -7,7 +7,7 @@ from collections.abc import Collection
|
|
|
7
7
|
|
|
8
8
|
from verifiers.v1.harness import Harness
|
|
9
9
|
from verifiers.v1.runtimes import (
|
|
10
|
-
|
|
10
|
+
NetworkPolicyConfig,
|
|
11
11
|
RuntimeConfig,
|
|
12
12
|
SubprocessConfig,
|
|
13
13
|
runtime_is_local,
|
|
@@ -45,19 +45,13 @@ def resolve_runtime_config(
|
|
|
45
45
|
task.data.network_block
|
|
46
46
|
)
|
|
47
47
|
if task_network_policy:
|
|
48
|
-
if not isinstance(config,
|
|
48
|
+
if not isinstance(config, NetworkPolicyConfig):
|
|
49
49
|
raise ValueError(
|
|
50
|
-
f"task {task.data.idx!r} requires a
|
|
51
|
-
f"{config.type} runtime does not support framework-aware
|
|
50
|
+
f"task {task.data.idx!r} requires a network policy, but the "
|
|
51
|
+
f"{config.type} runtime does not support framework-aware policies"
|
|
52
52
|
)
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
task.data.network_allow
|
|
56
|
-
if "*" in config.allow
|
|
57
|
-
else list(dict.fromkeys([*task.data.network_allow, *config.allow]))
|
|
58
|
-
)
|
|
59
|
-
updates["block"] = list(
|
|
60
|
-
dict.fromkeys([*task.data.network_block, *config.block])
|
|
53
|
+
config = config.with_task_network_policy(
|
|
54
|
+
task.data.network_allow, task.data.network_block
|
|
61
55
|
)
|
|
62
56
|
for resource, value in task.data.resources.model_dump(exclude_none=True).items():
|
|
63
57
|
spec = type(config).model_fields.get(resource)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|