verifiers 0.1.15.dev414__tar.gz → 0.1.15.dev416__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.dev414 → verifiers-0.1.15.dev416}/PKG-INFO +1 -1
- verifiers-0.1.15.dev416/tests/v1/test_scoring.py +33 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/__init__.py +15 -0
- verifiers-0.1.15.dev416/verifiers/v1/cli/dashboard/base.py +108 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/dashboard/eval.py +48 -11
- verifiers-0.1.15.dev416/verifiers/v1/scoring.py +166 -0
- verifiers-0.1.15.dev414/verifiers/v1/cli/dashboard/base.py +0 -32
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/.gitignore +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/LICENSE +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/README.md +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/pyproject.toml +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/AGENTS.md +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/README.md +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/conftest.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_browser_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_build_script.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_client_config.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_composable_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_env_group.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_env_server.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_environment.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_environment_extra.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_envs.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_error_chain.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_eval_display.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_eval_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_gym_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_imports.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_init_script.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_install_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_interception_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_logging.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_math_rubric.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_message_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_openenv_client.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_parser.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_path_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_renderer_client.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_rubric.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_rubric_group.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_save_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_setup_script.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_think_parser.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_tool_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_tool_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_types.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_wordle_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/test_xml_parser.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/conftest.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/test_configs.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/test_envs.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/test_graph.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/tests/v1/test_trace.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/AGENTS.md +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/cli/tui.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/clients/client.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/decorators.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/environment.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/errors.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/gepa/config.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/gepa/display.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rl/README.md +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rl/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rl/inference/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rl/inference/client.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rl/inference/server.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rl/trainer/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rl/trainer/config.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rl/trainer/orchestrator.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rl/trainer/trainer.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rl/trainer/utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/build.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/init.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/install.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/rl.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/train.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/scripts/vllm.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/serve/types.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/types.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/ARCHITECTURE.md +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/GUIDE.md +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/README.md +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/env.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/episode.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/errors.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/graph.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harness.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/default/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/default/harness.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/default/program.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/judge.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/mcp/multiplex.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/retries.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/runtimes/docker.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/state.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/task.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/trace.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/types.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.1.15.dev414 → verifiers-0.1.15.dev416}/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.dev416
|
|
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
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import verifiers.v1 as vf
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def test_compare_stdout_results_accepts_token_equal_text() -> None:
|
|
5
|
+
assert vf.compare_stdout_results("hello world\n", "hello world\n")
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def test_compare_stdout_results_keeps_numeric_tolerance() -> None:
|
|
9
|
+
assert vf.compare_stdout_results("1.0001 2.0\n", "1.0002 2.0009\n")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def test_parse_pytest_outcomes_strips_xfail_xpass_reasons() -> None:
|
|
13
|
+
output = "\n".join(
|
|
14
|
+
[
|
|
15
|
+
"XFAIL tests/test_mod.py::test_xfail - known bug - still tracked",
|
|
16
|
+
"XPASS tests/test_mod.py::test_xpass - always xfail - unexpectedly passed",
|
|
17
|
+
"FAILED tests/test_mod.py::test_param[a - b] - assert left - right",
|
|
18
|
+
"PASSED tests/test_mod.py::test_ok",
|
|
19
|
+
]
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
assert vf.parse_pytest_outcomes(output) == {
|
|
23
|
+
"tests/test_mod.py::test_xfail": "XFAIL",
|
|
24
|
+
"tests/test_mod.py::test_xpass": "XPASS",
|
|
25
|
+
"tests/test_mod.py::test_param[a - b]": "FAILED",
|
|
26
|
+
"tests/test_mod.py::test_ok": "PASSED",
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def test_parse_judge_choice_uses_first_choice_after_verdict_marker() -> None:
|
|
31
|
+
response = "Final Judgment: B because it is a better answer"
|
|
32
|
+
|
|
33
|
+
assert vf.parse_judge_choice(response, choices=("A", "B")) == "B"
|
|
@@ -49,6 +49,14 @@ from verifiers.v1.loaders import (
|
|
|
49
49
|
task_type,
|
|
50
50
|
taskset_config_type,
|
|
51
51
|
)
|
|
52
|
+
from verifiers.v1.scoring import (
|
|
53
|
+
compare_stdout_results as compare_stdout_results,
|
|
54
|
+
extract_boxed_answer as extract_boxed_answer,
|
|
55
|
+
parse_judge_choice as parse_judge_choice,
|
|
56
|
+
parse_pytest_outcomes as parse_pytest_outcomes,
|
|
57
|
+
read_answer_file_or_last_reply as read_answer_file_or_last_reply,
|
|
58
|
+
verify_boxed_math_answer as verify_boxed_math_answer,
|
|
59
|
+
)
|
|
52
60
|
from verifiers.v1.retries import RetryConfig, RolloutRetryConfig
|
|
53
61
|
from verifiers.v1.rollout import Rollout
|
|
54
62
|
from verifiers.v1.runtimes import (
|
|
@@ -195,6 +203,13 @@ __all__ = [
|
|
|
195
203
|
"JudgeConfig",
|
|
196
204
|
"JudgeSamplingConfig",
|
|
197
205
|
"JudgeResponse",
|
|
206
|
+
# scoring
|
|
207
|
+
"compare_stdout_results",
|
|
208
|
+
"extract_boxed_answer",
|
|
209
|
+
"parse_judge_choice",
|
|
210
|
+
"parse_pytest_outcomes",
|
|
211
|
+
"read_answer_file_or_last_reply",
|
|
212
|
+
"verify_boxed_math_answer",
|
|
198
213
|
# mcp
|
|
199
214
|
"Toolset",
|
|
200
215
|
"ToolsetConfig",
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"""The shared dashboard engine: a rich `Live` view on a fixed refresh tick.
|
|
2
|
+
|
|
3
|
+
The eval and validate dashboards each build their own frame; `live_view` just drives whichever
|
|
4
|
+
`render` it's given — refreshing on a timer and drawing a final frame on exit. When given an
|
|
5
|
+
`on_key` handler it also reads left/right arrow presses from the terminal (see `_key_reader`).
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import asyncio
|
|
9
|
+
import contextlib
|
|
10
|
+
import os
|
|
11
|
+
import sys
|
|
12
|
+
from collections.abc import Callable, Iterator
|
|
13
|
+
|
|
14
|
+
from rich.console import Group
|
|
15
|
+
from rich.live import Live
|
|
16
|
+
|
|
17
|
+
try: # POSIX-only terminal control; absent on Windows, where key reading is skipped.
|
|
18
|
+
import termios
|
|
19
|
+
import tty
|
|
20
|
+
|
|
21
|
+
_HAS_TTY = True
|
|
22
|
+
except ImportError:
|
|
23
|
+
_HAS_TTY = False
|
|
24
|
+
|
|
25
|
+
# Arrow-key escape sequences → direction, covering both the normal (`ESC [`) and application
|
|
26
|
+
# (`ESC O`) cursor-key modes a terminal might send.
|
|
27
|
+
_ARROWS = {
|
|
28
|
+
b"\x1b[C": "right",
|
|
29
|
+
b"\x1bOC": "right",
|
|
30
|
+
b"\x1b[D": "left",
|
|
31
|
+
b"\x1bOD": "left",
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@contextlib.contextmanager
|
|
36
|
+
def _key_reader(
|
|
37
|
+
on_key: Callable[[str], None] | None, refresh: Callable[[], None]
|
|
38
|
+
) -> Iterator[None]:
|
|
39
|
+
"""Dispatch left/right arrow presses to `on_key`, redrawing immediately after each so the
|
|
40
|
+
view feels instant rather than waiting for the next refresh tick. A no-op unless `on_key` is
|
|
41
|
+
given and stdin is a real terminal. Puts stdin in cbreak mode (char-at-a-time, no echo, Ctrl+C
|
|
42
|
+
still interrupts) and reads it via the event loop — no extra thread — restoring the terminal on
|
|
43
|
+
exit."""
|
|
44
|
+
if on_key is None or not _HAS_TTY or not sys.stdin.isatty():
|
|
45
|
+
yield
|
|
46
|
+
return
|
|
47
|
+
fd = sys.stdin.fileno()
|
|
48
|
+
loop = asyncio.get_running_loop()
|
|
49
|
+
old = termios.tcgetattr(fd)
|
|
50
|
+
# carries a partial escape across reads — cbreak can split a key's 3 bytes over callbacks
|
|
51
|
+
buf = bytearray()
|
|
52
|
+
|
|
53
|
+
def _read() -> None:
|
|
54
|
+
try:
|
|
55
|
+
data = os.read(fd, 32)
|
|
56
|
+
except OSError:
|
|
57
|
+
return
|
|
58
|
+
if not data:
|
|
59
|
+
return
|
|
60
|
+
buf.extend(data)
|
|
61
|
+
fired = False
|
|
62
|
+
i = 0
|
|
63
|
+
while i < len(buf): # a chunk may hold several presses; scan the whole buffer
|
|
64
|
+
if key := _ARROWS.get(bytes(buf[i : i + 3])):
|
|
65
|
+
on_key(key)
|
|
66
|
+
fired = True
|
|
67
|
+
i += 3
|
|
68
|
+
elif buf[i] == 0x1B and len(buf) - i < 3:
|
|
69
|
+
break # incomplete escape at the tail — hold it for the next read
|
|
70
|
+
else:
|
|
71
|
+
i += 1
|
|
72
|
+
del buf[:i]
|
|
73
|
+
if fired:
|
|
74
|
+
refresh()
|
|
75
|
+
|
|
76
|
+
# setcbreak inside the try so the finally always restores the terminal, even if it (or
|
|
77
|
+
# add_reader) raises — otherwise stdin could be left in cbreak with echo off after we exit.
|
|
78
|
+
try:
|
|
79
|
+
tty.setcbreak(fd)
|
|
80
|
+
loop.add_reader(fd, _read)
|
|
81
|
+
yield
|
|
82
|
+
finally:
|
|
83
|
+
loop.remove_reader(fd)
|
|
84
|
+
termios.tcsetattr(fd, termios.TCSADRAIN, old)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
@contextlib.asynccontextmanager
|
|
88
|
+
async def live_view(
|
|
89
|
+
render: Callable[[], Group], on_key: Callable[[str], None] | None = None
|
|
90
|
+
):
|
|
91
|
+
"""Refresh `render()` every 0.25s until the block exits, then draw one final frame. When
|
|
92
|
+
`on_key` is given, left/right arrow presses are dispatched to it (and redraw at once)."""
|
|
93
|
+
with Live(render(), auto_refresh=False) as live:
|
|
94
|
+
|
|
95
|
+
async def loop() -> None:
|
|
96
|
+
while True:
|
|
97
|
+
await asyncio.sleep(0.25)
|
|
98
|
+
live.update(render(), refresh=True)
|
|
99
|
+
|
|
100
|
+
task = asyncio.create_task(loop())
|
|
101
|
+
with _key_reader(on_key, lambda: live.update(render(), refresh=True)):
|
|
102
|
+
try:
|
|
103
|
+
yield
|
|
104
|
+
finally:
|
|
105
|
+
task.cancel()
|
|
106
|
+
with contextlib.suppress(asyncio.CancelledError):
|
|
107
|
+
await task
|
|
108
|
+
live.update(render(), refresh=True)
|
|
@@ -220,8 +220,8 @@ def Progress(
|
|
|
220
220
|
f"{len(done)}/{len(rollouts)} · {format_time(time.time() - start)} · "
|
|
221
221
|
f"reward {reward} · err {err}"
|
|
222
222
|
)
|
|
223
|
-
if page is not None: #
|
|
224
|
-
stats += f" (page {page[0]}/{page[1]})"
|
|
223
|
+
if page is not None: # overflowing — show which page, and that the arrows page
|
|
224
|
+
stats += f" (page {page[0]}/{page[1]} ◄ ►)"
|
|
225
225
|
row = Table.grid(expand=True, padding=(0, 1))
|
|
226
226
|
row.add_column(ratio=1) # bar stretches to fill the width left of the stats
|
|
227
227
|
row.add_column(justify="right", no_wrap=True)
|
|
@@ -495,13 +495,42 @@ def Rows(groups: list[list[Rollout]], now: float, runtime_type: str) -> Table:
|
|
|
495
495
|
return grid
|
|
496
496
|
|
|
497
497
|
|
|
498
|
+
class Pager:
|
|
499
|
+
"""Which page of overflowing rollout rows is on screen. Auto-advances on a timer until the
|
|
500
|
+
user takes over with the left/right arrows, after which it stays where they leave it. `count`
|
|
501
|
+
(the page count, set each render by `_paginate`) gates the arrows: they're inert while a single
|
|
502
|
+
page fits, so a stray press before rollouts overflow can't switch off auto-advance or offset the
|
|
503
|
+
starting page once paging begins. The chosen page is clamped to `count` (it can shrink on a
|
|
504
|
+
resize; it otherwise only grows, as rollouts are never removed)."""
|
|
505
|
+
|
|
506
|
+
def __init__(self) -> None:
|
|
507
|
+
self.page = 0
|
|
508
|
+
self.manual = False
|
|
509
|
+
self.count = 1
|
|
510
|
+
|
|
511
|
+
def on_key(self, key: str) -> None:
|
|
512
|
+
if key in ("left", "right") and self.count > 1:
|
|
513
|
+
self.manual = True
|
|
514
|
+
self.page += 1 if key == "right" else -1
|
|
515
|
+
|
|
516
|
+
def index(self, now: float) -> int:
|
|
517
|
+
# Track the auto page while it drives, so the first arrow continues from what's on screen
|
|
518
|
+
# rather than jumping back to page 1. Clamp in manual mode (count can shrink on resize).
|
|
519
|
+
if not self.manual:
|
|
520
|
+
self.page = int(now / _PAGE_SECONDS) % self.count
|
|
521
|
+
else:
|
|
522
|
+
self.page = max(0, min(self.page, self.count - 1))
|
|
523
|
+
return self.page
|
|
524
|
+
|
|
525
|
+
|
|
498
526
|
def _paginate(
|
|
499
|
-
groups: list[list[Rollout]], rows_per_page: int, now: float
|
|
527
|
+
groups: list[list[Rollout]], rows_per_page: int, pager: Pager, now: float
|
|
500
528
|
) -> tuple[list[list[Rollout]], int, int]:
|
|
501
529
|
"""Pack groups (a task's rollouts kept together) into pages of at most `rows_per_page` rows,
|
|
502
|
-
|
|
503
|
-
|
|
530
|
+
selecting the one `pager` points at. Returns (this page's groups, 0-based index, page count) —
|
|
531
|
+
a single page when everything already fits."""
|
|
504
532
|
if sum(len(g) for g in groups) <= rows_per_page:
|
|
533
|
+
pager.count = 1 # everything fits on one page — arrows stay inert
|
|
505
534
|
return groups, 0, 1
|
|
506
535
|
pages: list[list[list[Rollout]]] = []
|
|
507
536
|
current: list[list[Rollout]] = []
|
|
@@ -514,20 +543,24 @@ def _paginate(
|
|
|
514
543
|
used += len(group)
|
|
515
544
|
if current:
|
|
516
545
|
pages.append(current)
|
|
517
|
-
|
|
546
|
+
pager.count = len(pages)
|
|
547
|
+
index = pager.index(now)
|
|
518
548
|
return pages[index], index, len(pages)
|
|
519
549
|
|
|
520
550
|
|
|
521
|
-
def _render(
|
|
551
|
+
def _render(
|
|
552
|
+
rollouts: list[Rollout], config: EvalConfig, start: float, pager: Pager
|
|
553
|
+
) -> Group:
|
|
522
554
|
now = time.time()
|
|
523
555
|
warning = _warning(config)
|
|
524
556
|
# `{warning}\n\n{overview}` — the caution sits at the very top, blank line, then the overview.
|
|
525
557
|
header = Group(warning, Text(""), Overview(config)) if warning else Overview(config)
|
|
526
558
|
# Measure the fixed top (header + progress + rule) so the rollout rows fill the rest of the
|
|
527
|
-
# screen; page through them
|
|
559
|
+
# screen; page through them (timer, or the left/right arrows) when they'd overflow (rich would
|
|
560
|
+
# otherwise truncate).
|
|
528
561
|
top = Group(header, Progress(rollouts, start), Rule(style="dim"))
|
|
529
562
|
rows_per_page = max(1, _CONSOLE.size.height - len(_CONSOLE.render_lines(top)) - 1)
|
|
530
|
-
page_groups, index, count = _paginate(_groups(rollouts), rows_per_page, now)
|
|
563
|
+
page_groups, index, count = _paginate(_groups(rollouts), rows_per_page, pager, now)
|
|
531
564
|
progress = Progress(rollouts, start, page=(index + 1, count) if count > 1 else None)
|
|
532
565
|
return Group(
|
|
533
566
|
header,
|
|
@@ -539,6 +572,10 @@ def _render(rollouts: list[Rollout], config: EvalConfig, start: float) -> Group:
|
|
|
539
572
|
|
|
540
573
|
@contextlib.asynccontextmanager
|
|
541
574
|
async def dashboard(rollouts: list[Rollout], config: EvalConfig, start: float):
|
|
542
|
-
"""Refresh the live eval view until the `with` block exits, then a final frame.
|
|
543
|
-
|
|
575
|
+
"""Refresh the live eval view until the `with` block exits, then a final frame. Left/right
|
|
576
|
+
arrows page through rollout rows when they overflow the screen."""
|
|
577
|
+
pager = Pager()
|
|
578
|
+
async with live_view(
|
|
579
|
+
lambda: _render(rollouts, config, start, pager), on_key=pager.on_key
|
|
580
|
+
):
|
|
544
581
|
yield
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from collections.abc import Sequence
|
|
5
|
+
from decimal import Decimal, InvalidOperation
|
|
6
|
+
from typing import TYPE_CHECKING
|
|
7
|
+
|
|
8
|
+
from math_verify import parse, verify
|
|
9
|
+
from math_verify.errors import TimeoutException as MathVerifyTimeout
|
|
10
|
+
|
|
11
|
+
from verifiers.v1.errors import SandboxError
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from verifiers.v1.runtimes import Runtime
|
|
15
|
+
from verifiers.v1.trace import Trace
|
|
16
|
+
|
|
17
|
+
BOXED_START = "\\boxed{"
|
|
18
|
+
ANSI_RE = re.compile(r"\x1b\[[0-?]*[ -/]*[@-~]")
|
|
19
|
+
PYTEST_OUTCOMES = ("PASSED", "FAILED", "ERROR", "SKIPPED", "XFAIL", "XPASS")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def extract_boxed_answer(text: str, strict: bool = False) -> str:
|
|
23
|
+
start = text.rfind(BOXED_START)
|
|
24
|
+
if start == -1:
|
|
25
|
+
return "" if strict else text
|
|
26
|
+
|
|
27
|
+
# Regex is the wrong tool for nested braces, so walk the final box by hand.
|
|
28
|
+
answer_start = start + len(BOXED_START)
|
|
29
|
+
depth = 1
|
|
30
|
+
for index, char in enumerate(text[answer_start:], start=answer_start):
|
|
31
|
+
if char == "{":
|
|
32
|
+
depth += 1
|
|
33
|
+
elif char == "}":
|
|
34
|
+
depth -= 1
|
|
35
|
+
if depth == 0:
|
|
36
|
+
return text[answer_start:index]
|
|
37
|
+
|
|
38
|
+
return "" if strict else text
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
async def read_answer_file_or_last_reply(
|
|
42
|
+
runtime: "Runtime", path: str, trace: "Trace"
|
|
43
|
+
) -> str:
|
|
44
|
+
try:
|
|
45
|
+
answer = (await runtime.read(path)).decode(errors="replace").strip()
|
|
46
|
+
except (FileNotFoundError, OSError, SandboxError):
|
|
47
|
+
answer = ""
|
|
48
|
+
return answer or trace.last_reply
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def parse_judge_choice(
|
|
52
|
+
content: str | None, choices: Sequence[str] = ("A", "B", "C")
|
|
53
|
+
) -> str | None:
|
|
54
|
+
if not content or ("<think>" in content and "</think>" not in content):
|
|
55
|
+
return None
|
|
56
|
+
|
|
57
|
+
text = content.rsplit("</think>", 1)[-1].strip()
|
|
58
|
+
text = extract_boxed_answer(text, strict=True).strip() or text
|
|
59
|
+
|
|
60
|
+
text_upper = text.upper()
|
|
61
|
+
choices_by_upper = {choice.upper(): choice for choice in choices}
|
|
62
|
+
allowed = "|".join(re.escape(choice) for choice in choices_by_upper)
|
|
63
|
+
choice_re = rf"(?<!\w)({allowed})(?!\w)"
|
|
64
|
+
verdict_re = (
|
|
65
|
+
r"(?:^|\n)\s*(?:FINAL\s+JUDGMENT|FINAL\s+ANSWER|FINAL\s+VERDICT|"
|
|
66
|
+
r"JUDGMENT|VERDICT|ANSWER)\s*(?:IS\s*)?[:\-]?\s*"
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
verdict = re.search(verdict_re, text_upper)
|
|
70
|
+
if verdict:
|
|
71
|
+
match = re.search(choice_re, text_upper[verdict.end() :])
|
|
72
|
+
return choices_by_upper.get(match.group(1)) if match else None
|
|
73
|
+
|
|
74
|
+
matches = re.findall(choice_re, text_upper)
|
|
75
|
+
return choices_by_upper.get(matches[-1]) if matches else None
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def verify_boxed_math_answer(
|
|
79
|
+
response: str | None, answer: str, *, timeout_seconds: int = 5
|
|
80
|
+
) -> float:
|
|
81
|
+
if not response or ("<think>" in response and "</think>" not in response):
|
|
82
|
+
return 0.0
|
|
83
|
+
|
|
84
|
+
prediction_text = response.rsplit("</think>", 1)[-1]
|
|
85
|
+
prediction = extract_boxed_answer(prediction_text, strict=True).strip()
|
|
86
|
+
gold = (extract_boxed_answer(answer, strict=True) or answer).strip()
|
|
87
|
+
if not prediction or not gold:
|
|
88
|
+
return 0.0
|
|
89
|
+
|
|
90
|
+
# math-verify expects both sides as boxed math expressions.
|
|
91
|
+
try:
|
|
92
|
+
parsed_gold = parse(f"\\boxed{{{gold}}}", parsing_timeout=timeout_seconds)
|
|
93
|
+
parsed_prediction = parse(
|
|
94
|
+
f"\\boxed{{{prediction}}}",
|
|
95
|
+
parsing_timeout=timeout_seconds,
|
|
96
|
+
)
|
|
97
|
+
return float(
|
|
98
|
+
verify(
|
|
99
|
+
parsed_gold,
|
|
100
|
+
parsed_prediction,
|
|
101
|
+
timeout_seconds=timeout_seconds,
|
|
102
|
+
)
|
|
103
|
+
)
|
|
104
|
+
except (Exception, MathVerifyTimeout):
|
|
105
|
+
return 0.0
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def compare_stdout_results(
|
|
109
|
+
exec_stdout: str, expected: str, *, tolerance: float = 1e-3
|
|
110
|
+
) -> bool:
|
|
111
|
+
if exec_stdout.strip() == expected.strip():
|
|
112
|
+
return True
|
|
113
|
+
|
|
114
|
+
actual_lines = [line.strip() for line in exec_stdout.splitlines() if line.strip()]
|
|
115
|
+
expected_lines = [line.strip() for line in expected.splitlines() if line.strip()]
|
|
116
|
+
if actual_lines == expected_lines:
|
|
117
|
+
return True
|
|
118
|
+
|
|
119
|
+
actual_tokens = [token for line in actual_lines for token in line.split()]
|
|
120
|
+
expected_tokens = [token for line in expected_lines for token in line.split()]
|
|
121
|
+
if actual_tokens == expected_tokens:
|
|
122
|
+
return True
|
|
123
|
+
if len(actual_tokens) != len(expected_tokens) or not actual_tokens:
|
|
124
|
+
return False
|
|
125
|
+
|
|
126
|
+
# Code datasets often allow tiny floating-point drift in stdout.
|
|
127
|
+
try:
|
|
128
|
+
actual_numbers = [Decimal(token) for token in actual_tokens]
|
|
129
|
+
expected_numbers = [Decimal(token) for token in expected_tokens]
|
|
130
|
+
except (InvalidOperation, ValueError):
|
|
131
|
+
return False
|
|
132
|
+
if not all(number.is_finite() for number in actual_numbers + expected_numbers):
|
|
133
|
+
return False
|
|
134
|
+
|
|
135
|
+
limit = Decimal(str(tolerance))
|
|
136
|
+
return all(
|
|
137
|
+
abs(actual - expected) <= limit
|
|
138
|
+
for actual, expected in zip(actual_numbers, expected_numbers)
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def parse_pytest_outcomes(output: str | None) -> dict[str, str]:
|
|
143
|
+
outcomes: dict[str, str] = {}
|
|
144
|
+
for raw_line in ANSI_RE.sub("", output or "").splitlines():
|
|
145
|
+
parts = raw_line.strip().split(maxsplit=1)
|
|
146
|
+
if len(parts) != 2:
|
|
147
|
+
continue
|
|
148
|
+
|
|
149
|
+
outcome, test_id = parts
|
|
150
|
+
if outcome not in PYTEST_OUTCOMES:
|
|
151
|
+
continue
|
|
152
|
+
|
|
153
|
+
# SKIPPED short-summary rows use "[N] file.py:line: reason", not a node id.
|
|
154
|
+
if test_id.startswith("["):
|
|
155
|
+
continue
|
|
156
|
+
|
|
157
|
+
# These summary rows append " - <reason>"; passing node ids do not.
|
|
158
|
+
if outcome in ("FAILED", "ERROR", "XFAIL", "XPASS") and " - " in test_id:
|
|
159
|
+
parts = test_id.split(" - ")
|
|
160
|
+
for index in range(1, len(parts)):
|
|
161
|
+
node_id = " - ".join(parts[:index])
|
|
162
|
+
if node_id.count("[") == node_id.count("]"):
|
|
163
|
+
test_id = node_id
|
|
164
|
+
break
|
|
165
|
+
outcomes[test_id.rstrip()] = outcome
|
|
166
|
+
return outcomes
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
"""The shared dashboard engine: a rich `Live` view on a fixed refresh tick.
|
|
2
|
-
|
|
3
|
-
The eval and validate dashboards each build their own frame; `live_view` just drives whichever
|
|
4
|
-
`render` it's given — refreshing on a timer and drawing a final frame on exit.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import asyncio
|
|
8
|
-
import contextlib
|
|
9
|
-
from collections.abc import Callable
|
|
10
|
-
|
|
11
|
-
from rich.console import Group
|
|
12
|
-
from rich.live import Live
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
@contextlib.asynccontextmanager
|
|
16
|
-
async def live_view(render: Callable[[], Group]):
|
|
17
|
-
"""Refresh `render()` every 0.25s until the block exits, then draw one final frame."""
|
|
18
|
-
with Live(render(), auto_refresh=False) as live:
|
|
19
|
-
|
|
20
|
-
async def loop() -> None:
|
|
21
|
-
while True:
|
|
22
|
-
await asyncio.sleep(0.25)
|
|
23
|
-
live.update(render(), refresh=True)
|
|
24
|
-
|
|
25
|
-
task = asyncio.create_task(loop())
|
|
26
|
-
try:
|
|
27
|
-
yield
|
|
28
|
-
finally:
|
|
29
|
-
task.cancel()
|
|
30
|
-
with contextlib.suppress(asyncio.CancelledError):
|
|
31
|
-
await task
|
|
32
|
-
live.update(render(), refresh=True)
|
|
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
|