verifiers 0.2.2.dev51__tar.gz → 0.2.2.dev53__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.dev51 → verifiers-0.2.2.dev53}/PKG-INFO +1 -1
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/conftest.py +4 -9
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/test_e2e.py +8 -7
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/__init__.py +11 -0
- verifiers-0.2.2.dev53/verifiers/v1/artifacts.py +144 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/envs/agentic_judge/__init__.py +2 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/envs/agentic_judge/env.py +120 -52
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/state.py +3 -2
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/task.py +6 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/tasksets/harbor/taskset.py +99 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/utils/git.py +74 -9
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/.gitignore +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/LICENSE +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/README.md +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/pyproject.toml +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/conftest.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_build_script.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_client_config.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_env_group.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_env_server.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_environment.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_imports.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_init_script.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_logging.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_parser.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_rubric.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_types.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/fixtures/duet_v1.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/test_configs.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/test_envs.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/test_graph.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/test_judges.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/test_taskset.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/tests/v1/test_trace.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/decorators.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/errors.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/types.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/acp/_runner.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/agent.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/configs/agent.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/configs/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/configs/cli/debug.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/configs/cli/env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/configs/cli/eval.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/configs/cli/init.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/configs/cli/replay.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/configs/cli/serve.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/configs/cli/validate.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/configs/harness.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/configs/judge.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/configs/legacy.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/configs/retries.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/configs/task.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/configs/taskset.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/envs/user_sim/env.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/episode.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/errors.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/graph.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harness.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/bash/program.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/pool/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/pool/harness.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/judge.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/push.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/retries.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/runtimes/docker/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/session.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/trace.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/types.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/utils/compile.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/verifiers/v1/utils/sampling.py +0 -0
- {verifiers-0.2.2.dev51 → verifiers-0.2.2.dev53}/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.dev53
|
|
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
|
|
@@ -135,10 +135,6 @@ def _eval_config(
|
|
|
135
135
|
`{id: ...}` config; `runtime` places the `agent` seat's harness (an agent field, not a
|
|
136
136
|
harness one); `model` overrides the default text model (e.g. a VLM for an image task).
|
|
137
137
|
|
|
138
|
-
`temperature=0` (greedy) makes the run reproducible; `max_tokens` is generous headroom,
|
|
139
|
-
not a target — these trivial tasks finish in a few hundred tokens, so capping tighter only
|
|
140
|
-
risks truncating the reasoning before the answer (which tanks the reward).
|
|
141
|
-
|
|
142
138
|
`harness=None` leaves every seat on its own story — the multi-agent case: there
|
|
143
139
|
is no run-level harness, so a single-agent test's `harness` lands on the `agent`
|
|
144
140
|
seat and a multi-agent test pins its seats through `env` role fields instead."""
|
|
@@ -175,7 +171,6 @@ def _eval_config(
|
|
|
175
171
|
num_rollouts=n,
|
|
176
172
|
sampling={
|
|
177
173
|
"max_tokens": max_tokens,
|
|
178
|
-
"temperature": 0,
|
|
179
174
|
"reasoning_effort": reasoning_effort,
|
|
180
175
|
},
|
|
181
176
|
rich=False,
|
|
@@ -219,8 +214,8 @@ def run_v1_server():
|
|
|
219
214
|
|
|
220
215
|
@pytest.fixture
|
|
221
216
|
async def live_ctx():
|
|
222
|
-
"""A live `ModelContext` (the e2e default model + endpoint,
|
|
223
|
-
`Agent` directly — the agent-surface counterpart of `run_v1`."""
|
|
217
|
+
"""A live `ModelContext` (the e2e default model + endpoint, provider-default
|
|
218
|
+
sampling) for driving `Agent` directly — the agent-surface counterpart of `run_v1`."""
|
|
224
219
|
from verifiers.v1.clients import EvalClientConfig, ModelContext, resolve_client
|
|
225
220
|
from verifiers.v1.types import SamplingConfig
|
|
226
221
|
|
|
@@ -229,7 +224,7 @@ async def live_ctx():
|
|
|
229
224
|
yield ModelContext(
|
|
230
225
|
model="deepseek/deepseek-v4-flash",
|
|
231
226
|
client=client,
|
|
232
|
-
sampling=SamplingConfig(max_tokens=2048
|
|
227
|
+
sampling=SamplingConfig(max_tokens=2048),
|
|
233
228
|
)
|
|
234
229
|
finally:
|
|
235
230
|
await client.close()
|
|
@@ -252,7 +247,7 @@ def run_v0():
|
|
|
252
247
|
legacy={"id": env_id, "args": args or {}},
|
|
253
248
|
num_tasks=1,
|
|
254
249
|
num_rollouts=n,
|
|
255
|
-
sampling={"max_tokens": max_tokens
|
|
250
|
+
sampling={"max_tokens": max_tokens},
|
|
256
251
|
rich=False,
|
|
257
252
|
output_dir=output_dir,
|
|
258
253
|
)
|
|
@@ -109,7 +109,7 @@ async def test_single_turn(run_v1, harness, harness_runtime, tmp_path):
|
|
|
109
109
|
assert trace.stop_condition == "agent_completed"
|
|
110
110
|
assert trace.reward == 1.0
|
|
111
111
|
# The seat's resolved identity rides the trace (policy metadata for trainers).
|
|
112
|
-
assert trace.agent is not None and trace.agent.config.sampling.
|
|
112
|
+
assert trace.agent is not None and trace.agent.config.sampling.max_tokens == 2048
|
|
113
113
|
# Every sampled turn has one per-call record, linked to its assistant node.
|
|
114
114
|
sampled = [i for i, n in enumerate(trace.nodes) if n.sampled]
|
|
115
115
|
assert [c.node for c in trace.calls if c.error is None] == sampled
|
|
@@ -335,6 +335,7 @@ async def test_agentic(run_v1, harness, harness_runtime, tmp_path):
|
|
|
335
335
|
runtime={"type": harness_runtime},
|
|
336
336
|
output_dir=tmp_path,
|
|
337
337
|
max_turns=10,
|
|
338
|
+
max_tokens=8192,
|
|
338
339
|
)
|
|
339
340
|
assert trace.ok
|
|
340
341
|
assert trace.num_turns >= 1 # ran a command, then finished
|
|
@@ -405,18 +406,18 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
|
|
|
405
406
|
policy.write_text("Check EMPIRICALLY that the agent echoed the word back.")
|
|
406
407
|
traces = await run_v1(
|
|
407
408
|
"echo-v1",
|
|
408
|
-
harness=None,
|
|
409
|
+
harness=None,
|
|
409
410
|
env={
|
|
410
411
|
"id": "agentic-judge",
|
|
411
|
-
# The solver owns the shared box, so the container is pinned here.
|
|
412
412
|
"solver": {"harness": {"id": "bash"}, "runtime": {"type": "docker"}},
|
|
413
|
-
# The judge reads the trace and reasons before it writes the
|
|
414
|
-
# verdict file; the shared 2048-token run cap truncates it mid-audit.
|
|
415
413
|
"judge": {
|
|
416
414
|
"harness": {"id": "bash"},
|
|
417
415
|
"max_output_tokens": 8192,
|
|
418
416
|
},
|
|
419
|
-
"task": {
|
|
417
|
+
"task": {
|
|
418
|
+
"prompt": {"path": str(policy)},
|
|
419
|
+
"hint": "Do not rely on README.md",
|
|
420
|
+
},
|
|
420
421
|
"score": {"task_weight": 0.5},
|
|
421
422
|
},
|
|
422
423
|
output_dir=tmp_path,
|
|
@@ -431,7 +432,7 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
|
|
|
431
432
|
# The task's own reward keeps its raw score; the rescale lands on the weight.
|
|
432
433
|
assert solver.rewards["echoed"].score == 1.0
|
|
433
434
|
assert solver.rewards["echoed"].weight == 0.5
|
|
434
|
-
assert isinstance(judge.info.get("verdict"), dict)
|
|
435
|
+
assert isinstance(judge.info.get("verdict"), dict)
|
|
435
436
|
assert 0.0 <= solver.rewards["judge"].score <= 1.0
|
|
436
437
|
|
|
437
438
|
|
|
@@ -4,6 +4,12 @@ from pydantic_config import BaseConfig
|
|
|
4
4
|
|
|
5
5
|
from verifiers.v1.acp import ACP
|
|
6
6
|
from verifiers.v1.agent import Agent, Agents, Interaction, Segment, make_agent
|
|
7
|
+
from verifiers.v1.artifacts import (
|
|
8
|
+
ARTIFACTS_DIR,
|
|
9
|
+
Artifact,
|
|
10
|
+
collect,
|
|
11
|
+
restore,
|
|
12
|
+
)
|
|
7
13
|
from verifiers.v1.clients import (
|
|
8
14
|
BaseClientConfig,
|
|
9
15
|
Client,
|
|
@@ -297,6 +303,11 @@ __all__ = [ # noqa: RUF022 - grouped by public API area
|
|
|
297
303
|
"PATCH_CAP_BYTES",
|
|
298
304
|
"capture_patch",
|
|
299
305
|
"resolve_head",
|
|
306
|
+
# grading artifacts
|
|
307
|
+
"ARTIFACTS_DIR",
|
|
308
|
+
"Artifact",
|
|
309
|
+
"collect",
|
|
310
|
+
"restore",
|
|
300
311
|
# scoring
|
|
301
312
|
"compare_stdout_results",
|
|
302
313
|
"extract_boxed_answer",
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"""Artifact collection and restoration across runtimes."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import shlex
|
|
7
|
+
import uuid
|
|
8
|
+
from pathlib import PurePosixPath
|
|
9
|
+
from typing import TYPE_CHECKING
|
|
10
|
+
|
|
11
|
+
from pydantic import Field
|
|
12
|
+
|
|
13
|
+
from verifiers.v1.types import StrictBaseModel
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from verifiers.v1.runtimes import Runtime
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
ARTIFACTS_DIR = "/logs/artifacts"
|
|
21
|
+
"""Implicit artifact directory; tasks that write here need no declaration."""
|
|
22
|
+
|
|
23
|
+
MAX_ARTIFACT_BYTES = 32 * 1024 * 1024
|
|
24
|
+
"""Ceiling per collection. Sized for a delta, not a tree: the grading box boots from the
|
|
25
|
+
agent's image, so the repo is already there and only its output has to travel."""
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class Artifact(StrictBaseModel):
|
|
29
|
+
"""One path to restore at the same location in another runtime."""
|
|
30
|
+
|
|
31
|
+
source: str
|
|
32
|
+
exclude: list[str] = Field(default_factory=list)
|
|
33
|
+
"""`tar --exclude` patterns, applied when `source` is a directory."""
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
async def collect(
|
|
37
|
+
runtime: Runtime, artifacts: list[Artifact] | None = None
|
|
38
|
+
) -> dict[str, bytes]:
|
|
39
|
+
"""Tar the convention dir and every declared path out of `runtime`.
|
|
40
|
+
|
|
41
|
+
Keyed by source path; the values are tar archives. Insertion order is the order
|
|
42
|
+
they were declared, and a path cannot be collected twice.
|
|
43
|
+
|
|
44
|
+
A declared source that is missing raises: it was declared because grading needs it,
|
|
45
|
+
and grading a partial state scores the rollout wrong rather than failing it. The
|
|
46
|
+
implicit convention sweep is exempt — most tasks never write there.
|
|
47
|
+
|
|
48
|
+
Each source is archived separately so its exclude patterns stay local.
|
|
49
|
+
"""
|
|
50
|
+
# Resolve relative sources against the runtime workdir. Joining also normalises
|
|
51
|
+
# `/work/` to `/work`, so one tree cannot key two entries (the source is both the
|
|
52
|
+
# dict key and `restore`'s rm -rf target).
|
|
53
|
+
workdir = PurePosixPath(getattr(runtime.config, "workdir", "") or "/")
|
|
54
|
+
declared = [
|
|
55
|
+
a.model_copy(update={"source": str(workdir / a.source)})
|
|
56
|
+
for a in artifacts or []
|
|
57
|
+
]
|
|
58
|
+
convention = PurePosixPath(ARTIFACTS_DIR)
|
|
59
|
+
sweep = not any(
|
|
60
|
+
(p := PurePosixPath(a.source)) == convention
|
|
61
|
+
or p.is_relative_to(convention)
|
|
62
|
+
or convention.is_relative_to(p)
|
|
63
|
+
for a in declared
|
|
64
|
+
)
|
|
65
|
+
entries = ([Artifact(source=ARTIFACTS_DIR)] if sweep else []) + declared
|
|
66
|
+
|
|
67
|
+
collected: dict[str, bytes] = {}
|
|
68
|
+
budget = MAX_ARTIFACT_BYTES
|
|
69
|
+
for artifact in entries:
|
|
70
|
+
source = artifact.source
|
|
71
|
+
if (await runtime.run(["test", "-e", source], {})).exit_code != 0:
|
|
72
|
+
if sweep and source == ARTIFACTS_DIR:
|
|
73
|
+
continue
|
|
74
|
+
raise RuntimeError(
|
|
75
|
+
f"declared artifact {source!r} does not exist in the runtime"
|
|
76
|
+
)
|
|
77
|
+
archive = await _tar_out(runtime, artifact, budget)
|
|
78
|
+
budget -= len(archive)
|
|
79
|
+
collected[source] = archive
|
|
80
|
+
|
|
81
|
+
logger.debug("collected artifact roots: %s", list(collected))
|
|
82
|
+
return collected
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
async def restore(runtime: Runtime, collected: dict[str, bytes]) -> None:
|
|
86
|
+
"""Extract `collected` in `runtime` at the original absolute paths."""
|
|
87
|
+
if not collected:
|
|
88
|
+
return
|
|
89
|
+
# Restoring into the subprocess runtime would extract absolute paths onto the
|
|
90
|
+
# developer's filesystem, so refuse it before any archive reaches the host.
|
|
91
|
+
if getattr(runtime.config, "type", None) == "subprocess":
|
|
92
|
+
raise RuntimeError(
|
|
93
|
+
"refusing to restore artifacts into the subprocess runtime: extraction "
|
|
94
|
+
"writes to absolute paths on the host. Grade in a container."
|
|
95
|
+
)
|
|
96
|
+
# Clear every root up front, not per entry: a later nested root would otherwise
|
|
97
|
+
# delete content an earlier one just restored. Clearing also drops any file or
|
|
98
|
+
# symlink the image left at the target.
|
|
99
|
+
roots = " ".join(shlex.quote(root) for root in collected)
|
|
100
|
+
await _run(runtime, f"rm -rf -- {roots}", "clear artifact roots")
|
|
101
|
+
for root, archive in collected.items():
|
|
102
|
+
path = f"/tmp/vf-artifact-{uuid.uuid4().hex}.tar"
|
|
103
|
+
await runtime.write(path, archive)
|
|
104
|
+
await _run(
|
|
105
|
+
runtime,
|
|
106
|
+
f"tar -xf {shlex.quote(path)} -C / && rm -f {shlex.quote(path)}",
|
|
107
|
+
f"restore artifact {root!r}",
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
async def _tar_out(runtime: Runtime, artifact: Artifact, budget: int) -> bytes:
|
|
112
|
+
path = f"/tmp/vf-artifact-{uuid.uuid4().hex}.tar"
|
|
113
|
+
excludes = " ".join(f"--exclude={shlex.quote(p)}" for p in artifact.exclude)
|
|
114
|
+
try:
|
|
115
|
+
await _run(
|
|
116
|
+
runtime,
|
|
117
|
+
f"tar -cf {shlex.quote(path)} -C / {excludes} -- "
|
|
118
|
+
f"{shlex.quote(artifact.source.lstrip('/'))}",
|
|
119
|
+
f"collect artifact {artifact.source!r}",
|
|
120
|
+
)
|
|
121
|
+
# Size it in the box: an oversized collection is refused before it reaches host
|
|
122
|
+
# memory, not after.
|
|
123
|
+
sized = await runtime.run(["sh", "-c", f"wc -c < {shlex.quote(path)}"], {})
|
|
124
|
+
if (raw := sized.stdout.strip()).isdigit() and int(raw) > budget:
|
|
125
|
+
raise RuntimeError(
|
|
126
|
+
f"artifact {artifact.source!r} takes the collection over the "
|
|
127
|
+
f"{MAX_ARTIFACT_BYTES} byte limit. The grading box boots from the "
|
|
128
|
+
"agent's image, so only the delta needs to travel — narrow the source "
|
|
129
|
+
"or add `exclude` patterns."
|
|
130
|
+
)
|
|
131
|
+
return await runtime.read(path)
|
|
132
|
+
finally:
|
|
133
|
+
# Best-effort: the box is about to be destroyed and the name is unique per call.
|
|
134
|
+
try:
|
|
135
|
+
await runtime.run(["rm", "-f", path], {})
|
|
136
|
+
except Exception:
|
|
137
|
+
logger.debug("failed to remove %s", path, exc_info=True)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
async def _run(runtime: Runtime, command: str, action: str) -> None:
|
|
141
|
+
result = await runtime.run(["sh", "-c", command], {})
|
|
142
|
+
if result.exit_code:
|
|
143
|
+
detail = (result.stderr or result.stdout).strip()[-500:]
|
|
144
|
+
raise RuntimeError(f"failed to {action}: {detail}")
|
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
"""agentic-judge: a solver plays the task, a judge verifies
|
|
1
|
+
"""agentic-judge: a solver plays the task, then a judge verifies the work.
|
|
2
2
|
|
|
3
|
-
A reusable env (`--env.id agentic-judge` over any taskset)
|
|
4
|
-
provisioned from
|
|
5
|
-
and a code-executing judge then inspects the work as the agent left it, with
|
|
6
|
-
the solver's full trace record uploaded at `/tmp/trace.json`. The judge grades
|
|
3
|
+
A reusable env (`--env.id agentic-judge` over any taskset). The solver plays the
|
|
4
|
+
task in a container provisioned from its runtime policy; the judge then grades
|
|
7
5
|
rubric criteria (`[env.task]`: policy prompt, criteria file) and writes its
|
|
8
|
-
verdicts to `/tmp/verdict.json
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
default).
|
|
6
|
+
verdicts to `/tmp/verdict.json`, with the solver's full trace record uploaded at
|
|
7
|
+
`/tmp/trace.json`. `finalize()` validates them strictly onto the solver's trace —
|
|
8
|
+
`judge/<name>` metrics plus a weighted-mean `judge` reward, composed with the
|
|
9
|
+
taskset's own rewards via `[env.score]` (judge-only by default).
|
|
10
|
+
|
|
11
|
+
`--env.share-runtime` controls whether the judge uses the solver's runtime. It is
|
|
12
|
+
enabled by default. When disabled, the judge gets a fresh runtime containing the
|
|
13
|
+
task's collected artifacts.
|
|
12
14
|
"""
|
|
13
15
|
|
|
14
16
|
import json
|
|
@@ -21,6 +23,7 @@ from pydantic import Field, field_validator
|
|
|
21
23
|
|
|
22
24
|
import verifiers.v1 as vf
|
|
23
25
|
from verifiers.v1.types import StrictBaseModel
|
|
26
|
+
from verifiers.v1.utils.compile import validate_pairing
|
|
24
27
|
|
|
25
28
|
VERDICT_FILE = "/tmp/verdict.json"
|
|
26
29
|
TRACE_FILE = "/tmp/trace.json"
|
|
@@ -97,19 +100,31 @@ def _render(template: str, **fields: str) -> str:
|
|
|
97
100
|
return pattern.sub(lambda m: fields[m.group(1)], template)
|
|
98
101
|
|
|
99
102
|
|
|
100
|
-
|
|
103
|
+
_RECORD_NOTE = f"""\
|
|
104
|
+
The agent's raw trace record (JSON: messages, tool calls, and its `info`
|
|
105
|
+
artifacts) is written by the harness — not the agent — at `{TRACE_FILE}`. The
|
|
106
|
+
record can be very large — never dump it whole; peek selectively (list its
|
|
107
|
+
keys, then slice out specific fields with python or jq) and pull only what you
|
|
108
|
+
need. It is complete — it may also carry the task's own scores/metrics and
|
|
109
|
+
reference material (a gold answer, a reference solution, held-out tests). Those
|
|
110
|
+
are context, not your standard: recorded scores can be wrong and references can
|
|
111
|
+
be narrower than the task; do not over-index on how a reference solves it. Your
|
|
112
|
+
verdict is what YOU verified by execution."""
|
|
113
|
+
|
|
114
|
+
SHARED_WORKSPACE_NOTE = f"""\
|
|
115
|
+
## Your workspace
|
|
116
|
+
|
|
117
|
+
The graded agent worked in this sandbox. Its edits and any scoring side effects
|
|
118
|
+
are present. {_RECORD_NOTE}"""
|
|
119
|
+
|
|
120
|
+
ISOLATED_WORKSPACE_NOTE = f"""\
|
|
101
121
|
## Your workspace
|
|
102
122
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
and pull only what you need. It is complete — it may also carry the task's own
|
|
109
|
-
scores/metrics and reference material (a gold answer, a reference solution,
|
|
110
|
-
held-out tests). Those are context, not your standard: recorded scores can be
|
|
111
|
-
wrong and references can be narrower than the task; do not over-index on how a
|
|
112
|
-
reference solves it. Your verdict is what YOU verified by execution."""
|
|
123
|
+
This is a fresh sandbox built from the task's image. The task's published
|
|
124
|
+
artifacts were restored at their original paths; other changes made by the
|
|
125
|
+
graded agent are not present. The usual artifact location is
|
|
126
|
+
`{vf.ARTIFACTS_DIR}/` (for code tasks, typically a patch to read or apply), plus
|
|
127
|
+
any task-declared paths. {_RECORD_NOTE}"""
|
|
113
128
|
|
|
114
129
|
HINT_SECTION = """\
|
|
115
130
|
## Hints
|
|
@@ -125,13 +140,30 @@ class JudgeTask(vf.Task):
|
|
|
125
140
|
|
|
126
141
|
NEEDS_CONTAINER = True
|
|
127
142
|
|
|
128
|
-
def __init__(
|
|
143
|
+
def __init__(
|
|
144
|
+
self,
|
|
145
|
+
data: vf.TaskData,
|
|
146
|
+
files: dict[str, bytes],
|
|
147
|
+
artifacts: dict[str, bytes],
|
|
148
|
+
) -> None:
|
|
129
149
|
super().__init__(data)
|
|
130
150
|
self.files = files
|
|
151
|
+
self.artifacts = artifacts
|
|
131
152
|
|
|
132
153
|
@classmethod
|
|
133
|
-
def from_trace(
|
|
134
|
-
|
|
154
|
+
def from_trace(
|
|
155
|
+
cls,
|
|
156
|
+
solution: vf.Trace,
|
|
157
|
+
config: "JudgeTaskConfig",
|
|
158
|
+
share_runtime: bool = True,
|
|
159
|
+
) -> "JudgeTask":
|
|
160
|
+
"""Mint the judge's task from the solver's finished trace.
|
|
161
|
+
|
|
162
|
+
`share_runtime` selects both the workspace note and artifact transport. In
|
|
163
|
+
the solver's box the published artifacts are already on disk, so none
|
|
164
|
+
travel; a fresh box gets the collected set, restored by `setup` at the
|
|
165
|
+
paths they had.
|
|
166
|
+
"""
|
|
135
167
|
solved = solution.task.data
|
|
136
168
|
files = {TRACE_FILE: json.dumps(solution.to_record()).encode()}
|
|
137
169
|
template = config.build_prompt()
|
|
@@ -139,7 +171,10 @@ class JudgeTask(vf.Task):
|
|
|
139
171
|
if "{prompt}" not in template:
|
|
140
172
|
# A policy that doesn't place the task statement itself still needs it.
|
|
141
173
|
body += "\n\n" + _render(TASK_SECTION, prompt=solved.prompt_text)
|
|
142
|
-
|
|
174
|
+
workspace_note = (
|
|
175
|
+
SHARED_WORKSPACE_NOTE if share_runtime else ISOLATED_WORKSPACE_NOTE
|
|
176
|
+
)
|
|
177
|
+
sections = [body, _verdict_section(config.criteria()), workspace_note]
|
|
143
178
|
if (hint := config.build_hint()) is not None:
|
|
144
179
|
sections.insert(1, _render(HINT_SECTION, hint=hint))
|
|
145
180
|
prompt = "\n\n".join(sections)
|
|
@@ -152,9 +187,11 @@ class JudgeTask(vf.Task):
|
|
|
152
187
|
resources=solved.resources,
|
|
153
188
|
),
|
|
154
189
|
files=files,
|
|
190
|
+
artifacts={} if share_runtime else solution.state.artifacts,
|
|
155
191
|
)
|
|
156
192
|
|
|
157
193
|
async def setup(self, trace: vf.Trace, runtime: vf.Runtime) -> None:
|
|
194
|
+
await vf.restore(runtime, self.artifacts)
|
|
158
195
|
# The solver had this box first: a pre-seeded verdict must never read as
|
|
159
196
|
# the judge's own, and a file (or planted symlink) at an upload path must
|
|
160
197
|
# never survive it — a symlinked TRACE_FILE would redirect the write onto
|
|
@@ -177,34 +214,53 @@ class JudgeTask(vf.Task):
|
|
|
177
214
|
trace.info["verdict"] = json.loads(raw)
|
|
178
215
|
|
|
179
216
|
|
|
217
|
+
class TextFile(vf.BaseConfig):
|
|
218
|
+
"""An explicit file-backed text value for config formats without `Path` values."""
|
|
219
|
+
|
|
220
|
+
path: Path
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
TextSource = str | Path | TextFile
|
|
224
|
+
|
|
225
|
+
|
|
180
226
|
class JudgeTaskConfig(vf.BaseConfig):
|
|
181
227
|
"""The judge's minted task: the grading policy and what lands in its box."""
|
|
182
228
|
|
|
183
|
-
prompt:
|
|
184
|
-
"""Grading
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
"""
|
|
189
|
-
|
|
190
|
-
|
|
229
|
+
prompt: TextSource | None = None
|
|
230
|
+
"""Grading policy: a string is inline text; a `Path` in Python or
|
|
231
|
+
`{ path = "policy.md" }` in config reads a file. Replaces only the policy
|
|
232
|
+
body — the verdict contract and workspace note are always appended. May
|
|
233
|
+
reference `{prompt}` (the solver task's prompt); if it doesn't, the task
|
|
234
|
+
statement is appended after."""
|
|
235
|
+
hint: TextSource | None = None
|
|
236
|
+
"""Optional hints, with the same explicit inline/file forms as `prompt`,
|
|
237
|
+
injected as their own section: task-family pointers into the trace or box —
|
|
238
|
+
e.g. for math, where the reference answer lives in the record; for SWE, to
|
|
239
|
+
diff the repo or read `info.patch`."""
|
|
191
240
|
rubric: Path | None = None
|
|
192
241
|
"""Criteria the judge grades against: a `.toml`/`.json` file with a
|
|
193
242
|
`criteria` list — the plugged rubric judge's format, so the same rubric
|
|
194
243
|
files work for both. None grades the single built-in `solved` criterion."""
|
|
195
244
|
|
|
245
|
+
@staticmethod
|
|
246
|
+
def _resolve(value: TextSource) -> str:
|
|
247
|
+
if isinstance(value, str):
|
|
248
|
+
return value
|
|
249
|
+
path = value if isinstance(value, Path) else value.path
|
|
250
|
+
return path.read_text(encoding="utf-8")
|
|
251
|
+
|
|
196
252
|
def build_prompt(self) -> str:
|
|
197
253
|
if self.prompt is None:
|
|
198
254
|
return GRADE_PROMPT + "\n\n" + TASK_SECTION
|
|
199
|
-
return self.prompt
|
|
255
|
+
return self._resolve(self.prompt)
|
|
200
256
|
|
|
201
257
|
def build_hint(self) -> str | None:
|
|
202
|
-
return self.hint
|
|
258
|
+
return self._resolve(self.hint) if self.hint is not None else None
|
|
203
259
|
|
|
204
260
|
def criteria(self) -> list[Criterion]:
|
|
205
261
|
if self.rubric is None:
|
|
206
262
|
return [SOLVED]
|
|
207
|
-
text = self.rubric.read_text()
|
|
263
|
+
text = self.rubric.read_text(encoding="utf-8")
|
|
208
264
|
data = (
|
|
209
265
|
tomllib.loads(text)
|
|
210
266
|
if self.rubric.suffix.lower() == ".toml"
|
|
@@ -241,23 +297,23 @@ class ScoreConfig(vf.BaseConfig):
|
|
|
241
297
|
|
|
242
298
|
class AgenticJudgeEnvConfig(vf.EnvConfig):
|
|
243
299
|
solver: vf.AgentConfig = vf.AgentConfig()
|
|
244
|
-
"""The solver agent.
|
|
245
|
-
|
|
300
|
+
"""The solver agent. Its runtime must be a container:
|
|
301
|
+
`--env.solver.runtime.type docker|prime`."""
|
|
246
302
|
judge: vf.AgentConfig = vf.AgentConfig()
|
|
247
|
-
"""The judge agent.
|
|
248
|
-
|
|
303
|
+
"""The judge agent. Its runtime is ignored when `share_runtime` is enabled;
|
|
304
|
+
otherwise it must be a container."""
|
|
305
|
+
share_runtime: bool = True
|
|
306
|
+
"""Whether the judge grades in the solver's runtime."""
|
|
249
307
|
task: JudgeTaskConfig = JudgeTaskConfig()
|
|
250
308
|
score: ScoreConfig = ScoreConfig()
|
|
251
309
|
|
|
252
310
|
|
|
253
311
|
class AgenticJudgeEnv(vf.Env[AgenticJudgeEnvConfig]):
|
|
254
312
|
def __init__(self, config: AgenticJudgeEnvConfig) -> None:
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
update={"runtime": config.solver.runtime}
|
|
260
|
-
)
|
|
313
|
+
if config.share_runtime:
|
|
314
|
+
config.judge = config.judge.model_copy(
|
|
315
|
+
update={"runtime": config.solver.runtime}
|
|
316
|
+
)
|
|
261
317
|
super().__init__(config)
|
|
262
318
|
self._check_agents()
|
|
263
319
|
# A missing policy file or a malformed rubric fails here, not mid-episode.
|
|
@@ -271,30 +327,42 @@ class AgenticJudgeEnv(vf.Env[AgenticJudgeEnvConfig]):
|
|
|
271
327
|
judge = self._harnesses["judge"]
|
|
272
328
|
if not judge.EXECUTES_CODE:
|
|
273
329
|
raise ValueError(
|
|
274
|
-
"agentic-judge
|
|
330
|
+
"agentic-judge requires a judge harness that can execute code, but "
|
|
275
331
|
f"harness {judge.config.id!r} is a tool-less chat loop — a verdict "
|
|
276
332
|
"that needs no execution is a plugged judge "
|
|
277
333
|
"(--env.taskset.task.judges), not an agent."
|
|
278
334
|
)
|
|
279
335
|
if isinstance(self.config.solver.runtime, vf.SubprocessConfig):
|
|
280
336
|
raise TypeError(
|
|
281
|
-
"agentic-judge
|
|
282
|
-
"
|
|
337
|
+
"agentic-judge requires the solver to run in a container, but it "
|
|
338
|
+
"resolves to the subprocess runtime; use "
|
|
283
339
|
"--env.solver.runtime.type docker or prime"
|
|
284
340
|
)
|
|
341
|
+
validate_pairing(judge, JudgeTask, self.config.judge.runtime)
|
|
285
342
|
|
|
286
343
|
async def setup(self, agents: vf.Agents) -> None:
|
|
287
344
|
# The judge grades the policy; its tokens are never training data.
|
|
288
345
|
agents.judge.trainable = False
|
|
289
346
|
|
|
290
347
|
async def run(self, task: vf.Task, agents: vf.Agents) -> None:
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
348
|
+
if self.config.share_runtime:
|
|
349
|
+
async with agents.solver.provision(task) as box:
|
|
350
|
+
solution = await agents.solver.run(task, runtime=box)
|
|
351
|
+
judge_task = JudgeTask.from_trace(solution, self.config.task)
|
|
352
|
+
await agents.judge.run(judge_task, runtime=box)
|
|
353
|
+
return
|
|
354
|
+
|
|
355
|
+
solution = await agents.solver.run(task)
|
|
356
|
+
if not solution.ok:
|
|
357
|
+
return
|
|
358
|
+
await agents.judge.run(
|
|
359
|
+
JudgeTask.from_trace(solution, self.config.task, share_runtime=False)
|
|
360
|
+
)
|
|
295
361
|
|
|
296
362
|
async def finalize(self, task: vf.Task, episode: vf.Episode) -> None:
|
|
297
363
|
by_agent = {t.agent.name: t for t in episode.traces}
|
|
364
|
+
if "judge" not in by_agent:
|
|
365
|
+
return
|
|
298
366
|
solution, verdict = by_agent["solver"], by_agent["judge"]
|
|
299
367
|
data = verdict.info.get("verdict")
|
|
300
368
|
if not isinstance(data, dict) or not isinstance(data.get("verdicts"), list):
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"""Mutable state shared within one rollout.
|
|
2
2
|
|
|
3
3
|
Tool servers synchronize it through the interception state channel. It is excluded
|
|
4
|
-
from serialized traces
|
|
4
|
+
from serialized traces.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
from pydantic import ConfigDict
|
|
7
|
+
from pydantic import ConfigDict, Field
|
|
8
8
|
from typing_extensions import TypeVar
|
|
9
9
|
|
|
10
10
|
from verifiers.v1.types import StrictBaseModel
|
|
@@ -13,6 +13,7 @@ from verifiers.v1.utils.generic import concrete_type
|
|
|
13
13
|
|
|
14
14
|
class State(StrictBaseModel):
|
|
15
15
|
model_config = ConfigDict(ser_json_inf_nan="constants")
|
|
16
|
+
artifacts: dict[str, bytes] = Field(default_factory=dict)
|
|
16
17
|
|
|
17
18
|
|
|
18
19
|
StateT = TypeVar("StateT", bound=State, default=State)
|
|
@@ -34,6 +34,7 @@ from pydantic import ConfigDict, Field
|
|
|
34
34
|
from pydantic_config import BaseConfig
|
|
35
35
|
from typing_extensions import TypeVar
|
|
36
36
|
|
|
37
|
+
from verifiers.v1.artifacts import Artifact
|
|
37
38
|
from verifiers.v1.configs.task import TaskConfig
|
|
38
39
|
from verifiers.v1.decorators import discover_decorated, invoke_all
|
|
39
40
|
from verifiers.v1.errors import TaskError, boundary
|
|
@@ -102,6 +103,11 @@ class TaskData(StrictBaseModel):
|
|
|
102
103
|
"""Execution-time destinations denied by this task and combined with runtime
|
|
103
104
|
blocks. Non-empty concrete allowlists cannot be combined with blocklists. Docker
|
|
104
105
|
framework routes take precedence; ordinary Prime deny rules pass through unchanged."""
|
|
106
|
+
artifacts: list[Artifact] = Field(default_factory=list)
|
|
107
|
+
"""Paths collected from one runtime and restored at the same locations in another,
|
|
108
|
+
on top of the implicitly collected `/logs/artifacts/` convention dir. Declare
|
|
109
|
+
runtime outputs that must cross that boundary. A declared path that is missing at
|
|
110
|
+
collection time fails the rollout."""
|
|
105
111
|
timeout: TaskTimeout = TaskTimeout()
|
|
106
112
|
resources: TaskResources = TaskResources()
|
|
107
113
|
|