verifiers 0.1.15.dev386__tar.gz → 0.1.15.dev388__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.dev386 → verifiers-0.1.15.dev388}/PKG-INFO +1 -1
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/README.md +2 -3
- verifiers-0.1.15.dev388/verifiers/v1/harnesses/bash_edit/__init__.py +10 -0
- verifiers-0.1.15.dev388/verifiers/v1/harnesses/bash_edit/harness.py +84 -0
- verifiers-0.1.15.dev388/verifiers/v1/harnesses/bash_edit/program.py +250 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/tasksets/harbor/taskset.py +133 -32
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/.gitignore +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/LICENSE +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/README.md +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/pyproject.toml +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/AGENTS.md +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/README.md +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/conftest.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_browser_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_build_script.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_client_config.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_composable_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_env_group.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_env_server.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_environment.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_environment_extra.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_envs.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_error_chain.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_eval_display.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_eval_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_gym_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_imports.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_init_script.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_install_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_interception_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_lean_task.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_logging.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_math_rubric.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_message_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_openenv_client.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_parser.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_path_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_renderer_client.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_rubric.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_rubric_group.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_save_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_setup_script.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_think_parser.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_tool_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_tool_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_types.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_wordle_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_xml_parser.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/conftest.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/test_configs.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/test_envs.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/test_graph.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/test_trace.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/AGENTS.md +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/tui.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/clients/client.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/decorators.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/environment.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/lean/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/lean/lean_task.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/errors.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/gepa/config.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/gepa/display.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rl/README.md +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rl/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rl/inference/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rl/inference/client.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rl/inference/server.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rl/trainer/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rl/trainer/config.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rl/trainer/orchestrator.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rl/trainer/trainer.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rl/trainer/utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/build.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/init.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/install.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/rl.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/train.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/vllm.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/serve/types.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/types.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/ARCHITECTURE.md +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/GUIDE.md +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/env.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/episode.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/errors.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/graph.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harness.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/bash/program.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/default/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/default/harness.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/default/program.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/mcp/multiplex.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/retries.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/runtimes/docker.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/state.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/task.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/trace.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/types.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/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.dev388
|
|
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
|
|
@@ -228,9 +228,8 @@ uv run eval gsm8k-v1 -n 1 --retries.rollout.max-retries 3 --retries.rollout.incl
|
|
|
228
228
|
|
|
229
229
|
Some tasksets wrap a whole benchmark family rather than a single task — shipped, installed by
|
|
230
230
|
default. For example, `textarena` (TextArena games) and `harbor` (the agentic-
|
|
231
|
-
benchmark registry). Harbor is the showcase: it pulls tasks straight from the Harbor registry
|
|
232
|
-
|
|
233
|
-
image — e.g. Terminal-Bench 2:
|
|
231
|
+
benchmark registry). Harbor is the showcase: it pulls tasks straight from the Harbor registry,
|
|
232
|
+
each in its own declared, pullable container image — e.g. Terminal-Bench 2:
|
|
234
233
|
|
|
235
234
|
```bash
|
|
236
235
|
uv run eval harbor --taskset.dataset terminal-bench/terminal-bench-2 -n 10 --harness.id rlm
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"""bash_edit — v1's built-in agentic harness: the `bash` chat loop plus a local `edit` tool
|
|
2
|
+
(single-occurrence string replacement, ported from rlm). Its `harness.py` (class + config) and
|
|
3
|
+
the `program.py` script staged into the runtime. Resolved by id via `load_harness`."""
|
|
4
|
+
|
|
5
|
+
from verifiers.v1.harnesses.bash_edit.harness import (
|
|
6
|
+
BashEditHarness,
|
|
7
|
+
BashEditHarnessConfig,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
__all__ = ["BashEditHarness", "BashEditHarnessConfig"]
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""The built-in bash_edit harness: the `bash` chat loop plus a local `edit` tool.
|
|
2
|
+
|
|
3
|
+
Same growing-message-list chat loop as the `bash` harness — a local `bash` tool that runs shell
|
|
4
|
+
commands in the runtime, plus the taskset's MCP tools — with one extra local tool: `edit`, a
|
|
5
|
+
single-occurrence string replacement in a file (ported from the rlm `edit` skill). For agentic
|
|
6
|
+
tasks where targeted file edits are common and a model handles `edit` more reliably than
|
|
7
|
+
hand-built `sed`/heredoc shell. Its uv script (deps: openai, mcp) is prepared during setup, then
|
|
8
|
+
launched as the harness program.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import json
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
from verifiers.v1.harness import Harness, HarnessConfig
|
|
15
|
+
from verifiers.v1.clients import RolloutContext
|
|
16
|
+
from verifiers.v1.dialects.chat import message_to_wire
|
|
17
|
+
from verifiers.v1.runtimes import ProgramResult, Runtime
|
|
18
|
+
from verifiers.v1.trace import Trace
|
|
19
|
+
|
|
20
|
+
PROGRAM_SOURCE = (Path(__file__).resolve().parent / "program.py").read_text()
|
|
21
|
+
|
|
22
|
+
# Frames the model as a coding agent and names its local tools (a pure-text chat loop gets no
|
|
23
|
+
# harness-injected prompt).
|
|
24
|
+
BASH_EDIT_SYSTEM_PROMPT = (
|
|
25
|
+
"You are a coding agent. You have access to a bash tool for running shell commands and "
|
|
26
|
+
"an edit tool for single-occurrence string replacement in a file."
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class BashEditHarnessConfig(HarnessConfig):
|
|
31
|
+
"""The built-in bash_edit harness. A uv script (deps: openai, mcp), so it runs in any runtime
|
|
32
|
+
that has `uv` (the harness bootstraps it) with no other setup."""
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class BashEditHarness(Harness[BashEditHarnessConfig]):
|
|
36
|
+
APPENDS_SYSTEM_PROMPT = True
|
|
37
|
+
SUPPORTS_USER_SIM = True
|
|
38
|
+
SUPPORTS_MESSAGE_PROMPT = True
|
|
39
|
+
|
|
40
|
+
async def setup(self, runtime: Runtime) -> None:
|
|
41
|
+
await runtime.prepare_uv_script(PROGRAM_SOURCE, self.config.env)
|
|
42
|
+
|
|
43
|
+
async def launch(
|
|
44
|
+
self,
|
|
45
|
+
ctx: RolloutContext,
|
|
46
|
+
trace: Trace,
|
|
47
|
+
runtime: Runtime,
|
|
48
|
+
endpoint: str,
|
|
49
|
+
secret: str,
|
|
50
|
+
mcp_urls: dict[str, str],
|
|
51
|
+
) -> ProgramResult:
|
|
52
|
+
system_prompt, prompt = self.resolve_prompt(trace.task)
|
|
53
|
+
system_prompt = "\n\n".join(
|
|
54
|
+
p for p in (BASH_EDIT_SYSTEM_PROMPT, system_prompt) if p
|
|
55
|
+
)
|
|
56
|
+
env = {**self.config.env}
|
|
57
|
+
args = [
|
|
58
|
+
f"--base-url={endpoint}",
|
|
59
|
+
f"--api-key={secret}",
|
|
60
|
+
f"--model={ctx.model}",
|
|
61
|
+
f"--system-prompt={system_prompt}",
|
|
62
|
+
]
|
|
63
|
+
if mcp_urls:
|
|
64
|
+
# The program connects to the tool servers over HTTP; hand it a standard
|
|
65
|
+
# `mcpServers` URL config (the `mcp` client itself comes from the uv deps).
|
|
66
|
+
args.append(
|
|
67
|
+
"--mcp-config="
|
|
68
|
+
+ json.dumps(
|
|
69
|
+
{
|
|
70
|
+
"mcpServers": {
|
|
71
|
+
name: {"url": url} for name, url in mcp_urls.items()
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
)
|
|
75
|
+
)
|
|
76
|
+
# A Messages prompt (e.g. an image-bearing prompt) seeds the chat loop directly via env
|
|
77
|
+
# (it can be large multimodal content that overflows argv); a plain string is the single
|
|
78
|
+
# first user message; None means the task has no prompt and the user simulator opens it.
|
|
79
|
+
if isinstance(prompt, str):
|
|
80
|
+
args.append(f"--prompt={prompt}")
|
|
81
|
+
elif prompt is not None:
|
|
82
|
+
env["INITIAL_MESSAGES"] = json.dumps([message_to_wire(m) for m in prompt])
|
|
83
|
+
program = await runtime.prepare_uv_script(PROGRAM_SOURCE, self.config.env)
|
|
84
|
+
return await runtime.run_program([*program, *args], env)
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
# /// script
|
|
2
|
+
# requires-python = ">=3.10"
|
|
3
|
+
# dependencies = ["openai", "mcp"]
|
|
4
|
+
# ///
|
|
5
|
+
"""The bash_edit harness's program: a chat loop with local `bash` + `edit` tools (+ optional MCP).
|
|
6
|
+
|
|
7
|
+
A growing-message-list chat loop. It always offers a local `bash` tool that runs shell commands in
|
|
8
|
+
the runtime and a local `edit` tool that replaces a unique string in a file; when the harness sets
|
|
9
|
+
MCP_CONFIG (a standard `mcpServers` URL map) it also connects to those servers over streamable
|
|
10
|
+
HTTP, exposes their tools to the model as `<server>_<tool>`, and routes those calls to the server.
|
|
11
|
+
The loop runs until the model answers without a tool call.
|
|
12
|
+
|
|
13
|
+
It runs as a uv script (deps: openai, mcp), so the chat + tool plumbing is just the SDKs — the
|
|
14
|
+
harness bootstraps `uv` in the runtime. The interception endpoint, per-rollout secret, and model
|
|
15
|
+
arrive as argv (not env), so the local tools' subprocesses never inherit them.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
import argparse
|
|
19
|
+
import asyncio
|
|
20
|
+
import json
|
|
21
|
+
import os
|
|
22
|
+
import subprocess
|
|
23
|
+
from contextlib import AsyncExitStack
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
|
|
26
|
+
from openai import AsyncOpenAI
|
|
27
|
+
|
|
28
|
+
BASH_TOOL = {
|
|
29
|
+
"type": "function",
|
|
30
|
+
"function": {
|
|
31
|
+
"name": "bash",
|
|
32
|
+
"description": "Run a bash command and return its combined stdout and stderr.",
|
|
33
|
+
"parameters": {
|
|
34
|
+
"type": "object",
|
|
35
|
+
"properties": {
|
|
36
|
+
"command": {"type": "string", "description": "The bash command to run."}
|
|
37
|
+
},
|
|
38
|
+
"required": ["command"],
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
EDIT_TOOL = {
|
|
44
|
+
"type": "function",
|
|
45
|
+
"function": {
|
|
46
|
+
"name": "edit",
|
|
47
|
+
"description": (
|
|
48
|
+
"Replace a unique string in a file. old_str must appear exactly once in the file."
|
|
49
|
+
),
|
|
50
|
+
"parameters": {
|
|
51
|
+
"type": "object",
|
|
52
|
+
"properties": {
|
|
53
|
+
"path": {
|
|
54
|
+
"type": "string",
|
|
55
|
+
"description": "File path (relative to cwd or absolute).",
|
|
56
|
+
},
|
|
57
|
+
"old_str": {
|
|
58
|
+
"type": "string",
|
|
59
|
+
"description": "Exact string to find (must appear exactly once).",
|
|
60
|
+
},
|
|
61
|
+
"new_str": {"type": "string", "description": "Replacement string."},
|
|
62
|
+
},
|
|
63
|
+
"required": ["path", "old_str", "new_str"],
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def run_bash(command: str) -> str:
|
|
70
|
+
try:
|
|
71
|
+
result = subprocess.run(
|
|
72
|
+
["bash", "-c", command], capture_output=True, text=True, timeout=3600
|
|
73
|
+
)
|
|
74
|
+
return result.stdout + result.stderr
|
|
75
|
+
except Exception as e:
|
|
76
|
+
return f"error: {e}"
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def run_edit(path: str, old_str: str, new_str: str) -> str:
|
|
80
|
+
if not isinstance(path, str) or not path:
|
|
81
|
+
return "error: 'path' is required"
|
|
82
|
+
if not isinstance(old_str, str) or not isinstance(new_str, str):
|
|
83
|
+
return "error: 'old_str' and 'new_str' must be strings"
|
|
84
|
+
if not old_str:
|
|
85
|
+
# '' matches everywhere (''.count('') == 1 on an empty file), so it would insert
|
|
86
|
+
# rather than replace — reject it to keep the "exactly once" contract honest.
|
|
87
|
+
return "error: 'old_str' must be a non-empty string"
|
|
88
|
+
filepath = Path(path)
|
|
89
|
+
if not filepath.is_absolute():
|
|
90
|
+
filepath = Path.cwd() / filepath
|
|
91
|
+
if not filepath.exists():
|
|
92
|
+
return f"error: {path} not found"
|
|
93
|
+
# Reading/writing can fail on a directory, permissions, or non-text content; return the
|
|
94
|
+
# error as a tool result instead of letting it abort the chat loop.
|
|
95
|
+
try:
|
|
96
|
+
content = filepath.read_text()
|
|
97
|
+
except Exception as e:
|
|
98
|
+
return f"error: could not read {path}: {e}"
|
|
99
|
+
count = content.count(old_str)
|
|
100
|
+
if count != 1:
|
|
101
|
+
return f"error: old_str must appear exactly once in {path} (found {count})"
|
|
102
|
+
try:
|
|
103
|
+
filepath.write_text(content.replace(old_str, new_str, 1))
|
|
104
|
+
except Exception as e:
|
|
105
|
+
return f"error: could not write {path}: {e}"
|
|
106
|
+
return f"Edited {path}"
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
async def chat(
|
|
110
|
+
client: AsyncOpenAI, model: str, messages: list[dict], tools: list[dict]
|
|
111
|
+
):
|
|
112
|
+
completion = await client.chat.completions.create(
|
|
113
|
+
model=model, messages=messages, tools=tools or None
|
|
114
|
+
)
|
|
115
|
+
return completion.choices[0].message
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
async def connect_mcp(stack: AsyncExitStack, config: dict) -> tuple[list[dict], dict]:
|
|
119
|
+
"""Connect to each configured MCP server (a streamable-HTTP `url`); return
|
|
120
|
+
(tool schemas, dispatch mapping `<server>_<tool>` -> (session, raw tool name))."""
|
|
121
|
+
from mcp import ClientSession
|
|
122
|
+
from mcp.client.streamable_http import (
|
|
123
|
+
create_mcp_http_client,
|
|
124
|
+
streamable_http_client,
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
tool_schemas: list[dict] = []
|
|
128
|
+
dispatch: dict[str, tuple] = {}
|
|
129
|
+
for name, spec in config.get("mcpServers", {}).items():
|
|
130
|
+
http_client = await stack.enter_async_context(
|
|
131
|
+
create_mcp_http_client(headers=spec.get("headers") or None)
|
|
132
|
+
)
|
|
133
|
+
read, write, *_ = await stack.enter_async_context(
|
|
134
|
+
streamable_http_client(spec["url"], http_client=http_client)
|
|
135
|
+
)
|
|
136
|
+
session = await stack.enter_async_context(ClientSession(read, write))
|
|
137
|
+
await session.initialize()
|
|
138
|
+
for tool in (await session.list_tools()).tools:
|
|
139
|
+
full = f"{name}_{tool.name}"
|
|
140
|
+
tool_schemas.append(
|
|
141
|
+
{
|
|
142
|
+
"type": "function",
|
|
143
|
+
"function": {
|
|
144
|
+
"name": full,
|
|
145
|
+
"description": tool.description or "",
|
|
146
|
+
"parameters": tool.inputSchema,
|
|
147
|
+
},
|
|
148
|
+
}
|
|
149
|
+
)
|
|
150
|
+
dispatch[full] = (session, tool.name)
|
|
151
|
+
return tool_schemas, dispatch
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def mcp_content_to_chat_content(blocks) -> str | list[dict]:
|
|
155
|
+
parts = []
|
|
156
|
+
for block in blocks:
|
|
157
|
+
if block.type == "text":
|
|
158
|
+
parts.append({"type": "text", "text": block.text})
|
|
159
|
+
elif block.type == "image":
|
|
160
|
+
url = f"data:{block.mimeType};base64,{block.data}"
|
|
161
|
+
parts.append({"type": "image_url", "image_url": {"url": url}})
|
|
162
|
+
else:
|
|
163
|
+
parts.append({"type": "text", "text": str(block)})
|
|
164
|
+
if not parts:
|
|
165
|
+
return str(blocks)
|
|
166
|
+
if all(part["type"] == "text" for part in parts):
|
|
167
|
+
return "\n".join(part["text"] for part in parts)
|
|
168
|
+
return parts
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
async def call_mcp(dispatch: dict, name: str, arguments: dict) -> str | list[dict]:
|
|
172
|
+
session, raw = dispatch[name]
|
|
173
|
+
result = await session.call_tool(raw, arguments)
|
|
174
|
+
return mcp_content_to_chat_content(result.content)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def parse_args() -> argparse.Namespace:
|
|
178
|
+
parser = argparse.ArgumentParser()
|
|
179
|
+
parser.add_argument("--base-url", required=True)
|
|
180
|
+
parser.add_argument("--api-key", required=True)
|
|
181
|
+
parser.add_argument("--model", required=True)
|
|
182
|
+
parser.add_argument("--system-prompt", default="")
|
|
183
|
+
parser.add_argument("--prompt", default="")
|
|
184
|
+
parser.add_argument("--mcp-config", default="")
|
|
185
|
+
return parser.parse_args()
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
async def main() -> None:
|
|
189
|
+
args = parse_args()
|
|
190
|
+
client = AsyncOpenAI(base_url=args.base_url, api_key=args.api_key)
|
|
191
|
+
config = json.loads(args.mcp_config or "{}")
|
|
192
|
+
async with AsyncExitStack() as stack:
|
|
193
|
+
mcp_tools, dispatch = (
|
|
194
|
+
await connect_mcp(stack, config) if config.get("mcpServers") else ([], {})
|
|
195
|
+
)
|
|
196
|
+
tools = [BASH_TOOL, EDIT_TOOL] + mcp_tools
|
|
197
|
+
messages = (
|
|
198
|
+
[{"role": "system", "content": args.system_prompt}]
|
|
199
|
+
if args.system_prompt
|
|
200
|
+
else []
|
|
201
|
+
)
|
|
202
|
+
# A Messages prompt (e.g. an image-bearing prompt) arrives pre-built as OpenAI wire dicts
|
|
203
|
+
# via INITIAL_MESSAGES (kept in env: it can be large multimodal content that overflows
|
|
204
|
+
# argv, and it's prompt content, not a credential); otherwise --prompt is the opening
|
|
205
|
+
# message. Both empty means the task has no prompt — the user simulator seeds the opening.
|
|
206
|
+
initial = json.loads(os.environ.get("INITIAL_MESSAGES", "[]"))
|
|
207
|
+
if initial:
|
|
208
|
+
messages.extend(initial)
|
|
209
|
+
elif args.prompt:
|
|
210
|
+
messages.append({"role": "user", "content": args.prompt})
|
|
211
|
+
while True:
|
|
212
|
+
message = await chat(client, args.model, messages, tools)
|
|
213
|
+
messages.append(message.model_dump(exclude_none=True))
|
|
214
|
+
if not message.tool_calls:
|
|
215
|
+
break
|
|
216
|
+
for call in message.tool_calls:
|
|
217
|
+
name = call.function.name
|
|
218
|
+
try:
|
|
219
|
+
tool_args = json.loads(call.function.arguments or "{}")
|
|
220
|
+
except json.JSONDecodeError as e:
|
|
221
|
+
messages.append(
|
|
222
|
+
{
|
|
223
|
+
"role": "tool",
|
|
224
|
+
"tool_call_id": call.id,
|
|
225
|
+
"content": f"error: invalid JSON in tool arguments ({e}); resend the call with valid JSON",
|
|
226
|
+
}
|
|
227
|
+
)
|
|
228
|
+
continue
|
|
229
|
+
if name in dispatch:
|
|
230
|
+
content = await call_mcp(dispatch, name, tool_args)
|
|
231
|
+
elif name == "bash":
|
|
232
|
+
content = await asyncio.to_thread(
|
|
233
|
+
run_bash, tool_args.get("command", "")
|
|
234
|
+
)
|
|
235
|
+
elif name == "edit":
|
|
236
|
+
content = await asyncio.to_thread(
|
|
237
|
+
run_edit,
|
|
238
|
+
tool_args.get("path"),
|
|
239
|
+
tool_args.get("old_str"),
|
|
240
|
+
tool_args.get("new_str"),
|
|
241
|
+
)
|
|
242
|
+
else:
|
|
243
|
+
content = f"error: unknown tool {name!r}"
|
|
244
|
+
messages.append(
|
|
245
|
+
{"role": "tool", "tool_call_id": call.id, "content": content}
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
if __name__ == "__main__":
|
|
250
|
+
asyncio.run(main())
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
"""harbor: run a Harbor (Terminal-Bench) dataset.
|
|
2
2
|
|
|
3
|
-
`dataset` is a Harbor Hub
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
`hello-world` task.
|
|
3
|
+
`dataset` is a Harbor Hub package id (e.g. "org/name" or "org/name@ref"),
|
|
4
|
+
downloaded directly from the registry and cached on first use. Each task dir
|
|
5
|
+
ships task.toml + instruction.md (+ tests/, solution/, environment/). Defaults
|
|
6
|
+
to the registry `harbor/hello-world` dataset.
|
|
8
7
|
|
|
9
8
|
The harness runs in a container and edits /app; then the task's verifier
|
|
10
9
|
(tests/test.sh) runs in the SAME container and the reward it writes to
|
|
@@ -20,14 +19,16 @@ no environment at all also runs on that image, unless `require_image`.
|
|
|
20
19
|
"""
|
|
21
20
|
|
|
22
21
|
import io
|
|
23
|
-
import
|
|
24
|
-
import
|
|
25
|
-
import subprocess
|
|
26
|
-
import sys
|
|
22
|
+
import json
|
|
23
|
+
import os
|
|
27
24
|
import tarfile
|
|
25
|
+
import tempfile
|
|
28
26
|
import tomllib
|
|
27
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
29
28
|
from functools import lru_cache
|
|
30
29
|
from pathlib import Path
|
|
30
|
+
from urllib.parse import urlencode
|
|
31
|
+
from urllib.request import Request, urlopen
|
|
31
32
|
|
|
32
33
|
from pydantic import Field
|
|
33
34
|
|
|
@@ -40,14 +41,14 @@ from verifiers.v1.trace import Trace
|
|
|
40
41
|
from verifiers.v1.types import StrictBaseModel
|
|
41
42
|
|
|
42
43
|
CACHE = Path.home() / ".cache" / "harbor"
|
|
43
|
-
|
|
44
|
-
|
|
44
|
+
HARBOR_SUPABASE_URL = "https://ofhuhcpkvzjlejydnvyd.supabase.co"
|
|
45
|
+
HARBOR_SUPABASE_PUBLISHABLE_KEY = "sb_publishable_Z-vuQbpvpG-PStjbh4yE0Q_e-d3MTIH"
|
|
45
46
|
|
|
46
47
|
|
|
47
48
|
class HarborConfig(TasksetConfig):
|
|
48
|
-
dataset: str = "hello-world"
|
|
49
|
-
"""A Harbor Hub
|
|
50
|
-
|
|
49
|
+
dataset: str = "harbor/hello-world"
|
|
50
|
+
"""A Harbor Hub package id ("org/name" or "org/name@ref"), where ref is a
|
|
51
|
+
tag, integer revision, or sha256 digest. Downloaded directly and cached."""
|
|
51
52
|
tasks: list[str] | None = None
|
|
52
53
|
"""Optional subset of task names to load (None = all)."""
|
|
53
54
|
timeout_multiplier: float = Field(1.0, gt=0)
|
|
@@ -87,30 +88,130 @@ class HarborTask(Task):
|
|
|
87
88
|
|
|
88
89
|
|
|
89
90
|
def dataset_dir(dataset: str) -> Path:
|
|
90
|
-
"""Download a Harbor Hub
|
|
91
|
-
|
|
91
|
+
"""Download a Harbor Hub task or dataset package, cached on first use.
|
|
92
|
+
|
|
93
|
+
Harbor refs are tags, integer revisions, or ``sha256:`` digests.
|
|
94
|
+
"""
|
|
92
95
|
out = CACHE / dataset.replace("/", "_").replace("@", "_")
|
|
93
96
|
if out.is_dir():
|
|
94
97
|
return out
|
|
95
98
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
+
package, _, ref = dataset.partition("@")
|
|
100
|
+
org, name = package.split("/", 1)
|
|
101
|
+
ref = ref or "latest"
|
|
102
|
+
url = os.getenv("HARBOR_SUPABASE_URL", HARBOR_SUPABASE_URL).rstrip("/")
|
|
103
|
+
key = os.getenv("HARBOR_SUPABASE_PUBLISHABLE_KEY", HARBOR_SUPABASE_PUBLISHABLE_KEY)
|
|
104
|
+
headers = {
|
|
105
|
+
"apikey": key,
|
|
106
|
+
"Authorization": f"Bearer {key}",
|
|
107
|
+
"Content-Type": "application/json",
|
|
108
|
+
}
|
|
109
|
+
# Harbor stores datasets in version tables; standalone tasks use the RPC fallback below.
|
|
110
|
+
version_query = {
|
|
111
|
+
"package.name": f"eq.{name}",
|
|
112
|
+
"package.type": "eq.dataset",
|
|
113
|
+
"package.org.name": f"eq.{org}",
|
|
114
|
+
"limit": 1,
|
|
115
|
+
}
|
|
116
|
+
if ref.isdigit():
|
|
117
|
+
table = "dataset_version"
|
|
118
|
+
version_query |= {
|
|
119
|
+
"select": "id,package:package_id!inner(name,type,org:org_id!inner(name))",
|
|
120
|
+
"revision": f"eq.{ref}",
|
|
121
|
+
}
|
|
122
|
+
elif ref.startswith("sha256:"):
|
|
123
|
+
table = "dataset_version"
|
|
124
|
+
version_query |= {
|
|
125
|
+
"select": "id,package:package_id!inner(name,type,org:org_id!inner(name))",
|
|
126
|
+
"content_hash": f"eq.{ref.removeprefix('sha256:')}",
|
|
127
|
+
}
|
|
99
128
|
else:
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
# Harbor requires Python 3.12, while Verifiers also supports Python 3.11.
|
|
108
|
-
if sys.version_info[:2] == (3, 11):
|
|
109
|
-
command.extend(["--python", "3.12"])
|
|
110
|
-
command.extend(["--from", HARBOR_PACKAGE, "harbor"])
|
|
111
|
-
subprocess.run(
|
|
112
|
-
[*command, "download", dataset, "--export", "-o", str(out)], check=True
|
|
129
|
+
table = "dataset_version_tag"
|
|
130
|
+
version_query |= {
|
|
131
|
+
"select": "dataset_version:dataset_version_id(id),package:package_id!inner(name,type,org:org_id!inner(name))",
|
|
132
|
+
"tag": f"eq.{ref}",
|
|
133
|
+
}
|
|
134
|
+
request = Request(
|
|
135
|
+
f"{url}/rest/v1/{table}?{urlencode(version_query)}", headers=headers
|
|
113
136
|
)
|
|
137
|
+
with urlopen(request) as response:
|
|
138
|
+
versions = json.load(response)
|
|
139
|
+
|
|
140
|
+
if versions:
|
|
141
|
+
version = versions[0]
|
|
142
|
+
version_id = version.get("id") or version["dataset_version"]["id"]
|
|
143
|
+
task_query = {
|
|
144
|
+
"select": "task_version:task_version_id(archive_path,package:package_id(name))",
|
|
145
|
+
"dataset_version_id": f"eq.{version_id}",
|
|
146
|
+
"order": "task_version_id",
|
|
147
|
+
"limit": 1000,
|
|
148
|
+
"offset": 0,
|
|
149
|
+
}
|
|
150
|
+
request = Request(
|
|
151
|
+
f"{url}/rest/v1/dataset_version_task?{urlencode(task_query)}",
|
|
152
|
+
headers={**headers, "Prefer": "count=exact"},
|
|
153
|
+
)
|
|
154
|
+
with urlopen(request) as response:
|
|
155
|
+
pages = [json.load(response)]
|
|
156
|
+
total = int(response.headers["Content-Range"].rsplit("/", 1)[1])
|
|
157
|
+
|
|
158
|
+
for offset in range(1000, total, 1000):
|
|
159
|
+
task_query["offset"] = offset
|
|
160
|
+
request = Request(
|
|
161
|
+
f"{url}/rest/v1/dataset_version_task?{urlencode(task_query)}",
|
|
162
|
+
headers=headers,
|
|
163
|
+
)
|
|
164
|
+
with urlopen(request) as response:
|
|
165
|
+
pages.append(json.load(response))
|
|
166
|
+
downloads = [
|
|
167
|
+
(
|
|
168
|
+
Path(name) / row["task_version"]["package"]["name"],
|
|
169
|
+
row["task_version"]["archive_path"],
|
|
170
|
+
)
|
|
171
|
+
for page in pages
|
|
172
|
+
for row in page
|
|
173
|
+
]
|
|
174
|
+
else:
|
|
175
|
+
body = json.dumps({"p_org": org, "p_name": name, "p_ref": ref}).encode()
|
|
176
|
+
request = Request(
|
|
177
|
+
f"{url}/rest/v1/rpc/resolve_task_version", body, headers=headers
|
|
178
|
+
)
|
|
179
|
+
with urlopen(request) as response:
|
|
180
|
+
task = json.load(response)
|
|
181
|
+
if task is None:
|
|
182
|
+
raise ValueError(f"Harbor package not found: {dataset}")
|
|
183
|
+
downloads = [(Path(name), task["archive_path"])]
|
|
184
|
+
|
|
185
|
+
if not downloads:
|
|
186
|
+
raise ValueError(f"Harbor dataset has no tasks: {dataset}")
|
|
187
|
+
|
|
188
|
+
CACHE.mkdir(parents=True, exist_ok=True)
|
|
189
|
+
# Stream archives concurrently into a temporary directory; publish only a complete cache.
|
|
190
|
+
with tempfile.TemporaryDirectory(dir=CACHE) as temp:
|
|
191
|
+
|
|
192
|
+
def extract(item: tuple[Path, str]) -> None:
|
|
193
|
+
relative_path, archive_path = item
|
|
194
|
+
target = Path(temp) / relative_path
|
|
195
|
+
target.mkdir(parents=True, exist_ok=True)
|
|
196
|
+
request = Request(
|
|
197
|
+
f"{url}/storage/v1/object/authenticated/packages/{archive_path}",
|
|
198
|
+
headers=headers,
|
|
199
|
+
)
|
|
200
|
+
with urlopen(request) as response:
|
|
201
|
+
with tarfile.open(fileobj=response, mode="r|gz") as tar:
|
|
202
|
+
kwargs = (
|
|
203
|
+
{"filter": "data"} if hasattr(tarfile, "data_filter") else {}
|
|
204
|
+
)
|
|
205
|
+
tar.extractall(target, **kwargs)
|
|
206
|
+
|
|
207
|
+
with ThreadPoolExecutor(max_workers=100) as pool:
|
|
208
|
+
list(pool.map(extract, downloads))
|
|
209
|
+
try:
|
|
210
|
+
Path(temp).rename(out)
|
|
211
|
+
except OSError:
|
|
212
|
+
if out.is_dir():
|
|
213
|
+
return out
|
|
214
|
+
raise
|
|
114
215
|
return out
|
|
115
216
|
|
|
116
217
|
|
|
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
|