verifiers 0.2.2.dev18__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.dev18 → verifiers-0.2.2.dev19}/PKG-INFO +1 -1
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/pyproject.toml +4 -0
- {verifiers-0.2.2.dev18 → 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.dev18 → 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.dev18 → verifiers-0.2.2.dev19}/tests/v1/fixtures/pyproject.toml +3 -3
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/v1/test_e2e.py +191 -18
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/v1/test_envs.py +3 -0
- {verifiers-0.2.2.dev18 → 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.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/agent.py +297 -29
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/cli/init.py +10 -59
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/configs/init.py +0 -2
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/dialects/base.py +1 -14
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/dialects/chat.py +3 -15
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/dialects/responses.py +0 -72
- {verifiers-0.2.2.dev18 → 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.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/errors.py +3 -7
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harness.py +87 -17
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/bash/harness.py +4 -3
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/claude_code/harness.py +4 -2
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/codex/harness.py +109 -22
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/kimi_code/harness.py +42 -12
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/mini_swe_agent/harness.py +3 -1
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/null/harness.py +4 -3
- verifiers-0.2.2.dev19/verifiers/v1/harnesses/pi/harness.py +248 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/pool/harness.py +29 -60
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/rlm/harness.py +17 -11
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/terminus_2/harness.py +4 -4
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/interception/__init__.py +7 -4
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/interception/base.py +2 -2
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/interception/server.py +143 -196
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/interception/tunnel/custom.py +1 -1
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/mcp/__init__.py +0 -9
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/mcp/launch.py +15 -131
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/rollout.py +114 -51
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/runtimes/subprocess.py +40 -4
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/session.py +2 -15
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/state.py +1 -1
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/task.py +10 -13
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/tasksets/__init__.py +4 -8
- {verifiers-0.2.2.dev18 → 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.dev18 → 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.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/utils/compile.py +2 -8
- verifiers-0.2.2.dev18/tests/v1/fixtures/echo_user_sim_v1.py +0 -83
- verifiers-0.2.2.dev18/verifiers/v1/harnesses/pi/harness.py +0 -276
- verifiers-0.2.2.dev18/verifiers/v1/mcp/user.py +0 -76
- verifiers-0.2.2.dev18/verifiers/v1/tasksets/openenv/taskset.py +0 -154
- verifiers-0.2.2.dev18/verifiers/v1/tasksets/textarena/taskset.py +0 -152
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/.gitignore +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/LICENSE +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/README.md +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/conftest.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_build_script.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_client_config.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_env_group.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_env_server.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_environment.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_imports.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_init_script.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_logging.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_parser.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_rubric.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_types.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/v1/fixtures/duet_v1.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/v1/test_configs.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/v1/test_graph.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/v1/test_judges.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/v1/test_taskset.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/tests/v1/test_trace.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/decorators.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/errors.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/types.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/cli/debug.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/configs/debug.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/configs/replay.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/envs/agentic_judge/env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/episode.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/graph.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/bash/program.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/pool/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/judge.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/push.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/retries.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/runtimes/docker/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/trace.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/types.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev19}/verifiers/v1/utils/sampling.py +0 -0
- {verifiers-0.2.2.dev18 → 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
|
]
|
|
@@ -41,19 +41,26 @@ AGENTIC_PLACEMENTS = [
|
|
|
41
41
|
_pair("bash", "modal", "bash-harness-in-modal"),
|
|
42
42
|
]
|
|
43
43
|
|
|
44
|
-
#
|
|
45
|
-
#
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
_pair("docker", "subprocess", "harness-in-docker-with-user-in-subprocess"),
|
|
52
|
-
_pair("modal", "colocated", "harness-in-modal-with-user-colocated"),
|
|
53
|
-
_pair("subprocess", "modal", "harness-in-subprocess-with-user-in-modal"),
|
|
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"),
|
|
54
51
|
]
|
|
55
52
|
|
|
56
|
-
#
|
|
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"),
|
|
61
|
+
]
|
|
62
|
+
|
|
63
|
+
# harness runtime x tool placement: every axis value once plus the two-container case
|
|
57
64
|
# (harness and tool in separate docker boxes) and a prime-colocated row (a tool in its
|
|
58
65
|
# OWN prime sandbox needs port exposure; colocated rides the harness's box).
|
|
59
66
|
TOOL_PLACEMENTS = [
|
|
@@ -99,6 +106,7 @@ async def test_single_turn(run_v1, harness, harness_runtime, tmp_path):
|
|
|
99
106
|
)
|
|
100
107
|
assert trace.ok
|
|
101
108
|
assert trace.num_turns == 1
|
|
109
|
+
assert trace.stop_condition == "agent_completed"
|
|
102
110
|
assert trace.reward == 1.0
|
|
103
111
|
# The seat's resolved identity rides the trace (policy metadata for trainers).
|
|
104
112
|
assert trace.agent is not None and trace.agent.sampling.temperature == 0
|
|
@@ -111,25 +119,94 @@ async def test_single_turn(run_v1, harness, harness_runtime, tmp_path):
|
|
|
111
119
|
|
|
112
120
|
|
|
113
121
|
@pytest.mark.e2e
|
|
114
|
-
@pytest.mark.parametrize("harness_runtime
|
|
115
|
-
async def test_user(run_v1, harness_runtime,
|
|
116
|
-
"""Multi-turn, driven by a
|
|
117
|
-
|
|
118
|
-
the
|
|
119
|
-
|
|
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."""
|
|
120
130
|
(trace,) = await run_v1(
|
|
121
131
|
"echo-user-sim-v1",
|
|
122
132
|
harness="null",
|
|
123
133
|
harness_overrides={"runtime": {"type": harness_runtime}},
|
|
124
134
|
output_dir=tmp_path,
|
|
125
135
|
max_turns=6,
|
|
126
|
-
taskset_overrides={"task": {"user": user_runtime}},
|
|
127
136
|
)
|
|
128
137
|
assert trace.ok
|
|
129
138
|
assert trace.num_turns >= 2 # genuinely multi-turn
|
|
139
|
+
assert trace.stop_condition == "user_closed" # leaving the interaction ended it
|
|
130
140
|
assert trace.reward == 1.0
|
|
131
141
|
|
|
132
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
|
+
|
|
133
210
|
@pytest.mark.e2e
|
|
134
211
|
@pytest.mark.parametrize("harness_runtime,tool_runtime", TOOL_PLACEMENTS, indirect=True)
|
|
135
212
|
async def test_tool(run_v1, harness_runtime, tool_runtime, tmp_path):
|
|
@@ -347,6 +424,102 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
|
|
|
347
424
|
assert 0.0 <= solver.rewards["judge"] <= 1.0
|
|
348
425
|
|
|
349
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
|
+
|
|
350
523
|
@pytest.mark.e2e
|
|
351
524
|
async def test_multi_agent_env_server(run_v1_server, tmp_path):
|
|
352
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
|
|
|
@@ -2,6 +2,7 @@ import logging as _logging
|
|
|
2
2
|
|
|
3
3
|
from pydantic_config import BaseConfig
|
|
4
4
|
|
|
5
|
+
from verifiers.v1.acp import ACP
|
|
5
6
|
from verifiers.v1.clients import (
|
|
6
7
|
BaseClientConfig,
|
|
7
8
|
Client,
|
|
@@ -12,7 +13,14 @@ from verifiers.v1.clients import (
|
|
|
12
13
|
resolve_client,
|
|
13
14
|
)
|
|
14
15
|
from verifiers.v1.decorators import metric, reward, stop, tool
|
|
15
|
-
from verifiers.v1.agent import
|
|
16
|
+
from verifiers.v1.agent import (
|
|
17
|
+
Agent,
|
|
18
|
+
AgentConfig,
|
|
19
|
+
Agents,
|
|
20
|
+
Interaction,
|
|
21
|
+
Segment,
|
|
22
|
+
make_agent,
|
|
23
|
+
)
|
|
16
24
|
from verifiers.v1.configs.env import (
|
|
17
25
|
ElasticPoolConfig,
|
|
18
26
|
EnvServerConfig,
|
|
@@ -35,7 +43,6 @@ from verifiers.v1.errors import (
|
|
|
35
43
|
TaskError,
|
|
36
44
|
ToolsetError,
|
|
37
45
|
TunnelError,
|
|
38
|
-
UserError,
|
|
39
46
|
)
|
|
40
47
|
from verifiers.v1.harness import Harness, HarnessConfig
|
|
41
48
|
from verifiers.v1.judge import (
|
|
@@ -108,8 +115,6 @@ from verifiers.v1.mcp import (
|
|
|
108
115
|
Toolset,
|
|
109
116
|
SharedToolsetConfig,
|
|
110
117
|
ToolsetConfig,
|
|
111
|
-
User,
|
|
112
|
-
UserConfig,
|
|
113
118
|
)
|
|
114
119
|
from verifiers.v1.graph import MessageNode
|
|
115
120
|
from verifiers.v1.episode import Episode, WireEpisode
|
|
@@ -216,7 +221,6 @@ __all__ = [
|
|
|
216
221
|
"ProviderError",
|
|
217
222
|
"HarnessError",
|
|
218
223
|
"ToolsetError",
|
|
219
|
-
"UserError",
|
|
220
224
|
"SandboxError",
|
|
221
225
|
"TaskError",
|
|
222
226
|
"InterceptionError",
|
|
@@ -235,6 +239,7 @@ __all__ = [
|
|
|
235
239
|
"BaseConfig",
|
|
236
240
|
"Harness",
|
|
237
241
|
"HarnessConfig",
|
|
242
|
+
"ACP",
|
|
238
243
|
"ModelContext",
|
|
239
244
|
"Runtime",
|
|
240
245
|
"RuntimeConfig",
|
|
@@ -302,9 +307,9 @@ __all__ = [
|
|
|
302
307
|
"Toolset",
|
|
303
308
|
"SharedToolsetConfig",
|
|
304
309
|
"ToolsetConfig",
|
|
305
|
-
# user
|
|
306
|
-
"
|
|
307
|
-
"
|
|
310
|
+
# the user channel
|
|
311
|
+
"Interaction",
|
|
312
|
+
"Segment",
|
|
308
313
|
]
|
|
309
314
|
|
|
310
315
|
# The library logs via stdlib logging (per-module `getLogger(__name__)`), but is
|