verifiers 0.1.15.dev360__tar.gz → 0.1.15.dev366__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.dev360 → verifiers-0.1.15.dev366}/PKG-INFO +1 -1
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/eval/resume.py +46 -26
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/dialects/anthropic.py +36 -25
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/dialects/base.py +40 -14
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/dialects/chat.py +26 -9
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/graph.py +10 -8
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/interception/server.py +35 -11
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/runtimes/base.py +11 -1
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/runtimes/prime.py +18 -6
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/.gitignore +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/LICENSE +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/README.md +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/pyproject.toml +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/AGENTS.md +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/README.md +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/conftest.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_browser_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_build_script.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_client_config.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_composable_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_env_group.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_env_server.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_environment.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_environment_extra.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_envs.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_error_chain.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_eval_display.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_eval_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_gym_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_imports.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_init_script.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_install_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_interception_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_lean_task.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_logging.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_math_rubric.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_message_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_openenv_client.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_parser.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_path_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_renderer_client.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_rubric.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_rubric_group.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_save_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_setup_script.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_think_parser.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_tool_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_tool_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_types.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_wordle_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/test_xml_parser.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/conftest.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/test_configs.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/test_envs.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/test_graph.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/tests/v1/test_trace.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/AGENTS.md +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/cli/tui.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/clients/client.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/decorators.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/environment.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/lean/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/lean/lean_task.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/errors.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/gepa/config.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/gepa/display.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rl/README.md +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rl/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rl/inference/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rl/inference/client.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rl/inference/server.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rl/trainer/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rl/trainer/config.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rl/trainer/orchestrator.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rl/trainer/trainer.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rl/trainer/utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/build.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/init.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/install.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/rl.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/train.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/scripts/vllm.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/serve/types.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/types.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/ARCHITECTURE.md +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/GUIDE.md +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/README.md +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/env.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/episode.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/errors.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harness.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/bash/program.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/default/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/default/harness.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/default/program.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/mcp/multiplex.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/retries.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/runtimes/docker.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/state.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/task.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/tasksets/harbor_v1/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/tasksets/harbor_v1/taskset.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/tasksets/textarena_v1/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/tasksets/textarena_v1/taskset.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/trace.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/types.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.1.15.dev360 → verifiers-0.1.15.dev366}/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.dev366
|
|
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
|
|
@@ -11,8 +11,11 @@ together), so any task that isn't fully complete is redone from scratch.
|
|
|
11
11
|
import json
|
|
12
12
|
import tomllib
|
|
13
13
|
from collections import defaultdict
|
|
14
|
+
from collections.abc import Iterator
|
|
14
15
|
from pathlib import Path
|
|
15
16
|
|
|
17
|
+
from pydantic_core import from_json
|
|
18
|
+
|
|
16
19
|
from verifiers.v1.configs.eval import EvalConfig
|
|
17
20
|
|
|
18
21
|
|
|
@@ -45,54 +48,71 @@ def load_resume_config(resume_dir: Path) -> EvalConfig:
|
|
|
45
48
|
return config
|
|
46
49
|
|
|
47
50
|
|
|
48
|
-
def _read_results(results_path: Path) ->
|
|
49
|
-
"""
|
|
50
|
-
strict `Trace` can't re-validate, so we read the JSON directly — resume only needs each
|
|
51
|
-
trace's `task.idx` and whether it `errors`ed."""
|
|
51
|
+
def _read_results(results_path: Path) -> Iterator[tuple[int, int, bool]]:
|
|
52
|
+
"""Stream `(file reference, task idx, errored)` without retaining decoded traces."""
|
|
52
53
|
if not results_path.exists():
|
|
53
|
-
return
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
54
|
+
return
|
|
55
|
+
with results_path.open("rb") as results:
|
|
56
|
+
while True:
|
|
57
|
+
offset = results.tell()
|
|
58
|
+
line = results.readline()
|
|
59
|
+
if not line:
|
|
60
|
+
break
|
|
61
|
+
if line.strip():
|
|
62
|
+
try:
|
|
63
|
+
row = from_json(line)
|
|
64
|
+
except ValueError:
|
|
65
|
+
row = json.loads(line)
|
|
66
|
+
yield offset, row["task"]["idx"], bool(row.get("errors"))
|
|
59
67
|
|
|
60
68
|
|
|
61
69
|
def plan(
|
|
62
70
|
resume_dir: Path, selected_idxs: list[int], num_rollouts: int, group: bool
|
|
63
|
-
) -> tuple[list[
|
|
71
|
+
) -> tuple[list[int], dict[int, int]]:
|
|
64
72
|
"""Diff the saved results against the run's target (`num_rollouts` per selected task).
|
|
65
|
-
Returns (rows to keep
|
|
66
|
-
dropped and re-run; a group-scored task is kept only if fully complete, else its whole
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
73
|
+
Returns (byte offsets of rows to keep, rollouts owed per task idx). An errored trace is
|
|
74
|
+
dropped and re-run; a group-scored task is kept only if fully complete, else its whole group
|
|
75
|
+
is redone."""
|
|
76
|
+
# Retain only the offsets resume can reuse; trace payloads stay on disk.
|
|
77
|
+
selected = set(selected_idxs)
|
|
78
|
+
by_idx: dict[int, list[int]] = defaultdict(list)
|
|
79
|
+
for offset, idx, errored in _read_results(resume_dir / "results.jsonl"):
|
|
80
|
+
if idx in selected and not errored and len(by_idx[idx]) < num_rollouts:
|
|
81
|
+
by_idx[idx].append(offset)
|
|
82
|
+
keep: list[int] = []
|
|
72
83
|
owed: dict[int, int] = {}
|
|
73
84
|
for idx in selected_idxs:
|
|
74
|
-
good =
|
|
85
|
+
good = by_idx.get(idx, [])
|
|
75
86
|
if group:
|
|
76
87
|
if len(good) >= num_rollouts:
|
|
77
|
-
keep.extend(good
|
|
88
|
+
keep.extend(good)
|
|
78
89
|
else:
|
|
79
90
|
owed[idx] = num_rollouts # re-run the whole group; keep none of it
|
|
80
91
|
else:
|
|
81
|
-
keep.extend(good
|
|
82
|
-
missing = num_rollouts -
|
|
92
|
+
keep.extend(good)
|
|
93
|
+
missing = num_rollouts - len(good)
|
|
83
94
|
if missing:
|
|
84
95
|
owed[idx] = missing
|
|
85
96
|
return keep, owed
|
|
86
97
|
|
|
87
98
|
|
|
88
|
-
def rewrite_results(resume_dir: Path, keep: list[
|
|
99
|
+
def rewrite_results(resume_dir: Path, keep: list[int]) -> None:
|
|
89
100
|
"""Replace `results.jsonl` with just the kept (good) traces; resumed rollouts append. Via a
|
|
90
101
|
temp file + atomic rename, so an interrupted resume can't corrupt the prior good results."""
|
|
91
102
|
path = resume_dir / "results.jsonl"
|
|
92
103
|
tmp = path.with_suffix(".jsonl.tmp")
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
104
|
+
if not keep:
|
|
105
|
+
tmp.write_bytes(b"")
|
|
106
|
+
tmp.replace(path)
|
|
107
|
+
return
|
|
108
|
+
# Re-read retained rows by offset while building the atomic replacement.
|
|
109
|
+
with path.open("rb") as results, tmp.open("wb") as output:
|
|
110
|
+
for offset in keep:
|
|
111
|
+
results.seek(offset)
|
|
112
|
+
raw = results.readline()
|
|
113
|
+
output.write(raw)
|
|
114
|
+
if not raw.endswith(b"\n"):
|
|
115
|
+
output.write(b"\n")
|
|
96
116
|
tmp.replace(path)
|
|
97
117
|
|
|
98
118
|
|
|
@@ -122,15 +122,15 @@ def response_from_wire(message: AnthropicMessage) -> Response:
|
|
|
122
122
|
data = message.model_dump()
|
|
123
123
|
blocks = data.get("content") or []
|
|
124
124
|
state = [block for block in blocks if block["type"] in THINKING]
|
|
125
|
-
content =
|
|
126
|
-
reasoning =
|
|
125
|
+
content: list[str] = []
|
|
126
|
+
reasoning: list[str] = []
|
|
127
127
|
calls: list[ToolCall] = []
|
|
128
128
|
for block in blocks:
|
|
129
129
|
kind = block.get("type")
|
|
130
130
|
if kind == "text":
|
|
131
|
-
content
|
|
131
|
+
content.append(block.get("text", ""))
|
|
132
132
|
elif kind == "thinking":
|
|
133
|
-
reasoning
|
|
133
|
+
reasoning.append(block.get("thinking", ""))
|
|
134
134
|
elif kind == "tool_use":
|
|
135
135
|
calls.append(
|
|
136
136
|
ToolCall(
|
|
@@ -161,8 +161,8 @@ def response_from_wire(message: AnthropicMessage) -> Response:
|
|
|
161
161
|
created=0,
|
|
162
162
|
model=data.get("model", ""),
|
|
163
163
|
message=AssistantMessage(
|
|
164
|
-
content=content or None,
|
|
165
|
-
reasoning_content=reasoning or None,
|
|
164
|
+
content="".join(content) or None,
|
|
165
|
+
reasoning_content="".join(reasoning) or None,
|
|
166
166
|
tool_calls=calls or None,
|
|
167
167
|
provider_state=state or None,
|
|
168
168
|
),
|
|
@@ -220,30 +220,38 @@ class AnthropicDialect(Dialect[dict, AnthropicMessage]):
|
|
|
220
220
|
message, then parse it."""
|
|
221
221
|
message: dict = {}
|
|
222
222
|
blocks: dict[int, dict] = {}
|
|
223
|
-
|
|
223
|
+
block_parts: dict[int, dict[str, list[str]]] = {}
|
|
224
|
+
partial_json: dict[int, list[str]] = {}
|
|
224
225
|
for event in iter_sse(raw):
|
|
225
226
|
kind = event.get("type")
|
|
226
227
|
if kind == "message_start":
|
|
227
228
|
message = event.get("message") or {}
|
|
228
229
|
elif kind == "content_block_start":
|
|
229
|
-
|
|
230
|
+
index = event["index"]
|
|
231
|
+
blocks[index] = dict(event.get("content_block") or {})
|
|
232
|
+
block_parts.pop(index, None)
|
|
230
233
|
elif kind == "content_block_delta":
|
|
231
|
-
|
|
234
|
+
index = event["index"]
|
|
235
|
+
block = blocks.setdefault(index, {"type": "text", "text": ""})
|
|
232
236
|
delta = event.get("delta") or {}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
237
|
+
delta_type = delta.get("type")
|
|
238
|
+
if delta_type in ("text_delta", "thinking_delta", "signature_delta"):
|
|
239
|
+
field = delta_type.removesuffix("_delta")
|
|
240
|
+
fields = block_parts.get(index)
|
|
241
|
+
if fields is None:
|
|
242
|
+
fields = {}
|
|
243
|
+
block_parts[index] = fields
|
|
244
|
+
parts = fields.get(field)
|
|
245
|
+
if parts is None:
|
|
246
|
+
parts = [block.get(field, "")]
|
|
247
|
+
fields[field] = parts
|
|
248
|
+
parts.append(delta.get(field, ""))
|
|
249
|
+
elif delta_type == "input_json_delta":
|
|
250
|
+
parts = partial_json.get(index)
|
|
251
|
+
if parts is None:
|
|
252
|
+
parts = []
|
|
253
|
+
partial_json[index] = parts
|
|
254
|
+
parts.append(delta.get("partial_json", ""))
|
|
247
255
|
elif kind == "message_delta":
|
|
248
256
|
message.update(
|
|
249
257
|
{
|
|
@@ -256,8 +264,11 @@ class AnthropicDialect(Dialect[dict, AnthropicMessage]):
|
|
|
256
264
|
**(message.get("usage") or {}),
|
|
257
265
|
**(event.get("usage") or {}),
|
|
258
266
|
}
|
|
259
|
-
for index,
|
|
260
|
-
|
|
267
|
+
for index, fields in block_parts.items():
|
|
268
|
+
for field, parts in fields.items():
|
|
269
|
+
blocks[index][field] = "".join(parts)
|
|
270
|
+
for index, parts in partial_json.items():
|
|
271
|
+
blocks[index]["input"] = json.loads("".join(parts) or "{}")
|
|
261
272
|
message["content"] = [blocks[i] for i in sorted(blocks)]
|
|
262
273
|
return response_from_wire(self.validate_response(message))
|
|
263
274
|
|
|
@@ -13,37 +13,63 @@ the eval's model + sampling in this format's shape) and `extend` (chat-only user
|
|
|
13
13
|
"""
|
|
14
14
|
|
|
15
15
|
import json
|
|
16
|
+
import logging
|
|
16
17
|
from abc import ABC, abstractmethod
|
|
17
18
|
from collections.abc import Iterator, Mapping
|
|
18
19
|
from typing import ClassVar, Generic, TypeVar
|
|
19
20
|
|
|
20
21
|
from pydantic import BaseModel
|
|
22
|
+
from pydantic_core import from_json
|
|
21
23
|
|
|
22
24
|
from verifiers.v1.types import Messages, Response, SamplingConfig, Tool
|
|
23
25
|
|
|
24
26
|
ReqT = TypeVar("ReqT")
|
|
25
27
|
RespT = TypeVar("RespT", bound=BaseModel)
|
|
26
28
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
29
|
+
logger = logging.getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def iter_sse(raw: bytes) -> Iterator[dict]:
|
|
33
|
+
"""Yield JSON SSE payloads in order without retaining prior events."""
|
|
34
|
+
# Detect the wire line ending once, then scan without retaining prior payloads.
|
|
35
|
+
first_newline = raw.find(b"\n")
|
|
36
|
+
separator = (
|
|
37
|
+
b"\r\n\r\n"
|
|
38
|
+
if first_newline > 0 and raw[first_newline - 1] == ord("\r")
|
|
39
|
+
else b"\n\n"
|
|
40
|
+
)
|
|
41
|
+
start = 0
|
|
42
|
+
while start < len(raw):
|
|
43
|
+
end = raw.find(separator, start)
|
|
44
|
+
if end == -1:
|
|
45
|
+
end = len(raw)
|
|
46
|
+
block = raw[start:end]
|
|
47
|
+
data = b"\n".join(
|
|
48
|
+
line.removeprefix(b"data:").strip()
|
|
35
49
|
for line in block.splitlines()
|
|
36
|
-
if line.startswith("data:")
|
|
50
|
+
if line.startswith(b"data:")
|
|
37
51
|
)
|
|
38
|
-
if
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
52
|
+
if data and data != b"[DONE]":
|
|
53
|
+
try:
|
|
54
|
+
yield from_json(data)
|
|
55
|
+
except ValueError:
|
|
56
|
+
logger.warning(
|
|
57
|
+
"SSE JSON fast-path failed; falling back to stdlib with invalid UTF-8 replacement"
|
|
58
|
+
)
|
|
59
|
+
yield json.loads(data.decode("utf-8", errors="replace"))
|
|
60
|
+
start = end + len(separator)
|
|
42
61
|
|
|
43
62
|
|
|
44
63
|
def iter_sse_reverse(raw: bytes) -> Iterator[dict]:
|
|
45
64
|
"""Yield JSON SSE payloads from the end without decoding earlier events."""
|
|
46
|
-
|
|
65
|
+
decoded = raw.decode("utf-8", errors="replace")
|
|
66
|
+
first_newline = decoded.find("\n")
|
|
67
|
+
separator = (
|
|
68
|
+
"\r\n\r\n"
|
|
69
|
+
if first_newline > 0 and decoded[first_newline - 1] == "\r"
|
|
70
|
+
else "\n\n"
|
|
71
|
+
)
|
|
72
|
+
for block in reversed(decoded.split(separator)):
|
|
47
73
|
data = "\n".join(
|
|
48
74
|
line.removeprefix("data:").strip()
|
|
49
75
|
for line in block.splitlines()
|
|
@@ -229,13 +229,19 @@ class ChatDialect(Dialect[dict, ChatCompletion]):
|
|
|
229
229
|
|
|
230
230
|
def parse_stream(self, raw: bytes) -> Response:
|
|
231
231
|
"""Assemble `chat.completion.chunk` deltas into one completion, then parse it."""
|
|
232
|
-
chunks = iter_sse(raw)
|
|
233
232
|
message: dict = {"role": "assistant", "content": None}
|
|
233
|
+
# Join streamed fields once; repeated concatenation recopies the growing response.
|
|
234
|
+
message_parts = {key: [] for key in REASONING_FIELDS[:2] + ("content",)}
|
|
234
235
|
tool_calls: dict[int, dict] = {}
|
|
236
|
+
tool_arguments: dict[int, list[str]] = {}
|
|
235
237
|
reasoning_details: list[dict] = []
|
|
238
|
+
reasoning_detail_parts: dict[int, list[str]] = {}
|
|
236
239
|
finish_reason = None
|
|
237
240
|
usage = None
|
|
238
|
-
|
|
241
|
+
head = None
|
|
242
|
+
for chunk in iter_sse(raw):
|
|
243
|
+
if head is None:
|
|
244
|
+
head = chunk
|
|
239
245
|
usage = chunk.get("usage") or usage
|
|
240
246
|
for choice in chunk.get("choices") or []:
|
|
241
247
|
if choice.get("index", 0) != 0:
|
|
@@ -244,32 +250,43 @@ class ChatDialect(Dialect[dict, ChatCompletion]):
|
|
|
244
250
|
delta = choice.get("delta") or {}
|
|
245
251
|
for key in ("content", "reasoning_content", "reasoning"):
|
|
246
252
|
if delta.get(key) is not None:
|
|
247
|
-
|
|
253
|
+
message_parts[key].append(delta[key])
|
|
248
254
|
for detail in delta.get("reasoning_details") or []:
|
|
249
255
|
previous = reasoning_details[-1] if reasoning_details else {}
|
|
250
256
|
if detail.get("type") == previous.get("type") == "reasoning.text":
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
)
|
|
257
|
+
reasoning_detail_parts.setdefault(
|
|
258
|
+
len(reasoning_details) - 1, [previous.get("text") or ""]
|
|
259
|
+
).append(detail.get("text") or "")
|
|
254
260
|
for field in ("signature", "format"):
|
|
255
261
|
previous[field] = previous.get(field) or detail.get(field)
|
|
256
262
|
else:
|
|
257
263
|
reasoning_details.append(detail)
|
|
258
264
|
for tc in delta.get("tool_calls") or []:
|
|
265
|
+
index = tc.get("index", 0)
|
|
259
266
|
slot = tool_calls.setdefault(
|
|
260
|
-
|
|
267
|
+
index,
|
|
261
268
|
{"type": "function", "function": {"name": "", "arguments": ""}},
|
|
262
269
|
)
|
|
263
270
|
slot["id"] = tc.get("id") or slot.get("id", "")
|
|
264
271
|
fn = tc.get("function") or {}
|
|
265
272
|
if fn.get("name"):
|
|
266
273
|
slot["function"]["name"] = fn["name"]
|
|
267
|
-
|
|
274
|
+
tool_arguments.setdefault(index, []).append(
|
|
275
|
+
fn.get("arguments") or ""
|
|
276
|
+
)
|
|
277
|
+
for key, parts in message_parts.items():
|
|
278
|
+
if parts:
|
|
279
|
+
message[key] = "".join(parts)
|
|
280
|
+
for index, parts in reasoning_detail_parts.items():
|
|
281
|
+
reasoning_details[index]["text"] = "".join(parts)
|
|
282
|
+
for index, parts in tool_arguments.items():
|
|
283
|
+
tool_calls[index]["function"]["arguments"] = "".join(parts)
|
|
268
284
|
if tool_calls:
|
|
269
285
|
message["tool_calls"] = [tool_calls[i] for i in sorted(tool_calls)]
|
|
270
286
|
if reasoning_details:
|
|
271
287
|
message["reasoning_details"] = reasoning_details
|
|
272
|
-
|
|
288
|
+
if head is None:
|
|
289
|
+
head = {}
|
|
273
290
|
return response_from_wire(
|
|
274
291
|
ChatCompletion.model_validate(
|
|
275
292
|
{
|
|
@@ -376,18 +376,20 @@ def _attribute_routed_experts(
|
|
|
376
376
|
raw = binascii.a2b_base64(payload["data"])
|
|
377
377
|
arr = np.frombuffer(raw, dtype=np.uint8).reshape(payload["shape"])
|
|
378
378
|
off = path_len - int(payload.get("start", 0) or 0)
|
|
379
|
-
# The engine omits routing for the turn's final position (no forward pass follows the last
|
|
380
|
-
# generated token), so the array is one row short of the turn's new tokens. Pad the tail
|
|
381
|
-
# with a copy of the last row so the final node still aligns 1:1 with its tokens.
|
|
382
379
|
needed = off + sum(len(trace.nodes[nid].token_ids) for nid in new_node_ids)
|
|
383
|
-
if arr.shape[0] and 0 < needed - arr.shape[0] <= 1:
|
|
384
|
-
arr = np.concatenate([arr, arr[-1:]], axis=0)
|
|
385
380
|
for nid in new_node_ids:
|
|
386
381
|
n = len(trace.nodes[nid].token_ids)
|
|
387
|
-
|
|
382
|
+
end = off + n
|
|
383
|
+
if n and 0 <= off and end <= arr.shape[0]:
|
|
388
384
|
# Own only this node's rows; a view would retain the turn's full-context array.
|
|
389
|
-
trace.nodes[nid].routed_experts = arr[off
|
|
390
|
-
off
|
|
385
|
+
trace.nodes[nid].routed_experts = arr[off:end].copy()
|
|
386
|
+
elif n and arr.shape[0] and 0 <= off and end == needed == arr.shape[0] + 1:
|
|
387
|
+
# The engine omits the turn's final position because no forward pass follows it.
|
|
388
|
+
# Pad only the final node's suffix instead of copying the full-context array.
|
|
389
|
+
trace.nodes[nid].routed_experts = np.concatenate(
|
|
390
|
+
[arr[off:], arr[-1:]], axis=0
|
|
391
|
+
)
|
|
392
|
+
off = end
|
|
391
393
|
|
|
392
394
|
|
|
393
395
|
def _commit_turn(turn: PendingTurn, response: Response) -> None:
|
|
@@ -24,7 +24,7 @@ import contextlib
|
|
|
24
24
|
import json
|
|
25
25
|
import logging
|
|
26
26
|
import secrets
|
|
27
|
-
from collections.abc import Awaitable, Callable
|
|
27
|
+
from collections.abc import AsyncIterator, Awaitable, Callable
|
|
28
28
|
from dataclasses import dataclass, field
|
|
29
29
|
from typing import TYPE_CHECKING
|
|
30
30
|
|
|
@@ -56,6 +56,7 @@ logger = logging.getLogger(__name__)
|
|
|
56
56
|
# context window are the real limits, this is just a host-OOM backstop.
|
|
57
57
|
_MAX_REQUEST_BODY = 1024**3 # 1 GiB (aiohttp's default is 1 MiB)
|
|
58
58
|
_KEEPALIVE_INTERVAL_SECONDS = 3
|
|
59
|
+
_STREAM_QUEUE_MAXSIZE = 16
|
|
59
60
|
# The server binds loopback; callers reach it via localhost or a host tunnel (see `reachable_url`).
|
|
60
61
|
_HOST = "127.0.0.1"
|
|
61
62
|
|
|
@@ -69,6 +70,20 @@ def _completion_response(completion: dict | None) -> web.Response:
|
|
|
69
70
|
return web.Response(body=body, content_type="application/json", charset="utf-8")
|
|
70
71
|
|
|
71
72
|
|
|
73
|
+
async def _queue_chunks(
|
|
74
|
+
chunks: AsyncIterator[bytes],
|
|
75
|
+
queue: asyncio.Queue[bytes | None],
|
|
76
|
+
ready: asyncio.Event,
|
|
77
|
+
) -> None:
|
|
78
|
+
try:
|
|
79
|
+
async for chunk in chunks:
|
|
80
|
+
await queue.put(chunk)
|
|
81
|
+
ready.set()
|
|
82
|
+
finally:
|
|
83
|
+
await queue.put(None)
|
|
84
|
+
ready.set()
|
|
85
|
+
|
|
86
|
+
|
|
72
87
|
@dataclass(frozen=True)
|
|
73
88
|
class RolloutLimits:
|
|
74
89
|
"""Per-rollout framework limits (None = no cap), checked before each turn is served.
|
|
@@ -446,28 +461,37 @@ class InterceptionServer:
|
|
|
446
461
|
)
|
|
447
462
|
resp.content_type = reply.content_type.split(";")[0].strip()
|
|
448
463
|
buffer = bytearray()
|
|
449
|
-
|
|
450
|
-
|
|
464
|
+
# One bounded producer avoids per-event tasks; keepalive timeouts only cancel readiness waits.
|
|
465
|
+
queue: asyncio.Queue[bytes | None] = asyncio.Queue(
|
|
466
|
+
maxsize=_STREAM_QUEUE_MAXSIZE
|
|
467
|
+
)
|
|
468
|
+
ready = asyncio.Event()
|
|
469
|
+
producer = asyncio.create_task(_queue_chunks(reply.chunks, queue, ready))
|
|
451
470
|
try:
|
|
452
471
|
await resp.prepare(request)
|
|
453
472
|
while True:
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
473
|
+
try:
|
|
474
|
+
async with asyncio.timeout(_KEEPALIVE_INTERVAL_SECONDS):
|
|
475
|
+
await ready.wait()
|
|
476
|
+
except TimeoutError:
|
|
458
477
|
await resp.write(b": keepalive\n\n")
|
|
459
478
|
continue
|
|
460
|
-
chunk =
|
|
479
|
+
chunk = queue.get_nowait()
|
|
480
|
+
if queue.empty():
|
|
481
|
+
ready.clear()
|
|
461
482
|
if chunk is None:
|
|
483
|
+
await producer
|
|
462
484
|
break
|
|
463
485
|
buffer += chunk
|
|
464
486
|
await resp.write(chunk)
|
|
465
|
-
next_chunk = asyncio.create_task(anext(chunks, None))
|
|
466
487
|
except ConnectionResetError:
|
|
467
488
|
return resp
|
|
468
489
|
finally:
|
|
469
|
-
|
|
470
|
-
|
|
490
|
+
producer.cancel()
|
|
491
|
+
# Let a canceled producer enqueue EOF while unwinding.
|
|
492
|
+
if queue.full():
|
|
493
|
+
queue.get_nowait()
|
|
494
|
+
await asyncio.gather(producer, return_exceptions=True)
|
|
471
495
|
await reply.close()
|
|
472
496
|
|
|
473
497
|
try:
|
|
@@ -322,8 +322,18 @@ async def host_endpoint(port: int, is_local: bool, labels: list[str] | None = No
|
|
|
322
322
|
try:
|
|
323
323
|
yield url
|
|
324
324
|
finally:
|
|
325
|
+
# Delay cancellation until the synchronous stop has finished.
|
|
326
|
+
cancelled = None
|
|
327
|
+
stop_task = asyncio.create_task(asyncio.to_thread(tunnel.sync_stop))
|
|
325
328
|
with contextlib.suppress(Exception):
|
|
326
|
-
|
|
329
|
+
while not stop_task.done():
|
|
330
|
+
try:
|
|
331
|
+
await asyncio.shield(stop_task)
|
|
332
|
+
except asyncio.CancelledError as e:
|
|
333
|
+
cancelled = e
|
|
334
|
+
stop_task.result()
|
|
335
|
+
if cancelled is not None:
|
|
336
|
+
raise cancelled
|
|
327
337
|
|
|
328
338
|
|
|
329
339
|
class _Host:
|
|
@@ -7,11 +7,11 @@ direction (a program in the sandbox reaching a host service) is the shared host-
|
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
9
|
import asyncio
|
|
10
|
-
import base64
|
|
11
10
|
import contextlib
|
|
12
11
|
import logging
|
|
13
12
|
import shlex
|
|
14
|
-
|
|
13
|
+
import tempfile
|
|
14
|
+
from pathlib import Path, PurePosixPath
|
|
15
15
|
from typing import ClassVar, Literal
|
|
16
16
|
|
|
17
17
|
from pydantic_config import BaseConfig
|
|
@@ -176,10 +176,22 @@ class PrimeRuntime(Runtime):
|
|
|
176
176
|
)
|
|
177
177
|
|
|
178
178
|
async def read(self, path: str) -> bytes:
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
179
|
+
# Avoid background-job log limits and base64 overhead by downloading binary data directly.
|
|
180
|
+
# The temporary file is removed on every exit, and its byte read stays off the event loop.
|
|
181
|
+
target = (
|
|
182
|
+
path
|
|
183
|
+
if path.startswith("/")
|
|
184
|
+
else f"{self.config.workdir.rstrip('/')}/{path}"
|
|
185
|
+
)
|
|
186
|
+
try:
|
|
187
|
+
with tempfile.TemporaryDirectory() as directory:
|
|
188
|
+
download = Path(directory) / "download"
|
|
189
|
+
await self._client.download_file(
|
|
190
|
+
self._sandbox_id, target, str(download)
|
|
191
|
+
)
|
|
192
|
+
return await asyncio.to_thread(download.read_bytes)
|
|
193
|
+
except Exception as e:
|
|
194
|
+
raise SandboxError(f"read {path!r}: {e}") from e
|
|
183
195
|
|
|
184
196
|
async def write(self, path: str, data: bytes) -> None:
|
|
185
197
|
# Upload via the gateway (multipart) — never inline the bytes on the command line
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|