verifiers 0.1.15.dev408__tar.gz → 0.1.15.dev409__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.dev408 → verifiers-0.1.15.dev409}/PKG-INFO +1 -1
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/pyproject.toml +1 -1
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/v1/conftest.py +6 -6
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/v1/test_e2e.py +7 -7
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/GUIDE.md +5 -4
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/README.md +3 -2
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/cli/dashboard/eval.py +8 -6
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/env.py +5 -1
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/__init__.py +3 -3
- verifiers-0.1.15.dev409/verifiers/v1/harnesses/default/__init__.py +11 -0
- {verifiers-0.1.15.dev408/verifiers/v1/harnesses/bash_edit → verifiers-0.1.15.dev409/verifiers/v1/harnesses/default}/harness.py +26 -17
- {verifiers-0.1.15.dev408/verifiers/v1/harnesses/bash_edit → verifiers-0.1.15.dev409/verifiers/v1/harnesses/default}/program.py +22 -7
- verifiers-0.1.15.dev409/verifiers/v1/harnesses/null/__init__.py +7 -0
- {verifiers-0.1.15.dev408/verifiers/v1/harnesses/default → verifiers-0.1.15.dev409/verifiers/v1/harnesses/null}/harness.py +8 -7
- {verifiers-0.1.15.dev408/verifiers/v1/harnesses/default → verifiers-0.1.15.dev409/verifiers/v1/harnesses/null}/program.py +12 -1
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/loaders.py +3 -2
- verifiers-0.1.15.dev408/verifiers/v1/harnesses/bash/__init__.py +0 -7
- verifiers-0.1.15.dev408/verifiers/v1/harnesses/bash/harness.py +0 -79
- verifiers-0.1.15.dev408/verifiers/v1/harnesses/bash/program.py +0 -187
- verifiers-0.1.15.dev408/verifiers/v1/harnesses/bash_edit/__init__.py +0 -10
- verifiers-0.1.15.dev408/verifiers/v1/harnesses/default/__init__.py +0 -6
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/.gitignore +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/LICENSE +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/README.md +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/AGENTS.md +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/README.md +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/conftest.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_browser_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_build_script.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_client_config.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_composable_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_env_group.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_env_server.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_environment.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_environment_extra.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_envs.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_error_chain.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_eval_display.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_eval_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_gym_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_imports.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_init_script.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_install_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_interception_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_logging.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_math_rubric.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_message_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_openenv_client.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_parser.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_path_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_renderer_client.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_rubric.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_rubric_group.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_save_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_setup_script.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_think_parser.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_tool_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_tool_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_types.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_wordle_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/test_xml_parser.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/v1/test_configs.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/v1/test_envs.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/v1/test_graph.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/tests/v1/test_trace.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/AGENTS.md +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/cli/tui.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/clients/client.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/decorators.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/environment.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/errors.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/gepa/config.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/gepa/display.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/rl/README.md +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/rl/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/rl/inference/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/rl/inference/client.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/rl/inference/server.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/rl/trainer/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/rl/trainer/config.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/rl/trainer/orchestrator.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/rl/trainer/trainer.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/rl/trainer/utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/scripts/build.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/scripts/init.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/scripts/install.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/scripts/rl.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/scripts/train.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/scripts/vllm.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/serve/types.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/types.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/ARCHITECTURE.md +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/episode.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/errors.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/graph.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/harness.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/judge.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/mcp/multiplex.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/retries.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/runtimes/docker.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/state.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/task.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/trace.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/types.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.1.15.dev408 → verifiers-0.1.15.dev409}/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.dev409
|
|
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
|
|
@@ -249,8 +249,8 @@ markers = [
|
|
|
249
249
|
"modal: v1 e2e cases touching the modal runtime (local-only setup; excluded in CI)",
|
|
250
250
|
"colocated: v1 e2e cases with a user/tool server colocated in the harness runtime",
|
|
251
251
|
"shared: v1 e2e cases with a shared (one-per-eval) tool server",
|
|
252
|
+
"null: v1 e2e cases on the null harness",
|
|
252
253
|
"default: v1 e2e cases on the default harness",
|
|
253
|
-
"bash: v1 e2e cases on the bash harness",
|
|
254
254
|
"rlm: v1 e2e cases on the rlm harness",
|
|
255
255
|
"kimi_code: v1 e2e cases on the kimi-code harness",
|
|
256
256
|
"codex: v1 e2e cases on the codex harness",
|
|
@@ -15,12 +15,12 @@ Every matrix value carries a pytest mark, so subsets select with `-m`:
|
|
|
15
15
|
uv run pytest tests/v1 -n auto # the whole matrix (needs modal setup)
|
|
16
16
|
uv run pytest tests/v1 -n auto -m "not prime and not modal" # the CI matrix (host + docker only)
|
|
17
17
|
uv run pytest tests/v1 -n auto -m docker # any case touching the docker runtime
|
|
18
|
-
uv run pytest tests/v1 -n auto -m
|
|
18
|
+
uv run pytest tests/v1 -n auto -m default # only the default harness
|
|
19
19
|
uv run pytest tests/v1 -n auto -m prime # only prime (real sandboxes; local)
|
|
20
20
|
uv run pytest tests/v1 -n auto -m modal # only modal (needs local setup)
|
|
21
21
|
|
|
22
22
|
Marks: runtimes `subprocess` / `docker` / `prime` / `modal`, placements `colocated` / `shared`,
|
|
23
|
-
harnesses `
|
|
23
|
+
harnesses `null` / `default` / `rlm` / `kimi_code` / `codex`. A mark is applied per axis, so it
|
|
24
24
|
selects every case touching that value on ANY axis; for one exact combination use `-k` on the test
|
|
25
25
|
id (e.g. `-k "harness-in-docker-with-tool-in-subprocess"`). prime/modal provision real remote
|
|
26
26
|
sandboxes (slow, infra-flaky, need setup), so they're local-only — CI runs `-m "not prime and not modal"`.
|
|
@@ -108,15 +108,15 @@ def tool_runtime(request) -> dict:
|
|
|
108
108
|
return {"runtime": {"type": request.param}}
|
|
109
109
|
|
|
110
110
|
|
|
111
|
-
# Harnesses, composed with the runtime fixtures, each carrying its harness mark (`-m
|
|
111
|
+
# Harnesses, composed with the runtime fixtures, each carrying its harness mark (`-m default`, ...).
|
|
112
112
|
# Built-ins are bundled in the `harnesses` package; the agent CLIs (`rlm` / `kimi-code` / `codex`)
|
|
113
113
|
# install their dependencies at rollout. `compact` (an example harness) and `terminus-2` (drives
|
|
114
|
-
# the host tmux) are excluded. `test_agentic` skips `
|
|
114
|
+
# the host tmux) are excluded. `test_agentic` skips `null` (a chat loop with no shell);
|
|
115
115
|
# `test_single_turn` skips `codex` (a coding agent, unreliable on a no-op echo).
|
|
116
116
|
@pytest.fixture(
|
|
117
117
|
params=[
|
|
118
|
+
pytest.param("null", marks=pytest.mark.null, id="null"),
|
|
118
119
|
pytest.param("default", marks=pytest.mark.default, id="default"),
|
|
119
|
-
pytest.param("bash", marks=pytest.mark.bash, id="bash"),
|
|
120
120
|
pytest.param("rlm", marks=pytest.mark.rlm, id="rlm"),
|
|
121
121
|
pytest.param("kimi-code", marks=pytest.mark.kimi_code, id="kimi-code"),
|
|
122
122
|
pytest.param("codex", marks=pytest.mark.codex, id="codex"),
|
|
@@ -167,7 +167,7 @@ def _eval_config(
|
|
|
167
167
|
taskset: str,
|
|
168
168
|
*,
|
|
169
169
|
output_dir: Path,
|
|
170
|
-
harness: str = "
|
|
170
|
+
harness: str = "null",
|
|
171
171
|
n: int = 1,
|
|
172
172
|
num_tasks: int = 1,
|
|
173
173
|
max_tokens: int = 2048,
|
|
@@ -51,7 +51,7 @@ async def test_user(run_v1, harness_runtime, user_runtime, tmp_path):
|
|
|
51
51
|
)
|
|
52
52
|
(trace,) = await run_v1(
|
|
53
53
|
"echo-user-sim-v1",
|
|
54
|
-
harness="
|
|
54
|
+
harness="null",
|
|
55
55
|
harness_overrides={"runtime": {"type": harness_runtime}},
|
|
56
56
|
output_dir=tmp_path,
|
|
57
57
|
max_turns=6,
|
|
@@ -83,7 +83,7 @@ async def test_tool(run_v1, run_v1_server, harness_runtime, tool_runtime, tmp_pa
|
|
|
83
83
|
run = run_v1_server if tool_runtime.get("shared") else run_v1
|
|
84
84
|
(trace,) = await run(
|
|
85
85
|
"echo-tool-v1",
|
|
86
|
-
harness="
|
|
86
|
+
harness="null",
|
|
87
87
|
harness_overrides={"runtime": {"type": harness_runtime}},
|
|
88
88
|
output_dir=tmp_path,
|
|
89
89
|
max_turns=6,
|
|
@@ -114,7 +114,7 @@ async def test_tool_state(run_v1, harness_runtime, tool_runtime, tmp_path):
|
|
|
114
114
|
)
|
|
115
115
|
(trace,) = await run_v1(
|
|
116
116
|
"counter-tool-v1",
|
|
117
|
-
harness="
|
|
117
|
+
harness="null",
|
|
118
118
|
harness_overrides={"runtime": {"type": harness_runtime}},
|
|
119
119
|
output_dir=tmp_path,
|
|
120
120
|
max_turns=8,
|
|
@@ -167,7 +167,7 @@ async def test_shared_tool_isolation(
|
|
|
167
167
|
)
|
|
168
168
|
traces = await run_v1_server(
|
|
169
169
|
"scratchpad-v1",
|
|
170
|
-
harness="
|
|
170
|
+
harness="null",
|
|
171
171
|
harness_overrides={"runtime": {"type": harness_runtime}},
|
|
172
172
|
output_dir=tmp_path,
|
|
173
173
|
num_tasks=2, # two distinct words, run concurrently against the one shared server
|
|
@@ -195,7 +195,7 @@ async def test_tool_response_image(run_v1, tmp_path):
|
|
|
195
195
|
"""MCP image content from a tool result survives into the v1 trace (needs a vision model)."""
|
|
196
196
|
(trace,) = await run_v1(
|
|
197
197
|
"tool-response-image-v1",
|
|
198
|
-
harness="
|
|
198
|
+
harness="null",
|
|
199
199
|
harness_overrides={"runtime": {"type": "subprocess"}},
|
|
200
200
|
model="qwen/qwen3-vl-8b-instruct",
|
|
201
201
|
output_dir=tmp_path,
|
|
@@ -209,9 +209,9 @@ async def test_tool_response_image(run_v1, tmp_path):
|
|
|
209
209
|
@pytest.mark.e2e
|
|
210
210
|
async def test_agentic(run_v1, harness, harness_runtime, tmp_path):
|
|
211
211
|
"""Agentic: write a phrase to a file with the agent's shell, checked in the runtime."""
|
|
212
|
-
if harness == "
|
|
212
|
+
if harness == "null":
|
|
213
213
|
pytest.skip(
|
|
214
|
-
"
|
|
214
|
+
"null is a chat loop with no shell — it can't do the file-write task"
|
|
215
215
|
)
|
|
216
216
|
(trace,) = await run_v1(
|
|
217
217
|
"echo-agentic-v1",
|
|
@@ -552,15 +552,16 @@ Otherwise pick a built-in, selected with `--harness.id`:
|
|
|
552
552
|
|
|
553
553
|
| id | what it is |
|
|
554
554
|
| --- | --- |
|
|
555
|
-
| `default` | a
|
|
556
|
-
| `
|
|
555
|
+
| `default` | a `bash` + `edit` coding agent (the `edit` tool is on by default — `--harness.edit false` for bash-only) — the fallback when no harness is given |
|
|
556
|
+
| `null` | a tiny OpenAI chat loop (MCP tools only, no tools of its own) |
|
|
557
557
|
| `rlm` | the RLM CLI agent |
|
|
558
558
|
| `codex` | the Codex CLI (Responses dialect + SSE relay) |
|
|
559
559
|
| `mini-swe-agent` | the mini-swe-agent CLI (a minimal SWE agent) |
|
|
560
560
|
| `kimi-code` | the Kimi Code CLI agent |
|
|
561
561
|
|
|
562
562
|
```bash
|
|
563
|
-
uv run eval gsm8k-v1 -n 1 # default harness
|
|
563
|
+
uv run eval gsm8k-v1 -n 1 # default harness (bash + edit; the fallback)
|
|
564
|
+
uv run eval gsm8k-v1 -n 1 --harness.id null # bare chat loop, no local tools
|
|
564
565
|
uv run eval gsm8k-v1 -n 1 --harness.id rlm # same taskset, different driver
|
|
565
566
|
```
|
|
566
567
|
|
|
@@ -792,7 +793,7 @@ form. In a prime-rl config:
|
|
|
792
793
|
[[orchestrator.train.env]]
|
|
793
794
|
name = "gsm8k"
|
|
794
795
|
taskset = { id = "gsm8k-v1", dataset_name = "..." } # any v1 taskset id
|
|
795
|
-
harness = { id = "
|
|
796
|
+
harness = { id = "null", runtime = { type = "subprocess" } }
|
|
796
797
|
timeout = { scoring = 10 } # per-stage cap (default: no limit)
|
|
797
798
|
# pool = { type = "elastic", max_workers = 8, multiplex = 128 } # env-server pool (default elastic, self-sizing)
|
|
798
799
|
```
|
|
@@ -96,7 +96,8 @@ Harness examples (under `environments/`):
|
|
|
96
96
|
The program that drives the rollout — same taskset, different driver:
|
|
97
97
|
|
|
98
98
|
```bash
|
|
99
|
-
uv run eval gsm8k-v1 -n 1 # default:
|
|
99
|
+
uv run eval gsm8k-v1 -n 1 # default harness (fallback): a bash + edit agent
|
|
100
|
+
uv run eval gsm8k-v1 -n 1 --harness.id null # bare chat loop, no local tools (MCP tools only)
|
|
100
101
|
uv run eval gsm8k-v1 -n 1 --harness.id rlm # the rlm harness
|
|
101
102
|
uv run eval gsm8k-v1 -n 1 --harness.id codex # the codex harness
|
|
102
103
|
```
|
|
@@ -106,7 +107,7 @@ filesystem, so run it under a containerized runtime: `docker` locally, or a remo
|
|
|
106
107
|
`modal` sandbox (not the default `subprocess`).
|
|
107
108
|
|
|
108
109
|
```bash
|
|
109
|
-
uv run eval harbor -n 1 --taskset.ignore-dockerfile --harness.runtime.type docker --harness.id
|
|
110
|
+
uv run eval harbor -n 1 --taskset.ignore-dockerfile --harness.runtime.type docker --harness.id default # the bash + edit agent
|
|
110
111
|
uv run eval harbor -n 1 --taskset.ignore-dockerfile --harness.runtime.type docker --harness.id mini-swe-agent # the mini-swe-agent CLI
|
|
111
112
|
uv run eval harbor -n 1 --taskset.ignore-dockerfile --harness.runtime.type docker --harness.id rlm # the rlm CLI agent
|
|
112
113
|
uv run eval harbor -n 1 --taskset.ignore-dockerfile --harness.runtime.type docker --harness.id codex # the codex CLI agent
|
|
@@ -115,9 +115,9 @@ def _aligned(rows: list[list[str]]) -> list[str]:
|
|
|
115
115
|
|
|
116
116
|
|
|
117
117
|
def _warning(config: EvalConfig) -> Text | None:
|
|
118
|
-
"""A local-runtime caution for a code-running harness (none for the tool-less `
|
|
118
|
+
"""A local-runtime caution for a code-running harness (none for the tool-less `null`),
|
|
119
119
|
shown above the overview rather than as a row in it."""
|
|
120
|
-
if config.harness.id != "
|
|
120
|
+
if config.harness.id != "null" and config.harness.runtime.type == "subprocess":
|
|
121
121
|
return Text(
|
|
122
122
|
"warning Runs on the local system; local files and settings may affect this "
|
|
123
123
|
"evaluation. Use subprocess only for debugging, or use docker or prime for an "
|
|
@@ -254,10 +254,12 @@ def _breakdown(done: list[Trace]) -> Table | None:
|
|
|
254
254
|
names.extend(n for n in getattr(trace, source) if n not in names)
|
|
255
255
|
if not names:
|
|
256
256
|
continue
|
|
257
|
-
segments = [
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
257
|
+
segments = []
|
|
258
|
+
for name in names:
|
|
259
|
+
mean = format_mean(
|
|
260
|
+
done, lambda t, n=name, s=source: getattr(t, s).get(n, 0.0)
|
|
261
|
+
)
|
|
262
|
+
segments.append(f"{name} {mean}")
|
|
261
263
|
grid.add_row(label, " · ".join(segments))
|
|
262
264
|
|
|
263
265
|
# Resource use over every completed rollout (errored ones still spent tokens/time): tokens and
|
|
@@ -262,7 +262,11 @@ class Environment:
|
|
|
262
262
|
"(NEEDS_CONTAINER), but the harness runs on the subprocess runtime; "
|
|
263
263
|
"use --harness.runtime.type docker or prime."
|
|
264
264
|
)
|
|
265
|
-
|
|
265
|
+
# The warning is about the *agent* running arbitrary code on the host: every harness hands
|
|
266
|
+
# it local execution (bash/edit, or a CLI agent) except the tool-less `null` chat loop,
|
|
267
|
+
# whose program only relays the model and remote MCP tools — so exempt `null`, warn for the
|
|
268
|
+
# rest. (`null` still runs its fixed chat-loop program locally, but nothing agent-authored.)
|
|
269
|
+
if self.harness.config.id != "null" and isinstance(
|
|
266
270
|
self.harness.config.runtime, SubprocessConfig
|
|
267
271
|
):
|
|
268
272
|
logger.warning(
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
Re-exports each harness's class + config off the package."""
|
|
4
4
|
|
|
5
|
-
from verifiers.v1.harnesses.bash import BashHarness, BashHarnessConfig
|
|
6
5
|
from verifiers.v1.harnesses.codex import CodexHarness, CodexHarnessConfig
|
|
7
6
|
from verifiers.v1.harnesses.default import DefaultHarness, DefaultHarnessConfig
|
|
8
7
|
from verifiers.v1.harnesses.kimi_code import KimiCodeHarness, KimiCodeHarnessConfig
|
|
@@ -10,18 +9,19 @@ from verifiers.v1.harnesses.mini_swe_agent import (
|
|
|
10
9
|
MiniSWEAgentHarness,
|
|
11
10
|
MiniSWEAgentHarnessConfig,
|
|
12
11
|
)
|
|
12
|
+
from verifiers.v1.harnesses.null import NullHarness, NullHarnessConfig
|
|
13
13
|
from verifiers.v1.harnesses.rlm import RLMHarness, RLMHarnessConfig
|
|
14
14
|
from verifiers.v1.harnesses.terminus_2 import Terminus2Harness, Terminus2HarnessConfig
|
|
15
15
|
|
|
16
16
|
__all__ = [
|
|
17
|
-
"BashHarness",
|
|
18
|
-
"BashHarnessConfig",
|
|
19
17
|
"CodexHarness",
|
|
20
18
|
"CodexHarnessConfig",
|
|
21
19
|
"DefaultHarness",
|
|
22
20
|
"DefaultHarnessConfig",
|
|
23
21
|
"KimiCodeHarness",
|
|
24
22
|
"KimiCodeHarnessConfig",
|
|
23
|
+
"NullHarness",
|
|
24
|
+
"NullHarnessConfig",
|
|
25
25
|
"MiniSWEAgentHarness",
|
|
26
26
|
"MiniSWEAgentHarnessConfig",
|
|
27
27
|
"RLMHarness",
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""default — v1's built-in agentic harness (the fallback when no `--harness.id` is given): a chat
|
|
2
|
+
loop with a local `bash` tool and an optional `edit` tool (single-occurrence string replacement,
|
|
3
|
+
on by default). Its `harness.py` (class + config) and the `program.py` script staged into the
|
|
4
|
+
runtime. Resolved by id via `load_harness`."""
|
|
5
|
+
|
|
6
|
+
from verifiers.v1.harnesses.default.harness import (
|
|
7
|
+
DefaultHarness,
|
|
8
|
+
DefaultHarnessConfig,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
__all__ = ["DefaultHarness", "DefaultHarnessConfig"]
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
"""The built-in
|
|
1
|
+
"""The built-in default harness: a chat loop with a local `bash` tool and an optional `edit` tool.
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
single-occurrence string replacement in a file (ported from the rlm `edit` skill
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
A growing-message-list chat loop with a local `bash` tool that runs shell commands in the runtime,
|
|
4
|
+
the taskset's MCP tools, and — on by default, gated by the `edit` config flag — a local `edit`
|
|
5
|
+
tool for single-occurrence string replacement in a file (ported from the rlm `edit` skill; a model
|
|
6
|
+
handles it more reliably than hand-built `sed`/heredoc shell). This is the fallback harness when no
|
|
7
|
+
`--harness.id` is given. Its uv script (deps: openai, mcp) is prepared during setup, then launched
|
|
8
|
+
as the harness program. For a pure chat loop with no local tools, use the `null` harness.
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
11
|
import json
|
|
@@ -20,19 +20,25 @@ from verifiers.v1.trace import Trace
|
|
|
20
20
|
PROGRAM_SOURCE = (Path(__file__).resolve().parent / "program.py").read_text()
|
|
21
21
|
|
|
22
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
|
-
|
|
25
|
-
"You are a coding agent. You have access to a bash tool for running shell commands
|
|
26
|
-
|
|
23
|
+
# harness-injected prompt). The edit clause is appended only when the `edit` tool is enabled.
|
|
24
|
+
BASH_SYSTEM_PROMPT = (
|
|
25
|
+
"You are a coding agent. You have access to a bash tool for running shell commands."
|
|
26
|
+
)
|
|
27
|
+
EDIT_SYSTEM_PROMPT = (
|
|
28
|
+
"You also have an edit tool for single-occurrence string replacement in a file."
|
|
27
29
|
)
|
|
28
30
|
|
|
29
31
|
|
|
30
|
-
class
|
|
31
|
-
"""The built-in
|
|
32
|
+
class DefaultHarnessConfig(HarnessConfig):
|
|
33
|
+
"""The built-in default harness. A uv script (deps: openai, mcp), so it runs in any runtime
|
|
32
34
|
that has `uv` (the harness bootstraps it) with no other setup."""
|
|
33
35
|
|
|
36
|
+
edit: bool = True
|
|
37
|
+
"""Offer the local `edit` tool (single-occurrence string replacement in a file) alongside
|
|
38
|
+
`bash`. On by default; set `--harness.edit false` for a bash-only agent."""
|
|
39
|
+
|
|
34
40
|
|
|
35
|
-
class
|
|
41
|
+
class DefaultHarness(Harness[DefaultHarnessConfig]):
|
|
36
42
|
APPENDS_SYSTEM_PROMPT = True
|
|
37
43
|
SUPPORTS_MCP = True
|
|
38
44
|
SUPPORTS_USER_SIM = True
|
|
@@ -51,9 +57,10 @@ class BashEditHarness(Harness[BashEditHarnessConfig]):
|
|
|
51
57
|
mcp_urls: dict[str, str],
|
|
52
58
|
) -> ProgramResult:
|
|
53
59
|
system_prompt, prompt = self.resolve_prompt(trace.task)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
60
|
+
harness_prompt = BASH_SYSTEM_PROMPT
|
|
61
|
+
if self.config.edit:
|
|
62
|
+
harness_prompt = f"{BASH_SYSTEM_PROMPT} {EDIT_SYSTEM_PROMPT}"
|
|
63
|
+
system_prompt = "\n\n".join(p for p in (harness_prompt, system_prompt) if p)
|
|
57
64
|
env = {**self.config.resolved_env}
|
|
58
65
|
args = [
|
|
59
66
|
f"--base-url={endpoint}",
|
|
@@ -61,6 +68,8 @@ class BashEditHarness(Harness[BashEditHarnessConfig]):
|
|
|
61
68
|
f"--model={ctx.model}",
|
|
62
69
|
f"--system-prompt={system_prompt}",
|
|
63
70
|
]
|
|
71
|
+
if self.config.edit:
|
|
72
|
+
args.append("--edit")
|
|
64
73
|
if mcp_urls:
|
|
65
74
|
# The program connects to the tool servers over HTTP; hand it a standard
|
|
66
75
|
# `mcpServers` URL config (the `mcp` client itself comes from the uv deps).
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
# requires-python = ">=3.10"
|
|
3
3
|
# dependencies = ["openai", "mcp"]
|
|
4
4
|
# ///
|
|
5
|
-
"""The
|
|
5
|
+
"""The default harness's program: a chat loop with a local `bash` tool (+ optional `edit`, MCP).
|
|
6
6
|
|
|
7
7
|
A growing-message-list chat loop. It always offers a local `bash` tool that runs shell commands in
|
|
8
|
-
the runtime
|
|
9
|
-
MCP_CONFIG (a standard `mcpServers` URL map) it also connects to those
|
|
10
|
-
HTTP, exposes their tools to the model as `<server>_<tool>`, and routes
|
|
11
|
-
The loop runs until the model answers without a tool call.
|
|
8
|
+
the runtime; with `--edit` it also offers a local `edit` tool that replaces a unique string in a
|
|
9
|
+
file. When the harness sets MCP_CONFIG (a standard `mcpServers` URL map) it also connects to those
|
|
10
|
+
servers over streamable HTTP, exposes their tools to the model as `<server>_<tool>`, and routes
|
|
11
|
+
those calls to the server. The loop runs until the model answers without a tool call.
|
|
12
12
|
|
|
13
13
|
It runs as a uv script (deps: openai, mcp), so the chat + tool plumbing is just the SDKs — the
|
|
14
14
|
harness bootstraps `uv` in the runtime. The interception endpoint, per-rollout secret, and model
|
|
@@ -182,6 +182,7 @@ def parse_args() -> argparse.Namespace:
|
|
|
182
182
|
parser.add_argument("--system-prompt", default="")
|
|
183
183
|
parser.add_argument("--prompt", default="")
|
|
184
184
|
parser.add_argument("--mcp-config", default="")
|
|
185
|
+
parser.add_argument("--edit", action="store_true")
|
|
185
186
|
return parser.parse_args()
|
|
186
187
|
|
|
187
188
|
|
|
@@ -193,7 +194,10 @@ async def main() -> None:
|
|
|
193
194
|
mcp_tools, dispatch = (
|
|
194
195
|
await connect_mcp(stack, config) if config.get("mcpServers") else ([], {})
|
|
195
196
|
)
|
|
196
|
-
tools = [BASH_TOOL
|
|
197
|
+
tools = [BASH_TOOL]
|
|
198
|
+
if args.edit:
|
|
199
|
+
tools.append(EDIT_TOOL)
|
|
200
|
+
tools += mcp_tools
|
|
197
201
|
messages = (
|
|
198
202
|
[{"role": "system", "content": args.system_prompt}]
|
|
199
203
|
if args.system_prompt
|
|
@@ -226,13 +230,24 @@ async def main() -> None:
|
|
|
226
230
|
}
|
|
227
231
|
)
|
|
228
232
|
continue
|
|
233
|
+
# Valid JSON can still be a non-object (`[]`, `42`, `null`); the `.get(...)` calls
|
|
234
|
+
# below assume a dict, so reject anything else as a tool error rather than crashing.
|
|
235
|
+
if not isinstance(tool_args, dict):
|
|
236
|
+
messages.append(
|
|
237
|
+
{
|
|
238
|
+
"role": "tool",
|
|
239
|
+
"tool_call_id": call.id,
|
|
240
|
+
"content": f"error: tool arguments must be a JSON object, got {type(tool_args).__name__}; resend as an object",
|
|
241
|
+
}
|
|
242
|
+
)
|
|
243
|
+
continue
|
|
229
244
|
if name in dispatch:
|
|
230
245
|
content = await call_mcp(dispatch, name, tool_args)
|
|
231
246
|
elif name == "bash":
|
|
232
247
|
content = await asyncio.to_thread(
|
|
233
248
|
run_bash, tool_args.get("command", "")
|
|
234
249
|
)
|
|
235
|
-
elif name == "edit":
|
|
250
|
+
elif name == "edit" and args.edit:
|
|
236
251
|
content = await asyncio.to_thread(
|
|
237
252
|
run_edit,
|
|
238
253
|
tool_args.get("path"),
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"""null — v1's built-in tool-less harness: its `harness.py` (class + config) and the
|
|
2
|
+
`program.py` script it stages into the runtime. A plain chat loop with the taskset's MCP tools
|
|
3
|
+
and no tools of its own. Resolved by id via `load_harness`."""
|
|
4
|
+
|
|
5
|
+
from verifiers.v1.harnesses.null.harness import NullHarness, NullHarnessConfig
|
|
6
|
+
|
|
7
|
+
__all__ = ["NullHarness", "NullHarnessConfig"]
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
"""The built-in
|
|
1
|
+
"""The built-in null harness: runs a small chat-loop program as a uv script, no tools of its own.
|
|
2
2
|
|
|
3
3
|
A growing-message-list chat loop with the taskset's MCP tools (host-side, resolved to URLs by
|
|
4
|
-
the Environment) — and no tools of its own
|
|
5
|
-
|
|
6
|
-
dedicated agentic harness (e.g.
|
|
4
|
+
the Environment) — and no tools of its own (it's "null" precisely because it adds no
|
|
5
|
+
harness-side tooling). Its uv script (deps: openai, mcp) is prepared during setup, then launched
|
|
6
|
+
as the harness program. For a shell-driving agent, use a dedicated agentic harness (e.g.
|
|
7
|
+
`mini-swe-agent`).
|
|
7
8
|
"""
|
|
8
9
|
|
|
9
10
|
import json
|
|
@@ -18,12 +19,12 @@ from verifiers.v1.trace import Trace
|
|
|
18
19
|
PROGRAM_SOURCE = (Path(__file__).resolve().parent / "program.py").read_text()
|
|
19
20
|
|
|
20
21
|
|
|
21
|
-
class
|
|
22
|
-
"""The built-in harness. A uv script (deps: openai, mcp), so it runs in any runtime that
|
|
22
|
+
class NullHarnessConfig(HarnessConfig):
|
|
23
|
+
"""The built-in null harness. A uv script (deps: openai, mcp), so it runs in any runtime that
|
|
23
24
|
has `uv` (the harness bootstraps it) with no other setup."""
|
|
24
25
|
|
|
25
26
|
|
|
26
|
-
class
|
|
27
|
+
class NullHarness(Harness[NullHarnessConfig]):
|
|
27
28
|
APPENDS_SYSTEM_PROMPT = True
|
|
28
29
|
SUPPORTS_MCP = True
|
|
29
30
|
SUPPORTS_USER_SIM = True
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# requires-python = ">=3.10"
|
|
3
3
|
# dependencies = ["openai", "mcp"]
|
|
4
4
|
# ///
|
|
5
|
-
"""The
|
|
5
|
+
"""The null harness's program: a chat loop with the taskset's MCP tools (and none of its own).
|
|
6
6
|
|
|
7
7
|
A growing-message-list chat loop. When the harness sets MCP_CONFIG (a standard `mcpServers` URL
|
|
8
8
|
map) it connects to those servers over streamable HTTP, exposes their tools to the model as
|
|
@@ -142,6 +142,17 @@ async def main() -> None:
|
|
|
142
142
|
}
|
|
143
143
|
)
|
|
144
144
|
continue
|
|
145
|
+
# Valid JSON can still be a non-object (`[]`, `42`, `null`); the MCP dispatch
|
|
146
|
+
# assumes a dict, so reject anything else as a tool error rather than crashing.
|
|
147
|
+
if not isinstance(tool_args, dict):
|
|
148
|
+
messages.append(
|
|
149
|
+
{
|
|
150
|
+
"role": "tool",
|
|
151
|
+
"tool_call_id": call.id,
|
|
152
|
+
"content": f"error: tool arguments must be a JSON object, got {type(tool_args).__name__}; resend as an object",
|
|
153
|
+
}
|
|
154
|
+
)
|
|
155
|
+
continue
|
|
145
156
|
if name in dispatch:
|
|
146
157
|
content = await call_mcp(dispatch, name, tool_args)
|
|
147
158
|
else:
|
|
@@ -130,8 +130,9 @@ def harness_class(harness_id: str) -> type[Harness]:
|
|
|
130
130
|
def default_harness_id(taskset_id: str) -> str:
|
|
131
131
|
"""The harness id to use when none is given. A taskset that bundles its own harness — its
|
|
132
132
|
module also exports a `Harness` subclass via `__all__`, so the taskset id doubles as the
|
|
133
|
-
harness id — runs with that harness by default; otherwise the shared `default` harness
|
|
134
|
-
explicit `--harness.id` / toml id always takes precedence (this only
|
|
133
|
+
harness id — runs with that harness by default; otherwise the shared `default` harness (a
|
|
134
|
+
bash + edit agent). An explicit `--harness.id` / toml id always takes precedence (this only
|
|
135
|
+
supplies the fallback); for a tool-less chat loop, pass `--harness.id null`."""
|
|
135
136
|
if not taskset_id:
|
|
136
137
|
return "default"
|
|
137
138
|
try:
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
"""bash — v1's built-in agentic harness: the `default` chat loop plus a single local `bash`
|
|
2
|
-
tool. Its `harness.py` (class + config) and the `program.py` script staged into the runtime.
|
|
3
|
-
Resolved by id via `load_harness`."""
|
|
4
|
-
|
|
5
|
-
from verifiers.v1.harnesses.bash.harness import BashHarness, BashHarnessConfig
|
|
6
|
-
|
|
7
|
-
__all__ = ["BashHarness", "BashHarnessConfig"]
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
"""The built-in bash harness: the default chat loop plus a single local `bash` tool.
|
|
2
|
-
|
|
3
|
-
The same growing-message-list chat loop as the `default` harness, but its program also offers a
|
|
4
|
-
`bash` tool that runs shell commands in the runtime — for agentic tasks that drive a terminal
|
|
5
|
-
(e.g. harbor / terminal-bench). MCP tools from the taskset are wired in too. Its uv script
|
|
6
|
-
(deps: openai, mcp) is prepared during setup, then launched as the harness program.
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
import json
|
|
10
|
-
from pathlib import Path
|
|
11
|
-
|
|
12
|
-
from verifiers.v1.harness import Harness, HarnessConfig
|
|
13
|
-
from verifiers.v1.clients import RolloutContext
|
|
14
|
-
from verifiers.v1.dialects.chat import message_to_wire
|
|
15
|
-
from verifiers.v1.runtimes import ProgramResult, Runtime
|
|
16
|
-
from verifiers.v1.trace import Trace
|
|
17
|
-
|
|
18
|
-
PROGRAM_SOURCE = (Path(__file__).resolve().parent / "program.py").read_text()
|
|
19
|
-
|
|
20
|
-
# Tells the model it can run shell commands (a pure-text chat loop gets no harness-injected prompt).
|
|
21
|
-
BASH_SYSTEM_PROMPT = "You have access to a bash tool; use it to run shell commands."
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class BashHarnessConfig(HarnessConfig):
|
|
25
|
-
"""The built-in bash harness. A uv script (deps: openai, mcp), so it runs in any runtime that
|
|
26
|
-
has `uv` (the harness bootstraps it) with no other setup."""
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class BashHarness(Harness[BashHarnessConfig]):
|
|
30
|
-
APPENDS_SYSTEM_PROMPT = True
|
|
31
|
-
SUPPORTS_MCP = True
|
|
32
|
-
SUPPORTS_USER_SIM = True
|
|
33
|
-
SUPPORTS_MESSAGE_PROMPT = True
|
|
34
|
-
|
|
35
|
-
async def setup(self, runtime: Runtime) -> None:
|
|
36
|
-
await runtime.prepare_uv_script(PROGRAM_SOURCE, self.config.resolved_env)
|
|
37
|
-
|
|
38
|
-
async def launch(
|
|
39
|
-
self,
|
|
40
|
-
ctx: RolloutContext,
|
|
41
|
-
trace: Trace,
|
|
42
|
-
runtime: Runtime,
|
|
43
|
-
endpoint: str,
|
|
44
|
-
secret: str,
|
|
45
|
-
mcp_urls: dict[str, str],
|
|
46
|
-
) -> ProgramResult:
|
|
47
|
-
system_prompt, prompt = self.resolve_prompt(trace.task)
|
|
48
|
-
system_prompt = "\n\n".join(p for p in (BASH_SYSTEM_PROMPT, system_prompt) if p)
|
|
49
|
-
env = {**self.config.resolved_env}
|
|
50
|
-
args = [
|
|
51
|
-
f"--base-url={endpoint}",
|
|
52
|
-
f"--api-key={secret}",
|
|
53
|
-
f"--model={ctx.model}",
|
|
54
|
-
f"--system-prompt={system_prompt}",
|
|
55
|
-
]
|
|
56
|
-
if mcp_urls:
|
|
57
|
-
# The program connects to the tool servers over HTTP; hand it a standard
|
|
58
|
-
# `mcpServers` URL config (the `mcp` client itself comes from the uv deps).
|
|
59
|
-
args.append(
|
|
60
|
-
"--mcp-config="
|
|
61
|
-
+ json.dumps(
|
|
62
|
-
{
|
|
63
|
-
"mcpServers": {
|
|
64
|
-
name: {"url": url} for name, url in mcp_urls.items()
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
)
|
|
68
|
-
)
|
|
69
|
-
# A Messages prompt (e.g. an image-bearing prompt) seeds the chat loop directly via env
|
|
70
|
-
# (it can be large multimodal content that overflows argv); a plain string is the single
|
|
71
|
-
# first user message; None means the task has no prompt and the user simulator opens it.
|
|
72
|
-
if isinstance(prompt, str):
|
|
73
|
-
args.append(f"--prompt={prompt}")
|
|
74
|
-
elif prompt is not None:
|
|
75
|
-
env["INITIAL_MESSAGES"] = json.dumps([message_to_wire(m) for m in prompt])
|
|
76
|
-
program = await runtime.prepare_uv_script(
|
|
77
|
-
PROGRAM_SOURCE, self.config.resolved_env
|
|
78
|
-
)
|
|
79
|
-
return await runtime.run_program([*program, *args], env)
|