verifiers 0.2.2.dev15__tar.gz → 0.2.2.dev17__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/PKG-INFO +1 -1
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/test_configs.py +1 -1
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/agent.py +32 -5
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/cli/dashboard/eval.py +2 -4
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/cli/debug.py +1 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/cli/eval/resume.py +61 -28
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/cli/eval/runner.py +62 -46
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/cli/gepa.py +1 -1
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/cli/output.py +2 -2
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/configs/env.py +2 -4
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/env.py +10 -13
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/interception/__init__.py +6 -11
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/interception/server.py +5 -8
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/interception/tunnel/base.py +4 -7
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/legacy.py +13 -2
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/loaders.py +3 -5
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/mcp/launch.py +36 -8
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/push.py +1 -3
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/rollout.py +4 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/runtimes/__init__.py +2 -3
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/runtimes/base.py +20 -10
- verifiers-0.2.2.dev17/verifiers/v1/runtimes/docker/__init__.py +418 -0
- verifiers-0.2.2.dev17/verifiers/v1/runtimes/docker/egress.py +364 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/serve/client.py +16 -4
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/serve/server.py +31 -33
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/serve/types.py +18 -3
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/task.py +7 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/taskset.py +6 -1
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/tasksets/harbor/taskset.py +14 -2
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/utils/compile.py +28 -4
- verifiers-0.2.2.dev15/verifiers/v1/runtimes/docker.py +0 -211
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/.gitignore +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/LICENSE +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/README.md +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/pyproject.toml +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/conftest.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_build_script.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_client_config.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_env_group.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_env_server.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_environment.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_imports.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_init_script.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_logging.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_parser.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_rubric.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_types.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/conftest.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/fixtures/duet_v1.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/test_envs.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/test_graph.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/test_judges.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/test_taskset.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/tests/v1/test_trace.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/decorators.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/errors.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/types.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/configs/debug.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/configs/replay.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/envs/agentic_judge/env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/episode.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/errors.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/graph.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harness.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/bash/program.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/pool/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/pool/harness.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/judge.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/retries.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/session.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/state.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/trace.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/types.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/utils/sampling.py +0 -0
- {verifiers-0.2.2.dev15 → verifiers-0.2.2.dev17}/verifiers/v1/utils/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.2.2.
|
|
3
|
+
Version: 0.2.2.dev17
|
|
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
|
|
@@ -24,4 +24,4 @@ CONFIGS = sorted(
|
|
|
24
24
|
def test_eval_config_parses(path: Path) -> None:
|
|
25
25
|
config = EvalConfig.model_validate(tomllib.load(path.open("rb")))
|
|
26
26
|
# resolved to a v1 taskset or a v0 env id
|
|
27
|
-
assert
|
|
27
|
+
assert config.env.taskset.id or config.id
|
|
@@ -26,6 +26,7 @@ from verifiers.v1.mcp import SharedToolServer
|
|
|
26
26
|
from verifiers.v1.retries import RetryConfig, backoff, trace_should_retry
|
|
27
27
|
from verifiers.v1.rollout import RolloutRun
|
|
28
28
|
from verifiers.v1.runtimes import (
|
|
29
|
+
DockerConfig,
|
|
29
30
|
Runtime,
|
|
30
31
|
RuntimeConfig,
|
|
31
32
|
SubprocessConfig,
|
|
@@ -93,11 +94,37 @@ class AgentConfig(BaseConfig):
|
|
|
93
94
|
return data
|
|
94
95
|
|
|
95
96
|
|
|
96
|
-
def _check_borrowed_placement(
|
|
97
|
+
def _check_borrowed_placement(
|
|
98
|
+
task: Task, runtime: Runtime, base_config: RuntimeConfig
|
|
99
|
+
) -> None:
|
|
97
100
|
"""A borrowed box is never re-provisioned, so a task's placement fields can't
|
|
98
|
-
be honored.
|
|
99
|
-
|
|
100
|
-
|
|
101
|
+
be honored. Reject requirements that cannot be applied to the running box; an
|
|
102
|
+
image mismatch on a container only warns, since sharing its world is the point."""
|
|
103
|
+
task_policy = "*" not in task.data.network_allow or bool(task.data.network_block)
|
|
104
|
+
base_docker = base_config if isinstance(base_config, DockerConfig) else None
|
|
105
|
+
if task_policy or (base_docker is not None and base_docker.network_isolated):
|
|
106
|
+
config = runtime.config
|
|
107
|
+
if not isinstance(config, DockerConfig):
|
|
108
|
+
raise ValueError(
|
|
109
|
+
f"task {task.data.idx!r} requires a Docker URL network policy, but "
|
|
110
|
+
f"borrowed runtime {runtime.name!r} is not Docker-backed; use "
|
|
111
|
+
"agent.provision(task)"
|
|
112
|
+
)
|
|
113
|
+
policy_base = (
|
|
114
|
+
base_docker if base_docker is not None else DockerConfig(allow=["*"])
|
|
115
|
+
)
|
|
116
|
+
expected = resolve_runtime_config(policy_base, task)
|
|
117
|
+
assert isinstance(expected, DockerConfig)
|
|
118
|
+
# Do not inherit extra destinations from a box provisioned for another task.
|
|
119
|
+
if set(config.allow) != set(expected.allow) or set(config.block) != set(
|
|
120
|
+
expected.block
|
|
121
|
+
):
|
|
122
|
+
raise ValueError(
|
|
123
|
+
f"task {task.data.idx!r} requires allow={expected.allow!r} and "
|
|
124
|
+
f"block={expected.block!r}, but borrowed runtime {runtime.name!r} "
|
|
125
|
+
f"has allow={config.allow!r} and block={config.block!r}; use "
|
|
126
|
+
"agent.provision(task)"
|
|
127
|
+
)
|
|
101
128
|
if task.data.image is None:
|
|
102
129
|
return
|
|
103
130
|
if isinstance(runtime.config, SubprocessConfig):
|
|
@@ -299,7 +326,7 @@ class Agent:
|
|
|
299
326
|
) -> dict:
|
|
300
327
|
"""Resolve one run's runtime config, pairing checks, timeouts, interception."""
|
|
301
328
|
if runtime is not None:
|
|
302
|
-
_check_borrowed_placement(task, runtime)
|
|
329
|
+
_check_borrowed_placement(task, runtime, self.runtime_config)
|
|
303
330
|
runtime_config = runtime.config
|
|
304
331
|
run_is_local = runtime.is_local
|
|
305
332
|
else:
|
|
@@ -232,7 +232,7 @@ def Overview(config: EvalConfig) -> Table:
|
|
|
232
232
|
grid.add_column()
|
|
233
233
|
seats = config.env.agent_harnesses()
|
|
234
234
|
taskset = config.env.taskset
|
|
235
|
-
env_label = taskset.name if taskset
|
|
235
|
+
env_label = taskset.name if taskset.id else "no taskset"
|
|
236
236
|
if config.env.id:
|
|
237
237
|
env_label = f"{env_name(config.env.id)}+{env_label}"
|
|
238
238
|
# One seat story when every seat resolves the same way (the common case); one
|
|
@@ -254,9 +254,7 @@ def Overview(config: EvalConfig) -> Table:
|
|
|
254
254
|
# value (or our `[...]`/`{...}` delimiters) can carry Rich markup that would otherwise be
|
|
255
255
|
# parsed as styling and dropped. `id` is in the `env` row; harness `runtime.type` too (hidden
|
|
256
256
|
# here), but only for the harness — `taskset.task.tools.runtime.type` has no other display.
|
|
257
|
-
if
|
|
258
|
-
taskset_over := overrides(taskset, skip=frozenset({"id"}))
|
|
259
|
-
):
|
|
257
|
+
if taskset_over := overrides(taskset, skip=frozenset({"id"})):
|
|
260
258
|
grid.add_row("taskset", escape(" · ".join(taskset_over)))
|
|
261
259
|
for role, h in seats.items():
|
|
262
260
|
if harness_over := overrides(h, skip=frozenset({"id", "runtime.type"})):
|
|
@@ -230,6 +230,7 @@ async def debug_task(task: Task, config: DebugConfig) -> tuple[Trace, bool]:
|
|
|
230
230
|
invoke(task.setup, {"trace": trace, "runtime": runtime}),
|
|
231
231
|
setup_timeout,
|
|
232
232
|
)
|
|
233
|
+
await runtime.prepare_execution([])
|
|
233
234
|
trace.timing.setup.end = time.time()
|
|
234
235
|
|
|
235
236
|
trace.timing.generation.start = time.time()
|
|
@@ -4,13 +4,20 @@
|
|
|
4
4
|
flags) and writes back into the same dir. `load` keeps the good saved rollouts and
|
|
5
5
|
re-runs what's owed: missing rollouts (never written) and errored ones (dropped and
|
|
6
6
|
redone).
|
|
7
|
+
|
|
8
|
+
A saved rollout is matched to a selected task by content: `task_key` hashes the
|
|
9
|
+
task's wire data. Tasks with identical data are interchangeable, a task whose data
|
|
10
|
+
changed since the interrupted run re-runs, and nothing depends on `data.idx`. The
|
|
11
|
+
legacy (v0) bridge still matches by row index (`key_of`).
|
|
7
12
|
"""
|
|
8
13
|
|
|
14
|
+
import hashlib
|
|
9
15
|
import json
|
|
10
16
|
import tomllib
|
|
11
|
-
from collections import defaultdict
|
|
12
|
-
from collections.abc import Callable
|
|
17
|
+
from collections import Counter, defaultdict
|
|
18
|
+
from collections.abc import Callable, Hashable, Mapping
|
|
13
19
|
from pathlib import Path
|
|
20
|
+
from typing import TypeVar
|
|
14
21
|
|
|
15
22
|
from pydantic_core import from_json
|
|
16
23
|
|
|
@@ -19,6 +26,30 @@ from verifiers.v1.configs.eval import EvalConfig
|
|
|
19
26
|
from verifiers.v1.episode import Episode, WireEpisode
|
|
20
27
|
from verifiers.v1.trace import WireTrace
|
|
21
28
|
|
|
29
|
+
K = TypeVar("K", bound=Hashable)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def task_key(data: Mapping) -> str:
|
|
33
|
+
"""Content identity of one task's wire data — an `exclude_none` dump, the shape
|
|
34
|
+
saved rows already have on disk. `sort_keys` so field order can't split identity."""
|
|
35
|
+
return hashlib.sha256(json.dumps(data, sort_keys=True).encode()).hexdigest()
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def distribute(
|
|
39
|
+
selected_keys: list[K], owed: dict[K, int], num_rollouts: int
|
|
40
|
+
) -> list[int]:
|
|
41
|
+
"""Spread each key's owed rollouts over its selection instances, in order —
|
|
42
|
+
content-identical tasks are interchangeable, so any instance can absorb the
|
|
43
|
+
debt (capped at `num_rollouts` each). Returns one count per selection."""
|
|
44
|
+
remaining = dict(owed)
|
|
45
|
+
counts: list[int] = []
|
|
46
|
+
for key in selected_keys:
|
|
47
|
+
take = min(num_rollouts, remaining.get(key, 0))
|
|
48
|
+
if take:
|
|
49
|
+
remaining[key] -= take
|
|
50
|
+
counts.append(take)
|
|
51
|
+
return counts
|
|
52
|
+
|
|
22
53
|
|
|
23
54
|
def split_resume(argv: list[str]) -> tuple[Path | None, list[str]]:
|
|
24
55
|
"""Pull `--resume <dir>` / `--resume=<dir>` out of argv, returning (dir, the other args).
|
|
@@ -51,25 +82,27 @@ def load_resume_config(resume_dir: Path) -> EvalConfig:
|
|
|
51
82
|
|
|
52
83
|
def load(
|
|
53
84
|
resume_dir: Path,
|
|
54
|
-
|
|
85
|
+
selected_keys: list[K],
|
|
55
86
|
num_rollouts: int,
|
|
56
87
|
complete: Callable[[Episode], bool] | None = None,
|
|
57
88
|
*,
|
|
58
89
|
whole_task: bool = False,
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
kept
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
rows via a temp file + atomic rename
|
|
69
|
-
|
|
70
|
-
bare trace per line) load each trace as a single-trace episode."""
|
|
90
|
+
key_of: Callable[[Mapping], K] | None = None,
|
|
91
|
+
) -> tuple[list[Episode], dict[K, int]]:
|
|
92
|
+
"""Load the good saved rollouts and diff them against the run's target: returns
|
|
93
|
+
(kept episodes, rollouts owed per task key). `selected_keys` is one key per
|
|
94
|
+
selected task (duplicates allowed — a key selected k times is owed up to
|
|
95
|
+
`k * num_rollouts`; spread back over the tasks with `distribute`). `key_of` maps
|
|
96
|
+
a saved row's task data to its key (default `task_key`; the legacy bridge uses
|
|
97
|
+
row indices). `complete` is the keep-verdict (default `episode.ok`); `whole_task`
|
|
98
|
+
redoes a partially-kept task whole (legacy group scoring). Rewrites
|
|
99
|
+
`traces.jsonl` to the kept rows via a temp file + atomic rename; a torn or
|
|
100
|
+
malformed row is owed again, never a crash."""
|
|
71
101
|
path = resume_dir / TRACES_FILE
|
|
72
|
-
|
|
102
|
+
targets = {
|
|
103
|
+
key: count * num_rollouts for key, count in Counter(selected_keys).items()
|
|
104
|
+
}
|
|
105
|
+
keyed = key_of if key_of is not None else task_key
|
|
73
106
|
|
|
74
107
|
def parse(row: dict) -> Episode:
|
|
75
108
|
if sniff_episode(row):
|
|
@@ -77,7 +110,7 @@ def load(
|
|
|
77
110
|
return Episode.of(WireTrace.model_validate(row))
|
|
78
111
|
|
|
79
112
|
verdict = complete if complete is not None else (lambda episode: episode.ok)
|
|
80
|
-
good: dict[
|
|
113
|
+
good: dict[K, list[tuple[bytes, Episode]]] = defaultdict(list)
|
|
81
114
|
if path.exists():
|
|
82
115
|
with path.open("rb") as results:
|
|
83
116
|
for line in results:
|
|
@@ -89,16 +122,16 @@ def load(
|
|
|
89
122
|
except ValueError:
|
|
90
123
|
row = json.loads(line)
|
|
91
124
|
# The task rides each trace; a traceless record (a failure
|
|
92
|
-
# before any trace minted) has no
|
|
125
|
+
# before any trace minted) has no task and is owed again.
|
|
93
126
|
if sniff_episode(row):
|
|
94
|
-
|
|
127
|
+
key = keyed(row["traces"][0]["task"]["data"])
|
|
95
128
|
else:
|
|
96
|
-
|
|
129
|
+
key = keyed(row["task"]["data"])
|
|
97
130
|
except (ValueError, KeyError, IndexError, TypeError):
|
|
98
131
|
# A torn final line (the run died mid-write) or a foreign shape
|
|
99
132
|
# is not a keepable rollout — it's owed again, never a crash.
|
|
100
133
|
continue
|
|
101
|
-
if
|
|
134
|
+
if key not in targets or len(good[key]) >= targets[key]:
|
|
102
135
|
continue
|
|
103
136
|
try:
|
|
104
137
|
episode = parse(row)
|
|
@@ -106,20 +139,20 @@ def load(
|
|
|
106
139
|
continue
|
|
107
140
|
except Exception: # malformed row: redo it
|
|
108
141
|
continue
|
|
109
|
-
good[
|
|
142
|
+
good[key].append(
|
|
110
143
|
(line if line.endswith(b"\n") else line + b"\n", episode)
|
|
111
144
|
)
|
|
112
145
|
keep: list[bytes] = []
|
|
113
146
|
episodes: list[Episode] = []
|
|
114
|
-
owed: dict[
|
|
115
|
-
for
|
|
116
|
-
rows = good.get(
|
|
117
|
-
if whole_task and len(rows) <
|
|
147
|
+
owed: dict[K, int] = {}
|
|
148
|
+
for key, target in targets.items():
|
|
149
|
+
rows = good.get(key, [])
|
|
150
|
+
if whole_task and len(rows) < target:
|
|
118
151
|
rows = [] # a partial unit redoes whole — its kept rows are dropped
|
|
119
152
|
keep.extend(line for line, _ in rows)
|
|
120
153
|
episodes.extend(episode for _, episode in rows)
|
|
121
|
-
if missing :=
|
|
122
|
-
owed[
|
|
154
|
+
if missing := target - len(rows):
|
|
155
|
+
owed[key] = missing
|
|
123
156
|
tmp = path.with_suffix(".jsonl.tmp")
|
|
124
157
|
tmp.write_bytes(b"".join(keep))
|
|
125
158
|
tmp.replace(path)
|
|
@@ -32,21 +32,25 @@ async def run_eval(env: Env, config: EvalConfig) -> list[Episode]:
|
|
|
32
32
|
asyncio.Semaphore(config.max_concurrent) if config.max_concurrent else None
|
|
33
33
|
)
|
|
34
34
|
out = output_path(config)
|
|
35
|
-
|
|
35
|
+
# One (task, rollouts-to-run) pair per selected task; resume shrinks the counts.
|
|
36
|
+
plan = [(task, config.num_rollouts) for task in tasks]
|
|
36
37
|
# Kept on-disk rollouts rejoin the run as finished episodes; only owed ones re-run.
|
|
37
38
|
finished: list[Episode] = []
|
|
38
39
|
if config.resume is not None:
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
keys = [
|
|
41
|
+
resume.task_key(t.data.model_dump(mode="json", exclude_none=True))
|
|
42
|
+
for t in tasks
|
|
43
|
+
]
|
|
44
|
+
finished, owed = resume.load(out, keys, config.num_rollouts, env.complete)
|
|
42
45
|
if not owed: # already complete - report it and exit successfully
|
|
43
46
|
print(resume.nothing_to_resume_msg(out, len(tasks), config.num_rollouts))
|
|
44
47
|
raise SystemExit(0)
|
|
45
|
-
|
|
48
|
+
counts = resume.distribute(keys, owed, config.num_rollouts)
|
|
49
|
+
plan = [(task, n) for task, n in zip(tasks, counts) if n]
|
|
46
50
|
logger.info(
|
|
47
51
|
"resuming %s: %d task(s), %d rollout(s) owed",
|
|
48
52
|
out,
|
|
49
|
-
len(
|
|
53
|
+
len(plan),
|
|
50
54
|
sum(owed.values()),
|
|
51
55
|
)
|
|
52
56
|
else:
|
|
@@ -70,13 +74,7 @@ async def run_eval(env: Env, config: EvalConfig) -> list[Episode]:
|
|
|
70
74
|
# Serving resources (shared tool servers, interception) come up once for the
|
|
71
75
|
# run; plan slots inside so the env's agents borrow them.
|
|
72
76
|
async with env.serving():
|
|
73
|
-
planned = [
|
|
74
|
-
slot
|
|
75
|
-
for task in tasks
|
|
76
|
-
for slot in env.slots(
|
|
77
|
-
task, n=owed[task.data.idx] if owed else config.num_rollouts
|
|
78
|
-
)
|
|
79
|
-
]
|
|
77
|
+
planned = [slot for task, n in plan for slot in env.slots(task, n=n)]
|
|
80
78
|
slots = [RunSlot.finished(episode) for episode in finished] + planned
|
|
81
79
|
push_state = None
|
|
82
80
|
if config.push and config.rich:
|
|
@@ -123,6 +121,15 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
|
|
|
123
121
|
if legacy
|
|
124
122
|
else {"config_data": env_config_data(config.env)} # picklable across the spawn
|
|
125
123
|
)
|
|
124
|
+
tasks = []
|
|
125
|
+
if not legacy:
|
|
126
|
+
from verifiers.v1.loaders import load_taskset
|
|
127
|
+
|
|
128
|
+
# The client owns the taskset: load it here, once — the server (and its pool
|
|
129
|
+
# workers) never load data, they rebuild each dispatched task from its request.
|
|
130
|
+
tasks = load_taskset(config.env.taskset).select(
|
|
131
|
+
config.num_tasks, config.shuffle
|
|
132
|
+
)
|
|
126
133
|
# Spawned processes inherit no logging — hand them the main process's setup so
|
|
127
134
|
# their rollout logs land in the output dir.
|
|
128
135
|
level = "DEBUG" if config.verbose else "INFO"
|
|
@@ -151,48 +158,57 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
|
|
|
151
158
|
address = await asyncio.to_thread(address_queue.get, timeout=600)
|
|
152
159
|
client = EnvClient(address=address)
|
|
153
160
|
await client.wait_for_server_startup(timeout=600)
|
|
154
|
-
|
|
155
|
-
#
|
|
156
|
-
#
|
|
157
|
-
|
|
158
|
-
if
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
f"{config.env_id} is infinite - bound the run with -n/--num-tasks"
|
|
162
|
-
)
|
|
163
|
-
if config.shuffle:
|
|
164
|
-
logger.warning(
|
|
165
|
-
"shuffle is a no-op on an infinite taskset - "
|
|
166
|
-
"taking the first %d generated tasks",
|
|
167
|
-
config.num_tasks,
|
|
168
|
-
)
|
|
169
|
-
idxs = list(range(config.num_tasks))
|
|
170
|
-
else:
|
|
161
|
+
# A v1 run dispatches — and resumes — tasks by content: the client owns them,
|
|
162
|
+
# and `resume.task_key` is their identity. Only the legacy bridge is addressed
|
|
163
|
+
# by dataset row (its dataset lives server-side, reported via `info`), and
|
|
164
|
+
# only a legacy env group-scores; a v1 env scores siblings in its own rollout.
|
|
165
|
+
if legacy:
|
|
166
|
+
info = await client.info()
|
|
167
|
+
group_scored = info.requires_group_scoring
|
|
171
168
|
idxs = sample(list(range(info.num_tasks)), config.shuffle, config.num_tasks)
|
|
169
|
+
plan = [({"task_idx": idx}, config.num_rollouts) for idx in idxs]
|
|
170
|
+
else:
|
|
171
|
+
group_scored = False
|
|
172
|
+
plan = [
|
|
173
|
+
({"task_data": task.data.model_dump(mode="json")}, config.num_rollouts)
|
|
174
|
+
for task in tasks
|
|
175
|
+
]
|
|
172
176
|
out = output_path(config)
|
|
173
177
|
finished: list[Episode] = []
|
|
174
178
|
if config.resume is not None:
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
179
|
+
if legacy:
|
|
180
|
+
# A group is served and scored together, so a partially-kept task
|
|
181
|
+
# redoes as a whole group — whole_task drops its kept rows.
|
|
182
|
+
finished, owed = resume.load(
|
|
183
|
+
out,
|
|
184
|
+
idxs,
|
|
185
|
+
config.num_rollouts,
|
|
186
|
+
whole_task=group_scored,
|
|
187
|
+
key_of=lambda data: data.get("idx"),
|
|
188
|
+
)
|
|
189
|
+
counts = resume.distribute(idxs, owed, config.num_rollouts)
|
|
190
|
+
else:
|
|
191
|
+
keys = [
|
|
192
|
+
resume.task_key(t.data.model_dump(mode="json", exclude_none=True))
|
|
193
|
+
for t in tasks
|
|
194
|
+
]
|
|
195
|
+
finished, owed = resume.load(out, keys, config.num_rollouts)
|
|
196
|
+
counts = resume.distribute(keys, owed, config.num_rollouts)
|
|
180
197
|
if not owed: # already complete - report it and exit successfully
|
|
181
|
-
print(resume.nothing_to_resume_msg(out, len(
|
|
198
|
+
print(resume.nothing_to_resume_msg(out, len(plan), config.num_rollouts))
|
|
182
199
|
raise SystemExit(0)
|
|
183
|
-
|
|
200
|
+
plan = [(payload, n) for (payload, _), n in zip(plan, counts) if n]
|
|
184
201
|
logger.info(
|
|
185
202
|
"resuming %s: %d task(s), %d rollout(s) owed",
|
|
186
203
|
out,
|
|
187
|
-
len(
|
|
204
|
+
len(plan),
|
|
188
205
|
sum(owed.values()),
|
|
189
206
|
)
|
|
190
207
|
else:
|
|
191
|
-
owed = {idx: config.num_rollouts for idx in idxs}
|
|
192
208
|
save_config(config, out)
|
|
193
209
|
logger.info(
|
|
194
210
|
"running %dx%d rollouts via the env-server %s pool on %s",
|
|
195
|
-
len(
|
|
211
|
+
len(plan),
|
|
196
212
|
config.num_rollouts,
|
|
197
213
|
config.pool.type,
|
|
198
214
|
config.model,
|
|
@@ -224,13 +240,13 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
|
|
|
224
240
|
records.append(Episode.of(trace))
|
|
225
241
|
return records
|
|
226
242
|
|
|
227
|
-
async def run_unit(
|
|
243
|
+
async def run_unit(payload: dict) -> list[Episode]:
|
|
228
244
|
async with semaphore or contextlib.nullcontext():
|
|
229
245
|
episode = await client.run(
|
|
230
|
-
task_idx=idx,
|
|
231
246
|
client=config.client,
|
|
232
247
|
model=config.model,
|
|
233
248
|
sampling=config.sampling,
|
|
249
|
+
**payload,
|
|
234
250
|
)
|
|
235
251
|
for trace in episode.traces:
|
|
236
252
|
trace.stamp(EvalRunInfo(id=config.uuid))
|
|
@@ -238,12 +254,12 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
|
|
|
238
254
|
return [episode]
|
|
239
255
|
|
|
240
256
|
# A group-scored legacy task runs its rollouts together (one `run_group`
|
|
241
|
-
# request, one worker); otherwise each rollout is its own `
|
|
242
|
-
#
|
|
257
|
+
# request, one worker); otherwise each rollout is its own `run` request,
|
|
258
|
+
# dispatched least-busy across workers.
|
|
243
259
|
units = (
|
|
244
|
-
[run_group_unit(
|
|
260
|
+
[run_group_unit(payload["task_idx"]) for payload, _ in plan]
|
|
245
261
|
if group_scored
|
|
246
|
-
else [run_unit(
|
|
262
|
+
else [run_unit(payload) for payload, n in plan for _ in range(n)]
|
|
247
263
|
)
|
|
248
264
|
results = await asyncio.gather(*units)
|
|
249
265
|
await client.close()
|
|
@@ -66,7 +66,7 @@ def main(argv: list[str] | None = None) -> None:
|
|
|
66
66
|
# Refuse multi-agent before the dry-run return, so --dry-run can't write a
|
|
67
67
|
# config the real invocation would reject.
|
|
68
68
|
env_cls = vf.environment_class(
|
|
69
|
-
config.env.taskset.id
|
|
69
|
+
config.env.taskset.id,
|
|
70
70
|
config.env.id,
|
|
71
71
|
)
|
|
72
72
|
if not issubclass(env_cls, vf.SingleAgentEnv):
|
|
@@ -36,8 +36,8 @@ def output_path(config: EvalConfig) -> Path:
|
|
|
36
36
|
if config.output_dir is not None:
|
|
37
37
|
return config.output_dir
|
|
38
38
|
taskset = config.env.taskset
|
|
39
|
-
env = taskset.name if taskset
|
|
40
|
-
if taskset
|
|
39
|
+
env = taskset.name if taskset.id else "no-taskset"
|
|
40
|
+
if taskset.id and config.env.id:
|
|
41
41
|
# Same compounding as `EnvConfig.env_id`: a `best-of-n+gsm8k-v1` run must
|
|
42
42
|
# not share a parent dir with a plain `gsm8k-v1` one.
|
|
43
43
|
env = f"{env_name(config.env.id)}+{env}"
|
|
@@ -138,9 +138,7 @@ class EnvServerConfig(BaseConfig):
|
|
|
138
138
|
@property
|
|
139
139
|
def is_legacy(self) -> bool:
|
|
140
140
|
"""A v0/legacy env (run via the bridge): a legacy `id` is set and no v1 taskset."""
|
|
141
|
-
return self.id is not None and
|
|
142
|
-
self.env.taskset is None or not self.env.taskset.id
|
|
143
|
-
)
|
|
141
|
+
return self.id is not None and not self.env.taskset.id
|
|
144
142
|
|
|
145
143
|
@property
|
|
146
144
|
def env_id(self) -> str:
|
|
@@ -152,7 +150,7 @@ class EnvServerConfig(BaseConfig):
|
|
|
152
150
|
def _refuse_legacy_id_with_taskset(self):
|
|
153
151
|
"""A legacy `id` next to a v1 `env.taskset` would be silently inert
|
|
154
152
|
(`is_legacy` is False and the v0 env never loads); refuse the mix."""
|
|
155
|
-
if self.id is not None and self.env.taskset
|
|
153
|
+
if self.id is not None and self.env.taskset.id:
|
|
156
154
|
raise ValueError(
|
|
157
155
|
f"--id {self.id!r} is the legacy (v0) env id and can't combine with "
|
|
158
156
|
f"the v1 taskset {self.env.taskset.id!r}. Pairing an env with a "
|
|
@@ -31,7 +31,7 @@ from verifiers.v1.retries import RetryConfig, run_episode_with_retry
|
|
|
31
31
|
from verifiers.v1.runtimes import SubprocessConfig, runtime_is_local
|
|
32
32
|
from verifiers.v1.errors import EnvError, boundary
|
|
33
33
|
from verifiers.v1.task import Task, resolve_server_config
|
|
34
|
-
from verifiers.v1.taskset import
|
|
34
|
+
from verifiers.v1.taskset import TasksetConfig
|
|
35
35
|
from verifiers.v1.episode import Episode
|
|
36
36
|
from verifiers.v1.trace import Error, Trace
|
|
37
37
|
from verifiers.v1.utils.generic import deep_merge, generic_type
|
|
@@ -65,9 +65,9 @@ class EnvConfig(BaseConfig):
|
|
|
65
65
|
"""Which `Env` runs. Empty = the taskset's own, else `SingleAgentEnv`; set
|
|
66
66
|
to pair a reusable env with any taskset (an explicit id wins over the bundled)."""
|
|
67
67
|
# SerializeAsAny: the env-server wire needs the resolved subclass's fields.
|
|
68
|
-
taskset: SerializeAsAny[TasksetConfig]
|
|
68
|
+
taskset: SerializeAsAny[TasksetConfig] = TasksetConfig()
|
|
69
69
|
"""The seed taskset — the rows every rollout starts from (`--env.taskset.id`).
|
|
70
|
-
|
|
70
|
+
The id stays empty only for a legacy (v0) run, which sets the top-level `id`."""
|
|
71
71
|
timeout: TimeoutConfig = TimeoutConfig()
|
|
72
72
|
retries: RetryConfig = RetryConfig()
|
|
73
73
|
"""Whole-EPISODE retries — the coarse fallback for faults no agent owns; a
|
|
@@ -81,17 +81,14 @@ class EnvConfig(BaseConfig):
|
|
|
81
81
|
@property
|
|
82
82
|
def env_id(self) -> str:
|
|
83
83
|
"""The taskset id, prefixed by the paired env id (`best-of-n+gsm8k-v1`)."""
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
return taskset_id or self.id
|
|
84
|
+
if self.taskset.id and self.id:
|
|
85
|
+
return f"{self.id}+{self.taskset.id}"
|
|
86
|
+
return self.taskset.id or self.id
|
|
88
87
|
|
|
89
88
|
def agent_harnesses(self) -> dict[str, HarnessConfig]:
|
|
90
89
|
"""Each declared role's resolved harness config (pin, else the taskset's
|
|
91
90
|
default) — known without constructing the env."""
|
|
92
|
-
default = default_agent_harness(
|
|
93
|
-
self.taskset.id if self.taskset is not None else ""
|
|
94
|
-
)
|
|
91
|
+
default = default_agent_harness(self.taskset.id)
|
|
95
92
|
return {
|
|
96
93
|
name: cfg.harness if cfg.harness is not None else default
|
|
97
94
|
for name, cfg in _declared_agent_configs(self).items()
|
|
@@ -239,7 +236,7 @@ class Env(ABC, Generic[ConfigT]):
|
|
|
239
236
|
f"{config_cls.__name__}(...) explicitly"
|
|
240
237
|
)
|
|
241
238
|
self.config: ConfigT = config
|
|
242
|
-
if config.taskset
|
|
239
|
+
if not config.taskset.id:
|
|
243
240
|
raise ValueError(
|
|
244
241
|
f"{type(self).__name__} needs a seed taskset — every rollout starts "
|
|
245
242
|
"from one of its tasks: set --env.taskset.id (or the positional "
|
|
@@ -247,7 +244,7 @@ class Env(ABC, Generic[ConfigT]):
|
|
|
247
244
|
)
|
|
248
245
|
self.taskset = load_taskset(config.taskset)
|
|
249
246
|
self._default_harness = default_agent_harness(config.taskset.id)
|
|
250
|
-
task_cls =
|
|
247
|
+
task_cls = type(self.taskset).task_type()
|
|
251
248
|
self._task_cls: type[Task] = task_cls
|
|
252
249
|
self._agent_specs: dict[str, AgentConfig] = _declared_agent_configs(self.config)
|
|
253
250
|
if not self._agent_specs:
|
|
@@ -520,7 +517,7 @@ class Env(ABC, Generic[ConfigT]):
|
|
|
520
517
|
"""`requires_tunnel` over the consumers known before any rollout: role
|
|
521
518
|
runtimes, live `shared` servers, and the task class's tool/user servers;
|
|
522
519
|
a class overriding `server_config` conservatively counts as remote."""
|
|
523
|
-
task_cls =
|
|
520
|
+
task_cls = type(self.taskset).task_type()
|
|
524
521
|
server_classes = [*task_cls.tools, *([task_cls.user] if task_cls.user else [])]
|
|
525
522
|
if server_classes and task_cls.server_config is not Task.server_config:
|
|
526
523
|
return True
|
|
@@ -34,13 +34,10 @@ def requires_tunnel(
|
|
|
34
34
|
server_configs: Iterable[BaseConfig] = (),
|
|
35
35
|
shared: "Iterable[SharedToolServer]" = (),
|
|
36
36
|
) -> bool:
|
|
37
|
-
"""Whether
|
|
38
|
-
host
|
|
39
|
-
tool/user server
|
|
40
|
-
|
|
41
|
-
harness's runtime, covered by `harness_is_local`), a config-`url` server (external —
|
|
42
|
-
it connects out), and an `external` shared server (outside the state machinery
|
|
43
|
-
entirely). False means every consumer reaches the server at localhost."""
|
|
37
|
+
"""Whether interception needs a public tunnel because some consumer cannot use a
|
|
38
|
+
host-local URL: the harness itself, a live `shared` server in a remote runtime, or a
|
|
39
|
+
tool/user server placed there. Colocated servers, configured URLs, and external shared
|
|
40
|
+
servers add no consumer. False means local URL translation is sufficient."""
|
|
44
41
|
if not harness_is_local:
|
|
45
42
|
return True
|
|
46
43
|
if any(not s.external and not s.local for s in shared):
|
|
@@ -57,10 +54,8 @@ def make_interception(
|
|
|
57
54
|
config: InterceptionConfig, *, requires_tunnel: bool
|
|
58
55
|
) -> Interception:
|
|
59
56
|
"""The interception for a config, picked by type (the host-side counterpart to
|
|
60
|
-
`make_runtime`). With `requires_tunnel
|
|
61
|
-
|
|
62
|
-
it they get none and are reached at localhost. The caller computes it (see
|
|
63
|
-
`Env._requires_tunnel`)."""
|
|
57
|
+
`make_runtime`). With `requires_tunnel`, each server is exposed through its configured
|
|
58
|
+
tunnel; otherwise it remains on host loopback. The caller computes this requirement."""
|
|
64
59
|
if isinstance(config, InterceptionServerConfig):
|
|
65
60
|
return InterceptionServer(config, requires_tunnel)
|
|
66
61
|
if isinstance(config, StaticInterceptionPoolConfig):
|
|
@@ -121,11 +121,9 @@ class InterceptionServerConfig(BaseInterceptionConfig):
|
|
|
121
121
|
|
|
122
122
|
class InterceptionServer(Interception):
|
|
123
123
|
"""A server that proxies model calls for one or more rollouts — and is itself the
|
|
124
|
-
single-server `Interception` (the pools compose several of these).
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
sets `base_url` — the one URL every consumer reaches it at — to the tunnel's public
|
|
128
|
-
URL. Without, every consumer is on the host network: it binds loopback, tunnel-free."""
|
|
124
|
+
single-server `Interception` (the pools compose several of these). When a consumer
|
|
125
|
+
needs a public URL, it mints the configured tunnel and binds where that tunnel says;
|
|
126
|
+
otherwise it stays on host loopback."""
|
|
129
127
|
|
|
130
128
|
def __init__(
|
|
131
129
|
self,
|
|
@@ -203,9 +201,8 @@ class InterceptionServer(Interception):
|
|
|
203
201
|
self.runner = web.AppRunner(app)
|
|
204
202
|
await self.runner.setup()
|
|
205
203
|
self.stack.push_async_callback(self.runner.cleanup)
|
|
206
|
-
#
|
|
207
|
-
#
|
|
208
|
-
# `expose` publishes it.
|
|
204
|
+
# Without a tunnel, local URL translation reaches an ephemeral loopback port.
|
|
205
|
+
# Otherwise the tunnel determines the bind address and publishes it.
|
|
209
206
|
if self.tunnel is None:
|
|
210
207
|
self.host, bind_port = "127.0.0.1", 0
|
|
211
208
|
else:
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
"""The Tunnel contract: expose a host interception port to a remote consumer.
|
|
2
2
|
|
|
3
|
-
The interception server runs on the host.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
nothing about locality — the caller (`InterceptionServer.start`) uses it only in the remote
|
|
8
|
-
case. The host-side counterpart to a `Runtime`: `Runtime.expose` publishes a port *inside* a
|
|
9
|
-
sandbox; `Tunnel.expose` a *host* port.
|
|
3
|
+
The interception server runs on the host. Local runtimes use a host-local URL directly or
|
|
4
|
+
through their runtime translation; remote runtimes need the port published outward. A
|
|
5
|
+
`Tunnel` supplies the bind address and exposes that host port as a public URL. It is the
|
|
6
|
+
host-side counterpart to `Runtime.expose`, which publishes a port inside a sandbox.
|
|
10
7
|
"""
|
|
11
8
|
|
|
12
9
|
import contextlib
|