verifiers 0.1.15.dev359__tar.gz → 0.1.15.dev364__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.dev359 → verifiers-0.1.15.dev364}/PKG-INFO +1 -1
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/eval/resume.py +46 -26
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/interception/server.py +45 -19
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/mcp/server.py +32 -19
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/runtimes/base.py +11 -1
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/runtimes/prime.py +18 -6
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/.gitignore +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/LICENSE +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/README.md +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/pyproject.toml +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/AGENTS.md +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/README.md +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/conftest.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_browser_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_build_script.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_client_config.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_composable_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_env_group.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_env_server.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_environment.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_environment_extra.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_envs.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_error_chain.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_eval_display.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_eval_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_gym_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_imports.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_init_script.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_install_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_interception_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_lean_task.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_logging.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_math_rubric.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_message_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_openenv_client.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_parser.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_path_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_renderer_client.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_rubric.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_rubric_group.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_save_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_setup_script.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_think_parser.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_tool_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_tool_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_types.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_wordle_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/test_xml_parser.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/conftest.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/test_configs.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/test_envs.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/test_graph.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/tests/v1/test_trace.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/AGENTS.md +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/cli/tui.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/clients/client.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/decorators.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/environment.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/lean/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/lean/lean_task.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/errors.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/gepa/config.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/gepa/display.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rl/README.md +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rl/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rl/inference/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rl/inference/client.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rl/inference/server.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rl/trainer/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rl/trainer/config.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rl/trainer/orchestrator.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rl/trainer/trainer.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rl/trainer/utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/build.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/init.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/install.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/rl.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/train.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/scripts/vllm.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/serve/types.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/types.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/ARCHITECTURE.md +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/GUIDE.md +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/README.md +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/env.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/episode.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/errors.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/graph.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harness.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/bash/program.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/default/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/default/harness.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/default/program.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/mcp/multiplex.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/retries.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/runtimes/docker.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/state.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/task.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/tasksets/harbor_v1/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/tasksets/harbor_v1/taskset.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/tasksets/textarena_v1/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/tasksets/textarena_v1/taskset.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/trace.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/types.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.1.15.dev359 → verifiers-0.1.15.dev364}/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.dev364
|
|
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
|
|
|
@@ -24,12 +24,12 @@ 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
|
|
|
31
31
|
from aiohttp import web
|
|
32
|
-
from pydantic import ValidationError
|
|
32
|
+
from pydantic import TypeAdapter, ValidationError
|
|
33
33
|
from pydantic_core import PydanticSerializationError, from_json, to_json
|
|
34
34
|
|
|
35
35
|
from verifiers.v1.clients import RolloutContext
|
|
@@ -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:
|
|
@@ -522,8 +546,12 @@ class InterceptionServer:
|
|
|
522
546
|
if session is None:
|
|
523
547
|
return web.json_response({"error": "unauthorized"}, status=401)
|
|
524
548
|
logger.debug("intercept GET /state: id=%s", session.trace.id)
|
|
549
|
+
state = session.trace.state
|
|
525
550
|
return web.Response(
|
|
526
|
-
|
|
551
|
+
# TypeAdapter emits UTF-8 bytes directly, avoiding a JSON str copy in aiohttp.
|
|
552
|
+
body=TypeAdapter(type(state)).dump_json(state),
|
|
553
|
+
content_type="application/json",
|
|
554
|
+
charset="utf-8",
|
|
527
555
|
)
|
|
528
556
|
|
|
529
557
|
async def handle_task_get(self, request: web.Request) -> web.Response:
|
|
@@ -550,13 +578,11 @@ class InterceptionServer:
|
|
|
550
578
|
return web.json_response({"error": "unauthorized"}, status=401)
|
|
551
579
|
logger.debug("intercept PUT /state: id=%s", session.trace.id)
|
|
552
580
|
state_cls = type(session.trace.state)
|
|
581
|
+
raw = await request.read()
|
|
553
582
|
try:
|
|
554
|
-
new_state = state_cls.
|
|
555
|
-
except
|
|
556
|
-
#
|
|
557
|
-
# that doesn't fit the trace's `State` type (almost always a `StateT` mismatch between the
|
|
558
|
-
# taskset and a server). Surface a clean 400 (with the reason) rather than a 500, so the
|
|
559
|
-
# server's failed PUT fails the rollout legibly.
|
|
583
|
+
new_state = state_cls.model_validate_json(raw)
|
|
584
|
+
except ValidationError as e:
|
|
585
|
+
# Reject malformed, over-nested, or mismatched state before it enters the shared channel.
|
|
560
586
|
logger.warning("state PUT rejected: id=%s %s", session.trace.id, e)
|
|
561
587
|
return web.json_response(
|
|
562
588
|
{"error": f"invalid state PUT for {state_cls.__name__}: {e}"},
|
|
@@ -12,18 +12,21 @@ import contextlib
|
|
|
12
12
|
import contextvars
|
|
13
13
|
import functools
|
|
14
14
|
import inspect
|
|
15
|
+
import logging
|
|
15
16
|
import os
|
|
16
17
|
from typing import TYPE_CHECKING, Callable, ClassVar, Generic, TypeVar, get_args
|
|
17
18
|
|
|
19
|
+
from pydantic import TypeAdapter, ValidationError
|
|
18
20
|
from pydantic_config import BaseConfig
|
|
19
21
|
|
|
20
22
|
from verifiers.v1.state import State, StateT, state_cls
|
|
21
23
|
|
|
22
24
|
if TYPE_CHECKING:
|
|
23
|
-
from httpx import AsyncClient
|
|
25
|
+
from httpx import AsyncClient, Response
|
|
24
26
|
from mcp.server.fastmcp import FastMCP
|
|
25
27
|
|
|
26
28
|
ConfigT = TypeVar("ConfigT", bound=BaseConfig)
|
|
29
|
+
logger = logging.getLogger(__name__)
|
|
27
30
|
|
|
28
31
|
STATE_TIMEOUT = 30.0
|
|
29
32
|
"""Seconds for a state-channel GET/PUT (localhost, or a tunnel to the host)."""
|
|
@@ -38,13 +41,13 @@ async def _channel_request(
|
|
|
38
41
|
url: str,
|
|
39
42
|
secret: str,
|
|
40
43
|
*,
|
|
41
|
-
|
|
44
|
+
content: bytes | None = None,
|
|
42
45
|
client: AsyncClient | None = None,
|
|
43
|
-
) ->
|
|
46
|
+
) -> Response:
|
|
44
47
|
"""One bearer-authed call to the interception `/state` or `/task` channel, retried with
|
|
45
48
|
exponential backoff + jitter on transient failures (connection resets / 5xx from the host
|
|
46
49
|
tunnel). A 4xx is a real error (e.g. an invalid state PUT) and is not retried. Returns the
|
|
47
|
-
|
|
50
|
+
response so typed callers can validate its JSON bytes directly."""
|
|
48
51
|
import httpx
|
|
49
52
|
from tenacity import (
|
|
50
53
|
AsyncRetrying,
|
|
@@ -58,18 +61,21 @@ async def _channel_request(
|
|
|
58
61
|
isinstance(e, httpx.HTTPStatusError) and e.response.status_code >= 500
|
|
59
62
|
)
|
|
60
63
|
|
|
61
|
-
async def request() ->
|
|
64
|
+
async def request() -> Response:
|
|
62
65
|
manager = (
|
|
63
66
|
contextlib.nullcontext(client)
|
|
64
67
|
if client is not None
|
|
65
68
|
else httpx.AsyncClient(timeout=STATE_TIMEOUT)
|
|
66
69
|
)
|
|
67
70
|
async with manager as request_client:
|
|
71
|
+
headers = {"Authorization": f"Bearer {secret}"}
|
|
72
|
+
if content is not None:
|
|
73
|
+
headers["Content-Type"] = "application/json"
|
|
68
74
|
resp = await request_client.request(
|
|
69
|
-
method, url,
|
|
75
|
+
method, url, content=content, headers=headers
|
|
70
76
|
)
|
|
71
77
|
resp.raise_for_status()
|
|
72
|
-
return resp
|
|
78
|
+
return resp
|
|
73
79
|
|
|
74
80
|
return await AsyncRetrying(
|
|
75
81
|
stop=stop_after_attempt(STATE_RETRIES + 1),
|
|
@@ -158,6 +164,8 @@ class ServerBase(Generic[ConfigT, StateT]):
|
|
|
158
164
|
def __init__(self, config: ConfigT) -> None:
|
|
159
165
|
self.config = config
|
|
160
166
|
self._state_cls = state_cls(type(self))
|
|
167
|
+
# Reuse Pydantic's public byte serializer/validator across state-channel calls.
|
|
168
|
+
self._state_adapter = TypeAdapter(self._state_cls)
|
|
161
169
|
self._inert_state: StateT = self._state_cls() # type: ignore[assignment]
|
|
162
170
|
"""A fresh state used outside a tool/respond call (setup, or a manual debug run) — there's
|
|
163
171
|
no channel to sync, so writes to it don't escape the process (matches the no-channel case)."""
|
|
@@ -188,27 +196,31 @@ class ServerBase(Generic[ConfigT, StateT]):
|
|
|
188
196
|
"""Fetch the in-flight call's shared state from the channel (so it reflects other servers'
|
|
189
197
|
writes); a fresh inert state when there's no channel."""
|
|
190
198
|
url, secret = self._state_channel()
|
|
191
|
-
cls = self._state_cls
|
|
192
199
|
if not url:
|
|
193
|
-
return
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
200
|
+
return self._state_cls()
|
|
201
|
+
response = await _channel_request("GET", url, secret, client=self._state_client)
|
|
202
|
+
try:
|
|
203
|
+
return self._state_adapter.validate_json(response.content)
|
|
204
|
+
except ValidationError as e:
|
|
205
|
+
# Excessively nested or otherwise invalid state is a broken channel contract.
|
|
206
|
+
logger.warning(
|
|
207
|
+
"state pull rejected for %s: %s", self._state_cls.__name__, e
|
|
208
|
+
)
|
|
209
|
+
raise
|
|
197
210
|
|
|
198
|
-
async def _push_state(self, before:
|
|
211
|
+
async def _push_state(self, before: bytes) -> None:
|
|
199
212
|
"""Push the in-flight call's `self.state` back to the shared channel if it changed. No-op
|
|
200
213
|
without a channel or when nothing changed."""
|
|
201
214
|
url, secret = self._state_channel()
|
|
202
215
|
if not url:
|
|
203
216
|
return
|
|
204
217
|
state = _call_state.get()
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
)
|
|
218
|
+
current = state if state is not None else self._inert_state
|
|
219
|
+
after = self._state_adapter.dump_json(current)
|
|
208
220
|
if after == before:
|
|
209
221
|
return
|
|
210
222
|
await _channel_request(
|
|
211
|
-
"PUT", url, secret,
|
|
223
|
+
"PUT", url, secret, content=after, client=self._state_client
|
|
212
224
|
)
|
|
213
225
|
|
|
214
226
|
async def _fetch_task(self, state_url: str | None, secret: str):
|
|
@@ -222,7 +234,7 @@ class ServerBase(Generic[ConfigT, StateT]):
|
|
|
222
234
|
if state_url.endswith("/state")
|
|
223
235
|
else state_url
|
|
224
236
|
)
|
|
225
|
-
data = await _channel_request("GET", task_url, secret)
|
|
237
|
+
data = (await _channel_request("GET", task_url, secret)).json()
|
|
226
238
|
return _import_ref(data["cls"]).model_validate_json(data["task"])
|
|
227
239
|
|
|
228
240
|
async def _setup_task_from_channel(
|
|
@@ -253,7 +265,8 @@ class ServerBase(Generic[ConfigT, StateT]):
|
|
|
253
265
|
state = await self._pull_state()
|
|
254
266
|
token = _call_state.set(state)
|
|
255
267
|
try:
|
|
256
|
-
|
|
268
|
+
# Reuse the second serialization as the PUT body when the callback mutates state.
|
|
269
|
+
before = self._state_adapter.dump_json(state)
|
|
257
270
|
result = fn(*args, **kwargs)
|
|
258
271
|
if inspect.isawaitable(result):
|
|
259
272
|
result = await result
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|