verifiers 0.2.1.dev20__tar.gz → 0.2.1.dev22__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.dev20 → verifiers-0.2.1.dev22}/PKG-INFO +1 -1
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/test_color_codeword_tasks.py +3 -3
- verifiers-0.2.1.dev22/tests/v1/test_taskset.py +71 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/debug.py +1 -2
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/eval/runner.py +16 -3
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/gepa.py +1 -1
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/validate.py +1 -2
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/configs/debug.py +1 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/configs/eval.py +1 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/configs/validate.py +1 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/env.py +51 -23
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/errors.py +1 -1
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/gepa/config.py +1 -1
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/gepa/dataset.py +8 -12
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/gepa/runner.py +2 -4
- verifiers-0.2.1.dev22/verifiers/v1/interception/__init__.py +94 -0
- verifiers-0.2.1.dev22/verifiers/v1/interception/base.py +68 -0
- verifiers-0.2.1.dev22/verifiers/v1/interception/pool.py +133 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/interception/server.py +76 -98
- verifiers-0.2.1.dev22/verifiers/v1/interception/tunnel/__init__.py +40 -0
- verifiers-0.2.1.dev22/verifiers/v1/interception/tunnel/base.py +50 -0
- verifiers-0.2.1.dev22/verifiers/v1/interception/tunnel/custom.py +42 -0
- verifiers-0.2.1.dev22/verifiers/v1/interception/tunnel/prime.py +56 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/legacy.py +1 -1
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/mcp/launch.py +56 -41
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/rollout.py +38 -37
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/runtimes/__init__.py +1 -8
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/runtimes/base.py +4 -96
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/runtimes/limiters.py +0 -7
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/runtimes/modal.py +2 -2
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/runtimes/prime.py +2 -2
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/serve/pool.py +1 -1
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/serve/server.py +42 -10
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/serve/types.py +5 -4
- verifiers-0.2.1.dev22/verifiers/v1/session.py +100 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/taskset.py +46 -4
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/tasksets/textarena/taskset.py +7 -6
- verifiers-0.2.1.dev22/verifiers/v1/utils/sampling.py +25 -0
- verifiers-0.2.1.dev20/verifiers/v1/interception/__init__.py +0 -16
- verifiers-0.2.1.dev20/verifiers/v1/interception/pool.py +0 -94
- verifiers-0.2.1.dev20/verifiers/v1/utils/sampling.py +0 -26
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/.gitignore +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/LICENSE +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/README.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/pyproject.toml +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/AGENTS.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/conftest.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_build_script.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_client_config.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_env_group.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_env_server.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_environment.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_envs.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_imports.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_init_script.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_logging.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_parser.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_rubric.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_types.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_wordle_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/conftest.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/test_configs.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/test_envs.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/test_graph.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/test_judges.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/tests/v1/test_trace.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/decorators.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/errors.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/types.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/configs/replay.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/episode.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/graph.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harness.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/default/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/default/harness.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/default/program.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/judge.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/push.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/retries.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/runtimes/docker.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/state.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/task.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/trace.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/types.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev22}/verifiers/v1/utils/memory.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.dev22
|
|
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
|
|
@@ -10,9 +10,9 @@ def test_color_images_are_rendered_once(monkeypatch) -> None:
|
|
|
10
10
|
return render(color, size)
|
|
11
11
|
|
|
12
12
|
monkeypatch.setattr(taskset, "color_data_url", counted)
|
|
13
|
-
tasks = taskset.ColorCodewordTaskset(
|
|
14
|
-
|
|
15
|
-
)
|
|
13
|
+
tasks = taskset.ColorCodewordTaskset(taskset.ColorCodewordConfig()).select(
|
|
14
|
+
num_tasks=100
|
|
15
|
+
)
|
|
16
16
|
|
|
17
17
|
assert len(tasks) == 100
|
|
18
18
|
assert calls == list(taskset.COLOR_MAP)
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""`Taskset.select` over list, generator, and `INFINITE` `load` implementations."""
|
|
2
|
+
|
|
3
|
+
import itertools
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
import verifiers.v1 as vf
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class CountTask(vf.Task[vf.TaskData]):
|
|
11
|
+
pass
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class InfiniteTaskset(vf.Taskset[CountTask, vf.TasksetConfig]):
|
|
15
|
+
INFINITE = True
|
|
16
|
+
|
|
17
|
+
def load(self):
|
|
18
|
+
for i in itertools.count():
|
|
19
|
+
yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class FiniteTaskset(vf.Taskset[CountTask, vf.TasksetConfig]):
|
|
23
|
+
def load(self):
|
|
24
|
+
for i in range(10):
|
|
25
|
+
yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def idxs(tasks: list[CountTask]) -> list[int]:
|
|
29
|
+
return [task.data.idx for task in tasks]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def test_select_bounds_an_infinite_taskset() -> None:
|
|
33
|
+
tasks = InfiniteTaskset(vf.TasksetConfig()).select(num_tasks=5)
|
|
34
|
+
assert idxs(tasks) == [0, 1, 2, 3, 4]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def test_select_infinite_requires_num_tasks() -> None:
|
|
38
|
+
with pytest.raises(ValueError, match="infinite"):
|
|
39
|
+
InfiniteTaskset(vf.TasksetConfig()).select()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def test_select_infinite_ignores_shuffle() -> None:
|
|
43
|
+
tasks = InfiniteTaskset(vf.TasksetConfig()).select(num_tasks=3, shuffle=True)
|
|
44
|
+
assert idxs(tasks) == [0, 1, 2]
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def test_select_finite() -> None:
|
|
48
|
+
taskset = FiniteTaskset(vf.TasksetConfig())
|
|
49
|
+
assert len(taskset.select()) == 10
|
|
50
|
+
assert idxs(taskset.select(num_tasks=4)) == [0, 1, 2, 3]
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def test_select_shuffle_samples_the_whole_taskset_reproducibly() -> None:
|
|
54
|
+
taskset = FiniteTaskset(vf.TasksetConfig())
|
|
55
|
+
first = idxs(taskset.select(num_tasks=5, shuffle=True))
|
|
56
|
+
assert first == idxs(taskset.select(num_tasks=5, shuffle=True))
|
|
57
|
+
assert len(first) == 5 and set(first) <= set(range(10))
|
|
58
|
+
assert first != [0, 1, 2, 3, 4] # sampled from the whole set, not the head
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def test_select_only_builds_what_the_run_takes() -> None:
|
|
62
|
+
built: list[int] = []
|
|
63
|
+
|
|
64
|
+
class RecordingTaskset(InfiniteTaskset):
|
|
65
|
+
def load(self):
|
|
66
|
+
for i in itertools.count():
|
|
67
|
+
built.append(i)
|
|
68
|
+
yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
|
|
69
|
+
|
|
70
|
+
RecordingTaskset(vf.TasksetConfig()).select(num_tasks=3)
|
|
71
|
+
assert built == [0, 1, 2]
|
|
@@ -30,7 +30,6 @@ from verifiers.v1.task import Task
|
|
|
30
30
|
from verifiers.v1.trace import Error, Trace, TraceTask
|
|
31
31
|
from verifiers.v1.utils.interrupt import install_interrupt
|
|
32
32
|
from verifiers.v1.utils.logging import setup_logging
|
|
33
|
-
from verifiers.v1.utils.sampling import sample
|
|
34
33
|
|
|
35
34
|
logger = logging.getLogger(__name__)
|
|
36
35
|
|
|
@@ -274,7 +273,7 @@ async def debug_task(task: Task, config: DebugConfig) -> tuple[Trace, bool]:
|
|
|
274
273
|
|
|
275
274
|
async def run_debug(config: DebugConfig) -> list[Trace]:
|
|
276
275
|
taskset = vf.load_taskset(config.taskset)
|
|
277
|
-
tasks =
|
|
276
|
+
tasks = taskset.select(config.num_tasks, config.shuffle)
|
|
278
277
|
if isinstance(config.runtime, vf.SubprocessConfig) and any(
|
|
279
278
|
type(t).NEEDS_CONTAINER or t.data.image for t in tasks
|
|
280
279
|
):
|
|
@@ -21,7 +21,7 @@ logger = logging.getLogger(__name__)
|
|
|
21
21
|
async def run_eval(env: Environment, config: EvalConfig) -> list[Trace]:
|
|
22
22
|
logger.info("eval config:\n%s", config.model_dump_json(indent=2))
|
|
23
23
|
client = resolve_client(config.client)
|
|
24
|
-
tasks =
|
|
24
|
+
tasks = env.taskset.select(config.num_tasks, config.shuffle)
|
|
25
25
|
ctx = ModelContext(client=client, model=config.model, sampling=config.sampling)
|
|
26
26
|
# One episode of `num_rollouts` rollouts per task; the shared semaphore bounds total
|
|
27
27
|
# concurrent rollouts (across episodes), so group rewards still see their whole episode.
|
|
@@ -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():
|
|
@@ -162,7 +162,20 @@ async def run_eval_server(config: EvalConfig) -> list[Trace]:
|
|
|
162
162
|
await client.wait_for_server_startup(timeout=600)
|
|
163
163
|
info = await client.info()
|
|
164
164
|
group_scored = info.requires_group_scoring
|
|
165
|
-
|
|
165
|
+
if info.num_tasks is None: # infinite taskset - the run must be bounded
|
|
166
|
+
if config.num_tasks is None:
|
|
167
|
+
raise ValueError(
|
|
168
|
+
f"{config.env_id} is infinite - bound the run with -n/--num-tasks"
|
|
169
|
+
)
|
|
170
|
+
if config.shuffle:
|
|
171
|
+
logger.warning(
|
|
172
|
+
"shuffle is a no-op on an infinite taskset - "
|
|
173
|
+
"taking the first %d generated tasks",
|
|
174
|
+
config.num_tasks,
|
|
175
|
+
)
|
|
176
|
+
idxs = list(range(config.num_tasks))
|
|
177
|
+
else:
|
|
178
|
+
idxs = sample(list(range(info.num_tasks)), config.shuffle, config.num_tasks)
|
|
166
179
|
out = output_path(config)
|
|
167
180
|
finished: list[Trace] = []
|
|
168
181
|
if config.resume is not None:
|
|
@@ -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
|
|
|
@@ -26,7 +26,6 @@ from verifiers.v1.task import Task
|
|
|
26
26
|
from verifiers.v1.trace import Trace, TraceTask
|
|
27
27
|
from verifiers.v1.utils.interrupt import install_interrupt
|
|
28
28
|
from verifiers.v1.utils.logging import setup_logging
|
|
29
|
-
from verifiers.v1.utils.sampling import sample
|
|
30
29
|
|
|
31
30
|
logger = logging.getLogger(__name__)
|
|
32
31
|
|
|
@@ -198,7 +197,7 @@ async def _validate_task(task: Task, config: ValidateConfig) -> ResultRow:
|
|
|
198
197
|
|
|
199
198
|
async def run_validate(config: ValidateConfig) -> list[dict]:
|
|
200
199
|
taskset = vf.load_taskset(config.taskset)
|
|
201
|
-
tasks =
|
|
200
|
+
tasks = taskset.select(config.num_tasks, config.shuffle)
|
|
202
201
|
if isinstance(config.runtime, vf.SubprocessConfig) and any(
|
|
203
202
|
type(t).NEEDS_CONTAINER or t.data.image for t in tasks
|
|
204
203
|
):
|
|
@@ -22,6 +22,7 @@ class EvalConfig(EnvServerConfig):
|
|
|
22
22
|
sampling: SamplingConfig = SamplingConfig()
|
|
23
23
|
num_tasks: int | None = Field(
|
|
24
24
|
None,
|
|
25
|
+
ge=1,
|
|
25
26
|
validation_alias=AliasChoices("batch_size", "num_examples", "num_tasks", "n"),
|
|
26
27
|
)
|
|
27
28
|
"""How many tasks to evaluate (None = all)."""
|
|
@@ -26,6 +26,7 @@ class ValidateConfig(BaseConfig):
|
|
|
26
26
|
"""Run only `Task.setup` and `Task.validate`."""
|
|
27
27
|
num_tasks: int | None = Field(
|
|
28
28
|
None,
|
|
29
|
+
ge=1,
|
|
29
30
|
validation_alias=AliasChoices("num_tasks", "n", "num_examples", "batch_size"),
|
|
30
31
|
)
|
|
31
32
|
"""How many tasks to validate (None = all)."""
|
|
@@ -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
|
|
@@ -42,7 +42,7 @@ class GEPAConfig(EnvConfig):
|
|
|
42
42
|
"""Tasks held out to score each candidate system prompt for the pareto frontier."""
|
|
43
43
|
shuffle: bool = Field(True, validation_alias=AliasChoices("shuffle", "s"))
|
|
44
44
|
"""Shuffle tasks before splitting into train/val — v1 tasksets have no generic train/val
|
|
45
|
-
split, so GEPA carves one out of `
|
|
45
|
+
split, so GEPA carves one out of `Taskset.select` the way `run_eval` samples (fixed
|
|
46
46
|
seed, so the split is reproducible across runs)."""
|
|
47
47
|
seed: int = 0
|
|
48
48
|
"""Seed for GEPA's optimizer (candidate selection / minibatch sampling). Task shuffling
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
"""Train/val split and upfront validation for a GEPA run.
|
|
2
2
|
|
|
3
3
|
v1 tasksets have no generic train/val split concept (`TasksetConfig` has no `split` field;
|
|
4
|
-
individual tasksets define ad hoc ones inconsistently), so GEPA carves one out of
|
|
5
|
-
`
|
|
6
|
-
|
|
4
|
+
individual tasksets define ad hoc ones inconsistently), so GEPA carves one out of the tasks
|
|
5
|
+
`Taskset.select` hands it (the shared fixed-seed shuffle, reproducible across runs like every
|
|
6
|
+
other entrypoint): two disjoint slices.
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
9
|
from verifiers.v1.decorators import discover_decorated
|
|
10
10
|
from verifiers.v1.task import Task
|
|
11
|
-
from verifiers.v1.utils.sampling import sample
|
|
12
11
|
|
|
13
12
|
|
|
14
13
|
def reject_group_reward_tasksets(tasks: list[Task]) -> None:
|
|
@@ -26,19 +25,16 @@ def reject_group_reward_tasksets(tasks: list[Task]) -> None:
|
|
|
26
25
|
|
|
27
26
|
|
|
28
27
|
def split_tasks(
|
|
29
|
-
tasks: list[Task], num_train: int, num_val: int
|
|
28
|
+
tasks: list[Task], num_train: int, num_val: int
|
|
30
29
|
) -> tuple[list[Task], list[Task]]:
|
|
31
|
-
"""The
|
|
30
|
+
"""The selected tasks, split into disjoint `(train, val)` slices (`train` feeds reflection
|
|
32
31
|
minibatches; `val` scores each candidate for the pareto frontier)."""
|
|
33
|
-
|
|
34
|
-
tasks, shuffle
|
|
35
|
-
) # shared fixed-seed shuffle; GEPA does its own slicing below
|
|
36
|
-
if num_train + num_val > len(pool):
|
|
32
|
+
if num_train + num_val > len(tasks):
|
|
37
33
|
raise ValueError(
|
|
38
34
|
f"requested {num_train} train + {num_val} val tasks, but the taskset only "
|
|
39
|
-
f"loaded {len(
|
|
35
|
+
f"loaded {len(tasks)}"
|
|
40
36
|
)
|
|
41
|
-
return
|
|
37
|
+
return tasks[:num_train], tasks[num_train : num_train + num_val]
|
|
42
38
|
|
|
43
39
|
|
|
44
40
|
def resolve_gepa_seed_prompt(tasks: list[Task], initial_prompt: str | None) -> str:
|
|
@@ -38,10 +38,8 @@ class _GEPALog:
|
|
|
38
38
|
|
|
39
39
|
def run_gepa(env: Environment, config: GEPAConfig) -> GEPAResult:
|
|
40
40
|
logger.info("gepa config:\n%s", config.model_dump_json(indent=2))
|
|
41
|
-
all_tasks = env.taskset.
|
|
42
|
-
train_tasks, val_tasks = split_tasks(
|
|
43
|
-
all_tasks, config.num_train, config.num_val, config.shuffle
|
|
44
|
-
)
|
|
41
|
+
all_tasks = env.taskset.select(config.num_train + config.num_val, config.shuffle)
|
|
42
|
+
train_tasks, val_tasks = split_tasks(all_tasks, config.num_train, config.num_val)
|
|
45
43
|
selected_tasks = [*train_tasks, *val_tasks]
|
|
46
44
|
reject_group_reward_tasksets(
|
|
47
45
|
selected_tasks
|
|
@@ -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."""
|