verifiers 0.2.2.dev17__tar.gz → 0.2.2.dev19__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.2.2.dev17 → verifiers-0.2.2.dev19}/PKG-INFO +1 -1
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/pyproject.toml +4 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/v1/conftest.py +28 -19
- verifiers-0.2.2.dev19/tests/v1/fixtures/echo_acp_resume_v1.py +100 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/v1/fixtures/echo_tool_v1.py +5 -4
- verifiers-0.2.2.dev19/tests/v1/fixtures/echo_user_sim_v1.py +65 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/v1/fixtures/pyproject.toml +3 -3
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/v1/test_e2e.py +199 -24
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/v1/test_envs.py +3 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/__init__.py +13 -8
- verifiers-0.2.2.dev19/verifiers/v1/acp/__init__.py +64 -0
- verifiers-0.2.2.dev19/verifiers/v1/acp/_runner.py +192 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/agent.py +297 -29
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/cli/init.py +10 -59
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/configs/init.py +0 -2
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/dialects/base.py +1 -14
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/dialects/chat.py +3 -15
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/dialects/responses.py +0 -72
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/env.py +3 -3
- verifiers-0.2.2.dev19/verifiers/v1/envs/user_sim/__init__.py +3 -0
- verifiers-0.2.2.dev19/verifiers/v1/envs/user_sim/env.py +95 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/errors.py +3 -7
- verifiers-0.2.2.dev19/verifiers/v1/harness.py +265 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/bash/harness.py +5 -3
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/claude_code/harness.py +8 -3
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/codex/harness.py +112 -22
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/kimi_code/harness.py +45 -12
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/mini_swe_agent/harness.py +3 -1
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/null/harness.py +5 -3
- verifiers-0.2.2.dev19/verifiers/v1/harnesses/pi/harness.py +248 -0
- verifiers-0.2.2.dev19/verifiers/v1/harnesses/pool/harness.py +102 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/rlm/harness.py +26 -16
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/terminus_2/harness.py +6 -14
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/interception/__init__.py +7 -4
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/interception/base.py +2 -2
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/interception/server.py +143 -196
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/interception/tunnel/custom.py +1 -1
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/mcp/__init__.py +0 -9
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/mcp/launch.py +15 -131
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/rollout.py +114 -51
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/runtimes/subprocess.py +40 -4
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/session.py +2 -15
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/state.py +1 -1
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/task.py +10 -13
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/tasksets/__init__.py +4 -8
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/tasksets/openenv/__init__.py +4 -8
- verifiers-0.2.2.dev19/verifiers/v1/tasksets/openenv/taskset.py +154 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/tasksets/textarena/__init__.py +4 -6
- verifiers-0.2.2.dev19/verifiers/v1/tasksets/textarena/taskset.py +117 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/utils/compile.py +12 -6
- verifiers-0.2.2.dev17/tests/v1/fixtures/echo_user_sim_v1.py +0 -83
- verifiers-0.2.2.dev17/verifiers/v1/harness.py +0 -159
- verifiers-0.2.2.dev17/verifiers/v1/harnesses/pi/harness.py +0 -264
- verifiers-0.2.2.dev17/verifiers/v1/harnesses/pool/harness.py +0 -130
- verifiers-0.2.2.dev17/verifiers/v1/mcp/user.py +0 -76
- verifiers-0.2.2.dev17/verifiers/v1/tasksets/openenv/taskset.py +0 -154
- verifiers-0.2.2.dev17/verifiers/v1/tasksets/textarena/taskset.py +0 -152
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/.gitignore +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/LICENSE +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/README.md +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/conftest.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_build_script.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_client_config.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_env_group.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_env_server.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_environment.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_imports.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_init_script.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_logging.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_parser.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_rubric.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_types.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/v1/fixtures/duet_v1.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/v1/test_configs.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/v1/test_graph.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/v1/test_judges.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/v1/test_taskset.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/tests/v1/test_trace.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/decorators.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/errors.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/types.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/configs/debug.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/configs/replay.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/envs/agentic_judge/env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/episode.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/graph.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/bash/program.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/pool/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/judge.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/push.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/retries.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/runtimes/docker/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/trace.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/types.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/utils/sampling.py +0 -0
- {verifiers-0.2.2.dev17 → verifiers-0.2.2.dev19}/verifiers/v1/utils/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.2.2.
|
|
3
|
+
Version: 0.2.2.dev19
|
|
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
|
|
@@ -79,6 +79,7 @@ examples = [
|
|
|
79
79
|
"gsm8k-v1", "glossary-v1", "deepwiki-v1", "wiki-search-v1", "code-golf-v1",
|
|
80
80
|
"proposer-solver-v1", "reverse-text-v1", "color-codeword-v1",
|
|
81
81
|
"wordle-v1", "openenv-wordle-v1", "alphabet-sort-v1", "scratchpad-v1",
|
|
82
|
+
"kuhn-poker-v1",
|
|
82
83
|
]
|
|
83
84
|
|
|
84
85
|
[project.optional-dependencies]
|
|
@@ -131,6 +132,7 @@ openenv-wordle-v1 = { path = "environments/openenv_wordle_v1", editable = true }
|
|
|
131
132
|
color-codeword-v1 = { path = "environments/color_codeword_v1", editable = true }
|
|
132
133
|
alphabet-sort-v1 = { path = "environments/alphabet_sort_v1", editable = true }
|
|
133
134
|
scratchpad-v1 = { path = "environments/scratchpad_v1", editable = true }
|
|
135
|
+
kuhn-poker-v1 = { path = "environments/kuhn_poker_v1", editable = true }
|
|
134
136
|
|
|
135
137
|
[tool.uv.exclude-newer-package]
|
|
136
138
|
# PrimeIntellect-published on PyPI (trusted publisher)
|
|
@@ -229,6 +231,8 @@ markers = [
|
|
|
229
231
|
"bash: v1 e2e cases on the bash harness",
|
|
230
232
|
"rlm: v1 e2e cases on the rlm harness",
|
|
231
233
|
"kimi_code: v1 e2e cases on the kimi-code harness",
|
|
234
|
+
"pi: v1 e2e cases on the pi harness",
|
|
235
|
+
"pool: v1 e2e cases on the pool harness",
|
|
232
236
|
"codex: v1 e2e cases on the codex harness",
|
|
233
237
|
"unit: marks tests as unit tests",
|
|
234
238
|
"asyncio: marks tests as async tests",
|
|
@@ -6,7 +6,7 @@ not unit tests of individual components. They need a model API key (`PRIME_API_K
|
|
|
6
6
|
without one the `e2e`-marked tests skip (config parsing still runs).
|
|
7
7
|
|
|
8
8
|
`run_v1` / `run_v0` mirror the eval CLI's two paths (`run_eval` for a v1 taskset,
|
|
9
|
-
`run_legacy_eval` for a v0 env). Placement coverage (harness x harness runtime x
|
|
9
|
+
`run_legacy_eval` for a v0 env). Placement coverage (harness x harness runtime x tool
|
|
10
10
|
server runtime) is PAIRWISE, not a full cross product: each test carries a curated list of
|
|
11
11
|
combinations (in test_e2e.py) that hits every axis value and the cross-boundary pairs with
|
|
12
12
|
distinct networking. The full cross bought flake exposure and CI minutes, not coverage — add
|
|
@@ -24,11 +24,11 @@ Every combination carries its axes' pytest marks, so subsets select with `-m`:
|
|
|
24
24
|
uv run pytest tests/v1 -n auto -m modal # only modal (needs local setup)
|
|
25
25
|
|
|
26
26
|
Marks: runtimes `subprocess` / `docker` / `prime` / `modal`, placement `colocated`,
|
|
27
|
-
harnesses `null` / `bash` / `rlm` / `kimi_code` / `
|
|
28
|
-
axis, so it selects every case touching that value on ANY axis; for one exact
|
|
29
|
-
on the test id (e.g. `-k "harness-in-docker-with-tool-in-subprocess"`).
|
|
30
|
-
remote sandboxes (slow, infra-flaky, need setup), so they're local-only
|
|
31
|
-
`-m "not prime and not modal"`.
|
|
27
|
+
harnesses `null` / `bash` / `rlm` / `kimi_code` / `pi` / `pool` / `codex` / `claude_code`.
|
|
28
|
+
A mark is applied per axis, so it selects every case touching that value on ANY axis; for one exact
|
|
29
|
+
combination use `-k` on the test id (e.g. `-k "harness-in-docker-with-tool-in-subprocess"`).
|
|
30
|
+
prime/modal provision real remote sandboxes (slow, infra-flaky, need setup), so they're local-only
|
|
31
|
+
— CI runs `-m "not prime and not modal"`.
|
|
32
32
|
"""
|
|
33
33
|
|
|
34
34
|
import os
|
|
@@ -56,15 +56,6 @@ def harness_runtime(request) -> str:
|
|
|
56
56
|
return request.param
|
|
57
57
|
|
|
58
58
|
|
|
59
|
-
@pytest.fixture
|
|
60
|
-
def user_runtime(request) -> dict:
|
|
61
|
-
"""A `taskset.task.user` override placing the user simulator: `colocated` (inside the harness's
|
|
62
|
-
runtime) or its own runtime, by type."""
|
|
63
|
-
if request.param == "colocated":
|
|
64
|
-
return {"colocated": True}
|
|
65
|
-
return {"colocated": False, "runtime": {"type": request.param}}
|
|
66
|
-
|
|
67
|
-
|
|
68
59
|
@pytest.fixture
|
|
69
60
|
def tool_runtime(request) -> dict:
|
|
70
61
|
"""A `taskset.task.tools` override placing the tool server: `colocated` (inside the harness's
|
|
@@ -83,9 +74,9 @@ def harness(request) -> str:
|
|
|
83
74
|
|
|
84
75
|
|
|
85
76
|
def pytest_configure(config) -> None:
|
|
86
|
-
"""Self-launching tool
|
|
77
|
+
"""Self-launching tool servers run `python -m <module>` in a fresh subprocess, which
|
|
87
78
|
inherits `PYTHONPATH` but not pytest's in-process `pythonpath`. Put the fixture dir on
|
|
88
|
-
`PYTHONPATH` so a fixture server module (e.g. `
|
|
79
|
+
`PYTHONPATH` so a fixture server module (e.g. `tool_response_image_v1`)
|
|
89
80
|
resolves there too — an installed example package (e.g. `glossary_v1`) already would."""
|
|
90
81
|
fixtures = str(Path(__file__).parent / "fixtures")
|
|
91
82
|
existing = os.environ.get("PYTHONPATH", "")
|
|
@@ -107,12 +98,12 @@ def pytest_collection_modifyitems(config, items) -> None:
|
|
|
107
98
|
|
|
108
99
|
|
|
109
100
|
def _configure_prime_runtimes(config: dict) -> None:
|
|
110
|
-
"""Configure every prime runtime config (nested — harness / tool
|
|
101
|
+
"""Configure every prime runtime config (nested — harness / tool): tag a `vf-ci` label
|
|
111
102
|
for optional cleanup, and pin a region that supports port exposure."""
|
|
112
103
|
if isinstance(config, dict):
|
|
113
104
|
if config.get("type") == "prime":
|
|
114
105
|
config.setdefault("labels", ["vf-ci"])
|
|
115
|
-
# `us` is required for prime's port exposure, which a tool
|
|
106
|
+
# `us` is required for prime's port exposure, which a tool server hosted in a
|
|
116
107
|
# sandbox needs to be reachable from outside it.
|
|
117
108
|
config.setdefault("region", "us")
|
|
118
109
|
for value in config.values():
|
|
@@ -221,6 +212,24 @@ def run_v1_server():
|
|
|
221
212
|
return _run
|
|
222
213
|
|
|
223
214
|
|
|
215
|
+
@pytest.fixture
|
|
216
|
+
async def live_ctx():
|
|
217
|
+
"""A live `ModelContext` (the e2e default model + endpoint, greedy) for driving
|
|
218
|
+
`Agent` directly — the agent-surface counterpart of `run_v1`."""
|
|
219
|
+
from verifiers.v1.clients import EvalClientConfig, ModelContext, resolve_client
|
|
220
|
+
from verifiers.v1.types import SamplingConfig
|
|
221
|
+
|
|
222
|
+
client = resolve_client(EvalClientConfig())
|
|
223
|
+
try:
|
|
224
|
+
yield ModelContext(
|
|
225
|
+
model="deepseek/deepseek-v4-flash",
|
|
226
|
+
client=client,
|
|
227
|
+
sampling=SamplingConfig(max_tokens=2048, temperature=0),
|
|
228
|
+
)
|
|
229
|
+
finally:
|
|
230
|
+
await client.close()
|
|
231
|
+
|
|
232
|
+
|
|
224
233
|
@pytest.fixture
|
|
225
234
|
def run_v0():
|
|
226
235
|
"""Run a legacy v0 env through the v1 bridge (the eval CLI's `--id` path)."""
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"""Two-segment ACP continuation with an MCP call after resume."""
|
|
2
|
+
|
|
3
|
+
import verifiers.v1 as vf
|
|
4
|
+
|
|
5
|
+
CODEWORD = "violet-cascade-731"
|
|
6
|
+
TOOL_STAMP = "resume-ok-9d2"
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def _key(text: str) -> str:
|
|
10
|
+
return "".join(character for character in text.casefold() if character.isalnum())
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ResumeToolset(vf.Toolset[vf.ToolsetConfig]):
|
|
14
|
+
TOOL_PREFIX = "resume"
|
|
15
|
+
|
|
16
|
+
@vf.tool
|
|
17
|
+
def recall(self, codeword: str) -> str:
|
|
18
|
+
"""Return the supplied codeword with a private verification stamp."""
|
|
19
|
+
return f"{codeword} [{TOOL_STAMP}]"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class ACPResumeTaskConfig(vf.TaskConfig):
|
|
23
|
+
tools: vf.ToolsetConfig = vf.ToolsetConfig(colocated=True)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ACPResumeConfig(vf.TasksetConfig):
|
|
27
|
+
task: ACPResumeTaskConfig = ACPResumeTaskConfig()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ACPResumeTask(vf.Task[vf.TaskData, vf.State, ACPResumeTaskConfig]):
|
|
31
|
+
tools = (ResumeToolset,)
|
|
32
|
+
|
|
33
|
+
@vf.reward(weight=1.0)
|
|
34
|
+
async def resumed(self, trace: vf.Trace) -> float:
|
|
35
|
+
segments = trace.info.get("acp_segments", [])
|
|
36
|
+
if len(segments) != 2:
|
|
37
|
+
return 0.0
|
|
38
|
+
first, second = segments
|
|
39
|
+
resumed_tool_output = "\n".join(second["tool_outputs"])
|
|
40
|
+
return float(
|
|
41
|
+
bool(first["last_reply"].strip())
|
|
42
|
+
and _key(CODEWORD) in _key(second["last_reply"])
|
|
43
|
+
and _key(TOOL_STAMP) in _key(second["last_reply"])
|
|
44
|
+
and _key(CODEWORD) in _key(resumed_tool_output)
|
|
45
|
+
and _key(TOOL_STAMP) in _key(resumed_tool_output)
|
|
46
|
+
and "tool" in second["roles"]
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class ACPResumeEnv(vf.SingleAgentEnv):
|
|
51
|
+
async def run(self, task, agents):
|
|
52
|
+
async with agents.agent.interaction(task) as interaction:
|
|
53
|
+
first = await interaction.turn(
|
|
54
|
+
f"Remember the codeword {CODEWORD}. Reply with exactly READY."
|
|
55
|
+
)
|
|
56
|
+
segments = [first]
|
|
57
|
+
if not first.terminated:
|
|
58
|
+
segments.append(
|
|
59
|
+
await interaction.turn(
|
|
60
|
+
"Call `resume_recall` with the codeword from my previous "
|
|
61
|
+
"message, then reply with exactly the tool result."
|
|
62
|
+
)
|
|
63
|
+
)
|
|
64
|
+
interaction.trace.info["acp_segments"] = [
|
|
65
|
+
{
|
|
66
|
+
"roles": [message.role for message in segment.messages],
|
|
67
|
+
"tool_outputs": [
|
|
68
|
+
str(message.content)
|
|
69
|
+
for message in segment.messages
|
|
70
|
+
if message.role == "tool"
|
|
71
|
+
],
|
|
72
|
+
"last_reply": segment.last_reply,
|
|
73
|
+
"terminated": segment.terminated,
|
|
74
|
+
}
|
|
75
|
+
for segment in segments
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class ACPResumeTaskset(vf.Taskset[ACPResumeTask, ACPResumeConfig]):
|
|
80
|
+
def load(self) -> list[ACPResumeTask]:
|
|
81
|
+
return [
|
|
82
|
+
ACPResumeTask(
|
|
83
|
+
vf.TaskData(
|
|
84
|
+
idx=0,
|
|
85
|
+
prompt=None,
|
|
86
|
+
system_prompt=(
|
|
87
|
+
"Follow each user instruction exactly. Preserve conversational "
|
|
88
|
+
"context between turns and use requested tools."
|
|
89
|
+
),
|
|
90
|
+
),
|
|
91
|
+
self.config.task,
|
|
92
|
+
)
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
__all__ = ["ACPResumeTaskset", "ACPResumeEnv"]
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
if __name__ == "__main__":
|
|
100
|
+
ResumeToolset.run()
|
|
@@ -33,10 +33,11 @@ class EchoToolTask(vf.Task[vf.TaskData, vf.State, EchoToolTaskConfig]):
|
|
|
33
33
|
|
|
34
34
|
@vf.reward(weight=1.0)
|
|
35
35
|
async def echoed(self, trace: vf.Trace) -> float:
|
|
36
|
-
# The stamped token
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
# The stamped token surfaces in an ASSISTANT message only if the model called
|
|
37
|
+
# the MCP tool and relayed its result — wherever in the exchange that happened
|
|
38
|
+
# (in a conversation the last turn may be a closing pleasantry).
|
|
39
|
+
replies = ((m.content or "").lower() for m in trace.assistant_messages)
|
|
40
|
+
return float(any(PHRASE in r and ECHO_TOKEN in r for r in replies))
|
|
40
41
|
|
|
41
42
|
|
|
42
43
|
class EchoToolConfig(vf.TasksetConfig):
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"""Multi-turn echo driven by a scripted user — the single user-sim mechanism.
|
|
2
|
+
|
|
3
|
+
The env's `run()` scripts the user through an interaction. The task is
|
|
4
|
+
prompt-less, so the first `turn(phrase)` opens the conversation; each later turn
|
|
5
|
+
resumes the harness onto the accreted conversation, and leaving the `async with`
|
|
6
|
+
closes the interaction (the trace stops as `user_closed`).
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import verifiers.v1 as vf
|
|
10
|
+
|
|
11
|
+
PHRASES = ["hello world", "goodbye world"]
|
|
12
|
+
SYSTEM = "Repeat the user's message back to them exactly, with no extra words."
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _key(text: str) -> str:
|
|
16
|
+
return "".join(c for c in text.casefold() if c.isalnum())
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class EchoUserSimConfig(vf.TasksetConfig):
|
|
20
|
+
phrases: list[str] = PHRASES
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class EchoUserSimData(vf.TaskData):
|
|
24
|
+
phrases: list[str]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class EchoUserSimTask(vf.Task[EchoUserSimData, vf.State, vf.TaskConfig]):
|
|
28
|
+
@vf.reward(weight=1.0)
|
|
29
|
+
async def echoed(self, trace: vf.Trace) -> float:
|
|
30
|
+
replies = [m.content for m in trace.assistant_messages]
|
|
31
|
+
phrases = self.data.phrases
|
|
32
|
+
if len(replies) < len(phrases):
|
|
33
|
+
return 0.0
|
|
34
|
+
matched = sum(_key(p) in _key(r or "") for r, p in zip(replies, phrases))
|
|
35
|
+
return matched / len(phrases)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class EchoUserSimEnv(vf.SingleAgentEnv):
|
|
39
|
+
"""Scripts the user side: opens with the first phrase, follows with the rest."""
|
|
40
|
+
|
|
41
|
+
async def run(self, task, agents):
|
|
42
|
+
# An interaction scripting the user: the task carries no prompt, so the
|
|
43
|
+
# first turn opens the conversation.
|
|
44
|
+
async with agents.agent.interaction(task) as interaction:
|
|
45
|
+
for phrase in task.data.phrases:
|
|
46
|
+
if (await interaction.turn(phrase)).terminated:
|
|
47
|
+
break
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class EchoUserSimTaskset(vf.Taskset[EchoUserSimTask, EchoUserSimConfig]):
|
|
51
|
+
def load(self) -> list[EchoUserSimTask]:
|
|
52
|
+
return [
|
|
53
|
+
EchoUserSimTask(
|
|
54
|
+
EchoUserSimData(
|
|
55
|
+
idx=0,
|
|
56
|
+
# No prompt: the scripted user opens the conversation.
|
|
57
|
+
prompt=None,
|
|
58
|
+
system_prompt=SYSTEM,
|
|
59
|
+
phrases=self.config.phrases,
|
|
60
|
+
)
|
|
61
|
+
)
|
|
62
|
+
]
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
__all__ = ["EchoUserSimTaskset", "EchoUserSimEnv"]
|
|
@@ -9,13 +9,13 @@ dependencies = ["verifiers"]
|
|
|
9
9
|
requires = ["hatchling"]
|
|
10
10
|
build-backend = "hatchling.build"
|
|
11
11
|
|
|
12
|
-
# Flat fixture modules whose tool
|
|
13
|
-
# be importable there. The others (echo_v1, echo_*_v0) have no server, so they
|
|
12
|
+
# Flat fixture modules whose tool servers self-launch in a sandbox (docker/prime) and so must
|
|
13
|
+
# be importable there. The others (echo_v1, echo_user_sim_v1, echo_*_v0) have no server, so they
|
|
14
|
+
# never get installed.
|
|
14
15
|
[tool.hatch.build]
|
|
15
16
|
include = [
|
|
16
17
|
"counter_tool_v1.py",
|
|
17
18
|
"echo_tool_v1.py",
|
|
18
|
-
"echo_user_sim_v1.py",
|
|
19
19
|
"tool_response_image_v1.py",
|
|
20
20
|
"pyproject.toml",
|
|
21
21
|
]
|
|
@@ -15,43 +15,52 @@ def _pair(a: str, b: str, id: str, *extra_marks):
|
|
|
15
15
|
return pytest.param(a, b, marks=[*marks, *extra_marks], id=id)
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
# harness x harness runtime: every harness once, both local runtimes hit
|
|
19
|
-
#
|
|
18
|
+
# harness x harness runtime: every harness once, both local runtimes hit (subprocess
|
|
19
|
+
# only carries the in-house loops — the rest NEEDS_CONTAINER), one remote row per
|
|
20
|
+
# provider. codex/claude-code are excluded here (unreliable on a no-op echo chat
|
|
20
21
|
# task) — test_agentic covers them.
|
|
21
22
|
CHAT_PLACEMENTS = [
|
|
22
23
|
_pair("null", "subprocess", "null-harness-in-subprocess"),
|
|
23
24
|
_pair("bash", "docker", "bash-harness-in-docker"),
|
|
24
|
-
_pair("rlm", "
|
|
25
|
+
_pair("rlm", "docker", "rlm-harness-in-docker"),
|
|
25
26
|
_pair("kimi-code", "docker", "kimi-code-harness-in-docker"),
|
|
26
27
|
_pair("bash", "prime", "bash-harness-in-prime"),
|
|
27
28
|
_pair("bash", "modal", "bash-harness-in-modal"),
|
|
28
29
|
]
|
|
29
30
|
|
|
30
31
|
# harness x harness runtime for the shell task: every coding agent once (null is a chat
|
|
31
|
-
# loop with no shell), both local runtimes hit
|
|
32
|
+
# loop with no shell), both local runtimes hit (subprocess only carries bash), one
|
|
33
|
+
# remote row per provider.
|
|
32
34
|
AGENTIC_PLACEMENTS = [
|
|
33
35
|
_pair("bash", "subprocess", "bash-harness-in-subprocess"),
|
|
34
36
|
_pair("rlm", "docker", "rlm-harness-in-docker"),
|
|
35
|
-
_pair("kimi-code", "
|
|
37
|
+
_pair("kimi-code", "docker", "kimi-code-harness-in-docker"),
|
|
36
38
|
_pair("codex", "docker", "codex-harness-in-docker"),
|
|
37
|
-
_pair("claude-code", "
|
|
39
|
+
_pair("claude-code", "docker", "claude-code-harness-in-docker"),
|
|
38
40
|
_pair("bash", "prime", "bash-harness-in-prime"),
|
|
39
41
|
_pair("bash", "modal", "bash-harness-in-modal"),
|
|
40
42
|
]
|
|
41
43
|
|
|
42
|
-
#
|
|
43
|
-
#
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
44
|
+
# The scripted user runs in the eval process itself (no placement axis); the harness
|
|
45
|
+
# runtime is the exchange's only axis.
|
|
46
|
+
USER_RUNTIMES = [
|
|
47
|
+
pytest.param("subprocess", marks=[_m.subprocess], id="harness-in-subprocess"),
|
|
48
|
+
pytest.param("docker", marks=[_m.docker], id="harness-in-docker"),
|
|
49
|
+
pytest.param("prime", marks=[_m.prime], id="harness-in-prime"),
|
|
50
|
+
pytest.param("modal", marks=[_m.modal], id="harness-in-modal"),
|
|
51
|
+
]
|
|
52
|
+
|
|
53
|
+
# ACP-backed harnesses: each must preserve an exchange across process relaunches and
|
|
54
|
+
# retain MCP access after resuming. Cover every harness in the local container runtime,
|
|
55
|
+
# plus one remote placement for the sandbox/tunnel boundary.
|
|
56
|
+
ACP_RESUME_PLACEMENTS = [
|
|
57
|
+
_pair("kimi-code", "docker", "kimi-code-acp-in-docker"),
|
|
58
|
+
_pair("pi", "docker", "pi-acp-in-docker"),
|
|
59
|
+
_pair("pool", "docker", "pool-acp-in-docker"),
|
|
60
|
+
_pair("pool", "prime", "pool-acp-in-prime"),
|
|
52
61
|
]
|
|
53
62
|
|
|
54
|
-
# harness runtime x tool placement:
|
|
63
|
+
# harness runtime x tool placement: every axis value once plus the two-container case
|
|
55
64
|
# (harness and tool in separate docker boxes) and a prime-colocated row (a tool in its
|
|
56
65
|
# OWN prime sandbox needs port exposure; colocated rides the harness's box).
|
|
57
66
|
TOOL_PLACEMENTS = [
|
|
@@ -97,6 +106,7 @@ async def test_single_turn(run_v1, harness, harness_runtime, tmp_path):
|
|
|
97
106
|
)
|
|
98
107
|
assert trace.ok
|
|
99
108
|
assert trace.num_turns == 1
|
|
109
|
+
assert trace.stop_condition == "agent_completed"
|
|
100
110
|
assert trace.reward == 1.0
|
|
101
111
|
# The seat's resolved identity rides the trace (policy metadata for trainers).
|
|
102
112
|
assert trace.agent is not None and trace.agent.sampling.temperature == 0
|
|
@@ -109,25 +119,94 @@ async def test_single_turn(run_v1, harness, harness_runtime, tmp_path):
|
|
|
109
119
|
|
|
110
120
|
|
|
111
121
|
@pytest.mark.e2e
|
|
112
|
-
@pytest.mark.parametrize("harness_runtime
|
|
113
|
-
async def test_user(run_v1, harness_runtime,
|
|
114
|
-
"""Multi-turn, driven by a
|
|
115
|
-
|
|
116
|
-
the
|
|
117
|
-
|
|
122
|
+
@pytest.mark.parametrize("harness_runtime", USER_RUNTIMES, indirect=True)
|
|
123
|
+
async def test_user(run_v1, harness_runtime, tmp_path):
|
|
124
|
+
"""Multi-turn, driven by a scripted user — an interaction loop in the env's
|
|
125
|
+
`run()` — across the harness runtime axis. The task is prompt-less, so one
|
|
126
|
+
run covers the whole exchange shape: the caller opens (the user speaks first),
|
|
127
|
+
each later turn resumes the harness onto the conversation, and leaving the loop
|
|
128
|
+
ends the exchange (`user_closed`). The user runs in the eval process itself, so
|
|
129
|
+
there is no placement axis."""
|
|
118
130
|
(trace,) = await run_v1(
|
|
119
131
|
"echo-user-sim-v1",
|
|
120
132
|
harness="null",
|
|
121
133
|
harness_overrides={"runtime": {"type": harness_runtime}},
|
|
122
134
|
output_dir=tmp_path,
|
|
123
135
|
max_turns=6,
|
|
124
|
-
taskset_overrides={"task": {"user": user_runtime}},
|
|
125
136
|
)
|
|
126
137
|
assert trace.ok
|
|
127
138
|
assert trace.num_turns >= 2 # genuinely multi-turn
|
|
139
|
+
assert trace.stop_condition == "user_closed" # leaving the interaction ended it
|
|
128
140
|
assert trace.reward == 1.0
|
|
129
141
|
|
|
130
142
|
|
|
143
|
+
@pytest.mark.e2e
|
|
144
|
+
async def test_interaction(live_ctx):
|
|
145
|
+
"""Drive an agent turn-by-turn through `agent.interaction()` — the caller IS
|
|
146
|
+
the run's user. Runs on the tool-less `null` harness: nothing but the exchange
|
|
147
|
+
itself, yet a real rollout — trace, scoring, and the `user_closed` stop all
|
|
148
|
+
apply."""
|
|
149
|
+
import verifiers.v1 as vf
|
|
150
|
+
from verifiers.v1.harnesses.null import NullHarnessConfig
|
|
151
|
+
|
|
152
|
+
agent = vf.make_agent(
|
|
153
|
+
vf.AgentConfig(
|
|
154
|
+
harness=NullHarnessConfig(id="null"),
|
|
155
|
+
model=live_ctx.model,
|
|
156
|
+
sampling=live_ctx.sampling,
|
|
157
|
+
),
|
|
158
|
+
client=live_ctx.client,
|
|
159
|
+
)
|
|
160
|
+
task = vf.Task(
|
|
161
|
+
vf.TaskData(
|
|
162
|
+
idx=0,
|
|
163
|
+
prompt=None, # the interaction's caller opens the conversation
|
|
164
|
+
system_prompt="Repeat the user's message back exactly, no extra words.",
|
|
165
|
+
)
|
|
166
|
+
)
|
|
167
|
+
async with agent.interaction(task) as interaction:
|
|
168
|
+
first = await interaction.turn("hello world")
|
|
169
|
+
assert isinstance(first, vf.Segment)
|
|
170
|
+
assert not first.terminated
|
|
171
|
+
assert [message.role for message in first.messages] == ["assistant"]
|
|
172
|
+
assert "hello world" in first.last_reply.lower()
|
|
173
|
+
second = await interaction.turn("goodbye world")
|
|
174
|
+
assert not second.terminated
|
|
175
|
+
assert [message.role for message in second.messages] == ["assistant"]
|
|
176
|
+
assert "goodbye world" in second.last_reply.lower()
|
|
177
|
+
trace = interaction.trace
|
|
178
|
+
assert trace is not None and trace.errors == []
|
|
179
|
+
assert trace.stop_condition == "user_closed" # closing the interaction ended it
|
|
180
|
+
assert trace.num_turns == 2
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
@pytest.mark.e2e
|
|
184
|
+
@pytest.mark.parametrize(
|
|
185
|
+
"harness,harness_runtime", ACP_RESUME_PLACEMENTS, indirect=True
|
|
186
|
+
)
|
|
187
|
+
async def test_acp_resume_with_tool(run_v1, harness, harness_runtime, tmp_path):
|
|
188
|
+
"""Each ACP harness preserves context and MCP access across two segments."""
|
|
189
|
+
(trace,) = await run_v1(
|
|
190
|
+
"echo-acp-resume-v1",
|
|
191
|
+
harness=harness,
|
|
192
|
+
harness_overrides={"runtime": {"type": harness_runtime}},
|
|
193
|
+
output_dir=tmp_path,
|
|
194
|
+
max_turns=8,
|
|
195
|
+
max_tokens=8192,
|
|
196
|
+
rollout_timeout=600,
|
|
197
|
+
)
|
|
198
|
+
assert trace.ok, trace.errors
|
|
199
|
+
assert trace.stop_condition == "user_closed"
|
|
200
|
+
assert trace.rewards["resumed"] == 1.0
|
|
201
|
+
assert trace.tools # ACP-native tools, or Pi's MCP adapter meta-tool
|
|
202
|
+
segments = trace.info["acp_segments"]
|
|
203
|
+
assert len(segments) == 2
|
|
204
|
+
assert segments[0]["terminated"] is False
|
|
205
|
+
assert segments[1]["terminated"] is False
|
|
206
|
+
assert "tool" in segments[1]["roles"]
|
|
207
|
+
assert segments[1]["tool_outputs"]
|
|
208
|
+
|
|
209
|
+
|
|
131
210
|
@pytest.mark.e2e
|
|
132
211
|
@pytest.mark.parametrize("harness_runtime,tool_runtime", TOOL_PLACEMENTS, indirect=True)
|
|
133
212
|
async def test_tool(run_v1, harness_runtime, tool_runtime, tmp_path):
|
|
@@ -345,6 +424,102 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
|
|
|
345
424
|
assert 0.0 <= solver.rewards["judge"] <= 1.0
|
|
346
425
|
|
|
347
426
|
|
|
427
|
+
@pytest.mark.e2e
|
|
428
|
+
async def test_env_id_user_sim(run_v1, tmp_path):
|
|
429
|
+
"""The user-sim env over the echo taskset: a modeled user (null harness) opens
|
|
430
|
+
the conversation from the task's prompt-as-scenario; the assistant's trace is
|
|
431
|
+
judged by the task's own reward; both sides land agent-stamped on one episode."""
|
|
432
|
+
traces = await run_v1(
|
|
433
|
+
"echo-v1",
|
|
434
|
+
harness=None, # multi-agent: each seat pins its own
|
|
435
|
+
env={"id": "user-sim", "assistant": {"harness": {"id": "null"}}},
|
|
436
|
+
output_dir=tmp_path,
|
|
437
|
+
max_turns=6,
|
|
438
|
+
rollout_timeout=300,
|
|
439
|
+
)
|
|
440
|
+
assert sorted(t.agent_name for t in traces) == ["assistant", "user"]
|
|
441
|
+
(assistant,) = [t for t in traces if t.agent_name == "assistant"]
|
|
442
|
+
(user,) = [t for t in traces if t.agent_name == "user"]
|
|
443
|
+
assert assistant.ok and user.ok
|
|
444
|
+
assert user.trainable is False
|
|
445
|
+
assert user.num_turns >= 1 # the modeled user actually spoke
|
|
446
|
+
assert assistant.metrics["user_turns"] >= 1
|
|
447
|
+
# `mask_prompt`: the scenario is hidden from the assistant's harness (the run's
|
|
448
|
+
# visible data) while the task's own rewards still scored the real row. The
|
|
449
|
+
# masked view is what persists (provenance is the row's idx); both sides land
|
|
450
|
+
# as ONE durable episode.
|
|
451
|
+
assert assistant.task.data.prompt is None
|
|
452
|
+
assert "echoed" in assistant.rewards
|
|
453
|
+
from verifiers.v1.cli.output import read_episodes
|
|
454
|
+
from verifiers.v1.trace import WireTrace
|
|
455
|
+
|
|
456
|
+
(record,) = read_episodes(tmp_path, WireTrace)
|
|
457
|
+
assert {t.agent_name for t in record.traces} == {"assistant", "user"}
|
|
458
|
+
assert record.id # both traces are persisted under one durable episode identity
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
@pytest.mark.e2e
|
|
462
|
+
async def test_env_id_user_sim_with_tools(run_v1, tmp_path):
|
|
463
|
+
"""THE tau-bench shape — a tool-using assistant composed with a modeled user.
|
|
464
|
+
The assistant's MCP tool loop runs entirely inside a harness segment and the
|
|
465
|
+
user exchange advances between segments, so the two can never race or amputate
|
|
466
|
+
each other (the failure mode of injecting user turns at the model boundary).
|
|
467
|
+
Reward 1.0 proves the tool actually ran mid-conversation: its token never
|
|
468
|
+
appears in any prompt."""
|
|
469
|
+
traces = await run_v1(
|
|
470
|
+
"echo-tool-v1",
|
|
471
|
+
harness=None, # multi-agent: each seat pins its own
|
|
472
|
+
env={"id": "user-sim", "assistant": {"harness": {"id": "null"}}},
|
|
473
|
+
output_dir=tmp_path,
|
|
474
|
+
max_turns=8,
|
|
475
|
+
# Reasoning models can spend thousands of tokens on a turn; the default
|
|
476
|
+
# 2048 truncates the reply mid-relay, cutting the stamp out of the text.
|
|
477
|
+
max_tokens=8192,
|
|
478
|
+
rollout_timeout=300,
|
|
479
|
+
)
|
|
480
|
+
(assistant,) = [t for t in traces if t.agent_name == "assistant"]
|
|
481
|
+
(user,) = [t for t in traces if t.agent_name == "user"]
|
|
482
|
+
assert assistant.ok and user.ok
|
|
483
|
+
assert assistant.task.data.prompt is None # the scenario stayed off the wire
|
|
484
|
+
assert user.num_turns >= 1 # the modeled user actually drove the exchange
|
|
485
|
+
assert assistant.rewards["echoed"] == 1.0 # the tool ran, mid-conversation
|
|
486
|
+
# The tool was advertised to the masked chat exactly as to any run.
|
|
487
|
+
assert assistant.tools is not None
|
|
488
|
+
assert any(tool.name == "echo_back" for tool in assistant.tools)
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
@pytest.mark.e2e
|
|
492
|
+
async def test_kuhn_poker_self_play(run_v1, tmp_path):
|
|
493
|
+
"""The turn-coupled proof env: one Kuhn poker hand, both seats live interactions
|
|
494
|
+
of the run's own model (self-play), refereed host-side, paid out zero-sum."""
|
|
495
|
+
traces = await run_v1(
|
|
496
|
+
"kuhn-poker-v1",
|
|
497
|
+
harness=None, # both seats pin the null harness themselves
|
|
498
|
+
output_dir=tmp_path,
|
|
499
|
+
max_turns=8,
|
|
500
|
+
# The Q decision (the one mixed-strategy spot in Kuhn) can cost a reasoning
|
|
501
|
+
# model thousands of tokens; the default 2048 truncates to an empty reply AND
|
|
502
|
+
# exhausts the rollout budget, so the invalid-move retry is never served.
|
|
503
|
+
max_tokens=8192,
|
|
504
|
+
rollout_timeout=300,
|
|
505
|
+
)
|
|
506
|
+
assert sorted(t.agent_name for t in traces) == ["player0", "player1"]
|
|
507
|
+
payoffs = {t.agent_name: t.rewards["payoff"] for t in traces}
|
|
508
|
+
assert payoffs["player0"] + payoffs["player1"] == 0 # zero-sum
|
|
509
|
+
assert abs(payoffs["player0"]) in (1.0, 2.0)
|
|
510
|
+
for trace in traces:
|
|
511
|
+
assert trace.ok
|
|
512
|
+
assert trace.info["kuhn"]["seat"] in (0, 1)
|
|
513
|
+
# A played-out hand has both seats speaking. A forfeit (the model never produced
|
|
514
|
+
# a legal move) still pays out zero-sum, but the hand dies mid-exchange, so only
|
|
515
|
+
# the seat that acted is guaranteed a turn — a hand where NOBODY spoke means the
|
|
516
|
+
# exchange machinery never ran at all.
|
|
517
|
+
if traces[0].info["kuhn"]["forfeited"] is None:
|
|
518
|
+
assert all(t.num_turns >= 1 for t in traces)
|
|
519
|
+
else:
|
|
520
|
+
assert any(t.num_turns >= 1 for t in traces)
|
|
521
|
+
|
|
522
|
+
|
|
348
523
|
@pytest.mark.e2e
|
|
349
524
|
async def test_multi_agent_env_server(run_v1_server, tmp_path):
|
|
350
525
|
"""The same env through the env-server pool: the worker rebuilds the role-typed
|
|
@@ -25,7 +25,10 @@ SKIP_EVAL: set[str] = set()
|
|
|
25
25
|
# Per-run caps are seat fields; recipe envs name their own seats.
|
|
26
26
|
SEATS: dict[str, tuple[str, ...]] = {
|
|
27
27
|
"code_golf_v1": ("golfer",),
|
|
28
|
+
"kuhn_poker_v1": ("player0", "player1"),
|
|
29
|
+
"openenv_wordle_v1": ("player",),
|
|
28
30
|
"proposer_solver_v1": ("proposer", "solver"),
|
|
31
|
+
"wordle_v1": ("player",),
|
|
29
32
|
}
|
|
30
33
|
|
|
31
34
|
|