verifiers 0.2.0__tar.gz → 0.2.1.dev2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/PKG-INFO +1 -1
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/v1/test_e2e.py +5 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/v1/test_trace.py +4 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/cli/dashboard/base.py +11 -1
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/cli/dashboard/eval.py +22 -5
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/cli/eval/main.py +22 -13
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/dialects/chat.py +4 -1
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/interception/server.py +15 -3
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/legacy.py +19 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/push.py +6 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/trace.py +6 -0
- verifiers-0.2.1.dev2/verifiers/v1/utils/interrupt.py +33 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/.gitignore +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/LICENSE +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/README.md +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/pyproject.toml +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/AGENTS.md +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/conftest.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_build_script.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_client_config.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_env_group.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_env_server.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_environment.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_envs.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_imports.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_init_script.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_logging.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_parser.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_rubric.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_types.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_wordle_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/v1/conftest.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/v1/test_configs.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/v1/test_envs.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/v1/test_graph.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/v1/test_judges.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/decorators.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/errors.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/types.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/configs/debug.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/configs/replay.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/env.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/episode.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/errors.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/graph.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/harness.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/harnesses/default/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/harnesses/default/harness.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/harnesses/default/program.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/judge.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/retries.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/runtimes/docker.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/state.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/task.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/types.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.0 → verifiers-0.2.1.dev2}/verifiers/v1/utils/memory.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.1.dev2
|
|
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
|
|
@@ -74,6 +74,11 @@ async def test_tool(run_v1, harness_runtime, tool_runtime, tmp_path):
|
|
|
74
74
|
assert trace.errors == []
|
|
75
75
|
assert trace.num_turns >= 2 # tool call + answer
|
|
76
76
|
assert trace.reward == 1.0
|
|
77
|
+
# The interception server captured the advertised tools onto the trace (for tool-use SFT):
|
|
78
|
+
# the null harness offered the task's MCP tool as `echo_back`, schema included.
|
|
79
|
+
assert trace.tools is not None
|
|
80
|
+
(echo_tool,) = [t for t in trace.tools if t.name == "echo_back"]
|
|
81
|
+
assert "message" in echo_tool.parameters.get("properties", {})
|
|
77
82
|
|
|
78
83
|
|
|
79
84
|
@pytest.mark.e2e
|
|
@@ -60,6 +60,7 @@ def test_wire_trace_round_trip():
|
|
|
60
60
|
# carry node `parent` links for `num_branches` to survive.
|
|
61
61
|
tr = vf.Trace[MyTask, vf.State](
|
|
62
62
|
task=vf.TraceTask(type="MyTask", data=MyTask(idx=0, prompt="q", answer="a")),
|
|
63
|
+
tools=[vf.Tool(name="echo", description="", parameters={"type": "object"})],
|
|
63
64
|
nodes=[
|
|
64
65
|
MessageNode(parent=None, message=UserMessage(content="q"), sampled=False),
|
|
65
66
|
MessageNode(parent=0, message=AssistantMessage(content="a1"), sampled=True),
|
|
@@ -80,6 +81,9 @@ def test_wire_trace_round_trip():
|
|
|
80
81
|
assert rt.reward == 1.0 # property recomputed from `rewards`
|
|
81
82
|
assert rt.stop_condition == "done"
|
|
82
83
|
assert rt.info == {"build": "ok"}
|
|
84
|
+
assert (
|
|
85
|
+
rt.tools == tr.tools
|
|
86
|
+
) # the advertised tools persist (tool-use SFT reads them)
|
|
83
87
|
assert rt.task.data.model_extra == {
|
|
84
88
|
"answer": "a"
|
|
85
89
|
} # taskset extras preserved on WireTaskData
|
|
@@ -9,6 +9,8 @@ from collections.abc import Callable, Iterator
|
|
|
9
9
|
from rich.console import Group
|
|
10
10
|
from rich.live import Live
|
|
11
11
|
|
|
12
|
+
from verifiers.v1.utils.interrupt import cleaning_up
|
|
13
|
+
|
|
12
14
|
try: # POSIX-only terminal control; absent on Windows, where key reading is skipped.
|
|
13
15
|
import termios
|
|
14
16
|
import tty
|
|
@@ -82,10 +84,17 @@ async def live_view(
|
|
|
82
84
|
"""Refresh `render()` every 0.25s until the block exits, then draw one final frame. When
|
|
83
85
|
`on_key` is given, left/right arrow presses are dispatched to it (and redraw at once)."""
|
|
84
86
|
with Live(render(), auto_refresh=False) as live:
|
|
87
|
+
stopping = False
|
|
85
88
|
|
|
86
89
|
async def loop() -> None:
|
|
87
90
|
while True:
|
|
88
|
-
|
|
91
|
+
try:
|
|
92
|
+
await asyncio.sleep(0.25)
|
|
93
|
+
except asyncio.CancelledError:
|
|
94
|
+
# Ctrl-C cancels every task at once; keep refreshing so the cleanup notice
|
|
95
|
+
# stays live through teardown, stopping only when live_view tears down.
|
|
96
|
+
if stopping or not cleaning_up():
|
|
97
|
+
raise
|
|
89
98
|
live.update(render(), refresh=True)
|
|
90
99
|
|
|
91
100
|
task = asyncio.create_task(loop())
|
|
@@ -93,6 +102,7 @@ async def live_view(
|
|
|
93
102
|
try:
|
|
94
103
|
yield
|
|
95
104
|
finally:
|
|
105
|
+
stopping = True
|
|
96
106
|
task.cancel()
|
|
97
107
|
with contextlib.suppress(asyncio.CancelledError):
|
|
98
108
|
await task
|
|
@@ -14,6 +14,7 @@ from rich.text import Text
|
|
|
14
14
|
|
|
15
15
|
from verifiers.v1.cli.dashboard.base import live_view
|
|
16
16
|
from verifiers.v1.cli.output import output_path
|
|
17
|
+
from verifiers.v1.utils.interrupt import cleaning_up
|
|
17
18
|
from verifiers.v1.configs.eval import EvalConfig
|
|
18
19
|
from verifiers.v1.rollout import Phase, Rollout
|
|
19
20
|
from verifiers.v1.trace import Trace
|
|
@@ -110,6 +111,22 @@ def _aligned(rows: list[list[str]]) -> list[str]:
|
|
|
110
111
|
]
|
|
111
112
|
|
|
112
113
|
|
|
114
|
+
def _interrupt_footer() -> Group | None:
|
|
115
|
+
"""The graceful-shutdown notice under the rollouts once Ctrl-C has begun teardown — the
|
|
116
|
+
on-screen echo of the warning (console logging is silenced in rich mode); a further Ctrl-C
|
|
117
|
+
is ignored while it shows. Sits beside the `--push` line, mirroring its placement."""
|
|
118
|
+
if not cleaning_up():
|
|
119
|
+
return None
|
|
120
|
+
return Group(
|
|
121
|
+
Rule(style="dim"),
|
|
122
|
+
Text(
|
|
123
|
+
"interrupted — cleaning up, tearing down containers/sandboxes. "
|
|
124
|
+
"please wait; a further ctrl-c is ignored.",
|
|
125
|
+
style="yellow",
|
|
126
|
+
),
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
|
|
113
130
|
def _warning(config: EvalConfig) -> Text | None:
|
|
114
131
|
"""A local-runtime caution for a code-running harness (none for the tool-less `null`),
|
|
115
132
|
shown above the overview rather than as a row in it."""
|
|
@@ -561,11 +578,11 @@ def _render(
|
|
|
561
578
|
now = time.time()
|
|
562
579
|
warning = _warning(config)
|
|
563
580
|
header = Group(warning, Text(""), Overview(config)) if warning else Overview(config)
|
|
564
|
-
# The --push status line
|
|
565
|
-
#
|
|
566
|
-
#
|
|
567
|
-
|
|
568
|
-
footer =
|
|
581
|
+
# The --push status line (and, on Ctrl-C, the cleanup notice) appear under the rollouts. Measure
|
|
582
|
+
# the fixed top (header + progress + rule) and the footer so the rollout rows fill what's left;
|
|
583
|
+
# page through them (timer / arrows) when they'd overflow (else rich truncates).
|
|
584
|
+
footers = [f for f in (_push_footer(push), _interrupt_footer()) if f is not None]
|
|
585
|
+
footer = Group(*footers) if footers else None
|
|
569
586
|
top = Group(header, Progress(rollouts, start), Rule(style="dim"))
|
|
570
587
|
reserved = len(_CONSOLE.render_lines(top))
|
|
571
588
|
if footer is not None:
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import logging
|
|
5
|
-
import signal
|
|
6
5
|
import sys
|
|
7
6
|
|
|
8
7
|
from pydantic_config import cli
|
|
9
8
|
|
|
10
9
|
import verifiers.v1 as vf
|
|
10
|
+
from verifiers.v1.utils.interrupt import install as install_interrupt
|
|
11
11
|
from verifiers.v1.utils.logging import setup_logging
|
|
12
12
|
from verifiers.v1.cli.output import output_path, write_config
|
|
13
13
|
from verifiers.v1.cli.resolve import (
|
|
@@ -80,21 +80,30 @@ def main(argv: list[str] | None = None) -> None:
|
|
|
80
80
|
logging.lastResort = None
|
|
81
81
|
else:
|
|
82
82
|
setup_logging(level, log_file=log_file, console=True)
|
|
83
|
-
#
|
|
84
|
-
# rollout's `finally` (tears down containers/sandboxes) and any worker pool it
|
|
85
|
-
|
|
83
|
+
# First Ctrl-C / SIGTERM warns and raises KeyboardInterrupt so a killed/timed-out eval still
|
|
84
|
+
# runs each rollout's `finally` (tears down containers/sandboxes) and any worker pool it
|
|
85
|
+
# spawned; further signals during that cleanup are swallowed so an impatient second Ctrl-C
|
|
86
|
+
# can't orphan those resources.
|
|
87
|
+
install_interrupt()
|
|
86
88
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
+
try:
|
|
90
|
+
if (
|
|
91
|
+
config.is_legacy
|
|
92
|
+
): # v0 backwards-compat: run the classic env, bridged to Traces
|
|
93
|
+
from verifiers.v1.legacy import run_legacy_eval
|
|
89
94
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
95
|
+
traces = asyncio.run(run_legacy_eval(config))
|
|
96
|
+
elif config.server: # opt-in: drive rollouts through the env-server worker pool
|
|
97
|
+
from verifiers.v1.cli.eval.runner import run_eval_server
|
|
93
98
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
99
|
+
traces = asyncio.run(run_eval_server(config))
|
|
100
|
+
else: # in-process (default), with or without the live dashboard
|
|
101
|
+
env = vf.Environment(config)
|
|
102
|
+
traces = asyncio.run(run_eval(env, config))
|
|
103
|
+
except KeyboardInterrupt:
|
|
104
|
+
# Graceful cleanup has already run (each rollout's `finally`); partial results are on
|
|
105
|
+
# disk. Exit on the conventional Ctrl-C code without a traceback.
|
|
106
|
+
raise SystemExit(130)
|
|
98
107
|
if config.push and not rich:
|
|
99
108
|
from verifiers.v1.push import push_traces
|
|
100
109
|
|
|
@@ -96,6 +96,9 @@ def parse_message(raw: dict) -> Message:
|
|
|
96
96
|
|
|
97
97
|
|
|
98
98
|
def parse_tools(raw: list[dict] | None) -> list[Tool] | None:
|
|
99
|
+
# `or None` so a tools array with no function entries (e.g. only `custom`/built-in
|
|
100
|
+
# tools) parses to None, not [] — the same contract as the anthropic/responses
|
|
101
|
+
# dialects, and what keeps an empty parse from clearing `Trace.tools`.
|
|
99
102
|
if not raw:
|
|
100
103
|
return None
|
|
101
104
|
return [
|
|
@@ -107,7 +110,7 @@ def parse_tools(raw: list[dict] | None) -> list[Tool] | None:
|
|
|
107
110
|
)
|
|
108
111
|
for t in raw
|
|
109
112
|
if t.get("type", "function") == "function"
|
|
110
|
-
]
|
|
113
|
+
] or None
|
|
111
114
|
|
|
112
115
|
|
|
113
116
|
# --- vf -> chat wire ----------------------------------------------------------
|
|
@@ -43,7 +43,7 @@ from verifiers.v1.errors import (
|
|
|
43
43
|
UserError,
|
|
44
44
|
)
|
|
45
45
|
from verifiers.v1.trace import Trace
|
|
46
|
-
from verifiers.v1.types import Messages
|
|
46
|
+
from verifiers.v1.types import Messages, Tool
|
|
47
47
|
|
|
48
48
|
if TYPE_CHECKING:
|
|
49
49
|
from verifiers.v1.mcp import Respond
|
|
@@ -259,7 +259,10 @@ class InterceptionServer:
|
|
|
259
259
|
# dialect's typed view for building the trace; the renderer re-derives its own from `body`.
|
|
260
260
|
# A user simulator extends both each turn (`dialect.extend` for wire, `prompt` for trace).
|
|
261
261
|
prompt: Messages
|
|
262
|
-
|
|
262
|
+
# `tools` is recorded onto the trace only when a turn commits (below / in `_stream`):
|
|
263
|
+
# the request is ground truth for what the model saw, but a refused or failed request
|
|
264
|
+
# was never seen at all.
|
|
265
|
+
prompt, tools = dialect.parse_request(body)
|
|
263
266
|
# Cache the opening so retries do not advance the simulator twice.
|
|
264
267
|
if (
|
|
265
268
|
session.user is not None
|
|
@@ -273,7 +276,7 @@ class InterceptionServer:
|
|
|
273
276
|
# If the simulator ended at the open (its task's `@stop` now fires), the loop's
|
|
274
277
|
# `refused()` below halts the harness before any model call — no special-casing here.
|
|
275
278
|
if dialect.streaming(body):
|
|
276
|
-
return await self._stream(request, session, dialect, body, prompt)
|
|
279
|
+
return await self._stream(request, session, dialect, body, prompt, tools)
|
|
277
280
|
headers = request.headers.copy()
|
|
278
281
|
# A user simulator turns one program request into a multi-turn exchange: after each
|
|
279
282
|
# model turn the simulator's reply is injected as a user turn and the model is
|
|
@@ -356,6 +359,12 @@ class InterceptionServer:
|
|
|
356
359
|
)
|
|
357
360
|
turn.commit(response) # one node per new message;
|
|
358
361
|
# branches fall out of walking the graph (see Trace.branches / verifiers.v1.graph)
|
|
362
|
+
if tools:
|
|
363
|
+
# Persist the advertised tools now that the model actually saw them (see
|
|
364
|
+
# `Trace.tools`). Only a tools-bearing turn updates it (truthy, so an empty
|
|
365
|
+
# parse or a trailing tool-less call never erases the schemas the recorded
|
|
366
|
+
# tool calls need).
|
|
367
|
+
session.trace.tools = tools
|
|
359
368
|
# Hand back to the program when the model wants a tool (the program runs it) or
|
|
360
369
|
# when there's no user simulator to keep the conversation going.
|
|
361
370
|
if response.message.tool_calls or session.user is None:
|
|
@@ -389,6 +398,7 @@ class InterceptionServer:
|
|
|
389
398
|
dialect: Dialect,
|
|
390
399
|
body: dict,
|
|
391
400
|
prompt: Messages,
|
|
401
|
+
tools: list[Tool] | None = None,
|
|
392
402
|
) -> web.StreamResponse:
|
|
393
403
|
"""A streamed (SSE) model turn: relay the provider's stream through to the program,
|
|
394
404
|
incrementally assembling the response to record on the trace. Single-shot — a streamed
|
|
@@ -502,6 +512,8 @@ class InterceptionServer:
|
|
|
502
512
|
if parser_error is not None:
|
|
503
513
|
raise parser_error
|
|
504
514
|
turn.commit(parser.finish())
|
|
515
|
+
if tools: # record only on commit, like the non-streaming path
|
|
516
|
+
session.trace.tools = tools
|
|
505
517
|
logger.debug("intercept stream turn: id=%s", session.trace.id)
|
|
506
518
|
finally:
|
|
507
519
|
# Release the withheld events only now — after the commit — then close.
|
|
@@ -20,6 +20,7 @@ from typing import Any
|
|
|
20
20
|
|
|
21
21
|
import zmq
|
|
22
22
|
import zmq.asyncio
|
|
23
|
+
from pydantic import ValidationError
|
|
23
24
|
|
|
24
25
|
from verifiers.v1.clients.config import ClientConfig, TrainClientConfig
|
|
25
26
|
from verifiers.v1.serve.server import EnvServer
|
|
@@ -37,6 +38,7 @@ from verifiers.v1.types import (
|
|
|
37
38
|
Response,
|
|
38
39
|
SamplingConfig,
|
|
39
40
|
SystemMessage,
|
|
41
|
+
Tool,
|
|
40
42
|
ToolCall,
|
|
41
43
|
ToolMessage,
|
|
42
44
|
TurnTokens,
|
|
@@ -61,6 +63,22 @@ def _as_dict(obj: Any) -> Any:
|
|
|
61
63
|
return obj
|
|
62
64
|
|
|
63
65
|
|
|
66
|
+
def _to_v1_tools(raw: Any) -> list[Tool] | None:
|
|
67
|
+
"""Map v0 ``RolloutOutput.tool_defs`` onto ``Trace.tools``. The v0 and v1 ``Tool``
|
|
68
|
+
shapes are identical (name/description/parameters/strict), so this is a re-validation;
|
|
69
|
+
malformed entries are dropped rather than failing the whole trace mapping."""
|
|
70
|
+
defs: list[Tool] = []
|
|
71
|
+
for t in raw or []:
|
|
72
|
+
t = _as_dict(t)
|
|
73
|
+
if not isinstance(t, dict):
|
|
74
|
+
continue
|
|
75
|
+
try:
|
|
76
|
+
defs.append(Tool.model_validate(t))
|
|
77
|
+
except ValidationError:
|
|
78
|
+
continue
|
|
79
|
+
return defs or None
|
|
80
|
+
|
|
81
|
+
|
|
64
82
|
def _text(content: Any) -> str:
|
|
65
83
|
"""Flatten a message ``content`` (str, or a list of content parts) to text."""
|
|
66
84
|
if isinstance(content, str):
|
|
@@ -234,6 +252,7 @@ def rollout_output_to_trace(out: dict, task_idx: int) -> Trace:
|
|
|
234
252
|
type="Task",
|
|
235
253
|
data=_to_wire_task(task_idx, out.get("prompt"), out.get("answer")),
|
|
236
254
|
),
|
|
255
|
+
tools=_to_v1_tools(out.get("tool_defs")),
|
|
237
256
|
rewards={"reward": float(out.get("reward") or 0.0)},
|
|
238
257
|
metrics={k: float(v) for k, v in (out.get("metrics") or {}).items()},
|
|
239
258
|
is_completed=bool(out.get("is_completed", True)),
|
|
@@ -56,6 +56,12 @@ def trace_to_sample(trace: Trace, rollout_number: int = 1) -> dict[str, Any]:
|
|
|
56
56
|
"prompt": [],
|
|
57
57
|
"completion": dump(branches[-1].messages) if branches else [],
|
|
58
58
|
"answer": task.get("answer"),
|
|
59
|
+
# The tools advertised to the model (`Trace.tools`); keyed `tool_defs` because the
|
|
60
|
+
# v0 sample format already carries it there, so bridged and native rollouts render
|
|
61
|
+
# the same on the platform.
|
|
62
|
+
"tool_defs": [t.model_dump(mode="json", exclude_none=True) for t in trace.tools]
|
|
63
|
+
if trace.tools
|
|
64
|
+
else None,
|
|
59
65
|
"reward": trace.reward,
|
|
60
66
|
"timing": trace.timing.model_dump(mode="json", exclude_none=True),
|
|
61
67
|
"is_completed": trace.is_completed,
|
|
@@ -24,6 +24,7 @@ from verifiers.v1.types import (
|
|
|
24
24
|
AssistantMessage,
|
|
25
25
|
Messages,
|
|
26
26
|
StrictBaseModel,
|
|
27
|
+
Tool,
|
|
27
28
|
ToolMessage,
|
|
28
29
|
Usage,
|
|
29
30
|
content_text,
|
|
@@ -200,6 +201,11 @@ class Trace(StrictBaseModel, Generic[DataT, StateT]):
|
|
|
200
201
|
"""The runtime's full config plus its provisioned resource ID."""
|
|
201
202
|
nodes: list[MessageNode] = Field(default_factory=list)
|
|
202
203
|
"""The message graph; branches are derived views and storage stays linear in turns."""
|
|
204
|
+
tools: list[Tool] | None = None
|
|
205
|
+
"""The tools advertised to the model, recorded when an intercepted turn commits (last
|
|
206
|
+
committed turn wins) — never from a refused/failed request the model never saw. The full
|
|
207
|
+
advertised list (not just tools called), so tool-use SFT can re-render the exact prompt;
|
|
208
|
+
a trace-level snapshot: mid-rollout changes collapse to the last set the model saw."""
|
|
203
209
|
|
|
204
210
|
rewards: dict[str, float] = Field(default_factory=dict)
|
|
205
211
|
"""Weighted contributions from task rewards, group rewards, and judges."""
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""Graceful-shutdown signal handling for the eval CLI: the first Ctrl-C/SIGTERM warns and
|
|
2
|
+
raises KeyboardInterrupt so asyncio unwinds each rollout's teardown `finally`; further signals
|
|
3
|
+
are swallowed so a second Ctrl-C can't orphan containers/sandboxes mid-cleanup."""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import signal
|
|
7
|
+
|
|
8
|
+
logger = logging.getLogger(__name__)
|
|
9
|
+
|
|
10
|
+
_cleaning_up = False
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def cleaning_up() -> bool:
|
|
14
|
+
"""Whether a shutdown signal has begun graceful cleanup (read by the dashboard)."""
|
|
15
|
+
return _cleaning_up
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def install() -> None:
|
|
19
|
+
"""Route SIGINT/SIGTERM through the graceful-shutdown handler."""
|
|
20
|
+
|
|
21
|
+
def handle(*_) -> None:
|
|
22
|
+
global _cleaning_up
|
|
23
|
+
first, _cleaning_up = not _cleaning_up, True
|
|
24
|
+
logger.warning(
|
|
25
|
+
"interrupted — cleaning up, please wait..."
|
|
26
|
+
if first
|
|
27
|
+
else "cleanup in progress — please wait (ctrl-c ignored)"
|
|
28
|
+
)
|
|
29
|
+
if first:
|
|
30
|
+
raise KeyboardInterrupt
|
|
31
|
+
|
|
32
|
+
signal.signal(signal.SIGINT, handle)
|
|
33
|
+
signal.signal(signal.SIGTERM, handle)
|
|
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
|
|
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
|