verifiers 0.3.1.dev33__tar.gz → 0.3.1.dev35__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.3.1.dev33 → verifiers-0.3.1.dev35}/PKG-INFO +2 -2
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/pyproject.toml +2 -1
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/conftest.py +2 -1
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/test_e2e.py +4 -3
- verifiers-0.3.1.dev35/verifiers/v1/cli/eval/main.py +152 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/eval/resume.py +4 -21
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/eval/runner.py +5 -5
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/gepa.py +14 -2
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/output.py +45 -33
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/replay.py +14 -11
- verifiers-0.3.1.dev35/verifiers/v1/cli/resume.py +15 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/validate.py +36 -44
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/cli/eval.py +59 -12
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/cli/validate.py +24 -10
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/gepa/config.py +16 -9
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/gepa/runner.py +2 -2
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/claude_code/harness.py +2 -2
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/codex/harness.py +2 -2
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/kimi_code/harness.py +1 -1
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/pi/harness.py +2 -2
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/terminus_2/harness.py +1 -1
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/runtimes/__init__.py +7 -1
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/runtimes/prime.py +14 -2
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/trace.py +4 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/platform.py +2 -2
- verifiers-0.3.1.dev33/verifiers/v1/cli/eval/main.py +0 -116
- verifiers-0.3.1.dev33/verifiers/v1/cli/resume.py +0 -31
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/.gitignore +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/LICENSE +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/README.md +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/conftest.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_browser_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_build_script.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_client_config.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_composable_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_env_group.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_env_server.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_environment.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_environment_extra.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_error_chain.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_eval_display.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_eval_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_gym_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_imports.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_init_script.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_install_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_interception_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_logging.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_math_rubric.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_message_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_openenv_client.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_parser.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_path_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_renderer_client.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_rubric.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_rubric_group.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_save_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_setup_script.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_think_parser.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_tool_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_tool_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_types.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_xml_parser.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/fixtures/duet_v1.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/test_configs.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/test_envs.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/test_graph.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/test_judges.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/test_taskset.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/test_trace.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/tui.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/clients/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/clients/client.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/clients/openai_completions_client.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/clients/openai_responses_client.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/clients/renderer_client.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/decorators.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/env_group.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/environment.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/README.md +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/README.md +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/task.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/gym_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/README.md +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/multiturn_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/python_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/sandbox_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/singleturn_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/stateful_tool_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/tool_env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/errors.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/gepa/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/gepa/adapter.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/gepa/config.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/gepa/display.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/gepa/gepa_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/parsers/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/parsers/parser.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/parsers/think_parser.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/parsers/xml_parser.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/rubrics/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/rubrics/judge_rubric.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/rubrics/math_rubric.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/rubrics/rubric.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/rubrics/rubric_group.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/scripts/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/scripts/build.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/scripts/eval.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/scripts/gepa.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/scripts/init.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/scripts/install.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/scripts/setup.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/scripts/tui.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/serve/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/serve/client/env_client.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/serve/server/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/serve/server/env_router.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/serve/server/env_server.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/serve/server/env_worker.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/serve/types.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/types.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/async_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/client_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/config_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/data_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/display_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/env_config_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/env_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/error_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/eval_display.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/eval_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/heartbeat.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/import_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/install_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/interception_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/logging_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/message_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/metric_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/path_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/pricing_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/process_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/response_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/save_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/serve_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/thread_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/tool_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/usage_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/version_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/acp/runner.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/agent.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/clients/base.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/agent.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/cli/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/cli/debug.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/cli/env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/cli/init.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/cli/replay.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/client.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/harness.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/judge.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/retries.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/runtime.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/task.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/taskset.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/envs/agentic_judge/env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/envs/user_sim/env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/episode.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/errors.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/graph.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harness.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/bash/program.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/browser_use/program.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/node.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/pool/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/pool/harness.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/interception/tool.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/judge.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/runtimes/docker/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/serve/encoding.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/session.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/state.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/task.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/harbor/env.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/types.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/artifacts.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/compile.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/decorators.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/install_utils.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/loaders.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/paths.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/prime.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/retries.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/score.py +0 -0
- {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.3.1.
|
|
3
|
+
Version: 0.3.1.dev35
|
|
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
|
|
@@ -51,7 +51,7 @@ Provides-Extra: browser
|
|
|
51
51
|
Requires-Dist: python-dotenv>=1.0.0; extra == 'browser'
|
|
52
52
|
Requires-Dist: stagehand>=3.4.0; extra == 'browser'
|
|
53
53
|
Provides-Extra: harbor
|
|
54
|
-
Requires-Dist: harbor==0.
|
|
54
|
+
Requires-Dist: harbor==0.21.0; (python_full_version >= '3.12') and extra == 'harbor'
|
|
55
55
|
Provides-Extra: modal
|
|
56
56
|
Requires-Dist: modal>=1.4.0; extra == 'modal'
|
|
57
57
|
Provides-Extra: nemo-gym
|
|
@@ -109,7 +109,7 @@ browser = [
|
|
|
109
109
|
]
|
|
110
110
|
harbor = [
|
|
111
111
|
# Harbor currently publishes Python 3.12+ packages; keep core verifiers installable on 3.11.
|
|
112
|
-
"harbor==0.
|
|
112
|
+
"harbor==0.21.0 ; python_full_version >= '3.12'",
|
|
113
113
|
]
|
|
114
114
|
modal = [
|
|
115
115
|
"modal>=1.4.0",
|
|
@@ -186,6 +186,7 @@ web-search-interception = { path = "environments/web_search_interception", edita
|
|
|
186
186
|
# Bounded cutoffs for the explicitly requested tool upgrades.
|
|
187
187
|
# Full UTC timestamps: bare dates resolve to local-tz midnight and churn the
|
|
188
188
|
# lockfile across timezones.
|
|
189
|
+
harbor = "2026-08-11T00:00:00Z"
|
|
189
190
|
ruff = "2026-07-28T00:00:00Z"
|
|
190
191
|
ty = "2026-07-28T00:00:00Z"
|
|
191
192
|
# PrimeIntellect-published on PyPI (trusted publisher)
|
|
@@ -184,7 +184,8 @@ def _eval_config(
|
|
|
184
184
|
"reasoning_effort": reasoning_effort,
|
|
185
185
|
},
|
|
186
186
|
rich=False,
|
|
187
|
-
output_dir=output_dir,
|
|
187
|
+
output_dir=output_dir.parent,
|
|
188
|
+
run={"dir": output_dir.name},
|
|
188
189
|
**({"serve": {"pool": pool}} if pool else {}),
|
|
189
190
|
model=CI_MODEL,
|
|
190
191
|
)
|
|
@@ -662,10 +662,9 @@ async def test_replay_round_trip(run_v1, tmp_path):
|
|
|
662
662
|
typed rebuild fails and the trace-only `@reward` silently stops running (the
|
|
663
663
|
wire-narrowing regression). Trace-only rewards are deterministic given the transcript,
|
|
664
664
|
so all three generations must agree."""
|
|
665
|
-
import tomllib
|
|
666
665
|
from pathlib import Path
|
|
667
666
|
|
|
668
|
-
from verifiers.v1.cli.output import
|
|
667
|
+
from verifiers.v1.cli.output import saved_config_path
|
|
669
668
|
from verifiers.v1.cli.replay import run_replay
|
|
670
669
|
from verifiers.v1.configs.cli.replay import ReplayConfig
|
|
671
670
|
|
|
@@ -683,7 +682,9 @@ async def test_replay_round_trip(run_v1, tmp_path):
|
|
|
683
682
|
async def replay(source_dir: Path, out: Path):
|
|
684
683
|
# The CLI's layering, minus the argv plumbing: the saved run's config is the base
|
|
685
684
|
# (`ReplayConfig` ignores its eval-only keys), the source's output_dir is dropped.
|
|
686
|
-
|
|
685
|
+
import json
|
|
686
|
+
|
|
687
|
+
data = json.loads(saved_config_path(source_dir).read_text())
|
|
687
688
|
data.pop("output_dir", None)
|
|
688
689
|
config = ReplayConfig(**{**data, "rich": False})
|
|
689
690
|
(trace,) = await run_replay(config, source_dir, out)
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"""Eval CLI entrypoint."""
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
import json
|
|
5
|
+
import logging
|
|
6
|
+
import shutil
|
|
7
|
+
import sys
|
|
8
|
+
|
|
9
|
+
from pydantic_config import cli
|
|
10
|
+
|
|
11
|
+
import verifiers.v1 as vf
|
|
12
|
+
from verifiers.v1.cli.eval.runner import run_eval
|
|
13
|
+
from verifiers.v1.cli.output import (
|
|
14
|
+
TRACES_FILE,
|
|
15
|
+
config_digest,
|
|
16
|
+
output_path,
|
|
17
|
+
saved_config_path,
|
|
18
|
+
write_config,
|
|
19
|
+
)
|
|
20
|
+
from verifiers.v1.cli.resolve import (
|
|
21
|
+
extract_id,
|
|
22
|
+
narrow_config,
|
|
23
|
+
plugin_errors,
|
|
24
|
+
references_config_file,
|
|
25
|
+
with_positional_taskset,
|
|
26
|
+
)
|
|
27
|
+
from verifiers.v1.configs.cli.eval import EvalConfig
|
|
28
|
+
from verifiers.v1.utils.interrupt import install_interrupt
|
|
29
|
+
from verifiers.v1.utils.logging import setup_logging
|
|
30
|
+
|
|
31
|
+
logger = logging.getLogger(__name__)
|
|
32
|
+
|
|
33
|
+
USAGE = (
|
|
34
|
+
"usage: uv run eval [<taskset-id>] [--env.id <id>] [options] [@ file.toml]\n"
|
|
35
|
+
" uv run eval @ <run-dir>/configs/eval.json --resume (re-run the run's missing/errored rollouts)"
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def main(argv: list[str] | None = None) -> None:
|
|
40
|
+
argv = with_positional_taskset(list(sys.argv[1:]) if argv is None else list(argv))
|
|
41
|
+
|
|
42
|
+
if not argv or any(arg in ("-h", "--help") for arg in argv):
|
|
43
|
+
print(USAGE)
|
|
44
|
+
sys.argv = [sys.argv[0], "--help"]
|
|
45
|
+
with plugin_errors():
|
|
46
|
+
cli(
|
|
47
|
+
narrow_config(EvalConfig, argv)
|
|
48
|
+
) # full option help, narrowed to the given ids
|
|
49
|
+
return
|
|
50
|
+
# An env-block flag (or a since-moved flat axis) skips the usage gate so the
|
|
51
|
+
# typed parse renders its did-you-mean instead of a bare usage line.
|
|
52
|
+
typed_axis = any(
|
|
53
|
+
a.startswith(("--env.", "--taskset.", "--harness.", "--serve.")) for a in argv
|
|
54
|
+
)
|
|
55
|
+
if (
|
|
56
|
+
not extract_id(argv, "env.taskset")
|
|
57
|
+
and not references_config_file(argv)
|
|
58
|
+
and not typed_axis
|
|
59
|
+
):
|
|
60
|
+
raise SystemExit(
|
|
61
|
+
USAGE
|
|
62
|
+
) # need a taskset (positional / --env.taskset.id) or a @ file.toml
|
|
63
|
+
|
|
64
|
+
with plugin_errors():
|
|
65
|
+
config_type = narrow_config(EvalConfig, argv)
|
|
66
|
+
sys.argv = [
|
|
67
|
+
sys.argv[0],
|
|
68
|
+
*argv,
|
|
69
|
+
] # let prime-pydantic-config render help/errors
|
|
70
|
+
config = cli(config_type)
|
|
71
|
+
# A named run directory is re-entered only by `--resume` or wiped by `--clean`: any
|
|
72
|
+
# other write into it — the dry-run config.toml included, which would clobber the
|
|
73
|
+
# config a resume typically re-runs — would overwrite the previous run.
|
|
74
|
+
run_path = output_path(config)
|
|
75
|
+
if config.clean and not config.resume and run_path.exists():
|
|
76
|
+
if not run_path.resolve().is_relative_to(config.output_dir.resolve()):
|
|
77
|
+
raise SystemExit("--clean requires run.dir to remain under output_dir")
|
|
78
|
+
shutil.rmtree(run_path)
|
|
79
|
+
traces_file = run_path / TRACES_FILE
|
|
80
|
+
if not config.resume and traces_file.exists() and traces_file.stat().st_size > 0:
|
|
81
|
+
raise SystemExit(
|
|
82
|
+
f"run directory {run_path} already contains results - append --resume to "
|
|
83
|
+
"re-run its missing/errored rollouts, overwrite it with --clean, or pick "
|
|
84
|
+
"another --run.name"
|
|
85
|
+
)
|
|
86
|
+
if config.resume:
|
|
87
|
+
# A resumed eval is only trustworthy under the exact config that produced the
|
|
88
|
+
# existing rollouts — anything else silently mixes incomparable results. Saved
|
|
89
|
+
# configs are full JSON dumps (nulls included), so the comparison is exact.
|
|
90
|
+
saved_path = saved_config_path(run_path)
|
|
91
|
+
if saved_path is None:
|
|
92
|
+
raise SystemExit(
|
|
93
|
+
f"--resume: no saved config under {run_path} - not a run dir"
|
|
94
|
+
)
|
|
95
|
+
with plugin_errors():
|
|
96
|
+
saved = config_type.model_validate(json.loads(saved_path.read_text()))
|
|
97
|
+
if config_digest(saved) != config_digest(config):
|
|
98
|
+
saved_dump = saved.model_dump(mode="json")
|
|
99
|
+
current_dump = config.model_dump(mode="json")
|
|
100
|
+
changed = sorted(
|
|
101
|
+
key
|
|
102
|
+
for key in set(saved_dump) | set(current_dump)
|
|
103
|
+
if saved_dump.get(key) != current_dump.get(key)
|
|
104
|
+
)
|
|
105
|
+
raise SystemExit(
|
|
106
|
+
f"--resume requires the exact config the run was started with - it "
|
|
107
|
+
f"differs in [{', '.join(changed)}]. Resumed rollouts would not be "
|
|
108
|
+
f"comparable; re-run with `uv run eval @ {saved_path} --resume`, or "
|
|
109
|
+
"start a fresh run"
|
|
110
|
+
)
|
|
111
|
+
if config.dry_run: # resolved + validated; write it to the output dir and exit
|
|
112
|
+
setup_logging("DEBUG" if config.verbose else "INFO")
|
|
113
|
+
logger.info("wrote config to %s", write_config(config, output_path(config)))
|
|
114
|
+
return
|
|
115
|
+
# Execution path: in-process by default; `--server` opts into the env-server worker pool
|
|
116
|
+
# (the path prime-rl trains through). The `--rich` dashboard reads live in-process run
|
|
117
|
+
# slots, so it's in-process only (`server + rich` is rejected at config validation).
|
|
118
|
+
# Always tee the run's logs to a file under the output dir (in-process and server mode).
|
|
119
|
+
log_file = str(output_path(config) / "logs" / "eval.log")
|
|
120
|
+
level = "DEBUG" if config.verbose else "INFO"
|
|
121
|
+
if config.rich:
|
|
122
|
+
setup_logging(level, log_file=log_file, console=False)
|
|
123
|
+
# drop stray stdlib records that bypass loguru (else they print over the UI)
|
|
124
|
+
logging.lastResort = None
|
|
125
|
+
else:
|
|
126
|
+
setup_logging(level, log_file=log_file, console=True)
|
|
127
|
+
# First Ctrl-C / SIGTERM warns and raises KeyboardInterrupt so a killed/timed-out eval still
|
|
128
|
+
# runs each rollout's `finally` (tears down containers/sandboxes) and any worker pool it
|
|
129
|
+
# spawned; further signals during that cleanup are swallowed so an impatient second Ctrl-C
|
|
130
|
+
# can't orphan those resources.
|
|
131
|
+
install_interrupt()
|
|
132
|
+
|
|
133
|
+
try:
|
|
134
|
+
if config.server: # opt-in: drive rollouts through the env-server worker pool
|
|
135
|
+
from verifiers.v1.cli.eval.runner import run_eval_server
|
|
136
|
+
|
|
137
|
+
episodes = asyncio.run(run_eval_server(config))
|
|
138
|
+
else: # in-process (default), with or without the live dashboard
|
|
139
|
+
env = vf.load_environment(config.env)
|
|
140
|
+
episodes = asyncio.run(run_eval(env, config))
|
|
141
|
+
except KeyboardInterrupt:
|
|
142
|
+
# Graceful cleanup has already run (each rollout's `finally`); partial results are on
|
|
143
|
+
# disk. Exit on the conventional Ctrl-C code without a traceback.
|
|
144
|
+
raise SystemExit(130)
|
|
145
|
+
if config.push and not config.rich:
|
|
146
|
+
from verifiers.v1.utils.platform import push_traces
|
|
147
|
+
|
|
148
|
+
push_traces(episodes, config)
|
|
149
|
+
if not config.rich: # --rich is the whole output; otherwise dump each trace as JSON
|
|
150
|
+
for episode in episodes:
|
|
151
|
+
for trace in episode.traces:
|
|
152
|
+
print(trace.model_dump_json(indent=2, exclude_none=True))
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
"""Resume an interrupted eval: reload its finished rollouts and run only the rest.
|
|
2
2
|
|
|
3
|
-
`--resume
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
redone).
|
|
3
|
+
`--resume` re-enters the run dir the resolved config points at and writes back into
|
|
4
|
+
it. `load` keeps the good saved rollouts and re-runs what's owed: missing rollouts
|
|
5
|
+
(never written) and errored ones (dropped and redone).
|
|
7
6
|
|
|
8
7
|
A saved rollout is matched to a selected task by content: `task_key` hashes the
|
|
9
8
|
task's wire data. Tasks with identical data are interchangeable, a task whose data
|
|
@@ -11,34 +10,18 @@ changed since the interrupted run re-runs, and nothing depends on `data.idx`.
|
|
|
11
10
|
"""
|
|
12
11
|
|
|
13
12
|
import json
|
|
14
|
-
import tomllib
|
|
15
13
|
from collections import Counter, defaultdict
|
|
16
14
|
from collections.abc import Callable
|
|
17
15
|
from pathlib import Path
|
|
18
16
|
|
|
19
17
|
from pydantic_core import from_json
|
|
20
18
|
|
|
21
|
-
from verifiers.v1.cli.output import
|
|
22
|
-
from verifiers.v1.configs.cli.eval import EvalConfig
|
|
19
|
+
from verifiers.v1.cli.output import TRACES_FILE, sniff_episode
|
|
23
20
|
from verifiers.v1.episode import Episode, WireEpisode
|
|
24
21
|
from verifiers.v1.task import task_key
|
|
25
22
|
from verifiers.v1.trace import WireTrace
|
|
26
23
|
|
|
27
24
|
|
|
28
|
-
def load_resume_config(resume_dir: Path) -> EvalConfig:
|
|
29
|
-
"""Rebuild the run's `EvalConfig` from its saved `config.toml`, pointed back at its own
|
|
30
|
-
output dir so the resumed rollouts append to the same `traces.jsonl`."""
|
|
31
|
-
config_path = resume_dir / CONFIG_FILE
|
|
32
|
-
if not config_path.exists():
|
|
33
|
-
raise SystemExit(
|
|
34
|
-
f"--resume: no config.toml in {resume_dir} - not an eval output dir"
|
|
35
|
-
)
|
|
36
|
-
config = EvalConfig.model_validate(tomllib.loads(config_path.read_text()))
|
|
37
|
-
config.resume = resume_dir
|
|
38
|
-
config.output_dir = resume_dir
|
|
39
|
-
return config
|
|
40
|
-
|
|
41
|
-
|
|
42
25
|
def load(
|
|
43
26
|
resume_dir: Path,
|
|
44
27
|
selected_keys: list[str],
|
|
@@ -44,7 +44,7 @@ async def run_eval(env: Env, config: EvalConfig) -> list[Episode]:
|
|
|
44
44
|
plan = [(task, config.num_rollouts) for task in tasks]
|
|
45
45
|
# Kept on-disk rollouts rejoin the run as finished episodes; only owed ones re-run.
|
|
46
46
|
finished: list[Episode] = []
|
|
47
|
-
if config.resume
|
|
47
|
+
if config.resume:
|
|
48
48
|
keys = [task.hash for task in tasks]
|
|
49
49
|
finished, owed = resume.load(out, keys, config.num_rollouts, env.complete)
|
|
50
50
|
if not owed: # already complete - report it and exit successfully
|
|
@@ -73,7 +73,7 @@ async def run_eval(env: Env, config: EvalConfig) -> list[Episode]:
|
|
|
73
73
|
|
|
74
74
|
async def on_complete(episode: Episode) -> None:
|
|
75
75
|
for trace in episode.traces:
|
|
76
|
-
trace.record_run(EvalRunInfo(id=config.
|
|
76
|
+
trace.record_run(EvalRunInfo(id=config.run.id, name=config.run.name))
|
|
77
77
|
await append_episode(out, episode, write_lock)
|
|
78
78
|
|
|
79
79
|
# Serving resources (shared tool servers, interception) come up once for the
|
|
@@ -136,7 +136,7 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
|
|
|
136
136
|
# Spawned processes inherit no logging — hand them the main process's setup so
|
|
137
137
|
# their rollout logs land in the output dir.
|
|
138
138
|
level = "DEBUG" if config.verbose else "INFO"
|
|
139
|
-
log_file = str(output_path(config) / "eval.log")
|
|
139
|
+
log_file = str(output_path(config) / "logs" / "eval.log")
|
|
140
140
|
mpctx = mp.get_context("spawn")
|
|
141
141
|
address_queue: mp.Queue = mpctx.Queue()
|
|
142
142
|
# Death pipe: serve_env self-terminates if this process dies abruptly — we keep
|
|
@@ -168,7 +168,7 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
|
|
|
168
168
|
]
|
|
169
169
|
out = output_path(config)
|
|
170
170
|
finished: list[Episode] = []
|
|
171
|
-
if config.resume
|
|
171
|
+
if config.resume:
|
|
172
172
|
keys = [task.hash for task in tasks]
|
|
173
173
|
finished, owed = resume.load(out, keys, config.num_rollouts)
|
|
174
174
|
counts = distribute(keys, owed, config.num_rollouts)
|
|
@@ -206,7 +206,7 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
|
|
|
206
206
|
**payload,
|
|
207
207
|
)
|
|
208
208
|
for trace in episode.traces:
|
|
209
|
-
trace.record_run(EvalRunInfo(id=config.
|
|
209
|
+
trace.record_run(EvalRunInfo(id=config.run.id, name=config.run.name))
|
|
210
210
|
await append_episode(out, episode, write_lock)
|
|
211
211
|
return [episode]
|
|
212
212
|
|
|
@@ -14,7 +14,7 @@ import sys
|
|
|
14
14
|
from pydantic_config import cli
|
|
15
15
|
|
|
16
16
|
import verifiers.v1 as vf
|
|
17
|
-
from verifiers.v1.cli.output import output_path, write_config
|
|
17
|
+
from verifiers.v1.cli.output import TRACES_FILE, output_path, write_config
|
|
18
18
|
from verifiers.v1.cli.resolve import (
|
|
19
19
|
extract_id,
|
|
20
20
|
narrow_config,
|
|
@@ -69,8 +69,20 @@ def main(argv: list[str] | None = None) -> None:
|
|
|
69
69
|
"gepa optimizes one agent's prompt against per-trace rewards and can't "
|
|
70
70
|
"drive a multi-agent interaction — only eval runs those"
|
|
71
71
|
)
|
|
72
|
+
# A named run directory is never silently reused: any write into it — the dry-run
|
|
73
|
+
# config included, which would destroy the existing traces' config provenance —
|
|
74
|
+
# would overwrite the previous run.
|
|
75
|
+
traces_file = output_path(config) / TRACES_FILE
|
|
76
|
+
if traces_file.exists() and traces_file.stat().st_size > 0:
|
|
77
|
+
raise SystemExit(
|
|
78
|
+
f"run directory {output_path(config)} already contains results - "
|
|
79
|
+
"pick another --run.name or delete it"
|
|
80
|
+
)
|
|
81
|
+
|
|
72
82
|
if config.dry_run: # resolved + validated; write it to the output dir and exit
|
|
73
|
-
logger.info(
|
|
83
|
+
logger.info(
|
|
84
|
+
"wrote config to %s", write_config(config, output_path(config), "gepa.json")
|
|
85
|
+
)
|
|
74
86
|
return
|
|
75
87
|
|
|
76
88
|
# First Ctrl-C / SIGTERM warns and raises KeyboardInterrupt so a killed/timed-out run still
|
|
@@ -11,63 +11,75 @@ before the episode atom (one bare trace per line) are still readable:
|
|
|
11
11
|
"""
|
|
12
12
|
|
|
13
13
|
import asyncio
|
|
14
|
+
import hashlib
|
|
14
15
|
import json
|
|
15
16
|
from functools import cache
|
|
16
17
|
from pathlib import Path
|
|
17
18
|
|
|
18
|
-
import tomli_w
|
|
19
19
|
from pydantic import BaseModel, TypeAdapter
|
|
20
20
|
|
|
21
21
|
from verifiers.v1.configs.cli.eval import EvalConfig
|
|
22
22
|
from verifiers.v1.episode import Episode, WireEpisode
|
|
23
23
|
from verifiers.v1.trace import Trace
|
|
24
24
|
from verifiers.v1.utils.aio import run_shielded
|
|
25
|
-
from verifiers.v1.utils.install import env_name
|
|
26
25
|
|
|
27
26
|
TRACES_FILE = "traces.jsonl"
|
|
28
27
|
"""Filename a run's rollout episodes are written to (one JSON episode per line)."""
|
|
29
28
|
|
|
30
|
-
|
|
31
|
-
"""
|
|
29
|
+
CONFIG_DIR = "configs"
|
|
30
|
+
"""Directory inside a run dir holding its resolved config (one `<cli>.json`, re-runnable
|
|
31
|
+
via `@ <run-dir>/configs/<cli>.json`). Resolved configs are JSON, not TOML: JSON keeps
|
|
32
|
+
nulls, so explicit None settings round-trip exactly on re-parse."""
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def config_digest(config: BaseModel) -> str:
|
|
36
|
+
"""Canonical hash of a resolved config's full model dump (nulls included)."""
|
|
37
|
+
dump = config.model_dump(mode="json")
|
|
38
|
+
canonical = json.dumps(dump, sort_keys=True, separators=(",", ":"))
|
|
39
|
+
return hashlib.sha256(canonical.encode()).hexdigest()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def saved_config_path(run_dir: Path) -> Path | None:
|
|
43
|
+
"""The run's saved resolved config (`configs/<cli>.json`), None if absent."""
|
|
44
|
+
candidates = (
|
|
45
|
+
sorted((run_dir / CONFIG_DIR).glob("*.json"))
|
|
46
|
+
if (run_dir / CONFIG_DIR).is_dir()
|
|
47
|
+
else []
|
|
48
|
+
)
|
|
49
|
+
return candidates[0] if candidates else None
|
|
50
|
+
|
|
32
51
|
|
|
33
52
|
# Compiling an adapter is the expensive part; run output reuses only a few model classes.
|
|
34
53
|
type_adapter = cache(TypeAdapter)
|
|
35
54
|
|
|
36
55
|
|
|
37
56
|
def output_path(config: EvalConfig) -> Path:
|
|
38
|
-
"""Where this run writes: `
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def write_config(config: BaseModel, results_dir: Path) -> Path:
|
|
57
|
-
"""Write the run's resolved `config.toml` (re-readable via `@ config.toml`); return its
|
|
58
|
-
path. mode="json" makes values TOML-friendly (Path -> str, etc.); exclude_none drops the
|
|
59
|
-
nulls TOML can't represent."""
|
|
60
|
-
results_dir.mkdir(parents=True, exist_ok=True)
|
|
61
|
-
toml = tomli_w.dumps(config.model_dump(mode="json", exclude_none=True))
|
|
62
|
-
config_path = results_dir / CONFIG_FILE
|
|
63
|
-
config_path.write_text(toml)
|
|
57
|
+
"""Where this run writes: `output_dir / run.dir` — the same grouping convention as
|
|
58
|
+
training. The run directory defaults to the auto-generated run name
|
|
59
|
+
(`<env>--<model>--<harness>--<short-id>`)."""
|
|
60
|
+
assert config.run.dir is not None
|
|
61
|
+
return config.output_dir / config.run.dir
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def write_config(
|
|
65
|
+
config: BaseModel, results_dir: Path, filename: str = "eval.json"
|
|
66
|
+
) -> Path:
|
|
67
|
+
"""Write the run's resolved config to `configs/<filename>` (re-readable via
|
|
68
|
+
`@ <path>`); return its path. The full model dump is written, nulls included, so the
|
|
69
|
+
file round-trips exactly."""
|
|
70
|
+
config_dir = results_dir / CONFIG_DIR
|
|
71
|
+
config_dir.mkdir(parents=True, exist_ok=True)
|
|
72
|
+
config_path = config_dir / filename
|
|
73
|
+
config_path.write_text(json.dumps(config.model_dump(mode="json"), indent=2))
|
|
64
74
|
return config_path
|
|
65
75
|
|
|
66
76
|
|
|
67
|
-
def save_config(
|
|
68
|
-
|
|
77
|
+
def save_config(
|
|
78
|
+
config: BaseModel, results_dir: Path, filename: str = "eval.json"
|
|
79
|
+
) -> None:
|
|
80
|
+
"""Set up the run's output dir: write the resolved config and start a fresh (empty)
|
|
69
81
|
`traces.jsonl`. Call once up front, before episodes start landing."""
|
|
70
|
-
write_config(config, results_dir)
|
|
82
|
+
write_config(config, results_dir, filename)
|
|
71
83
|
(results_dir / TRACES_FILE).write_text(
|
|
72
84
|
""
|
|
73
85
|
) # fresh; appended to as rollouts complete
|
|
@@ -10,10 +10,10 @@ cross-trace `score()` can't run offline.
|
|
|
10
10
|
|
|
11
11
|
import asyncio
|
|
12
12
|
import contextlib
|
|
13
|
+
import json
|
|
13
14
|
import logging
|
|
14
15
|
import sys
|
|
15
16
|
import time
|
|
16
|
-
import tomllib
|
|
17
17
|
from pathlib import Path
|
|
18
18
|
|
|
19
19
|
from pydantic_config import cli
|
|
@@ -21,10 +21,10 @@ from pydantic_config import cli
|
|
|
21
21
|
import verifiers.v1 as vf
|
|
22
22
|
from verifiers.v1.cli.dashboard.replay import ReplayProgress, replay_dashboard
|
|
23
23
|
from verifiers.v1.cli.output import (
|
|
24
|
-
CONFIG_FILE,
|
|
25
24
|
append_trace,
|
|
26
25
|
read_episodes,
|
|
27
26
|
save_config,
|
|
27
|
+
saved_config_path,
|
|
28
28
|
write_config,
|
|
29
29
|
)
|
|
30
30
|
from verifiers.v1.cli.resolve import narrow_taskset_config
|
|
@@ -47,7 +47,7 @@ USAGE = (
|
|
|
47
47
|
def _narrow(config_path: Path) -> type[ReplayConfig]:
|
|
48
48
|
"""Narrow replay config to the saved taskset's config type. The source may be
|
|
49
49
|
an eval run (taskset on the [env] block) or an earlier replay (root taskset)."""
|
|
50
|
-
data =
|
|
50
|
+
data = json.loads(config_path.read_text())
|
|
51
51
|
taskset = data.get("taskset") or (data.get("env") or {}).get("taskset") or {}
|
|
52
52
|
taskset_id = taskset.get("id")
|
|
53
53
|
return narrow_taskset_config(ReplayConfig, taskset_id)
|
|
@@ -63,7 +63,10 @@ async def run_replay(config: ReplayConfig, source: Path, out: Path) -> list[Trac
|
|
|
63
63
|
# Refuse multi-agent up front, from the SOURCE run's saved config — the replay
|
|
64
64
|
# layer's taskset is overridable and must not decide what the run was.
|
|
65
65
|
# Everything below may assume plain single-agent episodes.
|
|
66
|
-
|
|
66
|
+
source_config = saved_config_path(source)
|
|
67
|
+
if source_config is None:
|
|
68
|
+
raise SystemExit(f"no saved config under {source} - not a run dir")
|
|
69
|
+
saved = json.loads(source_config.read_text())
|
|
67
70
|
saved_env = saved.get("env") or {}
|
|
68
71
|
saved_taskset = saved.get("taskset") or saved_env.get("taskset") or {}
|
|
69
72
|
env_cls = vf.environment_class(
|
|
@@ -126,7 +129,7 @@ async def run_replay(config: ReplayConfig, source: Path, out: Path) -> list[Trac
|
|
|
126
129
|
for _ in range(config.num_rescores)
|
|
127
130
|
]
|
|
128
131
|
|
|
129
|
-
save_config(config, out)
|
|
132
|
+
save_config(config, out, "replay.json")
|
|
130
133
|
logger.info(
|
|
131
134
|
"replay: re-scoring %d trace(s) x%d from %s -> %s",
|
|
132
135
|
len(traces),
|
|
@@ -201,15 +204,15 @@ def main(argv: list[str] | None = None) -> None:
|
|
|
201
204
|
cli(ReplayConfig) # full, typed pydantic-config option help
|
|
202
205
|
return
|
|
203
206
|
source = Path(argv.pop(0))
|
|
204
|
-
config_path = source
|
|
205
|
-
if
|
|
206
|
-
raise SystemExit(f"{USAGE}\nno config
|
|
207
|
+
config_path = saved_config_path(source)
|
|
208
|
+
if config_path is None:
|
|
209
|
+
raise SystemExit(f"{USAGE}\nno saved config under {source} - not a run dir")
|
|
207
210
|
|
|
208
211
|
layered = ["@", str(config_path), *argv]
|
|
209
212
|
config_type = _narrow(config_path)
|
|
210
213
|
sys.argv = [sys.argv[0], *layered]
|
|
211
214
|
config = cli(config_type)
|
|
212
|
-
source_out =
|
|
215
|
+
source_out = json.loads(config_path.read_text()).get("output_dir")
|
|
213
216
|
# Clear the source run's output_dir unless the user overrode it.
|
|
214
217
|
if config.output_dir is None or str(config.output_dir) == str(source_out):
|
|
215
218
|
config = config.model_copy(update={"output_dir": None})
|
|
@@ -222,10 +225,10 @@ def main(argv: list[str] | None = None) -> None:
|
|
|
222
225
|
level = "DEBUG" if config.verbose else "INFO"
|
|
223
226
|
if config.dry_run:
|
|
224
227
|
setup_logging(level)
|
|
225
|
-
logger.info("wrote config to %s", write_config(config, out))
|
|
228
|
+
logger.info("wrote config to %s", write_config(config, out, "replay.json"))
|
|
226
229
|
return
|
|
227
230
|
|
|
228
|
-
log_file = str(out / "replay.log")
|
|
231
|
+
log_file = str(out / "logs" / "replay.log")
|
|
229
232
|
if config.rich:
|
|
230
233
|
setup_logging(level, log_file=log_file, console=False)
|
|
231
234
|
logging.lastResort = None
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""Resume primitives shared by eval-like CLIs."""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def distribute(
|
|
5
|
+
selected_keys: list[str], owed: dict[str, int], num_results: int
|
|
6
|
+
) -> list[int]:
|
|
7
|
+
"""Spread each key's owed results over its selected instances, in order."""
|
|
8
|
+
remaining = dict(owed)
|
|
9
|
+
counts: list[int] = []
|
|
10
|
+
for key in selected_keys:
|
|
11
|
+
take = min(num_results, remaining.get(key, 0))
|
|
12
|
+
if take:
|
|
13
|
+
remaining[key] -= take
|
|
14
|
+
counts.append(take)
|
|
15
|
+
return counts
|