verifiers 0.2.2.dev73__tar.gz → 0.2.2.dev75__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.dev73 → verifiers-0.2.2.dev75}/PKG-INFO +1 -1
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/test_judges.py +1 -1
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/test_trace.py +6 -1
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/agent.py +2 -8
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/cli/dashboard/eval.py +6 -4
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/envs/agentic_judge/env.py +2 -1
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harness.py +8 -1
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/runtimes/__init__.py +19 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/runtimes/base.py +36 -2
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/runtimes/docker/__init__.py +1 -1
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/runtimes/modal.py +1 -1
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/runtimes/prime.py +1 -1
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/runtimes/subprocess.py +1 -1
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/task.py +21 -11
- verifiers-0.2.2.dev75/verifiers/v1/tasksets/harbor/__init__.py +16 -0
- verifiers-0.2.2.dev75/verifiers/v1/tasksets/harbor/env.py +124 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/tasksets/harbor/taskset.py +247 -51
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/trace.py +6 -5
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/utils/decorators.py +17 -1
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/utils/platform.py +11 -3
- verifiers-0.2.2.dev73/verifiers/v1/tasksets/harbor/__init__.py +0 -8
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/.gitignore +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/LICENSE +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/README.md +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/pyproject.toml +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/conftest.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_build_script.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_client_config.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_env_group.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_env_server.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_environment.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_imports.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_init_script.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_logging.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_parser.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_rubric.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_types.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/conftest.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/fixtures/duet_v1.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/test_configs.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/test_envs.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/test_graph.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/tests/v1/test_taskset.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/decorators.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/errors.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/types.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/acp/_runner.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/clients/base.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/configs/agent.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/configs/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/configs/cli/debug.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/configs/cli/env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/configs/cli/eval.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/configs/cli/init.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/configs/cli/replay.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/configs/cli/serve.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/configs/cli/validate.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/configs/client.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/configs/harness.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/configs/judge.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/configs/legacy.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/configs/retries.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/configs/task.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/configs/taskset.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/envs/user_sim/env.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/episode.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/errors.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/graph.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/bash/program.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/browser_use/program.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/pool/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/pool/harness.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/judge.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/session.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/state.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/types.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/utils/artifacts.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/utils/compile.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/utils/loaders.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/utils/retries.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/verifiers/v1/utils/score.py +0 -0
- {verifiers-0.2.2.dev73 → verifiers-0.2.2.dev75}/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.dev75
|
|
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
|
|
@@ -461,7 +461,7 @@ async def test_error_attribution(monkeypatch, tmp_path):
|
|
|
461
461
|
await JudgedTask(trace.task.data, taskset.config.task).score(
|
|
462
462
|
trace, runtime=None
|
|
463
463
|
)
|
|
464
|
-
assert "reference"
|
|
464
|
+
assert trace.rewards["reference"] is None # seeded: expected but never scored
|
|
465
465
|
assert len(trace.info["judge"]) == 1 # the billed call is still recorded
|
|
466
466
|
|
|
467
467
|
|
|
@@ -71,17 +71,22 @@ def test_wire_trace_round_trip():
|
|
|
71
71
|
],
|
|
72
72
|
)
|
|
73
73
|
tr.record_reward("r", 1.0)
|
|
74
|
+
tr.rewards.setdefault("solved", None) # seeded: expected but never scored
|
|
75
|
+
tr.metrics.setdefault("acc", None)
|
|
74
76
|
tr.info = {"build": "ok"}
|
|
75
77
|
tr.stop("done")
|
|
76
78
|
|
|
77
79
|
# the dump is plain pydantic — derived values are properties, so they're not serialized
|
|
78
80
|
data = json.loads(tr.model_dump_json(exclude_none=True))
|
|
79
81
|
assert "reward" not in data and "is_truncated" not in data
|
|
82
|
+
# exclude_none drops None FIELDS, not None dict values — unscored seeds survive
|
|
83
|
+
assert data["rewards"]["solved"] is None and data["metrics"]["acc"] is None
|
|
80
84
|
|
|
81
85
|
rt = vf.WireTrace.model_validate(data)
|
|
82
86
|
assert rt.num_branches == tr.num_branches == 2 # branch topology survived
|
|
83
87
|
assert rt.num_turns == tr.num_turns == 2
|
|
84
|
-
assert rt.reward == 1.0 # property recomputed from `rewards
|
|
88
|
+
assert rt.reward == 1.0 # property recomputed from `rewards`, seeds contribute 0
|
|
89
|
+
assert rt.rewards["solved"] is None
|
|
85
90
|
assert rt.stop_condition == "done"
|
|
86
91
|
assert rt.info == {"build": "ok"}
|
|
87
92
|
assert (
|
|
@@ -29,7 +29,7 @@ from verifiers.v1.runtimes import (
|
|
|
29
29
|
Runtime,
|
|
30
30
|
RuntimeConfig,
|
|
31
31
|
SubprocessConfig,
|
|
32
|
-
|
|
32
|
+
provision_runtime,
|
|
33
33
|
runtime_is_local,
|
|
34
34
|
)
|
|
35
35
|
from verifiers.v1.session import RolloutLimits
|
|
@@ -547,14 +547,8 @@ class Agent:
|
|
|
547
547
|
if task is not None
|
|
548
548
|
else self.runtime_config
|
|
549
549
|
)
|
|
550
|
-
|
|
551
|
-
try:
|
|
552
|
-
# start() inside the try: a failed start may already hold a remote
|
|
553
|
-
# sandbox, so it must reach stop() (safe on a partially-started runtime).
|
|
554
|
-
await runtime.start()
|
|
550
|
+
async with provision_runtime(config) as runtime:
|
|
555
551
|
yield runtime
|
|
556
|
-
finally:
|
|
557
|
-
await runtime.stop()
|
|
558
552
|
|
|
559
553
|
|
|
560
554
|
class _EpisodeAgent(Agent):
|
|
@@ -332,8 +332,8 @@ def Progress(
|
|
|
332
332
|
|
|
333
333
|
def _score_segments(traces: list[Trace], source: str) -> str | None:
|
|
334
334
|
"""`name mean` segments for every reward/metric key seen across `traces`,
|
|
335
|
-
first-seen order (a trace
|
|
336
|
-
can vary); None when no trace recorded anything."""
|
|
335
|
+
first-seen order (a trace carries only its own task's signals — unscored ones
|
|
336
|
+
seeded as `None` — so keys can vary); None when no trace recorded anything."""
|
|
337
337
|
names: list[str] = []
|
|
338
338
|
for trace in traces:
|
|
339
339
|
names.extend(n for n in getattr(trace, source) if n not in names)
|
|
@@ -347,11 +347,13 @@ def _score_segments(traces: list[Trace], source: str) -> str | None:
|
|
|
347
347
|
|
|
348
348
|
|
|
349
349
|
def _score(trace: Trace, source: str, name: str) -> float:
|
|
350
|
-
"""Rewards carry raw score + weight; the breakdown shows the raw score.
|
|
350
|
+
"""Rewards carry raw score + weight; the breakdown shows the raw score. A missing
|
|
351
|
+
or unscored (seeded `None`) entry reads as 0.0."""
|
|
351
352
|
if source == "rewards":
|
|
352
353
|
reward = trace.rewards.get(name)
|
|
353
354
|
return reward.score if reward is not None else 0.0
|
|
354
|
-
|
|
355
|
+
value = trace.metrics.get(name)
|
|
356
|
+
return value if value is not None else 0.0
|
|
355
357
|
|
|
356
358
|
|
|
357
359
|
def _breakdown(scored: list[Trace], done: list[Trace]) -> Table | None:
|
|
@@ -398,7 +398,8 @@ class AgenticJudgeEnv(vf.Env[AgenticJudgeEnvConfig]):
|
|
|
398
398
|
solution.record_metric(f"judge/{criterion.name}", scores[criterion.name])
|
|
399
399
|
if self.config.score.task_weight != 1.0:
|
|
400
400
|
for reward in solution.rewards.values():
|
|
401
|
-
reward
|
|
401
|
+
if reward is not None:
|
|
402
|
+
reward.weight *= self.config.score.task_weight
|
|
402
403
|
total = sum(criterion.weight for criterion in criteria)
|
|
403
404
|
reward = sum(c.weight * scores[c.name] for c in criteria) / total
|
|
404
405
|
solution.record_reward("judge", reward, weight=self.config.score.judge_weight)
|
|
@@ -12,7 +12,12 @@ from verifiers.v1.errors import HarnessError, SandboxError, boundary
|
|
|
12
12
|
from verifiers.v1.runtimes import ProgramResult, Runtime
|
|
13
13
|
from verifiers.v1.task import TaskData
|
|
14
14
|
from verifiers.v1.types import Messages
|
|
15
|
-
from verifiers.v1.utils.decorators import
|
|
15
|
+
from verifiers.v1.utils.decorators import (
|
|
16
|
+
discover_decorated,
|
|
17
|
+
invoke_all,
|
|
18
|
+
seed,
|
|
19
|
+
unseed,
|
|
20
|
+
)
|
|
16
21
|
|
|
17
22
|
if TYPE_CHECKING:
|
|
18
23
|
# Annotation-only: `Trace` appears in signatures only, so this module stays
|
|
@@ -155,10 +160,12 @@ class Harness(ABC, Generic[ConfigT]):
|
|
|
155
160
|
`runtime`) and can read what the harness left behind in the runtime."""
|
|
156
161
|
available = {"task": trace.task.data, "trace": trace, "runtime": runtime}
|
|
157
162
|
fns = discover_decorated(self, "metric")
|
|
163
|
+
seed(trace.metrics, (fn.__name__ for fn in fns))
|
|
158
164
|
async with boundary(HarnessError, f"harness {self.config.id!r} metric"):
|
|
159
165
|
results = await invoke_all(fns, available)
|
|
160
166
|
for fn, result in zip(fns, results):
|
|
161
167
|
if isinstance(result, Mapping):
|
|
168
|
+
unseed(trace.metrics, fn.__name__)
|
|
162
169
|
trace.record_metrics(result)
|
|
163
170
|
else:
|
|
164
171
|
trace.record_metric(fn.__name__, result)
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from collections.abc import AsyncIterator
|
|
2
|
+
from contextlib import asynccontextmanager
|
|
1
3
|
from typing import Annotated
|
|
2
4
|
|
|
3
5
|
from pydantic import Field
|
|
@@ -45,6 +47,22 @@ def make_runtime(config: RuntimeConfig, name: str | None = None) -> Runtime:
|
|
|
45
47
|
return runtime
|
|
46
48
|
|
|
47
49
|
|
|
50
|
+
@asynccontextmanager
|
|
51
|
+
async def provision_runtime(
|
|
52
|
+
config: RuntimeConfig, name: str | None = None
|
|
53
|
+
) -> AsyncIterator[Runtime]:
|
|
54
|
+
"""Provision a box from `config` and tear it down on exit.
|
|
55
|
+
|
|
56
|
+
`start()` sits inside the `try`: a failed start may already hold a paid sandbox, so
|
|
57
|
+
it has to reach `stop()` (which is safe on a partially-started runtime)."""
|
|
58
|
+
runtime = make_runtime(config, name)
|
|
59
|
+
try:
|
|
60
|
+
await runtime.start()
|
|
61
|
+
yield runtime
|
|
62
|
+
finally:
|
|
63
|
+
await runtime.stop()
|
|
64
|
+
|
|
65
|
+
|
|
48
66
|
def runtime_is_local(config: RuntimeConfig) -> bool:
|
|
49
67
|
"""Whether a runtime of this config exchanges host-local URLs without a public
|
|
50
68
|
tunnel, read off the runtime class without provisioning one."""
|
|
@@ -71,5 +89,6 @@ __all__ = [
|
|
|
71
89
|
"SubprocessRuntime",
|
|
72
90
|
"SubprocessRuntimeInfo",
|
|
73
91
|
"make_runtime",
|
|
92
|
+
"provision_runtime",
|
|
74
93
|
"runtime_is_local",
|
|
75
94
|
]
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import atexit
|
|
5
|
+
import base64
|
|
5
6
|
import contextlib
|
|
6
7
|
import hashlib
|
|
7
8
|
import logging
|
|
@@ -285,9 +286,42 @@ class Runtime(ABC):
|
|
|
285
286
|
argv = await self.prepare_uv_script(script, env)
|
|
286
287
|
return await self.run([*argv, *(args or [])], env or {})
|
|
287
288
|
|
|
289
|
+
async def read(self, path: str, max_bytes: int | None = None) -> bytes:
|
|
290
|
+
"""Read `path` into host memory. `max_bytes` caps the transfer, raising past
|
|
291
|
+
the cap — for a file written by something we don't control, whose size we
|
|
292
|
+
can't assume. The cap is enforced inside the box rather than after the
|
|
293
|
+
transfer, and base64 because `run` returns decoded text. Framework method —
|
|
294
|
+
override `_read`, not this."""
|
|
295
|
+
if max_bytes is None:
|
|
296
|
+
return await self._read(path)
|
|
297
|
+
# Through a temp file, not a pipe: `head | base64` exits with base64's 0
|
|
298
|
+
# even when the path is missing, and a missing file must raise here just
|
|
299
|
+
# as it does from `_read`.
|
|
300
|
+
result = await self.run(
|
|
301
|
+
[
|
|
302
|
+
"sh",
|
|
303
|
+
"-c",
|
|
304
|
+
(
|
|
305
|
+
"t=$(mktemp) || exit 1; "
|
|
306
|
+
'head -c "$1" -- "$2" > "$t" || { rm -f "$t"; exit 1; }; '
|
|
307
|
+
'base64 < "$t"; rc=$?; rm -f "$t"; exit $rc'
|
|
308
|
+
),
|
|
309
|
+
"sh",
|
|
310
|
+
str(max_bytes + 1),
|
|
311
|
+
path,
|
|
312
|
+
],
|
|
313
|
+
{},
|
|
314
|
+
)
|
|
315
|
+
if result.exit_code:
|
|
316
|
+
raise SandboxError(f"read {path!r}: {result.stderr.strip()[-500:]}")
|
|
317
|
+
data = base64.b64decode(result.stdout)
|
|
318
|
+
if len(data) > max_bytes:
|
|
319
|
+
raise SandboxError(f"read {path!r}: over the {max_bytes} byte limit")
|
|
320
|
+
return data
|
|
321
|
+
|
|
288
322
|
@abstractmethod
|
|
289
|
-
async def
|
|
290
|
-
|
|
323
|
+
async def _read(self, path: str) -> bytes:
|
|
324
|
+
"""Read the whole file at `path`; `read` adds the optional transfer cap."""
|
|
291
325
|
|
|
292
326
|
@abstractmethod
|
|
293
327
|
async def write(self, path: str, data: bytes) -> None:
|
|
@@ -334,7 +334,7 @@ class DockerRuntime(Runtime):
|
|
|
334
334
|
if run.exit_code != 0:
|
|
335
335
|
raise SandboxError(f"docker exec -d failed: {run.stderr.strip()}")
|
|
336
336
|
|
|
337
|
-
async def
|
|
337
|
+
async def _read(self, path: str) -> bytes:
|
|
338
338
|
proc = await asyncio.create_subprocess_exec(
|
|
339
339
|
"docker",
|
|
340
340
|
"exec",
|
|
@@ -165,7 +165,7 @@ class ModalRuntime(Runtime):
|
|
|
165
165
|
return path
|
|
166
166
|
return f"{self.config.workdir.rstrip('/')}/{path}"
|
|
167
167
|
|
|
168
|
-
async def
|
|
168
|
+
async def _read(self, path: str) -> bytes:
|
|
169
169
|
try:
|
|
170
170
|
return await self._sandbox.filesystem.read_bytes.aio(self._abs(path))
|
|
171
171
|
except Exception as e:
|
|
@@ -270,7 +270,7 @@ class PrimeRuntime(Runtime):
|
|
|
270
270
|
f"prime background launch failed: {result.stderr.strip()}"
|
|
271
271
|
)
|
|
272
272
|
|
|
273
|
-
async def
|
|
273
|
+
async def _read(self, path: str) -> bytes:
|
|
274
274
|
# Avoid background-job log limits and base64 overhead by downloading binary data directly.
|
|
275
275
|
# The temporary file is removed on every exit, and its byte read stays off the event loop.
|
|
276
276
|
target = (
|
|
@@ -96,7 +96,7 @@ class SubprocessRuntime(Runtime):
|
|
|
96
96
|
proc
|
|
97
97
|
) # killed in stop() — a host process won't die on its own
|
|
98
98
|
|
|
99
|
-
async def
|
|
99
|
+
async def _read(self, path: str) -> bytes:
|
|
100
100
|
return await asyncio.to_thread((self.workdir / path).read_bytes)
|
|
101
101
|
|
|
102
102
|
async def write(self, path: str, data: bytes) -> None:
|
|
@@ -23,7 +23,12 @@ from verifiers.v1.errors import TaskError, boundary
|
|
|
23
23
|
from verifiers.v1.state import StateT
|
|
24
24
|
from verifiers.v1.types import Messages, content_text
|
|
25
25
|
from verifiers.v1.utils.artifacts import Artifact
|
|
26
|
-
from verifiers.v1.utils.decorators import
|
|
26
|
+
from verifiers.v1.utils.decorators import (
|
|
27
|
+
discover_decorated,
|
|
28
|
+
invoke_all,
|
|
29
|
+
seed,
|
|
30
|
+
unseed,
|
|
31
|
+
)
|
|
27
32
|
from verifiers.v1.utils.generic import concrete_type
|
|
28
33
|
|
|
29
34
|
if TYPE_CHECKING:
|
|
@@ -180,31 +185,36 @@ class Task(Generic[DataT, StateT, ConfigT]):
|
|
|
180
185
|
judge for judge in judges if not requires_runtime(judge.score)
|
|
181
186
|
]
|
|
182
187
|
|
|
188
|
+
seed(trace.metrics, (fn.__name__ for fn in metrics))
|
|
189
|
+
seed(trace.rewards, (fn.__name__ for fn in rewards))
|
|
190
|
+
seed(trace.rewards, (judge.reward_name for judge in judges))
|
|
191
|
+
|
|
183
192
|
metric_results = await invoke_all(metrics, available)
|
|
184
193
|
for fn, result in zip(metrics, metric_results):
|
|
185
194
|
if isinstance(result, Mapping):
|
|
195
|
+
unseed(trace.metrics, fn.__name__)
|
|
186
196
|
trace.record_metrics(result)
|
|
187
197
|
else:
|
|
188
198
|
trace.record_metric(fn.__name__, result)
|
|
189
199
|
reward_results = await invoke_all(rewards, available)
|
|
190
200
|
for fn, result in zip(rewards, reward_results):
|
|
191
201
|
weight = getattr(fn, "_vf_weight", 1.0)
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
202
|
+
if isinstance(result, Mapping):
|
|
203
|
+
unseed(trace.rewards, fn.__name__)
|
|
204
|
+
items = result.items()
|
|
205
|
+
else:
|
|
206
|
+
items = [(fn.__name__, result)]
|
|
197
207
|
for key, value in items:
|
|
198
208
|
trace.record_reward(key, value, weight)
|
|
199
209
|
judge_results = await invoke_all(
|
|
200
210
|
[judge.score for judge in judges], available
|
|
201
211
|
)
|
|
202
212
|
for judge, result in zip(judges, judge_results):
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
213
|
+
if isinstance(result, Mapping):
|
|
214
|
+
unseed(trace.rewards, judge.reward_name)
|
|
215
|
+
items = result.items()
|
|
216
|
+
else:
|
|
217
|
+
items = [(judge.reward_name, result)]
|
|
208
218
|
for key, value in items:
|
|
209
219
|
trace.record_reward(key, value, judge.config.weight)
|
|
210
220
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from verifiers.v1.tasksets.harbor.env import HarborEnv, HarborEnvConfig
|
|
2
|
+
from verifiers.v1.tasksets.harbor.taskset import (
|
|
3
|
+
HarborConfig,
|
|
4
|
+
HarborData,
|
|
5
|
+
HarborTask,
|
|
6
|
+
HarborTaskset,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
__all__ = [
|
|
10
|
+
"HarborConfig",
|
|
11
|
+
"HarborData",
|
|
12
|
+
"HarborEnv",
|
|
13
|
+
"HarborEnvConfig",
|
|
14
|
+
"HarborTask",
|
|
15
|
+
"HarborTaskset",
|
|
16
|
+
]
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"""The harbor taskset's own env: the single solver seat, plus separate-verifier
|
|
2
|
+
grading for tasks that declare ``[verifier].environment_mode = "separate"``.
|
|
3
|
+
|
|
4
|
+
The default env for harbor runs (the taskset package exports it). A shared-verifier
|
|
5
|
+
task runs exactly as under the single-agent env: one `agent` trace, graded in the
|
|
6
|
+
box it worked in. A separate-verifier task is graded by `finalize` instead: the
|
|
7
|
+
solver's declared artifacts travel (collected by its task `finalize` while its box
|
|
8
|
+
is alive), a fresh box is provisioned from the task's verifier declaration,
|
|
9
|
+
`tests/` is staged there, and the verifier's rewards land on the solver's trace.
|
|
10
|
+
No second agent is involved — the verifier is the task's own `tests/test.sh`.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import asyncio
|
|
14
|
+
import logging
|
|
15
|
+
from contextlib import AsyncExitStack
|
|
16
|
+
|
|
17
|
+
from pydantic import Field
|
|
18
|
+
|
|
19
|
+
import verifiers.v1 as vf
|
|
20
|
+
from verifiers.v1.runtimes import RuntimeConfig, provision_runtime
|
|
21
|
+
from verifiers.v1.tasksets.harbor.taskset import (
|
|
22
|
+
HarborTask,
|
|
23
|
+
verifier_box_data,
|
|
24
|
+
)
|
|
25
|
+
from verifiers.v1.utils.artifacts import restore
|
|
26
|
+
from verifiers.v1.utils.compile import resolve_runtime_config
|
|
27
|
+
from verifiers.v1.utils.retries import backoff
|
|
28
|
+
|
|
29
|
+
logger = logging.getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class HarborEnvConfig(vf.EnvConfig):
|
|
33
|
+
agent: vf.AgentConfig = vf.AgentConfig()
|
|
34
|
+
"""The one seat — the policy under evaluation/training; pin
|
|
35
|
+
`--env.agent.harness.*` to choose its program or runtime."""
|
|
36
|
+
verifier_runtime: RuntimeConfig | None = None
|
|
37
|
+
"""Where a separate-verifier task grades. None derives the grading box from
|
|
38
|
+
the solver's runtime policy; set it (e.g. `--env.verifier-runtime.type prime
|
|
39
|
+
--env.verifier-runtime.vm true`) when the verifier needs different placement
|
|
40
|
+
than the agent."""
|
|
41
|
+
verifier_retries: int = Field(2, ge=0)
|
|
42
|
+
"""Extra attempts at provisioning-and-grading the separate box before the
|
|
43
|
+
episode fails. Grading is deterministic; what these retry is the
|
|
44
|
+
infrastructure around it (image pulls, provisioning)."""
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class HarborEnv(vf.Env[HarborEnvConfig]):
|
|
48
|
+
async def run(self, task: vf.Task, agents: vf.Agents) -> None:
|
|
49
|
+
if not isinstance(task, HarborTask):
|
|
50
|
+
raise TypeError(
|
|
51
|
+
f"the harbor env runs harbor tasks; got {type(task).__name__}"
|
|
52
|
+
)
|
|
53
|
+
if task.data.verifier is None:
|
|
54
|
+
await agents.agent.run(task)
|
|
55
|
+
return
|
|
56
|
+
# Resolve the verifier's box before the solve, so an impossible pairing
|
|
57
|
+
# (e.g. a restricted Prime verifier without vm=true) costs nothing
|
|
58
|
+
# rather than a full agent run.
|
|
59
|
+
self._verifier_config(task)
|
|
60
|
+
await agents.agent.run(task.graded_elsewhere())
|
|
61
|
+
|
|
62
|
+
def _verifier_config(self, task: HarborTask) -> RuntimeConfig:
|
|
63
|
+
base = (
|
|
64
|
+
self.config.verifier_runtime
|
|
65
|
+
if self.config.verifier_runtime is not None
|
|
66
|
+
else self.config.agent.runtime
|
|
67
|
+
)
|
|
68
|
+
return resolve_runtime_config(base, HarborTask(verifier_box_data(task.data)))
|
|
69
|
+
|
|
70
|
+
async def finalize(self, task: vf.Task, episode: vf.Episode) -> None:
|
|
71
|
+
"""Grade a separate-verifier task in its own box, onto the solver's trace.
|
|
72
|
+
|
|
73
|
+
Provision a fresh box from the task's verifier declaration, restore the
|
|
74
|
+
solver's collected artifacts, stage `tests/`, run the verifier, and record
|
|
75
|
+
its rewards (and any extra reward.json keys as metrics) on the solver's
|
|
76
|
+
trace. Infrastructure failures retry per `verifier_retries`; the last one
|
|
77
|
+
fails the episode — a grading box that can't be reached must never read
|
|
78
|
+
as reward 0."""
|
|
79
|
+
if not isinstance(task, HarborTask) or task.data.verifier is None:
|
|
80
|
+
return
|
|
81
|
+
solution = episode.traces[0]
|
|
82
|
+
if not solution.ok:
|
|
83
|
+
return
|
|
84
|
+
grader = HarborTask(verifier_box_data(task.data))
|
|
85
|
+
scores = await self._grade(self._verifier_config(task), grader, solution)
|
|
86
|
+
items = scores.items() if isinstance(scores, dict) else [("solved", scores)]
|
|
87
|
+
for name, value in items:
|
|
88
|
+
solution.record_reward(name, value)
|
|
89
|
+
|
|
90
|
+
async def _grade(
|
|
91
|
+
self, config: RuntimeConfig, grader: HarborTask, solution: vf.Trace
|
|
92
|
+
) -> float | dict[str, float]:
|
|
93
|
+
last: Exception | None = None
|
|
94
|
+
for attempt in range(self.config.verifier_retries + 1):
|
|
95
|
+
if attempt:
|
|
96
|
+
delay = backoff(attempt - 1)
|
|
97
|
+
logger.warning(
|
|
98
|
+
"harbor verifier attempt %d/%d failed (%s); retrying in %.1fs",
|
|
99
|
+
attempt,
|
|
100
|
+
self.config.verifier_retries + 1,
|
|
101
|
+
last,
|
|
102
|
+
delay,
|
|
103
|
+
)
|
|
104
|
+
await asyncio.sleep(delay)
|
|
105
|
+
try:
|
|
106
|
+
# The scoring deadline covers provisioning and grading, but not the
|
|
107
|
+
# box's teardown: a score already in hand must not be discarded
|
|
108
|
+
# because the teardown ran out the clock.
|
|
109
|
+
async with AsyncExitStack() as boxes:
|
|
110
|
+
async with asyncio.timeout(grader.data.timeout.scoring):
|
|
111
|
+
box = await boxes.enter_async_context(provision_runtime(config))
|
|
112
|
+
await box.prepare_setup()
|
|
113
|
+
# Artifacts first, tests second: an artifact entry pointing
|
|
114
|
+
# into /tests must not survive staging, which wipes and
|
|
115
|
+
# rebuilds that directory.
|
|
116
|
+
await restore(box, solution.state.artifacts)
|
|
117
|
+
await grader._stage_tests(box, wipe=True)
|
|
118
|
+
await box.prepare_execution([])
|
|
119
|
+
scores = await grader._graded(box, solution)
|
|
120
|
+
return scores
|
|
121
|
+
except Exception as e: # noqa: BLE001 - each attempt's failure is retried
|
|
122
|
+
last = e
|
|
123
|
+
assert last is not None
|
|
124
|
+
raise last
|