verifiers 0.2.1.dev41__tar.gz → 0.2.1.dev43__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.
Potentially problematic release.
This version of verifiers might be problematic. Click here for more details.
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/PKG-INFO +1 -1
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/default/program.py +3 -7
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/null/program.py +8 -2
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/interception/server.py +171 -97
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/mcp/server.py +6 -2
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/session.py +18 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/.gitignore +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/LICENSE +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/README.md +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/pyproject.toml +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/AGENTS.md +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/conftest.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_build_script.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_client_config.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_env_group.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_env_server.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_environment.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_envs.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_imports.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_init_script.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_logging.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_parser.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_rubric.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_types.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_wordle_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/conftest.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/test_configs.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/test_envs.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/test_graph.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/test_judges.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/test_taskset.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/v1/test_trace.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/decorators.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/errors.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/types.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/configs/debug.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/configs/replay.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/env.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/episode.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/errors.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/graph.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harness.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/default/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/default/harness.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/judge.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/push.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/retries.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/runtimes/docker.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/state.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/task.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/trace.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/types.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/verifiers/v1/utils/sampling.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.2.1.
|
|
3
|
+
Version: 0.2.1.dev43
|
|
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
|
|
@@ -198,7 +198,8 @@ async def connect_mcp(stack: AsyncExitStack, config: dict) -> tuple[list[dict],
|
|
|
198
198
|
session = await stack.enter_async_context(ClientSession(read, write))
|
|
199
199
|
await session.initialize()
|
|
200
200
|
for tool in (await session.list_tools()).tools:
|
|
201
|
-
|
|
201
|
+
# A server named "" (TOOL_PREFIX = None) advertises its tools bare.
|
|
202
|
+
full = f"{name}_{tool.name}" if name else tool.name
|
|
202
203
|
tool_schemas.append(
|
|
203
204
|
{
|
|
204
205
|
"type": "function",
|
|
@@ -259,12 +260,7 @@ async def main() -> None:
|
|
|
259
260
|
payload = path.read_bytes()
|
|
260
261
|
path.unlink()
|
|
261
262
|
initial = json.loads(payload)
|
|
262
|
-
|
|
263
|
-
# re-samples it and forks the trace into an extra dead-end branch. A generous timeout lets a
|
|
264
|
-
# slow turn finish instead of timing out and re-sending; genuine failures surface as error rows.
|
|
265
|
-
client = AsyncOpenAI(
|
|
266
|
-
base_url=args.base_url, api_key=args.api_key, timeout=1800.0, max_retries=0
|
|
267
|
-
)
|
|
263
|
+
client = AsyncOpenAI(base_url=args.base_url, api_key=args.api_key)
|
|
268
264
|
config = json.loads(args.mcp_config or "{}")
|
|
269
265
|
async with AsyncExitStack() as stack:
|
|
270
266
|
mcp_tools, dispatch = (
|
|
@@ -24,7 +24,9 @@ async def chat(
|
|
|
24
24
|
|
|
25
25
|
async def connect_mcp(stack: AsyncExitStack, config: dict) -> tuple[list[dict], dict]:
|
|
26
26
|
"""Connect to each configured MCP server (a streamable-HTTP `url`); return
|
|
27
|
-
(tool schemas, dispatch mapping
|
|
27
|
+
(tool schemas, dispatch mapping advertised name -> (session, raw tool name)). Tools are
|
|
28
|
+
advertised as `<server>_<tool>`; a server named `""` (TOOL_PREFIX = None) advertises its
|
|
29
|
+
tools bare, so names must be unique across the rollout's servers."""
|
|
28
30
|
from mcp import ClientSession
|
|
29
31
|
from mcp.client.streamable_http import (
|
|
30
32
|
create_mcp_http_client,
|
|
@@ -43,7 +45,11 @@ async def connect_mcp(stack: AsyncExitStack, config: dict) -> tuple[list[dict],
|
|
|
43
45
|
session = await stack.enter_async_context(ClientSession(read, write))
|
|
44
46
|
await session.initialize()
|
|
45
47
|
for tool in (await session.list_tools()).tools:
|
|
46
|
-
full = f"{name}_{tool.name}"
|
|
48
|
+
full = f"{name}_{tool.name}" if name else tool.name
|
|
49
|
+
if full in dispatch:
|
|
50
|
+
raise ValueError(
|
|
51
|
+
f"duplicate tool name {full!r} across servers; keep qualified names"
|
|
52
|
+
)
|
|
47
53
|
tool_schemas.append(
|
|
48
54
|
{
|
|
49
55
|
"type": "function",
|
|
@@ -21,6 +21,7 @@ handled out-of-band (run by the harness).
|
|
|
21
21
|
|
|
22
22
|
import asyncio
|
|
23
23
|
import contextlib
|
|
24
|
+
import hashlib
|
|
24
25
|
import json
|
|
25
26
|
import logging
|
|
26
27
|
import secrets
|
|
@@ -49,7 +50,7 @@ from verifiers.v1.interception.tunnel import (
|
|
|
49
50
|
make_tunnel,
|
|
50
51
|
)
|
|
51
52
|
from verifiers.v1.session import RolloutSession
|
|
52
|
-
from verifiers.v1.types import Messages, Tool
|
|
53
|
+
from verifiers.v1.types import Messages, Response, Tool
|
|
53
54
|
|
|
54
55
|
logger = logging.getLogger(__name__)
|
|
55
56
|
|
|
@@ -61,6 +62,23 @@ logger = logging.getLogger(__name__)
|
|
|
61
62
|
_MAX_REQUEST_BODY = 1024**3 # 1 GiB (aiohttp's default is 1 MiB)
|
|
62
63
|
_KEEPALIVE_INTERVAL_SECONDS = 3
|
|
63
64
|
_STREAM_QUEUE_MAXSIZE = 16
|
|
65
|
+
# blake2b saturates ~1.7 GB/s, so a body up to this size hashes inline in well under a
|
|
66
|
+
# millisecond; a larger one (bodies may reach `_MAX_REQUEST_BODY`) is hashed off the event
|
|
67
|
+
# loop instead — see `_request_digest`.
|
|
68
|
+
_HASH_INLINE_MAX = 1024**2 # 1 MiB
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _body_digest(raw: bytes) -> bytes:
|
|
72
|
+
return hashlib.blake2b(raw, digest_size=16).digest()
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
async def _request_digest(raw: bytes) -> bytes:
|
|
76
|
+
"""Digest a request body for the retry-replay guard. Hash a small body inline; offload a
|
|
77
|
+
large one to a thread so it does not stall every multiplexed rollout on the event loop
|
|
78
|
+
(blake2b releases the GIL, so the thread runs the hash off the loop)."""
|
|
79
|
+
if len(raw) <= _HASH_INLINE_MAX:
|
|
80
|
+
return _body_digest(raw)
|
|
81
|
+
return await asyncio.to_thread(_body_digest, raw)
|
|
64
82
|
|
|
65
83
|
|
|
66
84
|
def _completion_response(completion: dict | None) -> web.Response:
|
|
@@ -223,10 +241,38 @@ class InterceptionServer(Interception):
|
|
|
223
241
|
body = from_json(raw)
|
|
224
242
|
except ValueError:
|
|
225
243
|
body = json.loads(raw)
|
|
244
|
+
req_hash = await _request_digest(raw)
|
|
226
245
|
# Keep `read()` for aiohttp's size guard, then release its cache and our local
|
|
227
246
|
# alias after parsing so the wire body does not survive model inference.
|
|
228
247
|
request._read_bytes = None
|
|
229
248
|
del raw
|
|
249
|
+
# Graph atomicity under retries. The harness SDK retries a transient failure by
|
|
250
|
+
# re-sending the byte-identical request; sampling it again would commit a second turn and
|
|
251
|
+
# fork the graph into a dead-end branch. Two cases, both resolved without re-sampling:
|
|
252
|
+
# 1. the first attempt already finished -> replay the recorded response;
|
|
253
|
+
# 2. the first attempt is still computing (a slow turn) -> await it and return its
|
|
254
|
+
# result, so a slow turn is safe without an inflated client timeout.
|
|
255
|
+
# A growing conversation never repeats a body, so these only ever match a real retry; a
|
|
256
|
+
# failed attempt caches nothing and re-runs normally.
|
|
257
|
+
if session.last_request == req_hash and session.last_response is not None:
|
|
258
|
+
logger.debug("intercept replay: id=%s (retried request)", session.trace.id)
|
|
259
|
+
return _completion_response(session.last_response)
|
|
260
|
+
|
|
261
|
+
async def coalesced(inflight: "asyncio.Future[dict | None]") -> web.Response:
|
|
262
|
+
# Await the first attempt instead of re-sampling. None means it produced no servable
|
|
263
|
+
# response (it errored/refused), so let the SDK retry afresh.
|
|
264
|
+
logger.debug(
|
|
265
|
+
"intercept coalesce: id=%s (retry of in-flight turn)", session.trace.id
|
|
266
|
+
)
|
|
267
|
+
completion = await inflight
|
|
268
|
+
if completion is None:
|
|
269
|
+
return web.json_response(
|
|
270
|
+
dialect.error_body("upstream attempt failed"), status=503
|
|
271
|
+
)
|
|
272
|
+
return _completion_response(completion)
|
|
273
|
+
|
|
274
|
+
if (inflight := session.inflight.get(req_hash)) is not None:
|
|
275
|
+
return await coalesced(inflight)
|
|
230
276
|
logger.debug(
|
|
231
277
|
"intercept %s: id=%s stream=%s",
|
|
232
278
|
request.path,
|
|
@@ -256,112 +302,140 @@ class InterceptionServer(Interception):
|
|
|
256
302
|
if dialect.streaming(body):
|
|
257
303
|
return await self._stream(request, session, dialect, body, prompt, tools)
|
|
258
304
|
headers = request.headers.copy()
|
|
305
|
+
# Claim the in-flight slot so a retry arriving mid-flight coalesces onto it (above) rather
|
|
306
|
+
# than starting a second inference. Re-check first: an identical request may have claimed
|
|
307
|
+
# it while we awaited the simulator opening. The get / create / assign below run with no
|
|
308
|
+
# await between them, so two concurrent identical requests can never both become owner.
|
|
309
|
+
if (inflight := session.inflight.get(req_hash)) is not None:
|
|
310
|
+
return await coalesced(inflight)
|
|
311
|
+
fut: asyncio.Future[dict | None] = asyncio.get_running_loop().create_future()
|
|
312
|
+
session.inflight[req_hash] = fut
|
|
313
|
+
|
|
314
|
+
def serve(response: Response) -> web.Response:
|
|
315
|
+
# Record the served turn and hand it to any coalesced retry, so a retried
|
|
316
|
+
# byte-identical request replays instead of re-sampling and forking the graph.
|
|
317
|
+
# `Response.raw` is the full native provider object (or the renderer's synthesized
|
|
318
|
+
# completion) that the server serializes back to the program.
|
|
319
|
+
session.last_request = req_hash
|
|
320
|
+
session.last_response = response.raw
|
|
321
|
+
if not fut.done():
|
|
322
|
+
fut.set_result(response.raw)
|
|
323
|
+
return _completion_response(response.raw)
|
|
324
|
+
|
|
259
325
|
# A user simulator turns one program request into a multi-turn exchange: after each
|
|
260
326
|
# model turn the simulator's reply is injected as a user turn and the model is
|
|
261
327
|
# re-prompted, so a whole game plays out here and only the final assistant message
|
|
262
328
|
# returns to the (simulator-unaware) program. Without a simulator the loop runs once.
|
|
263
|
-
|
|
264
|
-
None # the latest turn
|
|
329
|
+
response: Response | None = (
|
|
330
|
+
None # the latest committed turn (None until the first)
|
|
265
331
|
)
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
332
|
+
try:
|
|
333
|
+
while True:
|
|
334
|
+
try:
|
|
335
|
+
refused = await session.refused()
|
|
336
|
+
except RolloutError as e:
|
|
337
|
+
return self._fail(session, dialect, e)
|
|
338
|
+
except Exception as e:
|
|
339
|
+
return self._fail(
|
|
340
|
+
session,
|
|
341
|
+
dialect,
|
|
342
|
+
TaskError(f"@stop failed: {type(e).__name__}: {e}"),
|
|
343
|
+
)
|
|
344
|
+
if refused is not None:
|
|
345
|
+
# Refuse the first model call to halt the harness; once a simulated
|
|
346
|
+
# conversation is under way, just end it and return the last turn cleanly.
|
|
347
|
+
if response is None:
|
|
348
|
+
return web.json_response(
|
|
349
|
+
dialect.error_body(f"rollout stopped: {refused}"),
|
|
350
|
+
status=400,
|
|
351
|
+
)
|
|
352
|
+
return serve(response)
|
|
353
|
+
turn = graph.prepare_turn(session.trace, prompt)
|
|
354
|
+
session.error = None
|
|
355
|
+
try:
|
|
356
|
+
response = await session.ctx.client.get_response(
|
|
357
|
+
dialect,
|
|
358
|
+
body,
|
|
359
|
+
session.ctx.model,
|
|
360
|
+
session.ctx.sampling,
|
|
361
|
+
headers=headers,
|
|
362
|
+
session_id=session.trace.id,
|
|
363
|
+
turn=turn,
|
|
364
|
+
)
|
|
365
|
+
except OverlongPromptError:
|
|
366
|
+
# An overlong prompt is a budget limit, not a crash: end the rollout cleanly
|
|
367
|
+
# as a truncation — return the last turn if there is one, else refuse to halt
|
|
368
|
+
# the harness (same shape as `refused` above).
|
|
369
|
+
session.trace.stop("context_length")
|
|
370
|
+
logger.debug("prompt too long: id=%s", session.trace.id)
|
|
371
|
+
if response is None:
|
|
372
|
+
return web.json_response(
|
|
373
|
+
dialect.error_body("rollout stopped: context_length"),
|
|
374
|
+
status=400,
|
|
375
|
+
)
|
|
376
|
+
return serve(response)
|
|
377
|
+
except RolloutError as e:
|
|
378
|
+
# Stash the real cause; the rollout re-raises it after the harness returns.
|
|
379
|
+
# Relay the provider's status so the harness SDK retries 5xx/429 and not 4xx.
|
|
380
|
+
session.error = e
|
|
381
|
+
logger.warning(
|
|
382
|
+
"model call failed: id=%s %s: %s",
|
|
383
|
+
session.trace.id,
|
|
384
|
+
type(e).__name__,
|
|
385
|
+
e,
|
|
283
386
|
)
|
|
284
|
-
return _completion_response(completion)
|
|
285
|
-
turn = graph.prepare_turn(session.trace, prompt)
|
|
286
|
-
session.error = None
|
|
287
|
-
try:
|
|
288
|
-
response = await session.ctx.client.get_response(
|
|
289
|
-
dialect,
|
|
290
|
-
body,
|
|
291
|
-
session.ctx.model,
|
|
292
|
-
session.ctx.sampling,
|
|
293
|
-
headers=headers,
|
|
294
|
-
session_id=session.trace.id,
|
|
295
|
-
turn=turn,
|
|
296
|
-
)
|
|
297
|
-
except OverlongPromptError:
|
|
298
|
-
# An overlong prompt is a budget limit, not a crash: end the rollout cleanly
|
|
299
|
-
# as a truncation — return the last turn if there is one, else refuse to halt
|
|
300
|
-
# the harness (same shape as `refused` above).
|
|
301
|
-
session.trace.stop("context_length")
|
|
302
|
-
logger.debug("prompt too long: id=%s", session.trace.id)
|
|
303
|
-
if completion is None:
|
|
304
387
|
return web.json_response(
|
|
305
|
-
dialect.error_body(
|
|
306
|
-
status=
|
|
388
|
+
dialect.error_body(str(e)),
|
|
389
|
+
status=getattr(e, "status_code", 502),
|
|
307
390
|
)
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
)
|
|
319
|
-
return web.json_response(
|
|
320
|
-
dialect.error_body(str(e)), status=getattr(e, "status_code", 502)
|
|
321
|
-
)
|
|
322
|
-
except Exception as e: # surface to the program as an API error
|
|
323
|
-
logger.warning(
|
|
324
|
-
"model call failed: id=%s %s: %s",
|
|
391
|
+
except Exception as e: # surface to the program as an API error
|
|
392
|
+
logger.warning(
|
|
393
|
+
"model call failed: id=%s %s: %s",
|
|
394
|
+
session.trace.id,
|
|
395
|
+
type(e).__name__,
|
|
396
|
+
e,
|
|
397
|
+
)
|
|
398
|
+
return web.json_response(dialect.error_body(str(e)), status=502)
|
|
399
|
+
logger.debug(
|
|
400
|
+
"intercept turn: id=%s tools=%d",
|
|
325
401
|
session.trace.id,
|
|
326
|
-
|
|
327
|
-
e,
|
|
328
|
-
)
|
|
329
|
-
return web.json_response(dialect.error_body(str(e)), status=502)
|
|
330
|
-
# `Response.raw` is the full native provider object, or the renderer's synthesized
|
|
331
|
-
# completion object, that the server serializes for the program.
|
|
332
|
-
completion = response.raw
|
|
333
|
-
logger.debug(
|
|
334
|
-
"intercept turn: id=%s tools=%d",
|
|
335
|
-
session.trace.id,
|
|
336
|
-
len(response.message.tool_calls or []),
|
|
337
|
-
)
|
|
338
|
-
turn.commit(response, tools) # one node per new message;
|
|
339
|
-
# branches fall out of walking the graph (see Trace.branches / verifiers.v1.graph)
|
|
340
|
-
# Hand back to the program when the model wants a tool (the program runs it) or
|
|
341
|
-
# when there's no user simulator to keep the conversation going.
|
|
342
|
-
if response.message.tool_calls or session.user is None:
|
|
343
|
-
return _completion_response(completion)
|
|
344
|
-
try:
|
|
345
|
-
user_messages = await session.user(response.message.content or "")
|
|
346
|
-
except RolloutError as e:
|
|
347
|
-
return self._fail(session, dialect, e)
|
|
348
|
-
except Exception as e:
|
|
349
|
-
return self._fail(
|
|
350
|
-
session,
|
|
351
|
-
dialect,
|
|
352
|
-
UserError(f"user simulator failed: {type(e).__name__}: {e}"),
|
|
402
|
+
len(response.message.tool_calls or []),
|
|
353
403
|
)
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
404
|
+
turn.commit(response, tools) # one node per new message;
|
|
405
|
+
# branches fall out of walking the graph (see Trace.branches / verifiers.v1.graph)
|
|
406
|
+
# Hand back to the program when the model wants a tool (the program runs it) or
|
|
407
|
+
# when there's no user simulator to keep the conversation going.
|
|
408
|
+
if response.message.tool_calls or session.user is None:
|
|
409
|
+
return serve(response)
|
|
410
|
+
try:
|
|
411
|
+
user_messages = await session.user(response.message.content or "")
|
|
412
|
+
except RolloutError as e:
|
|
413
|
+
return self._fail(session, dialect, e)
|
|
414
|
+
except Exception as e:
|
|
415
|
+
return self._fail(
|
|
416
|
+
session,
|
|
417
|
+
dialect,
|
|
418
|
+
UserError(f"user simulator failed: {type(e).__name__}: {e}"),
|
|
419
|
+
)
|
|
420
|
+
# Inject the model turn + the simulator's user turn(s): into the wire request for
|
|
421
|
+
# the next model call (`dialect.extend`, which keeps the model turn verbatim so
|
|
422
|
+
# reasoning survives) and into the typed prompt for the trace. The simulator ends
|
|
423
|
+
# the trajectory through its task's `@stop` (e.g. a `user_finished` flag it set on
|
|
424
|
+
# `self.state`), caught by `refused()` at the top of the next iteration — the
|
|
425
|
+
# interception server holds no opinion about the state's contents.
|
|
426
|
+
body = dialect.extend(body, response.raw, user_messages)
|
|
427
|
+
prompt = [*prompt, response.message, *user_messages]
|
|
428
|
+
# The simulator changed the payload, so this is a new operation not a retry.
|
|
429
|
+
headers.popall("idempotency-key", None)
|
|
430
|
+
headers.popall("x-idempotency-key", None)
|
|
431
|
+
finally:
|
|
432
|
+
# Free the in-flight slot and unblock any coalesced retry; None signals "no servable
|
|
433
|
+
# response" (an error/refuse return above), so the waiter surfaces a retryable error.
|
|
434
|
+
# Only clear our own entry — never one a later owner may have installed.
|
|
435
|
+
if session.inflight.get(req_hash) is fut:
|
|
436
|
+
session.inflight.pop(req_hash, None)
|
|
437
|
+
if not fut.done():
|
|
438
|
+
fut.set_result(None)
|
|
365
439
|
|
|
366
440
|
async def _stream(
|
|
367
441
|
self,
|
|
@@ -113,8 +113,10 @@ def _import_ref(ref: str) -> object:
|
|
|
113
113
|
|
|
114
114
|
|
|
115
115
|
class ServerBase(Generic[ConfigT, StateT]):
|
|
116
|
-
|
|
117
|
-
|
|
116
|
+
TOOL_PREFIX: ClassVar[str | None] = ""
|
|
117
|
+
"""The empty value falls back to the snake-cased class name. None advertises the server's
|
|
118
|
+
tools bare (no `<server>_` prefix); name collisions across servers are then the taskset
|
|
119
|
+
author's concern."""
|
|
118
120
|
|
|
119
121
|
EXTRAS: ClassVar[tuple[str, ...]] = ()
|
|
120
122
|
"""Package extras the server's module needs, applied at sandbox install."""
|
|
@@ -214,6 +216,8 @@ class ServerBase(Generic[ConfigT, StateT]):
|
|
|
214
216
|
|
|
215
217
|
@property
|
|
216
218
|
def server_name(self) -> str:
|
|
219
|
+
if self.TOOL_PREFIX is None:
|
|
220
|
+
return ""
|
|
217
221
|
return self.TOOL_PREFIX or "".join(
|
|
218
222
|
("_" + c.lower() if c.isupper() else c) for c in type(self).__name__
|
|
219
223
|
).lstrip("_")
|
|
@@ -8,6 +8,7 @@ injects the user simulator's replies, and stashes the real failure on `error`.
|
|
|
8
8
|
turns.
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
|
+
import asyncio
|
|
11
12
|
import logging
|
|
12
13
|
from collections.abc import Awaitable, Callable
|
|
13
14
|
from dataclasses import dataclass, field
|
|
@@ -81,6 +82,23 @@ class RolloutSession:
|
|
|
81
82
|
(and may swallow it, or exit non-zero), so the rollout re-raises this original error once the
|
|
82
83
|
harness returns — recording the real `ProviderError` instead of a secondary `HarnessError`.
|
|
83
84
|
Reset before each model turn, so a successful retry clears it."""
|
|
85
|
+
last_request: bytes | None = None
|
|
86
|
+
"""Digest of the most recently served request body; with `last_response`, the replay cache
|
|
87
|
+
that keeps the message graph atomic under harness-SDK retries. A retry re-sends the
|
|
88
|
+
byte-identical request; when it matches, the interception server replays the recorded
|
|
89
|
+
response instead of re-sampling and committing a second turn — which would fork the graph
|
|
90
|
+
into a dead-end branch. Only a fully served request is cached, so a genuinely failed attempt
|
|
91
|
+
still re-runs. Turns are issued sequentially (one outstanding request at a time), so a retry
|
|
92
|
+
is always of the most recent request — keeping only the last one is sufficient and bounded."""
|
|
93
|
+
last_response: dict | None = None
|
|
94
|
+
"""The response returned for `last_request`, replayed verbatim on a retry."""
|
|
95
|
+
inflight: dict[bytes, "asyncio.Future[dict | None]"] = field(default_factory=dict)
|
|
96
|
+
"""Body digest -> the future of the attempt currently computing it. A retry that arrives
|
|
97
|
+
while the first attempt is still in flight (a slow turn) awaits this future instead of
|
|
98
|
+
starting a second inference — the other half of retry atomicity (with `last_response`, which
|
|
99
|
+
covers a retry after the attempt finished). Because a slow turn is coalesced rather than
|
|
100
|
+
re-sampled, retries stay safe without an inflated client timeout. The future resolves to the
|
|
101
|
+
served response, or to None if the attempt produced no servable response (error/refuse)."""
|
|
84
102
|
|
|
85
103
|
async def refused(self) -> str | None:
|
|
86
104
|
"""The framework's limits (turns / token budget) and `@stop` checks, run before each
|
|
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
|
{verifiers-0.2.1.dev41 → verifiers-0.2.1.dev43}/tests/test_openai_chat_completions_token_client.py
RENAMED
|
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
|