verifiers 0.2.1.dev21__tar.gz → 0.2.1.dev23__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.1.dev21 → verifiers-0.2.1.dev23}/PKG-INFO +1 -1
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/eval/runner.py +1 -1
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/gepa.py +1 -1
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/env.py +51 -23
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/errors.py +1 -1
- verifiers-0.2.1.dev23/verifiers/v1/interception/__init__.py +94 -0
- verifiers-0.2.1.dev23/verifiers/v1/interception/base.py +68 -0
- verifiers-0.2.1.dev23/verifiers/v1/interception/pool.py +133 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/interception/server.py +76 -98
- verifiers-0.2.1.dev23/verifiers/v1/interception/tunnel/__init__.py +40 -0
- verifiers-0.2.1.dev23/verifiers/v1/interception/tunnel/base.py +50 -0
- verifiers-0.2.1.dev23/verifiers/v1/interception/tunnel/custom.py +42 -0
- verifiers-0.2.1.dev23/verifiers/v1/interception/tunnel/prime.py +56 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/mcp/launch.py +61 -41
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/rollout.py +38 -37
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/runtimes/__init__.py +1 -8
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/runtimes/base.py +8 -96
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/runtimes/docker.py +10 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/runtimes/limiters.py +0 -7
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/runtimes/modal.py +2 -2
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/runtimes/prime.py +2 -2
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/serve/pool.py +1 -1
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/serve/server.py +2 -2
- verifiers-0.2.1.dev23/verifiers/v1/session.py +100 -0
- verifiers-0.2.1.dev21/verifiers/v1/interception/__init__.py +0 -16
- verifiers-0.2.1.dev21/verifiers/v1/interception/pool.py +0 -94
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/.gitignore +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/LICENSE +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/README.md +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/pyproject.toml +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/AGENTS.md +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/conftest.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_build_script.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_client_config.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_env_group.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_env_server.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_environment.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_envs.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_imports.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_init_script.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_logging.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_parser.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_rubric.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_types.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_wordle_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/conftest.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/test_configs.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/test_envs.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/test_graph.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/test_judges.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/test_taskset.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/tests/v1/test_trace.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/decorators.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/errors.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/types.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/configs/debug.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/configs/replay.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/episode.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/graph.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harness.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/default/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/default/harness.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/default/program.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/judge.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/push.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/retries.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/state.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/task.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/trace.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/types.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.2.1.dev21 → verifiers-0.2.1.dev23}/verifiers/v1/utils/sampling.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.2.1.
|
|
3
|
+
Version: 0.2.1.dev23
|
|
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
|
|
@@ -70,7 +70,7 @@ async def run_eval(env: Environment, config: EvalConfig) -> list[Trace]:
|
|
|
70
70
|
await append_trace(out, trace, write_lock)
|
|
71
71
|
|
|
72
72
|
# Shared tool servers (if any) come up once here and their URLs flow into every rollout
|
|
73
|
-
# (non-shared ones start per rollout inside the episodes); the interception
|
|
73
|
+
# (non-shared ones start per rollout inside the episodes); the interception comes up
|
|
74
74
|
# here too, so concurrent rollouts share its servers + tunnels rather than one each. Build
|
|
75
75
|
# episodes inside `serving` so each rollout is wired to those resources at construction.
|
|
76
76
|
async with env.serving():
|
|
@@ -60,7 +60,7 @@ def main(argv: list[str] | None = None) -> None:
|
|
|
60
60
|
return
|
|
61
61
|
|
|
62
62
|
# First Ctrl-C / SIGTERM warns and raises KeyboardInterrupt so a killed/timed-out run still
|
|
63
|
-
# runs the runner's `serving()` teardown (interception
|
|
63
|
+
# runs the runner's `serving()` teardown (interception / tool-server runtimes); further
|
|
64
64
|
# signals during that cleanup are swallowed so an impatient second Ctrl-C can't orphan them.
|
|
65
65
|
install_interrupt()
|
|
66
66
|
|
|
@@ -12,7 +12,14 @@ from verifiers.v1.clients import ModelContext
|
|
|
12
12
|
from verifiers.v1.decorators import discover_decorated
|
|
13
13
|
from verifiers.v1.episode import Episode
|
|
14
14
|
from verifiers.v1.types import ID
|
|
15
|
-
from verifiers.v1.interception import
|
|
15
|
+
from verifiers.v1.interception import (
|
|
16
|
+
ElasticInterceptionPoolConfig,
|
|
17
|
+
Interception,
|
|
18
|
+
InterceptionConfig,
|
|
19
|
+
make_interception,
|
|
20
|
+
requires_tunnel,
|
|
21
|
+
)
|
|
22
|
+
from verifiers.v1.session import RolloutLimits
|
|
16
23
|
from verifiers.v1.retries import RetryConfig
|
|
17
24
|
from verifiers.v1.rollout import Rollout
|
|
18
25
|
from verifiers.v1.runtimes import (
|
|
@@ -20,7 +27,7 @@ from verifiers.v1.runtimes import (
|
|
|
20
27
|
SubprocessConfig,
|
|
21
28
|
runtime_is_local,
|
|
22
29
|
)
|
|
23
|
-
from verifiers.v1.task import Task
|
|
30
|
+
from verifiers.v1.task import Task, resolve_server_config
|
|
24
31
|
from verifiers.v1.taskset import Taskset, TasksetConfig
|
|
25
32
|
from verifiers.v1.utils.generic import generic_type
|
|
26
33
|
from verifiers.v1.mcp import SharedToolServer, serve_shared
|
|
@@ -100,10 +107,11 @@ class EnvConfig(BaseConfig):
|
|
|
100
107
|
max_total_tokens: int | None = None
|
|
101
108
|
"""Max total (prompt + completion) tokens per rollout (None = no limit). Caps the
|
|
102
109
|
trace's `num_total_tokens`; framework-enforced between turns."""
|
|
103
|
-
|
|
104
|
-
"""
|
|
105
|
-
|
|
106
|
-
|
|
110
|
+
interception: InterceptionConfig = ElasticInterceptionPoolConfig()
|
|
111
|
+
"""The interception shape (see `verifiers.v1.interception`): `elastic` (the
|
|
112
|
+
default — servers grown on demand, `multiplex` rollouts each), `server` (one server,
|
|
113
|
+
with a tunnel choice incl. a bring-your-own endpoint), or `static` (a fixed list of
|
|
114
|
+
such servers)."""
|
|
107
115
|
# --- legacy (v0) backwards-compat -----------------------------------------
|
|
108
116
|
id: ID | None = None
|
|
109
117
|
"""Classic (v0) env id (`name`, `org/name`, or `org/name@version` — installed from the
|
|
@@ -274,9 +282,9 @@ class Environment:
|
|
|
274
282
|
)
|
|
275
283
|
self._warned_resources: set[tuple[str, str]] = set()
|
|
276
284
|
self._shared_tools: dict[str, SharedToolServer] = {}
|
|
277
|
-
self._interception:
|
|
285
|
+
self._interception: Interception | None = None
|
|
278
286
|
"""Eval-level serving resources, live only inside `serving()`: shared tool servers
|
|
279
|
-
({name: SharedToolServer}) and the interception
|
|
287
|
+
({name: SharedToolServer}) and the interception. `episode()` injects them into every rollout
|
|
280
288
|
so neither runner has to thread them through `Episode.run`/`Rollout.run`."""
|
|
281
289
|
|
|
282
290
|
def runtime_for(self, task: Task) -> RuntimeConfig:
|
|
@@ -358,24 +366,44 @@ class Environment:
|
|
|
358
366
|
@contextlib.asynccontextmanager
|
|
359
367
|
async def serving(self):
|
|
360
368
|
"""Hold the env-level serving resources for the duration of an eval: the shared tool
|
|
361
|
-
servers (built once, see `shared_tools`) and the interception
|
|
369
|
+
servers (built once, see `shared_tools`) and the interception. Stash them so
|
|
362
370
|
every `episode()` built inside this context injects them into its rollouts — that's
|
|
363
371
|
what keeps both eval runners (in-process and env-server) on one serving path. Build
|
|
364
372
|
episodes inside this context; the resources are torn down on exit."""
|
|
365
|
-
async with (
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
373
|
+
async with self.shared_tools() as shared:
|
|
374
|
+
interception = make_interception(
|
|
375
|
+
self.config.interception, requires_tunnel=self._requires_tunnel(shared)
|
|
376
|
+
)
|
|
377
|
+
async with interception:
|
|
378
|
+
self._shared_tools = shared
|
|
379
|
+
self._interception = interception
|
|
380
|
+
try:
|
|
381
|
+
yield
|
|
382
|
+
finally:
|
|
383
|
+
self._shared_tools = {}
|
|
384
|
+
self._interception = None
|
|
385
|
+
|
|
386
|
+
def _requires_tunnel(self, shared: dict[str, SharedToolServer]) -> bool:
|
|
387
|
+
"""`requires_tunnel` over the consumers known before any rollout: the harness
|
|
388
|
+
runtime (by config), the live `shared` servers, and the task class's tool/user
|
|
389
|
+
servers — read class-level (like `validate_pairing`) with their configs resolved
|
|
390
|
+
the way `Task.server_config` resolves them. A task that *overrides* that pairing
|
|
391
|
+
isn't statically knowable, so it conservatively counts as remote (the tunnel then
|
|
392
|
+
reaches everything; a wrongly-assumed localhost would reach nothing remote)."""
|
|
393
|
+
task_cls = generic_type(type(self.taskset), Task, origin=Taskset) or Task
|
|
394
|
+
server_classes = [*task_cls.tools, *([task_cls.user] if task_cls.user else [])]
|
|
395
|
+
if server_classes and task_cls.server_config is not Task.server_config:
|
|
396
|
+
return True
|
|
397
|
+
sole = len({*task_cls.tools} | ({task_cls.user} - {None})) == 1
|
|
398
|
+
configs = [
|
|
399
|
+
resolve_server_config(
|
|
400
|
+
task_cls.__name__, self.taskset.config.task, server_cls, sole=sole
|
|
401
|
+
)
|
|
402
|
+
for server_cls in server_classes
|
|
403
|
+
]
|
|
404
|
+
return requires_tunnel(
|
|
405
|
+
runtime_is_local(self.harness.config.runtime), configs, shared.values()
|
|
406
|
+
)
|
|
379
407
|
|
|
380
408
|
@contextlib.asynccontextmanager
|
|
381
409
|
async def shared_tools(self):
|
|
@@ -10,7 +10,7 @@ Four mechanisms, each in one place:
|
|
|
10
10
|
raises plain Python errors — it never constructs a `vf` error type; `boundary` classifies them.
|
|
11
11
|
Infra that fails raises its type at the source (`runtimes` → `SandboxError`, `clients` →
|
|
12
12
|
`ProviderError`, tunnels → `TunnelError`); an already-typed `RolloutError` passes through unchanged.
|
|
13
|
-
3. Surfacing (`
|
|
13
|
+
3. Surfacing (`session.RolloutSession.error`): a model/tool/user call fails behind the harness
|
|
14
14
|
subprocess and comes back as HTTP, so the interception server stashes the real error there and
|
|
15
15
|
the rollout re-raises it once the harness returns — not a secondary `HarnessError`.
|
|
16
16
|
4. Capture (`Rollout.run`, mirrored by the env-server): the one place that records a failure (typed
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"""The interception layer.
|
|
2
|
+
|
|
3
|
+
`server` catches a harness's model calls and proxies them to the client, multiplexing many
|
|
4
|
+
rollouts on one server keyed by their secret — and is itself the single-server
|
|
5
|
+
`Interception`. `pool` composes such servers, statically (a fixed set, e.g. bring-your-own
|
|
6
|
+
endpoints) or elastically (grown on demand). `tunnel` makes a server reachable from remote
|
|
7
|
+
consumers; `requires_tunnel` decides whether that's needed. `make_interception` picks the
|
|
8
|
+
shape from the `InterceptionConfig` type.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from collections.abc import Iterable
|
|
12
|
+
from typing import TYPE_CHECKING, Annotated
|
|
13
|
+
|
|
14
|
+
from pydantic import Field
|
|
15
|
+
from pydantic_config import BaseConfig
|
|
16
|
+
|
|
17
|
+
from verifiers.v1.interception.base import BaseInterceptionConfig, Interception, Slot
|
|
18
|
+
from verifiers.v1.interception.pool import (
|
|
19
|
+
ElasticInterceptionPool,
|
|
20
|
+
ElasticInterceptionPoolConfig,
|
|
21
|
+
StaticInterceptionPool,
|
|
22
|
+
StaticInterceptionPoolConfig,
|
|
23
|
+
)
|
|
24
|
+
from verifiers.v1.interception.server import (
|
|
25
|
+
InterceptionServer,
|
|
26
|
+
InterceptionServerConfig,
|
|
27
|
+
)
|
|
28
|
+
from verifiers.v1.runtimes import runtime_is_local
|
|
29
|
+
|
|
30
|
+
if TYPE_CHECKING:
|
|
31
|
+
from verifiers.v1.mcp import SharedToolServer
|
|
32
|
+
|
|
33
|
+
# Discriminated on `type` so the CLI selects with `--interception.type server|static|elastic`.
|
|
34
|
+
InterceptionConfig = Annotated[
|
|
35
|
+
InterceptionServerConfig
|
|
36
|
+
| StaticInterceptionPoolConfig
|
|
37
|
+
| ElasticInterceptionPoolConfig,
|
|
38
|
+
Field(discriminator="type"),
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def requires_tunnel(
|
|
43
|
+
harness_is_local: bool,
|
|
44
|
+
server_configs: Iterable[BaseConfig] = (),
|
|
45
|
+
shared: "Iterable[SharedToolServer]" = (),
|
|
46
|
+
) -> bool:
|
|
47
|
+
"""Whether the interception must be exposed via a tunnel — some consumer is off the
|
|
48
|
+
host network: the harness itself, a live `shared` server in a remote runtime, or a
|
|
49
|
+
tool/user server config placing one there (each reaches the `/state` channel from
|
|
50
|
+
its own runtime). Skipped as non-consumers: a `colocated` server (shares the
|
|
51
|
+
harness's runtime, covered by `harness_is_local`), a config-`url` server (external —
|
|
52
|
+
it connects out), and an `external` shared server (outside the state machinery
|
|
53
|
+
entirely). False means every consumer reaches the server at localhost."""
|
|
54
|
+
if not harness_is_local:
|
|
55
|
+
return True
|
|
56
|
+
if any(not s.external and not s.local for s in shared):
|
|
57
|
+
return True
|
|
58
|
+
for config in server_configs:
|
|
59
|
+
if getattr(config, "url", None) or config.colocated:
|
|
60
|
+
continue
|
|
61
|
+
if not runtime_is_local(config.runtime):
|
|
62
|
+
return True
|
|
63
|
+
return False
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def make_interception(
|
|
67
|
+
config: InterceptionConfig, *, requires_tunnel: bool
|
|
68
|
+
) -> Interception:
|
|
69
|
+
"""The interception for a config, picked by type (the host-side counterpart to
|
|
70
|
+
`make_runtime`). With `requires_tunnel` (some consumer is off the host network — see
|
|
71
|
+
the `requires_tunnel` util) each server is exposed via its configured tunnel; without
|
|
72
|
+
it they get none and are reached at localhost. The caller computes it (see
|
|
73
|
+
`Environment._requires_tunnel`)."""
|
|
74
|
+
if isinstance(config, InterceptionServerConfig):
|
|
75
|
+
return InterceptionServer(config, requires_tunnel)
|
|
76
|
+
if isinstance(config, StaticInterceptionPoolConfig):
|
|
77
|
+
return StaticInterceptionPool(config, requires_tunnel)
|
|
78
|
+
return ElasticInterceptionPool(config, requires_tunnel)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
__all__ = [
|
|
82
|
+
"Interception",
|
|
83
|
+
"Slot",
|
|
84
|
+
"make_interception",
|
|
85
|
+
"requires_tunnel",
|
|
86
|
+
"InterceptionServer",
|
|
87
|
+
"StaticInterceptionPool",
|
|
88
|
+
"ElasticInterceptionPool",
|
|
89
|
+
"BaseInterceptionConfig",
|
|
90
|
+
"InterceptionConfig",
|
|
91
|
+
"InterceptionServerConfig",
|
|
92
|
+
"StaticInterceptionPoolConfig",
|
|
93
|
+
"ElasticInterceptionPoolConfig",
|
|
94
|
+
]
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""The interception contract: hand each rollout a slot on a host interception server.
|
|
2
|
+
|
|
3
|
+
Three shapes, picked by `InterceptionConfig` type (see `make_interception`): a single
|
|
4
|
+
`InterceptionServer`, a fixed `StaticInterceptionPool`, or an on-demand
|
|
5
|
+
`ElasticInterceptionPool`. From the outside they behave the same: start/stop (or the async
|
|
6
|
+
context manager wrapping them) bound the lifecycle — one eval, one topology run, or one
|
|
7
|
+
agent `.run` — and each rollout `acquire`s a slot and frees it. An `Interception` can be
|
|
8
|
+
shared: whoever entered it owns the lifecycle; borrowers only `acquire`.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from abc import ABC, abstractmethod
|
|
14
|
+
from contextlib import AbstractAsyncContextManager, AsyncExitStack
|
|
15
|
+
from typing import TYPE_CHECKING, Self
|
|
16
|
+
|
|
17
|
+
from pydantic_config import BaseConfig
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
from verifiers.v1.session import RolloutSession
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class BaseInterceptionConfig(BaseConfig):
|
|
24
|
+
"""Base for the interception types — the discriminated union's common type. Per-type
|
|
25
|
+
fields live on the subclasses (server's `tunnel`, static's `servers`, elastic's
|
|
26
|
+
`multiplex`)."""
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# (base_url, secret): the interception server's reachable base URL for this rollout, and the
|
|
30
|
+
# bearer the harness/tool/user servers authenticate with. The harness reaches the model at
|
|
31
|
+
# `{base_url}/v1`; tool/user servers reach this rollout's shared state at `{base_url}/state`
|
|
32
|
+
# + `/task`. `base_url` is universally reachable — the interception is exposed (tunnel)
|
|
33
|
+
# whenever any consumer is remote.
|
|
34
|
+
Slot = tuple[str, str]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class Interception(ABC):
|
|
38
|
+
"""How rollouts reach the host interception server. `start` brings the servers up (or
|
|
39
|
+
arms lazy growth), `stop` tears every server (+ its tunnel) down via `stack` — LIFO,
|
|
40
|
+
even if one teardown fails; `async with` wraps the two. Each rollout `acquire`s a slot
|
|
41
|
+
and frees it on exit."""
|
|
42
|
+
|
|
43
|
+
def __init__(self) -> None:
|
|
44
|
+
self.stack = AsyncExitStack()
|
|
45
|
+
|
|
46
|
+
@abstractmethod
|
|
47
|
+
async def start(self) -> None:
|
|
48
|
+
"""Bring the interception up; resources land on `stack` so `stop` frees them."""
|
|
49
|
+
|
|
50
|
+
async def stop(self) -> None:
|
|
51
|
+
await self.stack.aclose()
|
|
52
|
+
|
|
53
|
+
async def __aenter__(self) -> Self:
|
|
54
|
+
try:
|
|
55
|
+
await self.start()
|
|
56
|
+
except BaseException:
|
|
57
|
+
# unwind whatever `start` already put on the stack
|
|
58
|
+
await self.stop()
|
|
59
|
+
raise
|
|
60
|
+
return self
|
|
61
|
+
|
|
62
|
+
async def __aexit__(self, *exc) -> None:
|
|
63
|
+
await self.stop()
|
|
64
|
+
|
|
65
|
+
@abstractmethod
|
|
66
|
+
def acquire(self, session: RolloutSession) -> AbstractAsyncContextManager[Slot]:
|
|
67
|
+
"""Register `session` on a server (bringing one up if needed) and yield its `Slot`;
|
|
68
|
+
free it on exit."""
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"""Pools of shared interception servers, so N concurrent rollouts need ~N/multiplex
|
|
2
|
+
servers + tunnels rather than one each.
|
|
3
|
+
|
|
4
|
+
Behind a remote consumer each interception server needs a tunnel, and prime tunnel creation
|
|
5
|
+
is rate-capped per API token — so one-tunnel-per-rollout caps how wide a remote eval (or env
|
|
6
|
+
server) can fan out. Each shared `InterceptionServer` multiplexes rollouts behind one
|
|
7
|
+
tunnel; the harness is unchanged, authenticating with a per-rollout secret the server routes
|
|
8
|
+
by. Two shapes: `ElasticInterceptionPool` grows servers on demand (`multiplex` rollouts
|
|
9
|
+
each, always prime tunnels — the only kind the framework can mint) and fits both the bounded
|
|
10
|
+
eval runner and the env server's unbounded request load; `StaticInterceptionPool` is a fixed
|
|
11
|
+
set of servers (each with its own tunnel choice, e.g. bring-your-own endpoints), balanced
|
|
12
|
+
least-loaded.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import asyncio
|
|
16
|
+
import logging
|
|
17
|
+
from collections.abc import AsyncIterator
|
|
18
|
+
from contextlib import asynccontextmanager
|
|
19
|
+
from typing import Literal
|
|
20
|
+
|
|
21
|
+
from pydantic import Field
|
|
22
|
+
|
|
23
|
+
from verifiers.v1.interception.base import BaseInterceptionConfig, Interception, Slot
|
|
24
|
+
from verifiers.v1.interception.server import (
|
|
25
|
+
InterceptionServer,
|
|
26
|
+
InterceptionServerConfig,
|
|
27
|
+
)
|
|
28
|
+
from verifiers.v1.interception.tunnel import PrimeTunnelConfig
|
|
29
|
+
from verifiers.v1.session import RolloutSession
|
|
30
|
+
|
|
31
|
+
logger = logging.getLogger(__name__)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class StaticInterceptionPoolConfig(BaseInterceptionConfig):
|
|
35
|
+
"""A fixed set of interception servers, each configured like a `server` type; rollouts
|
|
36
|
+
land on the least-loaded one. The shape for multiple bring-your-own endpoints (one
|
|
37
|
+
`custom` tunnel per server)."""
|
|
38
|
+
|
|
39
|
+
type: Literal["static"] = "static"
|
|
40
|
+
servers: list[InterceptionServerConfig] = Field(min_length=1)
|
|
41
|
+
"""One entry per server, each with its own `tunnel` choice."""
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class StaticInterceptionPool(Interception):
|
|
45
|
+
"""A fixed set of interception servers, all started up front; `acquire` hands a rollout
|
|
46
|
+
a slot on the least-loaded one. No capacity cap — sizing the set to the load is the
|
|
47
|
+
operator's call (it's the shape for pre-provisioned/bring-your-own endpoints)."""
|
|
48
|
+
|
|
49
|
+
def __init__(
|
|
50
|
+
self, config: StaticInterceptionPoolConfig, requires_tunnel: bool = False
|
|
51
|
+
) -> None:
|
|
52
|
+
super().__init__()
|
|
53
|
+
self.config = config
|
|
54
|
+
self.servers = [
|
|
55
|
+
InterceptionServer(server, requires_tunnel) for server in config.servers
|
|
56
|
+
]
|
|
57
|
+
|
|
58
|
+
async def start(self) -> None:
|
|
59
|
+
for server in self.servers:
|
|
60
|
+
await self.stack.enter_async_context(server)
|
|
61
|
+
|
|
62
|
+
@asynccontextmanager
|
|
63
|
+
async def acquire(self, session: RolloutSession) -> AsyncIterator[Slot]:
|
|
64
|
+
# min + register have no await between them, so concurrent acquires can't all
|
|
65
|
+
# land on the same "least-loaded" server.
|
|
66
|
+
server = min(self.servers, key=lambda s: s.load)
|
|
67
|
+
secret = server.register(session)
|
|
68
|
+
try:
|
|
69
|
+
yield server.base_url, secret
|
|
70
|
+
finally:
|
|
71
|
+
server.unregister(secret)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class ElasticInterceptionPoolConfig(BaseInterceptionConfig):
|
|
75
|
+
"""Interception servers grown on demand: `multiplex` rollouts share one server (and,
|
|
76
|
+
behind a remote consumer, one prime tunnel). The default."""
|
|
77
|
+
|
|
78
|
+
type: Literal["elastic"] = "elastic"
|
|
79
|
+
multiplex: int = Field(32, ge=1)
|
|
80
|
+
"""Rollouts that share one interception server (and tunnel). N concurrent rollouts use
|
|
81
|
+
~N/multiplex servers + tunnels instead of one each — key past the per-token tunnel cap.
|
|
82
|
+
1 = a server (+ tunnel) per rollout."""
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class ElasticInterceptionPool(Interception):
|
|
86
|
+
"""Interception servers grown on demand: `multiplex` rollouts share one server (one
|
|
87
|
+
prime tunnel behind a remote consumer); `acquire` hands a rollout a slot on one,
|
|
88
|
+
bringing up a new server when all are at capacity."""
|
|
89
|
+
|
|
90
|
+
def __init__(
|
|
91
|
+
self,
|
|
92
|
+
config: ElasticInterceptionPoolConfig | None = None,
|
|
93
|
+
requires_tunnel: bool = False,
|
|
94
|
+
) -> None:
|
|
95
|
+
super().__init__()
|
|
96
|
+
self.config = config or ElasticInterceptionPoolConfig()
|
|
97
|
+
self.requires_tunnel = requires_tunnel
|
|
98
|
+
self.servers: list[InterceptionServer] = []
|
|
99
|
+
self._lock = asyncio.Lock()
|
|
100
|
+
|
|
101
|
+
async def start(self) -> None:
|
|
102
|
+
pass # servers are brought up lazily in `acquire`, on `stack`
|
|
103
|
+
|
|
104
|
+
async def _server(self) -> InterceptionServer:
|
|
105
|
+
"""A server with spare capacity — reuse one under `multiplex`, else bring up a new
|
|
106
|
+
one (its own tunnel, on `stack`, torn down with the pool). The caller holds
|
|
107
|
+
`_lock`."""
|
|
108
|
+
for server in self.servers:
|
|
109
|
+
if server.load < self.config.multiplex:
|
|
110
|
+
return server
|
|
111
|
+
# Pin prime explicitly — the only tunnel kind that can be minted on demand.
|
|
112
|
+
server = InterceptionServer(
|
|
113
|
+
InterceptionServerConfig(tunnel=PrimeTunnelConfig()), self.requires_tunnel
|
|
114
|
+
)
|
|
115
|
+
await self.stack.enter_async_context(server)
|
|
116
|
+
self.servers.append(server)
|
|
117
|
+
logger.info(
|
|
118
|
+
"interception pool: %d server(s), multiplex=%d",
|
|
119
|
+
len(self.servers),
|
|
120
|
+
self.config.multiplex,
|
|
121
|
+
)
|
|
122
|
+
return server
|
|
123
|
+
|
|
124
|
+
@asynccontextmanager
|
|
125
|
+
async def acquire(self, session: RolloutSession) -> AsyncIterator[Slot]:
|
|
126
|
+
# Register under the lock so concurrent acquires see each other's load.
|
|
127
|
+
async with self._lock:
|
|
128
|
+
server = await self._server()
|
|
129
|
+
secret = server.register(session)
|
|
130
|
+
try:
|
|
131
|
+
yield server.base_url, secret
|
|
132
|
+
finally:
|
|
133
|
+
server.unregister(secret)
|