verifiers 0.1.15.dev423__tar.gz → 0.1.15.dev425__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.1.15.dev423 → verifiers-0.1.15.dev425}/PKG-INFO +1 -1
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/pyproject.toml +1 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/__init__.py +2 -2
- verifiers-0.1.15.dev425/verifiers/v1/cli/dashboard/replay.py +96 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/cli/eval/runner.py +2 -2
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/cli/init.py +1 -1
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/cli/output.py +15 -0
- verifiers-0.1.15.dev425/verifiers/v1/cli/replay.py +183 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/clients/__init__.py +2 -2
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/clients/client.py +3 -3
- verifiers-0.1.15.dev425/verifiers/v1/configs/replay.py +67 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/env.py +2 -2
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harness.py +3 -3
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/codex/harness.py +2 -2
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/default/harness.py +2 -2
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/kimi_code/harness.py +2 -2
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/mini_swe_agent/harness.py +2 -2
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/null/harness.py +2 -2
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/rlm/harness.py +2 -2
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/terminus_2/harness.py +2 -2
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/interception/server.py +2 -2
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/rollout.py +2 -2
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/serve/server.py +4 -4
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/taskset.py +46 -6
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/.gitignore +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/LICENSE +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/README.md +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/AGENTS.md +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/README.md +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/conftest.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_browser_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_build_script.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_client_config.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_composable_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_env_group.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_env_server.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_environment.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_environment_extra.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_envs.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_error_chain.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_eval_display.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_eval_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_gym_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_imports.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_init_script.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_install_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_interception_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_logging.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_math_rubric.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_message_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_openenv_client.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_parser.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_path_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_renderer_client.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_rubric.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_rubric_group.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_save_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_setup_script.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_think_parser.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_tool_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_tool_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_types.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_wordle_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/test_xml_parser.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/v1/conftest.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/v1/test_configs.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/v1/test_envs.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/v1/test_graph.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/v1/test_judges.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/tests/v1/test_trace.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/AGENTS.md +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/cli/tui.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/clients/client.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/decorators.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/environment.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/errors.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/gepa/config.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/gepa/display.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/rl/README.md +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/rl/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/rl/inference/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/rl/inference/client.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/rl/inference/server.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/rl/trainer/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/rl/trainer/config.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/rl/trainer/orchestrator.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/rl/trainer/trainer.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/rl/trainer/utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/scripts/build.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/scripts/init.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/scripts/install.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/scripts/rl.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/scripts/train.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/scripts/vllm.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/serve/types.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/types.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/ARCHITECTURE.md +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/GUIDE.md +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/README.md +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/configs/debug.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/episode.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/errors.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/graph.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/default/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/default/program.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/judge.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/retries.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/runtimes/docker.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/state.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/task.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/trace.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/types.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/utils/memory.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.1.15.
|
|
3
|
+
Version: 0.1.15.dev425
|
|
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
|
|
@@ -167,6 +167,7 @@ vf-eval = "verifiers.scripts.eval:main"
|
|
|
167
167
|
eval = "verifiers.v1.cli.eval.main:main"
|
|
168
168
|
validate = "verifiers.v1.cli.validate:main"
|
|
169
169
|
debug = "verifiers.v1.cli.debug:main"
|
|
170
|
+
replay = "verifiers.v1.cli.replay:main"
|
|
170
171
|
serve = "verifiers.v1.cli.serve:main"
|
|
171
172
|
init = "verifiers.v1.cli.init:main"
|
|
172
173
|
vf-gepa = "verifiers.scripts.gepa:main"
|
|
@@ -12,7 +12,7 @@ from verifiers.v1.clients import (
|
|
|
12
12
|
BaseClientConfig,
|
|
13
13
|
Client,
|
|
14
14
|
ClientConfig,
|
|
15
|
-
|
|
15
|
+
ModelContext,
|
|
16
16
|
resolve_client,
|
|
17
17
|
)
|
|
18
18
|
from verifiers.v1.decorators import group_reward, metric, reward, stop, tool
|
|
@@ -188,7 +188,7 @@ __all__ = [
|
|
|
188
188
|
"BaseConfig",
|
|
189
189
|
"Harness",
|
|
190
190
|
"HarnessConfig",
|
|
191
|
-
"
|
|
191
|
+
"ModelContext",
|
|
192
192
|
"Runtime",
|
|
193
193
|
"RuntimeConfig",
|
|
194
194
|
"ProgramResult",
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""Live dashboard for `replay` — one row per trace being re-scored (pending → running → its
|
|
2
|
+
outcome), mirroring the validate view. Reuses `TaskProgress` and `live_view`."""
|
|
3
|
+
|
|
4
|
+
import contextlib
|
|
5
|
+
import time
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
|
|
8
|
+
from rich.console import Group
|
|
9
|
+
from rich.markup import escape
|
|
10
|
+
from rich.progress_bar import ProgressBar
|
|
11
|
+
from rich.rule import Rule
|
|
12
|
+
from rich.table import Table
|
|
13
|
+
from rich.text import Text
|
|
14
|
+
|
|
15
|
+
from verifiers.v1.cli.dashboard.base import live_view
|
|
16
|
+
from verifiers.v1.cli.dashboard.validate import TaskProgress
|
|
17
|
+
from verifiers.v1.utils.format import format_time
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass
|
|
21
|
+
class ReplayProgress(TaskProgress):
|
|
22
|
+
"""`TaskProgress` plus the re-score `detail` shown per row: the final reward when scored, or
|
|
23
|
+
the exception type when it errored."""
|
|
24
|
+
|
|
25
|
+
detail: str = ""
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
# Colors mirror the eval dashboard for shared states: pending=dim, running=cyan, scored=green
|
|
29
|
+
# (eval's "success"), error=red. `skipped` is replay-only (a rollout that errored → copied through).
|
|
30
|
+
_STYLE = {
|
|
31
|
+
"pending": "dim",
|
|
32
|
+
"running": "cyan",
|
|
33
|
+
"scored": "green",
|
|
34
|
+
"skipped": "blue",
|
|
35
|
+
"error": "red",
|
|
36
|
+
}
|
|
37
|
+
_MARK_WIDTH = max(len(state) for state in _STYLE)
|
|
38
|
+
_MARK = {state: escape(f"[{state:<{_MARK_WIDTH}}]") for state in _STYLE}
|
|
39
|
+
_DONE = ("scored", "error", "skipped")
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _render(
|
|
43
|
+
states: list[TaskProgress], taskset_name: str, source: str, out: str, start: float
|
|
44
|
+
) -> Group:
|
|
45
|
+
done = [s for s in states if s.state in _DONE]
|
|
46
|
+
scored = sum(1 for s in done if s.state == "scored")
|
|
47
|
+
skipped = sum(1 for s in done if s.state == "skipped")
|
|
48
|
+
overview = Table.grid(padding=(0, 2))
|
|
49
|
+
overview.add_column(style="dim")
|
|
50
|
+
overview.add_column()
|
|
51
|
+
overview.add_row("replay", f"{taskset_name} · {source}")
|
|
52
|
+
overview.add_row("output", out)
|
|
53
|
+
|
|
54
|
+
stats = (
|
|
55
|
+
f" {len(done)}/{len(states)} · {format_time(time.time() - start)} · "
|
|
56
|
+
f"scored {scored} · failed {len(done) - scored - skipped} · skipped {skipped}"
|
|
57
|
+
)
|
|
58
|
+
progress = Table.grid()
|
|
59
|
+
progress.add_column()
|
|
60
|
+
progress.add_column()
|
|
61
|
+
progress.add_row(
|
|
62
|
+
ProgressBar(total=len(states) or 1, completed=len(done), width=32), Text(stats)
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
now = time.time()
|
|
66
|
+
rows = Table.grid(expand=True, padding=(0, 1))
|
|
67
|
+
rows.add_column(ratio=1, no_wrap=True)
|
|
68
|
+
rows.add_column(justify="right", no_wrap=True)
|
|
69
|
+
rows.add_column(justify="right", no_wrap=True)
|
|
70
|
+
for s in states:
|
|
71
|
+
if s.state == "pending": # show only in-flight/done rows (like eval/validate)
|
|
72
|
+
continue
|
|
73
|
+
label = f"name={s.name[:40]}" if s.name else f"idx={s.idx}"
|
|
74
|
+
parts = [
|
|
75
|
+
p
|
|
76
|
+
for p in (s.state if s.state in _DONE else "", getattr(s, "detail", ""))
|
|
77
|
+
if p
|
|
78
|
+
]
|
|
79
|
+
result = " ".join(parts) + " ·" if parts else ""
|
|
80
|
+
elapsed = format_time((s.end or now) - s.start) if s.start else ""
|
|
81
|
+
rows.add_row(
|
|
82
|
+
f"{_MARK[s.state]} {label}",
|
|
83
|
+
result,
|
|
84
|
+
elapsed,
|
|
85
|
+
style=_STYLE[s.state],
|
|
86
|
+
)
|
|
87
|
+
return Group(overview, progress, Rule(style="dim"), rows)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
@contextlib.asynccontextmanager
|
|
91
|
+
async def replay_dashboard(
|
|
92
|
+
states: list[TaskProgress], taskset_name: str, source: str, out: str, start: float
|
|
93
|
+
):
|
|
94
|
+
"""Refresh the live replay view until the `with` block exits, then a final frame."""
|
|
95
|
+
async with live_view(lambda: _render(states, taskset_name, source, out, start)):
|
|
96
|
+
yield
|
|
@@ -6,7 +6,7 @@ import logging
|
|
|
6
6
|
import random
|
|
7
7
|
import time
|
|
8
8
|
|
|
9
|
-
from verifiers.v1.clients import
|
|
9
|
+
from verifiers.v1.clients import ModelContext, resolve_client
|
|
10
10
|
from verifiers.v1.configs.eval import EvalConfig
|
|
11
11
|
from verifiers.v1.cli.eval import resume
|
|
12
12
|
from verifiers.v1.cli.dashboard import dashboard
|
|
@@ -29,7 +29,7 @@ async def run_eval(env: Environment, config: EvalConfig) -> list[Trace]:
|
|
|
29
29
|
if config.shuffle:
|
|
30
30
|
random.Random(_SHUFFLE_SEED).shuffle(tasks)
|
|
31
31
|
tasks = tasks if config.num_tasks is None else tasks[: config.num_tasks]
|
|
32
|
-
ctx =
|
|
32
|
+
ctx = ModelContext(client=client, model=config.model, sampling=config.sampling)
|
|
33
33
|
# One episode of `num_rollouts` rollouts per task; the shared semaphore bounds total
|
|
34
34
|
# concurrent rollouts (across episodes), so group rewards still see their whole episode.
|
|
35
35
|
semaphore = (
|
|
@@ -12,6 +12,7 @@ durable as they land rather than only at the end.
|
|
|
12
12
|
"""
|
|
13
13
|
|
|
14
14
|
import asyncio
|
|
15
|
+
import json
|
|
15
16
|
from pathlib import Path
|
|
16
17
|
|
|
17
18
|
import tomli_w
|
|
@@ -58,6 +59,20 @@ def write_trace(results_dir: Path, trace: Trace) -> None:
|
|
|
58
59
|
f.write(data + b"\n")
|
|
59
60
|
|
|
60
61
|
|
|
62
|
+
def read_traces(results_dir: Path, trace_type: type) -> list[Trace]:
|
|
63
|
+
"""Load a run's saved traces from `results.jsonl`, typed as `trace_type` — the inverse of
|
|
64
|
+
`write_trace`. Used by `replay` to re-score finished rollouts (pass the taskset's typed
|
|
65
|
+
`Trace[...]`, or `Trace[WireTask, ...]` to read any taskset's traces without importing it).
|
|
66
|
+
Streams line-by-line so a large (multi-GB) results file isn't loaded into memory at once."""
|
|
67
|
+
adapter = TypeAdapter(trace_type)
|
|
68
|
+
traces: list[Trace] = []
|
|
69
|
+
with (results_dir / "results.jsonl").open(encoding="utf-8") as f:
|
|
70
|
+
for line in f:
|
|
71
|
+
if line.strip():
|
|
72
|
+
traces.append(adapter.validate_python(json.loads(line)))
|
|
73
|
+
return traces
|
|
74
|
+
|
|
75
|
+
|
|
61
76
|
async def append_trace(results_dir: Path, trace: Trace, lock: asyncio.Lock) -> None:
|
|
62
77
|
"""Append one finished trace without blocking the event loop. The run's shared lock
|
|
63
78
|
preserves whole-line ordering, and awaiting the worker preserves per-trace durability."""
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"""The replay entrypoint: `uv run replay <output-dir> [options] [@ file.toml]`.
|
|
2
|
+
|
|
3
|
+
Offline sibling of `eval`: loads a finished run's saved traces and re-runs **scoring only**, no
|
|
4
|
+
runtime. The run's own `config.toml` is the base; CLI flags / `@ file.toml` layer on top (e.g. a
|
|
5
|
+
different judge model). Signals needing a `runtime` (in-sandbox verifiers like a SWE `solved`
|
|
6
|
+
reward) are skipped and left as the source recorded them; config-plugged judges and trace-only
|
|
7
|
+
`@reward`/`@metric`s re-run. Rollouts that errored during generation (`stop_condition == "error"`)
|
|
8
|
+
were never scored by eval, so they're copied through unchanged rather than re-scored on a broken
|
|
9
|
+
transcript. `--num-rescores`/`-r` re-scores each trace N times to sample judge variance. Results go
|
|
10
|
+
to a fresh output dir, so the source run is never overwritten.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import asyncio
|
|
14
|
+
import contextlib
|
|
15
|
+
import logging
|
|
16
|
+
import signal
|
|
17
|
+
import sys
|
|
18
|
+
import time
|
|
19
|
+
import tomllib
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
|
|
22
|
+
from pydantic_config import cli
|
|
23
|
+
|
|
24
|
+
import verifiers.v1 as vf
|
|
25
|
+
from verifiers.v1.cli.dashboard.replay import ReplayProgress, replay_dashboard
|
|
26
|
+
from verifiers.v1.cli.output import append_trace, read_traces, save_config, write_config
|
|
27
|
+
from verifiers.v1.configs.replay import ReplayConfig
|
|
28
|
+
from verifiers.v1.state import state_cls
|
|
29
|
+
from verifiers.v1.task import WireTask
|
|
30
|
+
from verifiers.v1.trace import Trace
|
|
31
|
+
from verifiers.v1.utils.logging import setup_logging
|
|
32
|
+
|
|
33
|
+
logger = logging.getLogger(__name__)
|
|
34
|
+
|
|
35
|
+
USAGE = (
|
|
36
|
+
"usage: uv run replay <output-dir> [options] [@ file.toml]\n"
|
|
37
|
+
" re-score a finished run's saved traces (judges + trace-only signals; no runtime)"
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _narrow(config_path: Path) -> type[ReplayConfig]:
|
|
42
|
+
"""`ReplayConfig` with `taskset` narrowed to the saved run's taskset type, so the `cli()`
|
|
43
|
+
parse stays typed and CLI overrides of taskset fields validate (mirrors eval/validate)."""
|
|
44
|
+
data = tomllib.loads(config_path.read_text())
|
|
45
|
+
taskset_id = (data.get("taskset") or {}).get("id")
|
|
46
|
+
if not taskset_id:
|
|
47
|
+
return ReplayConfig
|
|
48
|
+
ftype = vf.taskset_config_type(taskset_id)
|
|
49
|
+
return type(
|
|
50
|
+
"ReplayConfig",
|
|
51
|
+
(ReplayConfig,),
|
|
52
|
+
{"__annotations__": {"taskset": ftype}, "taskset": ftype(id=taskset_id)},
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def output_dir(config: ReplayConfig) -> Path:
|
|
57
|
+
"""Where a replay writes: `--output-dir`, else a fresh `outputs/<taskset>--replay/<uuid>`."""
|
|
58
|
+
return config.output_dir or Path("outputs") / f"{config.name}--replay" / config.uuid
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
async def run_replay(config: ReplayConfig, source: Path, out: Path) -> list[Trace]:
|
|
62
|
+
logger.debug("replay config:\n%s", config.model_dump_json(indent=2))
|
|
63
|
+
taskset = vf.load_taskset(config.taskset)
|
|
64
|
+
# `WireTask` reads any taskset's saved task without a runtime or its Task type (see WireTask).
|
|
65
|
+
traces = read_traces(source, Trace[WireTask, state_cls(type(taskset))])
|
|
66
|
+
if config.num_traces is not None:
|
|
67
|
+
traces = traces[: config.num_traces]
|
|
68
|
+
# `num_rescores` re-scores each trace that many times, each on its own copy.
|
|
69
|
+
work = [t.model_copy(deep=True) for t in traces for _ in range(config.num_rescores)]
|
|
70
|
+
|
|
71
|
+
save_config(config, out)
|
|
72
|
+
logger.info(
|
|
73
|
+
"replay: re-scoring %d trace(s) x%d from %s -> %s",
|
|
74
|
+
len(traces),
|
|
75
|
+
config.num_rescores,
|
|
76
|
+
source,
|
|
77
|
+
out,
|
|
78
|
+
)
|
|
79
|
+
start = time.time()
|
|
80
|
+
|
|
81
|
+
sem = asyncio.Semaphore(config.max_concurrent) if config.max_concurrent else None
|
|
82
|
+
states = [ReplayProgress(idx=t.task.idx, name=t.task.name) for t in work]
|
|
83
|
+
lock = asyncio.Lock()
|
|
84
|
+
|
|
85
|
+
async def rescore(trace: Trace, st: ReplayProgress) -> None:
|
|
86
|
+
async with sem or contextlib.nullcontext():
|
|
87
|
+
st.start = time.time()
|
|
88
|
+
# A rollout that errored during generation was never scored by eval (its scoring phase
|
|
89
|
+
# never ran), so re-scoring would grade a broken/partial transcript. Copy it through
|
|
90
|
+
# unchanged, mirroring eval. A *scoring* error leaves `stop_condition` as the
|
|
91
|
+
# generation outcome, so those still re-score (the offline-recovery case).
|
|
92
|
+
if trace.stop_condition == "error":
|
|
93
|
+
st.state, st.detail, st.end = "skipped", "rollout errored", time.time()
|
|
94
|
+
else:
|
|
95
|
+
st.state = "running"
|
|
96
|
+
# Clear prior scores so a changed/removed judge leaves no stale (double-summed) entry.
|
|
97
|
+
if isinstance(trace.info, dict):
|
|
98
|
+
trace.info.pop("judge", None)
|
|
99
|
+
trace.rewards, trace.metrics, trace.extra_usage = {}, {}, []
|
|
100
|
+
try:
|
|
101
|
+
await taskset.score(trace)
|
|
102
|
+
st.state, st.detail = "scored", f"reward {trace.reward:.3f}"
|
|
103
|
+
except Exception as exc:
|
|
104
|
+
st.state, st.detail = "error", type(exc).__name__
|
|
105
|
+
trace.capture_error(
|
|
106
|
+
exc
|
|
107
|
+
) # record the re-scoring failure on the trace
|
|
108
|
+
if not config.rich:
|
|
109
|
+
logger.warning(
|
|
110
|
+
"replay: scoring failed for task %s",
|
|
111
|
+
trace.task.idx,
|
|
112
|
+
exc_info=True,
|
|
113
|
+
)
|
|
114
|
+
st.end = time.time()
|
|
115
|
+
if not config.rich:
|
|
116
|
+
logger.info(
|
|
117
|
+
"idx=%s %s (%.1fs)", trace.task.idx, st.state, st.end - st.start
|
|
118
|
+
)
|
|
119
|
+
# Persist as each trace finishes (like eval), so an interrupted replay keeps its progress.
|
|
120
|
+
await append_trace(out, trace, lock)
|
|
121
|
+
|
|
122
|
+
display = (
|
|
123
|
+
replay_dashboard(states, config.name, str(source), str(out), start)
|
|
124
|
+
if config.rich
|
|
125
|
+
else contextlib.nullcontext()
|
|
126
|
+
)
|
|
127
|
+
async with display:
|
|
128
|
+
await asyncio.gather(*(rescore(t, s) for t, s in zip(work, states)))
|
|
129
|
+
logger.info("replay: done in %.1fs -> %s", time.time() - start, out)
|
|
130
|
+
return work
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def main(argv: list[str] | None = None) -> None:
|
|
134
|
+
argv = list(sys.argv[1:]) if argv is None else list(argv)
|
|
135
|
+
if not argv or any(a in ("-h", "--help") for a in argv):
|
|
136
|
+
print(USAGE)
|
|
137
|
+
sys.argv = [sys.argv[0], "--help"]
|
|
138
|
+
cli(ReplayConfig) # full, typed pydantic-config option help
|
|
139
|
+
return
|
|
140
|
+
source = Path(argv.pop(0)) # the finished run dir to replay
|
|
141
|
+
config_path = source / "config.toml"
|
|
142
|
+
if not config_path.exists():
|
|
143
|
+
raise SystemExit(f"{USAGE}\nno config.toml in {source}")
|
|
144
|
+
|
|
145
|
+
# The saved run's config is the base; user flags / @ file.toml layer on top.
|
|
146
|
+
layered = ["@", str(config_path), *argv]
|
|
147
|
+
config_type = _narrow(config_path)
|
|
148
|
+
sys.argv = [sys.argv[0], *layered]
|
|
149
|
+
config = cli(config_type)
|
|
150
|
+
# Honor a user-set output_dir (via -o or an @ file); drop the *source* run's own output_dir
|
|
151
|
+
# so a replay always writes to a fresh dir and never back over the run it re-scores.
|
|
152
|
+
source_out = (tomllib.loads(config_path.read_text())).get("output_dir")
|
|
153
|
+
if config.output_dir is None or str(config.output_dir) == str(source_out):
|
|
154
|
+
config = config.model_copy(update={"output_dir": None})
|
|
155
|
+
|
|
156
|
+
out = output_dir(config)
|
|
157
|
+
if (
|
|
158
|
+
out.resolve() == source.resolve()
|
|
159
|
+
): # never write back over the run being replayed
|
|
160
|
+
raise SystemExit(
|
|
161
|
+
f"replay: --output-dir must differ from the source run ({source}); "
|
|
162
|
+
"refusing to overwrite it"
|
|
163
|
+
)
|
|
164
|
+
level = "DEBUG" if config.verbose else "INFO"
|
|
165
|
+
if config.dry_run: # resolve + validate, write the config, and exit (no re-scoring)
|
|
166
|
+
setup_logging(level)
|
|
167
|
+
logger.info("wrote config to %s", write_config(config, out))
|
|
168
|
+
return
|
|
169
|
+
|
|
170
|
+
log_file = str(
|
|
171
|
+
out / "replay.log"
|
|
172
|
+
) # tee the run's logs to its output dir, like eval
|
|
173
|
+
if config.rich: # the dashboard owns the screen, so keep logs off the console
|
|
174
|
+
setup_logging(level, log_file=log_file, console=False)
|
|
175
|
+
logging.lastResort = None
|
|
176
|
+
else:
|
|
177
|
+
setup_logging(level, log_file=log_file, console=True)
|
|
178
|
+
signal.signal(signal.SIGTERM, lambda *_: (_ for _ in ()).throw(KeyboardInterrupt()))
|
|
179
|
+
asyncio.run(run_replay(config, source, out))
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
if __name__ == "__main__":
|
|
183
|
+
main()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""The client abstraction and its OpenAI-compatible + renderer implementations."""
|
|
2
2
|
|
|
3
|
-
from verifiers.v1.clients.client import Client,
|
|
3
|
+
from verifiers.v1.clients.client import Client, ModelContext
|
|
4
4
|
from verifiers.v1.clients.config import (
|
|
5
5
|
BaseClientConfig,
|
|
6
6
|
ClientConfig,
|
|
@@ -13,7 +13,7 @@ from verifiers.v1.clients.train import TrainClient
|
|
|
13
13
|
|
|
14
14
|
__all__ = [
|
|
15
15
|
"Client",
|
|
16
|
-
"
|
|
16
|
+
"ModelContext",
|
|
17
17
|
"BaseClientConfig",
|
|
18
18
|
"ClientConfig",
|
|
19
19
|
"EvalClientConfig",
|
|
@@ -77,9 +77,9 @@ class Client(ABC):
|
|
|
77
77
|
|
|
78
78
|
|
|
79
79
|
@dataclass(frozen=True)
|
|
80
|
-
class
|
|
81
|
-
"""The collaborators a
|
|
82
|
-
so harnesses hold no rollout state. Built by the Environment."""
|
|
80
|
+
class ModelContext:
|
|
81
|
+
"""The model-side collaborators a harness talks to (client + model + sampling),
|
|
82
|
+
bundled so harnesses hold no rollout state. Built by the Environment."""
|
|
83
83
|
|
|
84
84
|
model: str
|
|
85
85
|
client: Client
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""The `ReplayConfig`: the config the `replay` CLI parses.
|
|
2
|
+
|
|
3
|
+
Replay re-scores a finished run's saved traces with no runtime, so it needs only a subset of
|
|
4
|
+
`EvalConfig` — the taskset (with its plugged judges) and a few run knobs. It carries no harness,
|
|
5
|
+
runtime, model, sampling, or pool. Its base is the replayed run's own `config.toml` (a full
|
|
6
|
+
`EvalConfig`), so `model_config` ignores the eval-only fields rather than rejecting them; CLI
|
|
7
|
+
flags / `@ file.toml` then layer overrides (e.g. re-judge with different judge settings).
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from uuid import uuid4
|
|
12
|
+
|
|
13
|
+
from pydantic import AliasChoices, ConfigDict, Field, SerializeAsAny, model_validator
|
|
14
|
+
from pydantic_config import BaseConfig
|
|
15
|
+
|
|
16
|
+
from verifiers.v1.taskset import TasksetConfig
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class ReplayConfig(BaseConfig):
|
|
20
|
+
"""A taskset (with its config-plugged judges) plus replay run knobs. The saved run's
|
|
21
|
+
`config.toml` is the base; its eval-only fields (harness, runtime, model, sampling, pool, …)
|
|
22
|
+
are ignored here — replay only re-runs scoring from the trace."""
|
|
23
|
+
|
|
24
|
+
model_config = ConfigDict(extra="ignore")
|
|
25
|
+
|
|
26
|
+
uuid: str = Field(default_factory=lambda: str(uuid4()), exclude=True)
|
|
27
|
+
"""Auto-generated run id — the leaf of the output dir, so replays never overwrite."""
|
|
28
|
+
taskset: SerializeAsAny[TasksetConfig] = TasksetConfig()
|
|
29
|
+
"""The taskset, selected by `--taskset.id` (narrowed to its config type). Its
|
|
30
|
+
`taskset.judges` are what replay re-runs; override them via `@ file.toml` / dotted flags."""
|
|
31
|
+
num_traces: int | None = Field(
|
|
32
|
+
None, validation_alias=AliasChoices("num_traces", "n")
|
|
33
|
+
)
|
|
34
|
+
"""How many saved traces to re-score (None = all)."""
|
|
35
|
+
num_rescores: int = Field(1, validation_alias=AliasChoices("num_rescores", "r"))
|
|
36
|
+
"""Re-score each selected trace this many times — e.g. to measure judge variance across
|
|
37
|
+
repeated gradings of the same trace. Named distinctly from eval's `num_rollouts` so the
|
|
38
|
+
replayed run's own `num_rollouts` (in the base `config.toml`) is ignored, not inherited."""
|
|
39
|
+
max_concurrent: int | None = Field(
|
|
40
|
+
128, validation_alias=AliasChoices("max_concurrent", "c")
|
|
41
|
+
)
|
|
42
|
+
"""Max traces re-scored (judge calls) in flight at once."""
|
|
43
|
+
verbose: bool = Field(False, validation_alias=AliasChoices("verbose", "v"))
|
|
44
|
+
"""Log at debug level instead of the default info."""
|
|
45
|
+
dry_run: bool = False
|
|
46
|
+
"""Resolve + validate the config and write it to the output dir, then exit (no re-scoring)."""
|
|
47
|
+
rich: bool = True
|
|
48
|
+
"""Show a live dashboard (one row per trace) instead of per-trace log lines."""
|
|
49
|
+
output_dir: Path | None = Field(
|
|
50
|
+
None, validation_alias=AliasChoices("output_dir", "o")
|
|
51
|
+
)
|
|
52
|
+
"""Where to write the re-scored run (config.toml + results.jsonl). None = a fresh per-run
|
|
53
|
+
dir under `outputs/<taskset>--replay/<uuid>` (so a replay never overwrites the source run)."""
|
|
54
|
+
|
|
55
|
+
@property
|
|
56
|
+
def name(self) -> str:
|
|
57
|
+
return self.taskset.name
|
|
58
|
+
|
|
59
|
+
@model_validator(mode="before")
|
|
60
|
+
@classmethod
|
|
61
|
+
def _resolve_taskset(cls, data):
|
|
62
|
+
"""Narrow the generic `taskset` to its specific config type by `id` (mirrors
|
|
63
|
+
`ValidateConfig`), so `taskset.judges` and other taskset fields validate typed."""
|
|
64
|
+
from verifiers.v1.loaders import narrow_plugin_field, taskset_config_type
|
|
65
|
+
|
|
66
|
+
narrow_plugin_field(data, "taskset", taskset_config_type)
|
|
67
|
+
return data
|
|
@@ -19,7 +19,7 @@ from pydantic import Field, SerializeAsAny, model_validator
|
|
|
19
19
|
from pydantic_config import BaseConfig
|
|
20
20
|
|
|
21
21
|
from verifiers.v1.harness import HarnessConfig
|
|
22
|
-
from verifiers.v1.clients import
|
|
22
|
+
from verifiers.v1.clients import ModelContext
|
|
23
23
|
from verifiers.v1.decorators import discover_decorated
|
|
24
24
|
from verifiers.v1.episode import Episode
|
|
25
25
|
from verifiers.v1.types import ID
|
|
@@ -300,7 +300,7 @@ class Environment:
|
|
|
300
300
|
self.harness.config.runtime, task, self._warned_resources
|
|
301
301
|
)
|
|
302
302
|
|
|
303
|
-
def episode(self, task: Task, ctx:
|
|
303
|
+
def episode(self, task: Task, ctx: ModelContext, n: int = 1) -> Episode:
|
|
304
304
|
"""Resolve `task` into a runnable episode of `n` rollouts: pick its runtime
|
|
305
305
|
(image + resources) and its timeouts (cli/toml > task > default, None = no limit),
|
|
306
306
|
build one `Rollout` per sample sharing them, and wrap them in an `Episode` (which
|
|
@@ -16,7 +16,7 @@ from typing import ClassVar, Generic, TypeVar
|
|
|
16
16
|
from pydantic import Field
|
|
17
17
|
from pydantic_config import BaseConfig
|
|
18
18
|
|
|
19
|
-
from verifiers.v1.clients import
|
|
19
|
+
from verifiers.v1.clients import ModelContext
|
|
20
20
|
from verifiers.v1.decorators import discover_decorated, invoke
|
|
21
21
|
from verifiers.v1.errors import HarnessError, boundary
|
|
22
22
|
from verifiers.v1.utils.install import env_name
|
|
@@ -131,7 +131,7 @@ class Harness(ABC, Generic[ConfigT]):
|
|
|
131
131
|
|
|
132
132
|
async def run(
|
|
133
133
|
self,
|
|
134
|
-
ctx:
|
|
134
|
+
ctx: ModelContext,
|
|
135
135
|
trace: Trace,
|
|
136
136
|
runtime: Runtime,
|
|
137
137
|
endpoint: str,
|
|
@@ -176,7 +176,7 @@ class Harness(ABC, Generic[ConfigT]):
|
|
|
176
176
|
@abstractmethod
|
|
177
177
|
async def launch(
|
|
178
178
|
self,
|
|
179
|
-
ctx:
|
|
179
|
+
ctx: ModelContext,
|
|
180
180
|
trace: Trace,
|
|
181
181
|
runtime: Runtime,
|
|
182
182
|
endpoint: str,
|
|
@@ -10,7 +10,7 @@ session secret) is read from an env var.
|
|
|
10
10
|
import logging
|
|
11
11
|
import shlex
|
|
12
12
|
|
|
13
|
-
from verifiers.v1.clients import
|
|
13
|
+
from verifiers.v1.clients import ModelContext
|
|
14
14
|
from verifiers.v1.harness import Harness, HarnessConfig
|
|
15
15
|
from verifiers.v1.runtimes import ProgramResult, Runtime
|
|
16
16
|
from verifiers.v1.trace import Trace
|
|
@@ -65,7 +65,7 @@ class CodexHarness(Harness[CodexHarnessConfig]):
|
|
|
65
65
|
|
|
66
66
|
async def launch(
|
|
67
67
|
self,
|
|
68
|
-
ctx:
|
|
68
|
+
ctx: ModelContext,
|
|
69
69
|
trace: Trace,
|
|
70
70
|
runtime: Runtime,
|
|
71
71
|
endpoint: str,
|
{verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/default/harness.py
RENAMED
|
@@ -14,7 +14,7 @@ import os
|
|
|
14
14
|
from pathlib import Path
|
|
15
15
|
|
|
16
16
|
from verifiers.v1.harness import Harness, HarnessConfig
|
|
17
|
-
from verifiers.v1.clients import
|
|
17
|
+
from verifiers.v1.clients import ModelContext
|
|
18
18
|
from verifiers.v1.dialects.chat import message_to_wire
|
|
19
19
|
from verifiers.v1.runtimes import ProgramResult, Runtime
|
|
20
20
|
from verifiers.v1.trace import Trace
|
|
@@ -61,7 +61,7 @@ class DefaultHarness(Harness[DefaultHarnessConfig]):
|
|
|
61
61
|
|
|
62
62
|
async def launch(
|
|
63
63
|
self,
|
|
64
|
-
ctx:
|
|
64
|
+
ctx: ModelContext,
|
|
65
65
|
trace: Trace,
|
|
66
66
|
runtime: Runtime,
|
|
67
67
|
endpoint: str,
|
{verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/kimi_code/harness.py
RENAMED
|
@@ -9,7 +9,7 @@ import json
|
|
|
9
9
|
import logging
|
|
10
10
|
import shlex
|
|
11
11
|
|
|
12
|
-
from verifiers.v1.clients import
|
|
12
|
+
from verifiers.v1.clients import ModelContext
|
|
13
13
|
from verifiers.v1.harness import Harness, HarnessConfig
|
|
14
14
|
from verifiers.v1.runtimes import ProgramResult, Runtime
|
|
15
15
|
from verifiers.v1.trace import Trace
|
|
@@ -64,7 +64,7 @@ class KimiCodeHarness(Harness[KimiCodeHarnessConfig]):
|
|
|
64
64
|
|
|
65
65
|
async def launch(
|
|
66
66
|
self,
|
|
67
|
-
ctx:
|
|
67
|
+
ctx: ModelContext,
|
|
68
68
|
trace: Trace,
|
|
69
69
|
runtime: Runtime,
|
|
70
70
|
endpoint: str,
|
{verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/mini_swe_agent/harness.py
RENAMED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from pathlib import Path
|
|
4
4
|
|
|
5
|
-
from verifiers.v1.clients import
|
|
5
|
+
from verifiers.v1.clients import ModelContext
|
|
6
6
|
from verifiers.v1.harness import Harness, HarnessConfig
|
|
7
7
|
from verifiers.v1.runtimes import ProgramResult, Runtime
|
|
8
8
|
from verifiers.v1.trace import Trace
|
|
@@ -27,7 +27,7 @@ class MiniSWEAgentHarness(Harness[MiniSWEAgentHarnessConfig]):
|
|
|
27
27
|
|
|
28
28
|
async def launch(
|
|
29
29
|
self,
|
|
30
|
-
ctx:
|
|
30
|
+
ctx: ModelContext,
|
|
31
31
|
trace: Trace,
|
|
32
32
|
runtime: Runtime,
|
|
33
33
|
endpoint: str,
|
|
@@ -11,7 +11,7 @@ import json
|
|
|
11
11
|
from pathlib import Path
|
|
12
12
|
|
|
13
13
|
from verifiers.v1.harness import Harness, HarnessConfig
|
|
14
|
-
from verifiers.v1.clients import
|
|
14
|
+
from verifiers.v1.clients import ModelContext
|
|
15
15
|
from verifiers.v1.dialects.chat import message_to_wire
|
|
16
16
|
from verifiers.v1.runtimes import ProgramResult, Runtime
|
|
17
17
|
from verifiers.v1.trace import Trace
|
|
@@ -35,7 +35,7 @@ class NullHarness(Harness[NullHarnessConfig]):
|
|
|
35
35
|
|
|
36
36
|
async def launch(
|
|
37
37
|
self,
|
|
38
|
-
ctx:
|
|
38
|
+
ctx: ModelContext,
|
|
39
39
|
trace: Trace,
|
|
40
40
|
runtime: Runtime,
|
|
41
41
|
endpoint: str,
|
|
@@ -18,7 +18,7 @@ from typing import Literal
|
|
|
18
18
|
from pydantic import model_validator
|
|
19
19
|
|
|
20
20
|
from verifiers.v1.harness import Harness, HarnessConfig
|
|
21
|
-
from verifiers.v1.clients import
|
|
21
|
+
from verifiers.v1.clients import ModelContext
|
|
22
22
|
from verifiers.v1.decorators import metric
|
|
23
23
|
from verifiers.v1.runtimes import ProgramResult, Runtime
|
|
24
24
|
from verifiers.v1.trace import Trace
|
|
@@ -115,7 +115,7 @@ class RLMHarness(Harness[RLMHarnessConfig]):
|
|
|
115
115
|
|
|
116
116
|
async def launch(
|
|
117
117
|
self,
|
|
118
|
-
ctx:
|
|
118
|
+
ctx: ModelContext,
|
|
119
119
|
trace: Trace,
|
|
120
120
|
runtime: Runtime,
|
|
121
121
|
endpoint: str,
|
{verifiers-0.1.15.dev423 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/terminus_2/harness.py
RENAMED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import logging
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
|
|
6
|
-
from verifiers.v1.clients import
|
|
6
|
+
from verifiers.v1.clients import ModelContext
|
|
7
7
|
from verifiers.v1.harness import Harness, HarnessConfig
|
|
8
8
|
from verifiers.v1.runtimes import ProgramResult, Runtime
|
|
9
9
|
from verifiers.v1.trace import Trace
|
|
@@ -39,7 +39,7 @@ class Terminus2Harness(Harness[Terminus2HarnessConfig]):
|
|
|
39
39
|
|
|
40
40
|
async def launch(
|
|
41
41
|
self,
|
|
42
|
-
ctx:
|
|
42
|
+
ctx: ModelContext,
|
|
43
43
|
trace: Trace,
|
|
44
44
|
runtime: Runtime,
|
|
45
45
|
endpoint: str,
|