verifiers 0.1.15.dev439__tar.gz → 0.1.15.dev440__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.dev439 → verifiers-0.1.15.dev440}/PKG-INFO +1 -1
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/__init__.py +2 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/rollout.py +3 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/runtimes/__init__.py +23 -4
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/runtimes/base.py +23 -3
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/runtimes/docker.py +12 -7
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/runtimes/modal.py +15 -12
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/runtimes/prime.py +29 -24
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/runtimes/subprocess.py +7 -5
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/trace.py +7 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/.gitignore +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/LICENSE +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/README.md +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/pyproject.toml +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/AGENTS.md +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/conftest.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_browser_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_build_script.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_client_config.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_composable_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_env_group.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_env_server.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_environment.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_environment_extra.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_envs.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_error_chain.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_eval_display.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_eval_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_gym_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_imports.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_init_script.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_install_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_interception_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_logging.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_math_rubric.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_message_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_openenv_client.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_parser.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_path_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_renderer_client.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_rubric.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_rubric_group.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_save_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_setup_script.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_think_parser.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_tool_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_tool_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_types.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_wordle_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/test_xml_parser.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/v1/conftest.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/v1/test_configs.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/v1/test_envs.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/v1/test_graph.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/v1/test_judges.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/tests/v1/test_trace.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/cli/tui.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/clients/client.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/decorators.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/environment.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/errors.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/gepa/config.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/gepa/display.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/scripts/build.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/scripts/init.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/scripts/install.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/serve/types.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/types.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/configs/debug.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/configs/replay.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/env.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/episode.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/errors.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/graph.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/harness.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/harnesses/default/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/harnesses/default/harness.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/harnesses/default/program.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/judge.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/push.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/retries.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/state.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/task.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/types.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev440}/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.dev440
|
|
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
|
|
@@ -82,6 +82,7 @@ from verifiers.v1.runtimes import (
|
|
|
82
82
|
ProgramResult,
|
|
83
83
|
Runtime,
|
|
84
84
|
RuntimeConfig,
|
|
85
|
+
RuntimeInfo,
|
|
85
86
|
SubprocessConfig,
|
|
86
87
|
)
|
|
87
88
|
from verifiers.v1.state import State, StateT
|
|
@@ -191,6 +192,7 @@ __all__ = [
|
|
|
191
192
|
"ModelContext",
|
|
192
193
|
"Runtime",
|
|
193
194
|
"RuntimeConfig",
|
|
195
|
+
"RuntimeInfo",
|
|
194
196
|
"ProgramResult",
|
|
195
197
|
"SubprocessConfig",
|
|
196
198
|
"DockerConfig",
|
|
@@ -149,6 +149,9 @@ class Rollout:
|
|
|
149
149
|
self.runtime_config, name=trace.id
|
|
150
150
|
) # ref set first → always tearable-down; named after the rollout for traceability
|
|
151
151
|
runtime = self.runtime
|
|
152
|
+
# The live info object, shared by reference: the trace carries the full runtime config
|
|
153
|
+
# from the start, and the resource `id` lands on it the moment start() provisions.
|
|
154
|
+
trace.runtime = runtime.info
|
|
152
155
|
ctx = self.ctx
|
|
153
156
|
stops = discover_decorated(self.taskset, "stop")
|
|
154
157
|
logger.info(
|
|
@@ -13,22 +13,35 @@ from pydantic import Field
|
|
|
13
13
|
|
|
14
14
|
from verifiers.v1.runtimes.base import (
|
|
15
15
|
HOST,
|
|
16
|
+
BaseRuntimeInfo,
|
|
16
17
|
ProgramResult,
|
|
17
18
|
Runtime,
|
|
18
19
|
host_endpoint,
|
|
19
20
|
reachable_url,
|
|
20
21
|
register,
|
|
21
22
|
)
|
|
22
|
-
from verifiers.v1.runtimes.docker import DockerConfig, DockerRuntime
|
|
23
|
-
from verifiers.v1.runtimes.modal import ModalConfig, ModalRuntime
|
|
24
|
-
from verifiers.v1.runtimes.prime import PrimeConfig, PrimeRuntime
|
|
25
|
-
from verifiers.v1.runtimes.subprocess import
|
|
23
|
+
from verifiers.v1.runtimes.docker import DockerConfig, DockerRuntime, DockerRuntimeInfo
|
|
24
|
+
from verifiers.v1.runtimes.modal import ModalConfig, ModalRuntime, ModalRuntimeInfo
|
|
25
|
+
from verifiers.v1.runtimes.prime import PrimeConfig, PrimeRuntime, PrimeRuntimeInfo
|
|
26
|
+
from verifiers.v1.runtimes.subprocess import (
|
|
27
|
+
SubprocessConfig,
|
|
28
|
+
SubprocessRuntime,
|
|
29
|
+
SubprocessRuntimeInfo,
|
|
30
|
+
)
|
|
26
31
|
|
|
27
32
|
RuntimeConfig = Annotated[
|
|
28
33
|
SubprocessConfig | DockerConfig | PrimeConfig | ModalConfig,
|
|
29
34
|
Field(discriminator="type"),
|
|
30
35
|
]
|
|
31
36
|
|
|
37
|
+
RuntimeInfo = Annotated[
|
|
38
|
+
SubprocessRuntimeInfo | DockerRuntimeInfo | PrimeRuntimeInfo | ModalRuntimeInfo,
|
|
39
|
+
Field(discriminator="type"),
|
|
40
|
+
]
|
|
41
|
+
"""What a rollout's runtime looked like, as trace data: each runtime's info type is its full
|
|
42
|
+
config plus the provisioned resource's `id` (see `BaseRuntimeInfo`). The discriminated union
|
|
43
|
+
is `Trace.runtime`'s type, so a dumped trace round-trips to the exact info class."""
|
|
44
|
+
|
|
32
45
|
|
|
33
46
|
def _runtime_cls(config: RuntimeConfig) -> type[Runtime]:
|
|
34
47
|
if isinstance(config, PrimeConfig):
|
|
@@ -58,6 +71,8 @@ __all__ = [
|
|
|
58
71
|
"ProgramResult",
|
|
59
72
|
"Runtime",
|
|
60
73
|
"RuntimeConfig",
|
|
74
|
+
"RuntimeInfo",
|
|
75
|
+
"BaseRuntimeInfo",
|
|
61
76
|
"make_runtime",
|
|
62
77
|
"runtime_is_local",
|
|
63
78
|
"host_endpoint",
|
|
@@ -65,10 +80,14 @@ __all__ = [
|
|
|
65
80
|
"HOST",
|
|
66
81
|
"SubprocessConfig",
|
|
67
82
|
"SubprocessRuntime",
|
|
83
|
+
"SubprocessRuntimeInfo",
|
|
68
84
|
"DockerConfig",
|
|
69
85
|
"DockerRuntime",
|
|
86
|
+
"DockerRuntimeInfo",
|
|
70
87
|
"PrimeConfig",
|
|
71
88
|
"PrimeRuntime",
|
|
89
|
+
"PrimeRuntimeInfo",
|
|
72
90
|
"ModalConfig",
|
|
73
91
|
"ModalRuntime",
|
|
92
|
+
"ModalRuntimeInfo",
|
|
74
93
|
]
|
|
@@ -19,6 +19,8 @@ from dataclasses import dataclass
|
|
|
19
19
|
from pathlib import PurePosixPath
|
|
20
20
|
from typing import ClassVar, TypeVar
|
|
21
21
|
|
|
22
|
+
from pydantic_config import BaseConfig
|
|
23
|
+
|
|
22
24
|
from verifiers.v1.retries import retrying
|
|
23
25
|
from verifiers.v1.utils.aio import run_shielded
|
|
24
26
|
|
|
@@ -106,6 +108,19 @@ def cleanup_at_exit() -> None:
|
|
|
106
108
|
runtime.cleanup()
|
|
107
109
|
|
|
108
110
|
|
|
111
|
+
class BaseRuntimeInfo(BaseConfig):
|
|
112
|
+
"""Runtime metadata persisted with the rollout (`Trace.runtime`): each runtime's info class
|
|
113
|
+
inherits its full config — every knob the runtime ran with — and adds the provisioned
|
|
114
|
+
resource's `id`. Built with the runtime and shared by reference with the trace, so fields
|
|
115
|
+
land there the moment they're known: the config at creation, `id` once `start()` has
|
|
116
|
+
provisioned the resource. `RuntimeInfo` (the discriminated union over the concrete info
|
|
117
|
+
types) is what a dumped trace round-trips through."""
|
|
118
|
+
|
|
119
|
+
id: str | None = None
|
|
120
|
+
"""The provisioned resource's identifier (None until the runtime is up): the subprocess
|
|
121
|
+
workdir, the docker container id, the prime/modal sandbox id."""
|
|
122
|
+
|
|
123
|
+
|
|
109
124
|
class Runtime(ABC):
|
|
110
125
|
is_local: ClassVar[bool] = True
|
|
111
126
|
"""Whether this runtime shares the host network — a program inside it reaches a host service
|
|
@@ -113,6 +128,11 @@ class Runtime(ABC):
|
|
|
113
128
|
subprocess / docker(--network host); remote runtimes (modal/prime) override to False (they
|
|
114
129
|
need a tunnel each way: `host_endpoint` inward, `expose` outward)."""
|
|
115
130
|
|
|
131
|
+
info: BaseRuntimeInfo
|
|
132
|
+
"""This runtime's trace-facing metadata (see `BaseRuntimeInfo`): the full config plus the
|
|
133
|
+
resolved resource `id`. Each runtime constructs its own info type in `__init__` and fills
|
|
134
|
+
`id` in `start()`."""
|
|
135
|
+
|
|
116
136
|
def __init__(self, name: str | None = None) -> None:
|
|
117
137
|
self.name = name or f"vf-{uuid.uuid4().hex[:12]}"
|
|
118
138
|
"""Resource name — the subprocess workdir, docker `--name`, prime sandbox name.
|
|
@@ -131,9 +151,9 @@ class Runtime(ABC):
|
|
|
131
151
|
|
|
132
152
|
@property
|
|
133
153
|
def descriptor(self) -> str | None:
|
|
134
|
-
"""A short resolved id for display (None until provisioned).
|
|
135
|
-
|
|
136
|
-
return
|
|
154
|
+
"""A short resolved id for display (None until provisioned): the runtime's `info.id` —
|
|
155
|
+
subprocess workdir, docker container id, prime/modal sandbox id."""
|
|
156
|
+
return self.info.id
|
|
137
157
|
|
|
138
158
|
# --- lifecycle ---
|
|
139
159
|
|
|
@@ -15,7 +15,12 @@ from typing import Literal
|
|
|
15
15
|
from pydantic_config import BaseConfig
|
|
16
16
|
|
|
17
17
|
from verifiers.v1.errors import SandboxError
|
|
18
|
-
from verifiers.v1.runtimes.base import
|
|
18
|
+
from verifiers.v1.runtimes.base import (
|
|
19
|
+
BaseRuntimeInfo,
|
|
20
|
+
ProgramResult,
|
|
21
|
+
Runtime,
|
|
22
|
+
parse_gpu,
|
|
23
|
+
)
|
|
19
24
|
|
|
20
25
|
logger = logging.getLogger(__name__)
|
|
21
26
|
|
|
@@ -37,6 +42,10 @@ class DockerConfig(BaseConfig):
|
|
|
37
42
|
this is accepted (so a task can declare it without a warning) but not enforced."""
|
|
38
43
|
|
|
39
44
|
|
|
45
|
+
class DockerRuntimeInfo(DockerConfig, BaseRuntimeInfo):
|
|
46
|
+
"""`DockerConfig` + the resolved `id` — docker's short container id."""
|
|
47
|
+
|
|
48
|
+
|
|
40
49
|
async def docker(*args: str) -> ProgramResult:
|
|
41
50
|
"""Run a `docker` CLI command, capturing its result."""
|
|
42
51
|
proc = await asyncio.create_subprocess_exec(
|
|
@@ -59,14 +68,10 @@ class DockerRuntime(Runtime):
|
|
|
59
68
|
def __init__(self, config: DockerConfig, name: str | None = None) -> None:
|
|
60
69
|
super().__init__(name)
|
|
61
70
|
self.config = config
|
|
71
|
+
self.info = DockerRuntimeInfo(**config.model_dump())
|
|
62
72
|
self._container: str | None = None # our `--name` (used for exec/rm)
|
|
63
|
-
self._container_id: str | None = None # docker's short id (for display)
|
|
64
73
|
self._stopped = False
|
|
65
74
|
|
|
66
|
-
@property
|
|
67
|
-
def descriptor(self) -> str | None:
|
|
68
|
-
return self._container_id
|
|
69
|
-
|
|
70
75
|
async def start(self) -> None:
|
|
71
76
|
try:
|
|
72
77
|
version = await docker("version", "--format", "{{.Server.Version}}")
|
|
@@ -111,7 +116,7 @@ class DockerRuntime(Runtime):
|
|
|
111
116
|
)
|
|
112
117
|
if run.exit_code != 0:
|
|
113
118
|
raise SandboxError(f"docker run failed: {run.stderr.strip()}")
|
|
114
|
-
self.
|
|
119
|
+
self.info.id = run.stdout.strip()[
|
|
115
120
|
:12
|
|
116
121
|
] # `docker run -d` prints the container id
|
|
117
122
|
logger.info(
|
|
@@ -17,7 +17,12 @@ from typing import ClassVar, Literal
|
|
|
17
17
|
from pydantic_config import BaseConfig
|
|
18
18
|
|
|
19
19
|
from verifiers.v1.errors import SandboxError
|
|
20
|
-
from verifiers.v1.runtimes.base import
|
|
20
|
+
from verifiers.v1.runtimes.base import (
|
|
21
|
+
SERVICE_PORT,
|
|
22
|
+
BaseRuntimeInfo,
|
|
23
|
+
ProgramResult,
|
|
24
|
+
Runtime,
|
|
25
|
+
)
|
|
21
26
|
from verifiers.v1.runtimes.limiters import creation_limiter
|
|
22
27
|
|
|
23
28
|
logger = logging.getLogger(__name__)
|
|
@@ -50,6 +55,10 @@ class ModalConfig(BaseConfig):
|
|
|
50
55
|
env-server worker process (None/<= 0 disables it)."""
|
|
51
56
|
|
|
52
57
|
|
|
58
|
+
class ModalRuntimeInfo(ModalConfig, BaseRuntimeInfo):
|
|
59
|
+
"""`ModalConfig` + the resolved `id` — the modal sandbox object id."""
|
|
60
|
+
|
|
61
|
+
|
|
53
62
|
class ModalRuntime(Runtime):
|
|
54
63
|
"""Runs the program in a Modal sandbox; the server is reached via a tunnel."""
|
|
55
64
|
|
|
@@ -58,12 +67,8 @@ class ModalRuntime(Runtime):
|
|
|
58
67
|
def __init__(self, config: ModalConfig, name: str | None = None) -> None:
|
|
59
68
|
super().__init__(name)
|
|
60
69
|
self.config = config
|
|
70
|
+
self.info = ModalRuntimeInfo(**config.model_dump())
|
|
61
71
|
self._sandbox = None
|
|
62
|
-
self._sandbox_id: str | None = None
|
|
63
|
-
|
|
64
|
-
@property
|
|
65
|
-
def descriptor(self) -> str | None:
|
|
66
|
-
return self._sandbox_id
|
|
67
72
|
|
|
68
73
|
@property
|
|
69
74
|
def published_port(self) -> int | None:
|
|
@@ -101,9 +106,9 @@ class ModalRuntime(Runtime):
|
|
|
101
106
|
timeout=24 * 60 * 60, # Maximum lifetime of any sandbox.
|
|
102
107
|
encrypted_ports=[SERVICE_PORT],
|
|
103
108
|
)
|
|
104
|
-
self.
|
|
109
|
+
self.info.id = self._sandbox.object_id
|
|
105
110
|
logger.info(
|
|
106
|
-
"modal: sandbox %s up (image=%s)", self.
|
|
111
|
+
"modal: sandbox %s up (image=%s)", self.info.id, self.config.image
|
|
107
112
|
)
|
|
108
113
|
await self._sandbox.filesystem.make_directory.aio(self.config.workdir)
|
|
109
114
|
except (
|
|
@@ -185,7 +190,7 @@ class ModalRuntime(Runtime):
|
|
|
185
190
|
# the sandbox via Modal's sync API so the costly resource isn't left to its max-lifetime.
|
|
186
191
|
# Idempotent — the async `stop` handles the normal path, and a second terminate is a no-op.
|
|
187
192
|
sandbox, self._sandbox = self._sandbox, None
|
|
188
|
-
if sandbox is not None: # `
|
|
193
|
+
if sandbox is not None: # `info.id` kept so descriptor survives teardown
|
|
189
194
|
with contextlib.suppress(Exception):
|
|
190
195
|
sandbox.terminate()
|
|
191
196
|
|
|
@@ -202,7 +207,5 @@ class ModalRuntime(Runtime):
|
|
|
202
207
|
try:
|
|
203
208
|
await sandbox.terminate.aio()
|
|
204
209
|
except Exception as e:
|
|
205
|
-
logger.warning(
|
|
206
|
-
"modal: failed to terminate sandbox %s: %s", self._sandbox_id, e
|
|
207
|
-
)
|
|
210
|
+
logger.warning("modal: failed to terminate sandbox %s: %s", self.info.id, e)
|
|
208
211
|
self._sandbox = None
|
|
@@ -19,7 +19,13 @@ from pydantic import model_validator
|
|
|
19
19
|
from pydantic_config import BaseConfig
|
|
20
20
|
|
|
21
21
|
from verifiers.v1.errors import SandboxError
|
|
22
|
-
from verifiers.v1.runtimes.base import
|
|
22
|
+
from verifiers.v1.runtimes.base import (
|
|
23
|
+
SERVICE_PORT,
|
|
24
|
+
BaseRuntimeInfo,
|
|
25
|
+
ProgramResult,
|
|
26
|
+
Runtime,
|
|
27
|
+
parse_gpu,
|
|
28
|
+
)
|
|
23
29
|
from verifiers.v1.runtimes.limiters import creation_limiter
|
|
24
30
|
|
|
25
31
|
logger = logging.getLogger(__name__)
|
|
@@ -69,6 +75,10 @@ class PrimeConfig(BaseConfig):
|
|
|
69
75
|
return self
|
|
70
76
|
|
|
71
77
|
|
|
78
|
+
class PrimeRuntimeInfo(PrimeConfig, BaseRuntimeInfo):
|
|
79
|
+
"""`PrimeConfig` + the resolved `id` — the prime sandbox id."""
|
|
80
|
+
|
|
81
|
+
|
|
72
82
|
class PrimeRuntime(Runtime):
|
|
73
83
|
"""Runs the program in a Prime sandbox; the server is reached via a tunnel."""
|
|
74
84
|
|
|
@@ -77,12 +87,8 @@ class PrimeRuntime(Runtime):
|
|
|
77
87
|
def __init__(self, config: PrimeConfig, name: str | None = None) -> None:
|
|
78
88
|
super().__init__(name)
|
|
79
89
|
self.config = config
|
|
90
|
+
self.info = PrimeRuntimeInfo(**config.model_dump())
|
|
80
91
|
self._client = None
|
|
81
|
-
self._sandbox_id: str | None = None
|
|
82
|
-
|
|
83
|
-
@property
|
|
84
|
-
def descriptor(self) -> str | None:
|
|
85
|
-
return self._sandbox_id
|
|
86
92
|
|
|
87
93
|
@property
|
|
88
94
|
def published_port(self) -> int | None:
|
|
@@ -96,10 +102,11 @@ class PrimeRuntime(Runtime):
|
|
|
96
102
|
# GB). gpu_type/region are only sent when set (else provider-chosen).
|
|
97
103
|
gpu_type, gpu_count = parse_gpu(self.config.gpu)
|
|
98
104
|
# prime's idle timeout is in whole minutes; convert from the seconds config surface
|
|
99
|
-
# (floored to the SDK's 1-minute minimum).
|
|
105
|
+
# (floored to the SDK's 1-minute minimum). VM sandboxes don't support an idle timeout
|
|
106
|
+
# (the API 422s on it), so it's dropped there rather than failing every VM rollout.
|
|
100
107
|
idle_minutes = (
|
|
101
108
|
max(1, math.ceil(self.config.idle_timeout / 60))
|
|
102
|
-
if self.config.idle_timeout is not None
|
|
109
|
+
if self.config.idle_timeout is not None and not self.config.vm
|
|
103
110
|
else None
|
|
104
111
|
)
|
|
105
112
|
options = {
|
|
@@ -130,13 +137,13 @@ class PrimeRuntime(Runtime):
|
|
|
130
137
|
**{k: v for k, v in options.items() if v is not None},
|
|
131
138
|
)
|
|
132
139
|
)
|
|
133
|
-
self.
|
|
134
|
-
await self._client.wait_for_creation(self.
|
|
140
|
+
self.info.id = sandbox.id
|
|
141
|
+
await self._client.wait_for_creation(self.info.id)
|
|
135
142
|
logger.info(
|
|
136
|
-
"prime: sandbox %s up (image=%s)", self.
|
|
143
|
+
"prime: sandbox %s up (image=%s)", self.info.id, self.config.image
|
|
137
144
|
)
|
|
138
145
|
await self._client.run_background_job(
|
|
139
|
-
self.
|
|
146
|
+
self.info.id, f"mkdir -p {shlex.quote(self.config.workdir)}"
|
|
140
147
|
)
|
|
141
148
|
except (
|
|
142
149
|
Exception
|
|
@@ -148,14 +155,14 @@ class PrimeRuntime(Runtime):
|
|
|
148
155
|
# Poll directly so the rollout stage owns the execution timeout; the SDK helper
|
|
149
156
|
# otherwise imposes its own 15-minute limit.
|
|
150
157
|
job = await self._client.start_background_job(
|
|
151
|
-
self.
|
|
158
|
+
self.info.id,
|
|
152
159
|
shlex.join(argv),
|
|
153
160
|
working_dir=self.config.workdir,
|
|
154
161
|
env=env,
|
|
155
162
|
)
|
|
156
163
|
delay = 0.1
|
|
157
164
|
while True:
|
|
158
|
-
result = await self._client.get_background_job(self.
|
|
165
|
+
result = await self._client.get_background_job(self.info.id, job)
|
|
159
166
|
if result.completed:
|
|
160
167
|
break
|
|
161
168
|
await asyncio.sleep(delay)
|
|
@@ -177,7 +184,7 @@ class PrimeRuntime(Runtime):
|
|
|
177
184
|
# backend default, which lands in us-central) 400 it; `us` supports it. TODO: re-enable the
|
|
178
185
|
# prime cases in the e2e `skip_if_unexposable` guard once prime exposes ports in any region.
|
|
179
186
|
try:
|
|
180
|
-
exposed = await self._client.expose(self.
|
|
187
|
+
exposed = await self._client.expose(self.info.id, port)
|
|
181
188
|
except Exception as e: # surface prime's exposure constraints actionably
|
|
182
189
|
raise SandboxError(
|
|
183
190
|
"prime port exposure failed — port exposure isn't supported in this sandbox's "
|
|
@@ -210,9 +217,7 @@ class PrimeRuntime(Runtime):
|
|
|
210
217
|
try:
|
|
211
218
|
with tempfile.TemporaryDirectory() as directory:
|
|
212
219
|
download = Path(directory) / "download"
|
|
213
|
-
await self._client.download_file(
|
|
214
|
-
self._sandbox_id, target, str(download)
|
|
215
|
-
)
|
|
220
|
+
await self._client.download_file(self.info.id, target, str(download))
|
|
216
221
|
return await asyncio.to_thread(download.read_bytes)
|
|
217
222
|
except Exception as e:
|
|
218
223
|
raise SandboxError(f"read {path!r}: {e}") from e
|
|
@@ -234,7 +239,7 @@ class PrimeRuntime(Runtime):
|
|
|
234
239
|
)
|
|
235
240
|
try:
|
|
236
241
|
await self._client.upload_bytes(
|
|
237
|
-
self.
|
|
242
|
+
self.info.id, target, data, filename=PurePosixPath(target).name
|
|
238
243
|
)
|
|
239
244
|
except Exception as e:
|
|
240
245
|
raise SandboxError(f"write {path!r}: {e}") from e
|
|
@@ -243,12 +248,12 @@ class PrimeRuntime(Runtime):
|
|
|
243
248
|
# Synchronous atexit backstop (the async client can't run once the loop is gone): delete
|
|
244
249
|
# the sandbox via the sync client, so the costly resource isn't left to its max-lifetime.
|
|
245
250
|
# Idempotent — the async `stop` deletes it on the normal path, a second delete 404s.
|
|
246
|
-
if self.
|
|
251
|
+
if self.info.id is not None:
|
|
247
252
|
from prime_sandboxes import SandboxClient
|
|
248
253
|
from prime_sandboxes.core import APIClient
|
|
249
254
|
|
|
250
255
|
with contextlib.suppress(Exception):
|
|
251
|
-
SandboxClient(APIClient()).delete(self.
|
|
256
|
+
SandboxClient(APIClient()).delete(self.info.id)
|
|
252
257
|
|
|
253
258
|
async def teardown(self) -> None:
|
|
254
259
|
# Best-effort, idempotent teardown: delete the sandbox (the costly resource). Runs via
|
|
@@ -257,13 +262,13 @@ class PrimeRuntime(Runtime):
|
|
|
257
262
|
if client is None:
|
|
258
263
|
return
|
|
259
264
|
if (
|
|
260
|
-
self.
|
|
265
|
+
self.info.id is not None
|
|
261
266
|
): # kept (not nulled) so descriptor survives teardown
|
|
262
267
|
try:
|
|
263
|
-
await client.delete(self.
|
|
268
|
+
await client.delete(self.info.id)
|
|
264
269
|
except Exception as e:
|
|
265
270
|
logger.warning(
|
|
266
|
-
"prime: failed to delete sandbox %s: %s", self.
|
|
271
|
+
"prime: failed to delete sandbox %s: %s", self.info.id, e
|
|
267
272
|
)
|
|
268
273
|
with contextlib.suppress(Exception):
|
|
269
274
|
await client.aclose()
|
|
@@ -15,7 +15,7 @@ from typing import Literal
|
|
|
15
15
|
|
|
16
16
|
from pydantic_config import BaseConfig
|
|
17
17
|
|
|
18
|
-
from verifiers.v1.runtimes.base import ProgramResult, Runtime
|
|
18
|
+
from verifiers.v1.runtimes.base import BaseRuntimeInfo, ProgramResult, Runtime
|
|
19
19
|
|
|
20
20
|
# A local subprocess inherits the host environment EXCEPT any var whose name
|
|
21
21
|
# contains "API_KEY" — so it can never reach a real provider with the host's API
|
|
@@ -33,6 +33,10 @@ class SubprocessConfig(BaseConfig):
|
|
|
33
33
|
type: Literal["subprocess"] = "subprocess"
|
|
34
34
|
|
|
35
35
|
|
|
36
|
+
class SubprocessRuntimeInfo(SubprocessConfig, BaseRuntimeInfo):
|
|
37
|
+
"""`SubprocessConfig` + the resolved `id` — the `/tmp/<name>` workspace path."""
|
|
38
|
+
|
|
39
|
+
|
|
36
40
|
class SubprocessRuntime(Runtime):
|
|
37
41
|
"""Runs the program as a local subprocess in a unique /tmp workspace."""
|
|
38
42
|
|
|
@@ -45,16 +49,14 @@ class SubprocessRuntime(Runtime):
|
|
|
45
49
|
self._uv_interpreters = self._interpreters
|
|
46
50
|
self._uv_script_locks = self._locks
|
|
47
51
|
self.config = config
|
|
52
|
+
self.info = SubprocessRuntimeInfo(**config.model_dump())
|
|
48
53
|
self.workdir: Path | None = None
|
|
49
54
|
self._background: list[asyncio.subprocess.Process] = []
|
|
50
55
|
|
|
51
|
-
@property
|
|
52
|
-
def descriptor(self) -> str | None:
|
|
53
|
-
return self.workdir.name if self.workdir else None
|
|
54
|
-
|
|
55
56
|
async def start(self) -> None:
|
|
56
57
|
self.workdir = Path("/tmp") / self.name
|
|
57
58
|
self.workdir.mkdir()
|
|
59
|
+
self.info.id = str(self.workdir)
|
|
58
60
|
|
|
59
61
|
async def run(self, argv: list[str], env: dict[str, str]) -> ProgramResult:
|
|
60
62
|
full_env = {k: v for k, v in os.environ.items() if "API_KEY" not in k.upper()}
|
|
@@ -25,6 +25,7 @@ if TYPE_CHECKING:
|
|
|
25
25
|
from verifiers.v1 import graph
|
|
26
26
|
from verifiers.v1.errors import ProviderError
|
|
27
27
|
from verifiers.v1.graph import MessageNode
|
|
28
|
+
from verifiers.v1.runtimes import RuntimeInfo
|
|
28
29
|
from verifiers.v1.state import State, StateT
|
|
29
30
|
from verifiers.v1.task import TaskT, WireTask
|
|
30
31
|
from verifiers.v1.types import (
|
|
@@ -220,6 +221,12 @@ class Trace(StrictBaseModel, Generic[TaskT, StateT]):
|
|
|
220
221
|
"""Unique id for this rollout, auto-generated per trace."""
|
|
221
222
|
task: TaskT
|
|
222
223
|
"""The (immutable) task being solved — fully typed, flows into scoring."""
|
|
224
|
+
runtime: RuntimeInfo | None = None
|
|
225
|
+
"""Where the rollout ran: the runtime's full config plus the provisioned resource's `id`
|
|
226
|
+
(subprocess workdir / docker container id / prime or modal sandbox id). The rollout assigns
|
|
227
|
+
the live runtime's `info` object the moment it makes the runtime, so the config is recorded
|
|
228
|
+
from the start and `id` appears as soon as the runtime is up. None only for traces created
|
|
229
|
+
outside a rollout."""
|
|
223
230
|
nodes: list[MessageNode] = Field(default_factory=list)
|
|
224
231
|
"""The message graph — one node per distinct message, linked to its predecessor (see
|
|
225
232
|
`graph`). The ground truth; `branches` is a view over it. Stores each message once, so
|
|
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
|