verifiers 0.1.15.dev424__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.dev424 → verifiers-0.1.15.dev425}/PKG-INFO +1 -1
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/pyproject.toml +1 -0
- verifiers-0.1.15.dev425/verifiers/v1/cli/dashboard/replay.py +96 -0
- {verifiers-0.1.15.dev424 → 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.dev425/verifiers/v1/configs/replay.py +67 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/taskset.py +46 -6
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/.gitignore +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/LICENSE +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/README.md +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/AGENTS.md +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/README.md +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/conftest.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_browser_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_build_script.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_client_config.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_composable_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_env_group.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_env_server.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_environment.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_environment_extra.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_envs.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_error_chain.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_eval_display.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_eval_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_gym_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_imports.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_init_script.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_install_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_interception_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_logging.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_math_rubric.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_message_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_openenv_client.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_parser.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_path_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_renderer_client.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_rubric.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_rubric_group.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_save_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_setup_script.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_think_parser.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_tool_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_tool_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_types.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_wordle_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/test_xml_parser.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/v1/conftest.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/v1/test_configs.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/v1/test_envs.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/v1/test_graph.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/v1/test_judges.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/tests/v1/test_trace.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/AGENTS.md +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/cli/tui.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/clients/client.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/decorators.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/environment.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → 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.dev424 → 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.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
- {verifiers-0.1.15.dev424 → 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.dev424 → 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.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → 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.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → 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.dev424 → 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.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
- {verifiers-0.1.15.dev424 → 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.dev424 → 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.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/errors.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/gepa/config.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/gepa/display.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/rl/README.md +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/rl/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/rl/inference/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/rl/inference/client.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/rl/inference/server.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/rl/trainer/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/rl/trainer/config.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/rl/trainer/orchestrator.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/rl/trainer/trainer.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/rl/trainer/utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/scripts/build.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/scripts/init.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/scripts/install.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/scripts/rl.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/scripts/train.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/scripts/vllm.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/serve/types.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/types.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/ARCHITECTURE.md +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/GUIDE.md +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/README.md +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/configs/debug.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/env.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/episode.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/errors.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/graph.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/harness.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/default/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/default/harness.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/default/program.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/judge.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/retries.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/runtimes/docker.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/state.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/task.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/trace.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/types.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev425}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.1.15.dev424 → 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"
|
|
@@ -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
|
|
@@ -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()
|
|
@@ -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
|
|
@@ -17,6 +17,8 @@ For a heterogeneous taskset (different verification per task), have a single
|
|
|
17
17
|
"""
|
|
18
18
|
|
|
19
19
|
import asyncio
|
|
20
|
+
import inspect
|
|
21
|
+
import logging
|
|
20
22
|
from collections.abc import Mapping
|
|
21
23
|
from functools import cached_property
|
|
22
24
|
from typing import ClassVar, Generic, TypeVar
|
|
@@ -35,6 +37,8 @@ from verifiers.v1.state import StateT
|
|
|
35
37
|
from verifiers.v1.task import TaskT
|
|
36
38
|
from verifiers.v1.trace import Trace
|
|
37
39
|
|
|
40
|
+
logger = logging.getLogger(__name__)
|
|
41
|
+
|
|
38
42
|
|
|
39
43
|
class TasksetConfig(BaseConfig):
|
|
40
44
|
"""Base taskset config. Subclass to add task-generation knobs."""
|
|
@@ -172,17 +176,36 @@ class Taskset(Generic[TaskT, ConfigT, StateT]):
|
|
|
172
176
|
records the reason (the raised error's message)."""
|
|
173
177
|
return True
|
|
174
178
|
|
|
175
|
-
async def score(self, trace: Trace, runtime: Runtime) -> None:
|
|
179
|
+
async def score(self, trace: Trace, runtime: Runtime | None = None) -> None:
|
|
176
180
|
"""Score one rollout: run all `@metric`, then `@reward`, then the config-plugged
|
|
177
181
|
`judges` over its trace, concurrently within each phase. Each metric is recorded in
|
|
178
182
|
`trace.metrics` (a number, or a mapping merged in); each reward and judge verdict
|
|
179
183
|
(weighted — likewise a number or a mapping merged in) in `trace.rewards`, which
|
|
180
184
|
`trace.reward` sums. Signals declare what they need — `task`, `trace`,
|
|
181
185
|
`runtime` — so a reward is either a pure function of the trace or runs
|
|
182
|
-
read/write/exec in that (still-live) runtime, e.g. a verifier script.
|
|
183
|
-
|
|
186
|
+
read/write/exec in that (still-live) runtime, e.g. a verifier script.
|
|
187
|
+
|
|
188
|
+
`runtime` may be `None` — the offline path taken by `replay`, which re-scores a saved
|
|
189
|
+
trace with no live runtime. Signals that declare a `runtime` parameter are then skipped
|
|
190
|
+
(they can't run without one) and logged; trace-only `@metric`/`@reward`s and the plugged
|
|
191
|
+
judges (which grade from the trace) still run, overwriting their own keys and leaving the
|
|
192
|
+
skipped signals' previously-recorded values untouched. With a runtime present (the eval
|
|
193
|
+
path) nothing is skipped."""
|
|
194
|
+
available = {"task": trace.task, "trace": trace}
|
|
195
|
+
if runtime is not None:
|
|
196
|
+
available["runtime"] = runtime
|
|
197
|
+
|
|
198
|
+
def can_run(fn) -> bool:
|
|
199
|
+
# A signal that *requires* a runtime can't run without one, so skip it when replaying.
|
|
200
|
+
# A `runtime` parameter with a default (e.g. `runtime=None`) is optional — `invoke`
|
|
201
|
+
# just omits it — so those still run offline.
|
|
202
|
+
if runtime is not None:
|
|
203
|
+
return True
|
|
204
|
+
param = inspect.signature(fn).parameters.get("runtime")
|
|
205
|
+
return param is None or param.default is not inspect.Parameter.empty
|
|
206
|
+
|
|
184
207
|
async with boundary(TasksetError, f"taskset {type(self).__name__} scoring"):
|
|
185
|
-
metrics = discover_decorated(self, "metric")
|
|
208
|
+
metrics = [fn for fn in discover_decorated(self, "metric") if can_run(fn)]
|
|
186
209
|
metric_results = (
|
|
187
210
|
[await invoke(fn, available) for fn in metrics]
|
|
188
211
|
if len(metrics) < 2
|
|
@@ -193,7 +216,7 @@ class Taskset(Generic[TaskT, ConfigT, StateT]):
|
|
|
193
216
|
trace.record_metrics(result)
|
|
194
217
|
else:
|
|
195
218
|
trace.record_metric(fn.__name__, result)
|
|
196
|
-
rewards = discover_decorated(self, "reward")
|
|
219
|
+
rewards = [fn for fn in discover_decorated(self, "reward") if can_run(fn)]
|
|
197
220
|
reward_results = (
|
|
198
221
|
[await invoke(fn, available) for fn in rewards]
|
|
199
222
|
if len(rewards) < 2
|
|
@@ -206,7 +229,24 @@ class Taskset(Generic[TaskT, ConfigT, StateT]):
|
|
|
206
229
|
trace.record_reward(name, value, weight)
|
|
207
230
|
else:
|
|
208
231
|
trace.record_reward(fn.__name__, result, weight)
|
|
209
|
-
judges = self.judges
|
|
232
|
+
judges = [judge for judge in self.judges if can_run(judge.score)]
|
|
233
|
+
if runtime is None:
|
|
234
|
+
# Exactly the signals `can_run` filtered out above — those requiring a runtime
|
|
235
|
+
# (a `runtime` param with no default). Signals whose `runtime` has a default run
|
|
236
|
+
# offline and are not reported as skipped.
|
|
237
|
+
skipped = [
|
|
238
|
+
fn.__name__
|
|
239
|
+
for fn in (
|
|
240
|
+
*discover_decorated(self, "metric"),
|
|
241
|
+
*discover_decorated(self, "reward"),
|
|
242
|
+
)
|
|
243
|
+
if not can_run(fn)
|
|
244
|
+
] + [j.reward_name for j in self.judges if not can_run(j.score)]
|
|
245
|
+
if skipped:
|
|
246
|
+
logger.info(
|
|
247
|
+
"score: no runtime — skipped runtime-dependent signals: %s",
|
|
248
|
+
skipped,
|
|
249
|
+
)
|
|
210
250
|
judge_results = (
|
|
211
251
|
[await invoke(judge.score, available) for judge in judges]
|
|
212
252
|
if len(judges) < 2
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|