verifiers 0.1.15.dev415__tar.gz → 0.1.15.dev417__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.dev415 → verifiers-0.1.15.dev417}/PKG-INFO +1 -1
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/test_e2e.py +9 -25
- verifiers-0.1.15.dev417/tests/v1/test_scoring.py +33 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/GUIDE.md +6 -8
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/__init__.py +15 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/interception/server.py +3 -3
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/mcp/launch.py +7 -37
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/mcp/server.py +5 -14
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/mcp/toolset.py +0 -15
- verifiers-0.1.15.dev417/verifiers/v1/scoring.py +166 -0
- verifiers-0.1.15.dev415/verifiers/v1/mcp/multiplex.py +0 -302
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/.gitignore +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/LICENSE +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/README.md +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/pyproject.toml +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/AGENTS.md +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/README.md +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/conftest.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_browser_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_build_script.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_client_config.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_composable_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_env_group.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_env_server.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_environment.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_environment_extra.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_envs.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_error_chain.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_eval_display.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_eval_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_gym_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_imports.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_init_script.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_install_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_interception_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_logging.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_math_rubric.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_message_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_openenv_client.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_parser.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_path_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_renderer_client.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_rubric.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_rubric_group.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_save_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_setup_script.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_think_parser.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_tool_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_tool_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_types.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_wordle_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_xml_parser.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/conftest.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/test_configs.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/test_envs.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/test_graph.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/test_trace.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/AGENTS.md +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/tui.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/clients/client.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/decorators.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/environment.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/errors.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/gepa/config.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/gepa/display.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rl/README.md +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rl/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rl/inference/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rl/inference/client.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rl/inference/server.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rl/trainer/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rl/trainer/config.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rl/trainer/orchestrator.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rl/trainer/trainer.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rl/trainer/utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/build.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/init.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/install.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/rl.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/train.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/vllm.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/serve/types.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/types.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/ARCHITECTURE.md +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/README.md +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/env.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/episode.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/errors.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/graph.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harness.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/default/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/default/harness.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/default/program.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/judge.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/retries.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/runtimes/docker.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/state.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/task.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/trace.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/types.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/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.dev417
|
|
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
|
|
@@ -9,8 +9,8 @@ carries a pytest mark, so subsets select with `-m` (see `conftest.py`).
|
|
|
9
9
|
`test_user` and `test_tool` fan a server's own runtime against the harness runtime (the full
|
|
10
10
|
reachability matrix); `test_single_turn`/`test_agentic` fan the harness against the harness runtime.
|
|
11
11
|
`test_shared_tool_isolation` runs two concurrent rollouts against one SHARED writable tool server
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
across the full `harness_runtime` x (shared server's own) `tool_runtime` matrix — incl. mixed-locality
|
|
13
|
+
combos — asserting each keeps its own `self.state`.
|
|
14
14
|
"""
|
|
15
15
|
|
|
16
16
|
import pytest
|
|
@@ -126,23 +126,16 @@ async def test_tool_state(run_v1, harness_runtime, tool_runtime, tmp_path):
|
|
|
126
126
|
|
|
127
127
|
|
|
128
128
|
@pytest.mark.e2e
|
|
129
|
-
@pytest.mark.parametrize(
|
|
130
|
-
"fork",
|
|
131
|
-
[pytest.param(False, id="fork-off"), pytest.param(True, id="fork-on")],
|
|
132
|
-
)
|
|
133
129
|
async def test_shared_tool_isolation(
|
|
134
|
-
run_v1_server, harness_runtime, tool_runtime,
|
|
130
|
+
run_v1_server, harness_runtime, tool_runtime, tmp_path
|
|
135
131
|
):
|
|
136
|
-
"""A SHARED, writable tool server keeps each rollout's state isolated across concurrent
|
|
137
|
-
over the FULL `harness_runtime` x (shared server's own) `tool_runtime`
|
|
132
|
+
"""A SHARED, writable tool server keeps each rollout's `self.state` isolated across concurrent
|
|
133
|
+
rollouts, over the FULL `harness_runtime` x (shared server's own) `tool_runtime` matrix — including
|
|
138
134
|
the mixed-locality combos (e.g. a local harness with a remote shared tool), which is exactly where
|
|
139
|
-
the rollout's `/state`
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
`isolate=True` (the per-rollout `self.state` channel); fork=on sets `isolate=False` (the server
|
|
144
|
-
writes a process-global slot), so ONLY the forked-child process isolation can keep it correct.
|
|
145
|
-
`isolate` is a config field (not an env var), so it reaches the shared server in any runtime.
|
|
135
|
+
the rollout's `/state` channel must be bridged to the tool's runtime. `scratchpad-v1` gives each
|
|
136
|
+
task a unique word and rewards 1.0 iff the rollout reads back its OWN word, so two concurrent
|
|
137
|
+
rollouts (two distinct words on the ONE shared instance) both scoring 1.0 proves the per-rollout
|
|
138
|
+
`self.state` channel keeps them isolated with no cross-rollout corruption.
|
|
146
139
|
|
|
147
140
|
Placement is fixed to `shared`, so only the own-runtime cases of `tool_runtime` apply (the
|
|
148
141
|
colocated/shared params have no distinct runtime to fan — skipped). Runs through the env-server
|
|
@@ -158,13 +151,6 @@ async def test_shared_tool_isolation(
|
|
|
158
151
|
pytest.skip(
|
|
159
152
|
"tool server in a prime sandbox needs prime port exposure (unreachable from host here)"
|
|
160
153
|
)
|
|
161
|
-
# A prime harness relays every model call through the sandbox, so two concurrent rollouts driving
|
|
162
|
-
# the EXPERIMENTAL fork-per-rollout server can't finish within the rollout cap (reward stays 0).
|
|
163
|
-
# The fork-isolation path is covered by the subprocess/docker harness cases.
|
|
164
|
-
if harness_runtime == "prime" and fork:
|
|
165
|
-
pytest.skip(
|
|
166
|
-
"prime harness + experimental fork-per-rollout is too slow under concurrency to finish in the rollout cap"
|
|
167
|
-
)
|
|
168
154
|
traces = await run_v1_server(
|
|
169
155
|
"scratchpad-v1",
|
|
170
156
|
harness="null",
|
|
@@ -176,8 +162,6 @@ async def test_shared_tool_isolation(
|
|
|
176
162
|
taskset_overrides={
|
|
177
163
|
"tools": {
|
|
178
164
|
"shared": True,
|
|
179
|
-
"fork": fork,
|
|
180
|
-
"isolate": not fork, # fork=on: write a global slot so ONLY fork can isolate it
|
|
181
165
|
**tool_runtime, # the shared tool's own runtime ({"runtime": {"type": ...}})
|
|
182
166
|
}
|
|
183
167
|
},
|
|
@@ -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"
|
|
@@ -511,19 +511,17 @@ the default is the cheapest correct thing; the rest trade setup cost for isolati
|
|
|
511
511
|
| **own runtime** *(default)* | *(nothing; `runtime = {type = "docker"\|"prime"}` for a sandbox)* | own runtime per rollout — `subprocess` on the host (default), or a `docker`/`prime` sandbox over a tunnel | full per-rollout isolation; a sandbox also isolates untrusted code / deps / network | pays `setup` every rollout (a sandbox adds spin-up + env install) |
|
|
512
512
|
| **colocated** | `colocated = true` | inside the harness's runtime, one per rollout (no tunnel) | no extra runtime/tunnel; can touch the harness's filesystem | couples to the harness; `setup` per rollout |
|
|
513
513
|
| **shared** | `shared = true` | one instance for the whole eval | `setup` once; writable per-rollout if state lives in `self.state` | state outside `self.state` corrupts across rollouts; `setup_task` skipped |
|
|
514
|
-
| **shared + fork** | `shared = true, fork = true` | warm parent + forked child per rollout (copy-on-write) | `setup` once **and** isolates arbitrary in-process/on-disk state; runs `setup_task` per child | a process per concurrent rollout; Linux only |
|
|
515
514
|
| **remote** *(tools only)* | `url = "https://…"` | connects to an already-running MCP endpoint | zero hosting; use a public/third-party server | no isolation, state, or lifecycle control |
|
|
516
515
|
|
|
517
|
-
`shared`
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
memory.
|
|
516
|
+
`shared` works on any runtime — the framework makes the rollout's `/state` channel reachable from the
|
|
517
|
+
shared server (localhost, or a host tunnel when remote). Keep big shared data off the Python heap
|
|
518
|
+
(numpy / mmap / an on-disk index) so one instance scales across rollouts.
|
|
521
519
|
|
|
522
520
|
**Choosing per-rollout state:** read-only resource → `shared`; state that fits a `State` model →
|
|
523
521
|
`shared` + `self.state` (no extra process, the scalable default); state that can't (module globals,
|
|
524
|
-
on-disk scratch, a stateful C library) →
|
|
525
|
-
`setup` each time; cheap `setup` → just use the default. **User simulators** support only the
|
|
526
|
-
per-rollout placements (own runtime or `colocated`); `shared` / `
|
|
522
|
+
on-disk scratch, a stateful C library) → a per-rollout placement (own runtime or `colocated`) that
|
|
523
|
+
pays `setup` each time; cheap `setup` → just use the default. **User simulators** support only the
|
|
524
|
+
per-rollout placements (own runtime or `colocated`); `shared` / `url` are tools-only.
|
|
527
525
|
|
|
528
526
|
## Learn from the examples
|
|
529
527
|
|
|
@@ -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",
|
|
@@ -216,8 +216,8 @@ class InterceptionServer:
|
|
|
216
216
|
# GET/PUT their `self.state` here, keyed by the same bearer secret as the model routes.
|
|
217
217
|
app.router.add_get("/state", self.handle_state_get)
|
|
218
218
|
app.router.add_put("/state", self.handle_state_put)
|
|
219
|
-
# A
|
|
220
|
-
#
|
|
219
|
+
# A launched tool/user server fetches its rollout's task here to run `setup_task` — the task
|
|
220
|
+
# is never passed via env, only over this channel, keyed by the same bearer secret.
|
|
221
221
|
app.router.add_get("/task", self.handle_task_get)
|
|
222
222
|
self.runner = web.AppRunner(app)
|
|
223
223
|
await self.runner.setup()
|
|
@@ -585,7 +585,7 @@ class InterceptionServer:
|
|
|
585
585
|
)
|
|
586
586
|
|
|
587
587
|
async def handle_task_get(self, request: web.Request) -> web.Response:
|
|
588
|
-
"""Hand a
|
|
588
|
+
"""Hand a launched tool/user server the rollout's task (class ref + JSON) so it can run
|
|
589
589
|
`setup_task` for this rollout — keyed by the same bearer secret as the state channel."""
|
|
590
590
|
session = self._session_for(request)
|
|
591
591
|
if session is None:
|
|
@@ -287,23 +287,11 @@ async def serve(
|
|
|
287
287
|
"is built once for the whole eval and must be task-agnostic — it receives no task. "
|
|
288
288
|
"Drop `shared` to run it per-rollout (with the task), or make its `setup` task-independent."
|
|
289
289
|
)
|
|
290
|
-
if (
|
|
291
|
-
shared
|
|
292
|
-
and not getattr(cfg, "fork", False)
|
|
293
|
-
and type(server).setup_task is not ServerBase.setup_task
|
|
294
|
-
):
|
|
290
|
+
if shared and type(server).setup_task is not ServerBase.setup_task:
|
|
295
291
|
logger.warning(
|
|
296
292
|
"shared server %r overrides `setup_task`, but `setup_task` is NEVER called for a shared "
|
|
297
293
|
"server (it's built once, task-agnostic) — its per-task logic will not run. Move "
|
|
298
|
-
"task-agnostic work into `setup`, drop `shared` to run it per-rollout,
|
|
299
|
-
"(each rollout gets a forked child that runs `setup_task`).",
|
|
300
|
-
server.server_name,
|
|
301
|
-
)
|
|
302
|
-
if shared and getattr(cfg, "fork", False):
|
|
303
|
-
# `serve_tools` makes the rollout's /state + /task channel reachable from the shared server's
|
|
304
|
-
# runtime (a host tunnel when it's remote), so any harness/runtime combo works.
|
|
305
|
-
logger.warning(
|
|
306
|
-
"shared server %r uses fork-per-rollout isolation, which is EXPERIMENTAL",
|
|
294
|
+
"task-agnostic work into `setup`, or drop `shared` to run it per-rollout.",
|
|
307
295
|
server.server_name,
|
|
308
296
|
)
|
|
309
297
|
async with contextlib.AsyncExitStack() as stack:
|
|
@@ -383,11 +371,11 @@ async def serve_shared(toolsets: list[Toolset], harness_is_local: bool = True):
|
|
|
383
371
|
|
|
384
372
|
def _shared_url_for_rollout(url: str, state_base: str | None, state_secret: str) -> str:
|
|
385
373
|
"""Tag a `shared` server's eval-level URL with this rollout's state-channel coordinates, so the
|
|
386
|
-
one shared process serves each rollout its OWN `self.state`
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
374
|
+
one shared process serves each rollout its OWN `self.state`. `state_base` is the interception
|
|
375
|
+
server's reachable base for THIS rollout, chosen by the caller to be reachable from the shared
|
|
376
|
+
server's runtime (localhost, or a host tunnel for a remote runtime). The secret is the bearer the
|
|
377
|
+
harness already holds, so it's no new exposure — but it must not be logged (callers log the
|
|
378
|
+
untagged base)."""
|
|
391
379
|
if not state_base:
|
|
392
380
|
return url
|
|
393
381
|
parts = urlsplit(url)
|
|
@@ -397,19 +385,6 @@ def _shared_url_for_rollout(url: str, state_base: str | None, state_secret: str)
|
|
|
397
385
|
return urlunsplit(parts._replace(query=urlencode(query)))
|
|
398
386
|
|
|
399
387
|
|
|
400
|
-
async def reap_forked_child(shared_url: str, secret: str) -> None:
|
|
401
|
-
"""Best-effort: POST `/vf/close` to reap this rollout's forked child on teardown (a `fork` shared
|
|
402
|
-
server, see `multiplex`); the multiplexer otherwise only reaps a child when it exits."""
|
|
403
|
-
close_url = (
|
|
404
|
-
f"{shared_url.rsplit('/mcp', 1)[0]}/vf/close?{STATE_SECRET_PARAM}={secret}"
|
|
405
|
-
)
|
|
406
|
-
with contextlib.suppress(Exception):
|
|
407
|
-
import httpx
|
|
408
|
-
|
|
409
|
-
async with httpx.AsyncClient(timeout=10.0) as client:
|
|
410
|
-
await client.post(close_url)
|
|
411
|
-
|
|
412
|
-
|
|
413
388
|
@contextlib.asynccontextmanager
|
|
414
389
|
async def serve_tools(
|
|
415
390
|
toolsets: list[Toolset],
|
|
@@ -456,11 +431,6 @@ async def serve_tools(
|
|
|
456
431
|
# log the untagged base, NOT urls[name] — the per-rollout tag carries the rollout's
|
|
457
432
|
# bearer secret (`vf_state_secret`), which must not reach a log sink
|
|
458
433
|
logger.info("tool server '%s' (shared): %s", name, shared_urls[name])
|
|
459
|
-
if getattr(cfg, "fork", False) and state_secret:
|
|
460
|
-
# reap this rollout's forked child when the rollout's tool-serving scope exits
|
|
461
|
-
stack.push_async_callback(
|
|
462
|
-
reap_forked_child, shared_urls[name], state_secret
|
|
463
|
-
)
|
|
464
434
|
else:
|
|
465
435
|
urls[name] = await stack.enter_async_context(
|
|
466
436
|
serve(
|
|
@@ -118,8 +118,7 @@ def _request_query(name: str) -> str | None:
|
|
|
118
118
|
def _die_with_parent() -> None:
|
|
119
119
|
"""Ask the kernel to SIGKILL this process when its parent (the launcher) dies, so a server is
|
|
120
120
|
never orphaned if its launcher is torn down without stopping it (a backstop to the runtime's
|
|
121
|
-
own cleanup). Linux-only; a no-op elsewhere.
|
|
122
|
-
it again."""
|
|
121
|
+
own cleanup). Linux-only; a no-op elsewhere."""
|
|
123
122
|
import ctypes
|
|
124
123
|
import signal
|
|
125
124
|
|
|
@@ -241,9 +240,8 @@ class ServerBase(Generic[ConfigT, StateT]):
|
|
|
241
240
|
self, state_url: str | None, secret: str
|
|
242
241
|
) -> None:
|
|
243
242
|
"""Fetch this rollout's task over the state channel and run `setup_task` for it — a no-op
|
|
244
|
-
without a channel or task (a shared, task-agnostic server).
|
|
245
|
-
|
|
246
|
-
channel (see `verifiers.v1.mcp.multiplex`)."""
|
|
243
|
+
without a channel or task (a shared, task-agnostic server). Called by `_serve` with the
|
|
244
|
+
per-rollout env channel a launched server carries."""
|
|
247
245
|
task = await self._fetch_task(state_url, secret)
|
|
248
246
|
if task is not None:
|
|
249
247
|
await self.setup_task(task)
|
|
@@ -332,8 +330,8 @@ class ServerBase(Generic[ConfigT, StateT]):
|
|
|
332
330
|
async def _setup() -> None:
|
|
333
331
|
await self.setup()
|
|
334
332
|
# Per-rollout servers carry the rollout's state channel in their env; fetch this rollout's
|
|
335
|
-
# task over it and run `setup_task`. A shared server has no env channel
|
|
336
|
-
#
|
|
333
|
+
# task over it and run `setup_task`. A shared server has no env channel, so this is a
|
|
334
|
+
# no-op for it (it's task-agnostic — one instance for the whole eval).
|
|
337
335
|
await self._setup_task_from_channel(*self._state_channel())
|
|
338
336
|
|
|
339
337
|
asyncio.run(_setup())
|
|
@@ -369,13 +367,6 @@ class ServerBase(Generic[ConfigT, StateT]):
|
|
|
369
367
|
self._state_client = None
|
|
370
368
|
|
|
371
369
|
app.router.lifespan_context = serving_lifespan
|
|
372
|
-
if getattr(self.config, "fork", False):
|
|
373
|
-
# `setup` ran once above (warm); fork a child per rollout that inherits it and runs
|
|
374
|
-
# `setup_task` for the rollout's task (see multiplex).
|
|
375
|
-
from verifiers.v1.mcp.multiplex import serve_forked
|
|
376
|
-
|
|
377
|
-
serve_forked(app, sock, self)
|
|
378
|
-
return
|
|
379
370
|
server = uvicorn.Server(uvicorn.Config(app, log_level="critical"))
|
|
380
371
|
asyncio.run(server.serve(sockets=[sock]))
|
|
381
372
|
|
|
@@ -32,8 +32,6 @@ class ToolsetConfig(BaseConfig):
|
|
|
32
32
|
costs a per-rollout install.
|
|
33
33
|
- shared: one instance for the whole eval, in its own `runtime` (pays `setup` once; per-rollout
|
|
34
34
|
writable state stays isolated via `self.state`).
|
|
35
|
-
- shared + fork: like shared, but a forked child per rollout (copy-on-write) also isolates
|
|
36
|
-
state that can't live in `self.state`.
|
|
37
35
|
See the placement/isolation section of `verifiers/v1/GUIDE.md` for the trade-offs of each.
|
|
38
36
|
Subclass to add the server's own knobs (the data its `@tool` methods read). The server name is
|
|
39
37
|
the class's `TOOL_PREFIX` ClassVar, not a field here — it's an identity (the model sees
|
|
@@ -51,15 +49,6 @@ class ToolsetConfig(BaseConfig):
|
|
|
51
49
|
server's URL), so concurrent rollouts don't corrupt each other — provided the shared server runs
|
|
52
50
|
on a local runtime (the default), which can reach the host's interception server. Mutually
|
|
53
51
|
exclusive with `colocated`."""
|
|
54
|
-
fork: bool = False
|
|
55
|
-
"""For a `shared` server: fork a child process per rollout (copy-on-write memory + a private
|
|
56
|
-
working dir), so per-rollout state that can't live in `self.state` — module globals, a mutated
|
|
57
|
-
in-memory object, relative-path on-disk writes — is isolated per rollout automatically. The
|
|
58
|
-
expensive `setup` runs once in the parent; each child inherits it warm and runs `setup_task` for
|
|
59
|
-
its rollout's task (see `verifiers.v1.mcp.multiplex`) — so a stateful per-rollout server pays its
|
|
60
|
-
`setup` once yet stays isolated. Requires `shared`; works on any runtime (a remote one reaches the
|
|
61
|
-
rollout's state/task channel over a host tunnel). Linux/fork only; not for CUDA/GPU state or
|
|
62
|
-
background threads in the server."""
|
|
63
52
|
runtime: RuntimeConfig = SubprocessConfig()
|
|
64
53
|
"""The server's own runtime, used unless `colocated` (host/subprocess by default — always
|
|
65
54
|
reachable from any harness runtime; set docker/prime to isolate it in its own sandbox)."""
|
|
@@ -72,10 +61,6 @@ class ToolsetConfig(BaseConfig):
|
|
|
72
61
|
def _validate_placement(self) -> "ToolsetConfig":
|
|
73
62
|
if self.colocated and self.shared:
|
|
74
63
|
raise ValueError("colocated and shared are mutually exclusive")
|
|
75
|
-
if self.fork and not self.shared:
|
|
76
|
-
raise ValueError(
|
|
77
|
-
"fork requires shared — a per-rollout server already runs in its own process"
|
|
78
|
-
)
|
|
79
64
|
return self
|
|
80
65
|
|
|
81
66
|
|
|
@@ -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
|