verifiers 0.2.2.dev49__tar.gz → 0.2.2.dev57__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.dev49 → verifiers-0.2.2.dev57}/PKG-INFO +1 -1
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/pyproject.toml +1 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/conftest.py +4 -9
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/counter_tool_v1.py +3 -1
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_acp_resume_v1.py +3 -1
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_tool_v1.py +3 -1
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/tool_response_image_v1.py +17 -3
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/test_color_codeword_tasks.py +1 -3
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/test_e2e.py +29 -8
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/test_judges.py +6 -18
- verifiers-0.2.2.dev57/tests/v1/test_taskset.py +93 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/__init__.py +13 -4
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/agent.py +5 -2
- verifiers-0.2.2.dev57/verifiers/v1/artifacts.py +142 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/dashboard/eval.py +29 -42
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/debug.py +14 -7
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/eval/runner.py +18 -4
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/init.py +7 -2
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/replay.py +3 -3
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/validate.py +8 -1
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/judge.py +3 -10
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/taskset.py +5 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/env.py +9 -16
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/envs/agentic_judge/__init__.py +2 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/envs/agentic_judge/env.py +117 -60
- verifiers-0.2.2.dev57/verifiers/v1/episode.py +83 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/gepa/adapter.py +4 -8
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/gepa/runner.py +18 -2
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/graph.py +3 -4
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/__init__.py +6 -0
- verifiers-0.2.2.dev57/verifiers/v1/harnesses/browser_use/__init__.py +6 -0
- verifiers-0.2.2.dev57/verifiers/v1/harnesses/browser_use/harness.py +125 -0
- verifiers-0.2.2.dev57/verifiers/v1/harnesses/browser_use/program.py +402 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/judge.py +9 -10
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/judges/rubric.py +5 -5
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/legacy.py +4 -3
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/loaders.py +4 -4
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/mcp/launch.py +2 -2
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/mcp/server.py +2 -2
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/rollout.py +8 -8
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/serve/server.py +2 -2
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/state.py +6 -6
- verifiers-0.2.2.dev57/verifiers/v1/task.py +238 -0
- verifiers-0.2.2.dev57/verifiers/v1/taskset.py +110 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/harbor/taskset.py +101 -3
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/lean/taskset.py +1 -2
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/trace.py +22 -23
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/types.py +13 -17
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/compile.py +10 -9
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/generic.py +1 -1
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/git.py +74 -9
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/sampling.py +4 -5
- verifiers-0.2.2.dev49/tests/v1/test_taskset.py +0 -71
- verifiers-0.2.2.dev49/verifiers/v1/episode.py +0 -55
- verifiers-0.2.2.dev49/verifiers/v1/task.py +0 -274
- verifiers-0.2.2.dev49/verifiers/v1/taskset.py +0 -98
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/.gitignore +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/LICENSE +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/README.md +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/conftest.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_build_script.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_client_config.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_env_group.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_env_server.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_environment.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_imports.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_init_script.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_logging.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_parser.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_rubric.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_types.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/duet_v1.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/test_configs.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/test_envs.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/test_graph.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/tests/v1/test_trace.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/decorators.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/errors.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/types.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/acp/_runner.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/agent.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/debug.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/eval.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/init.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/replay.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/serve.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/validate.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/legacy.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/retries.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/configs/task.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/envs/user_sim/env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/errors.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/bash/program.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/pool/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/pool/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/push.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/retries.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/docker/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/session.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev57}/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.dev57
|
|
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
|
|
@@ -234,6 +234,7 @@ markers = [
|
|
|
234
234
|
"colocated: v1 e2e cases with a user/tool server colocated in the harness runtime",
|
|
235
235
|
"null: v1 e2e cases on the null harness",
|
|
236
236
|
"bash: v1 e2e cases on the bash harness",
|
|
237
|
+
"browser_use: v1 e2e cases on the browser_use harness",
|
|
237
238
|
"rlm: v1 e2e cases on the rlm harness",
|
|
238
239
|
"kimi_code: v1 e2e cases on the kimi-code harness",
|
|
239
240
|
"pi: v1 e2e cases on the pi harness",
|
|
@@ -135,10 +135,6 @@ def _eval_config(
|
|
|
135
135
|
`{id: ...}` config; `runtime` places the `agent` seat's harness (an agent field, not a
|
|
136
136
|
harness one); `model` overrides the default text model (e.g. a VLM for an image task).
|
|
137
137
|
|
|
138
|
-
`temperature=0` (greedy) makes the run reproducible; `max_tokens` is generous headroom,
|
|
139
|
-
not a target — these trivial tasks finish in a few hundred tokens, so capping tighter only
|
|
140
|
-
risks truncating the reasoning before the answer (which tanks the reward).
|
|
141
|
-
|
|
142
138
|
`harness=None` leaves every seat on its own story — the multi-agent case: there
|
|
143
139
|
is no run-level harness, so a single-agent test's `harness` lands on the `agent`
|
|
144
140
|
seat and a multi-agent test pins its seats through `env` role fields instead."""
|
|
@@ -175,7 +171,6 @@ def _eval_config(
|
|
|
175
171
|
num_rollouts=n,
|
|
176
172
|
sampling={
|
|
177
173
|
"max_tokens": max_tokens,
|
|
178
|
-
"temperature": 0,
|
|
179
174
|
"reasoning_effort": reasoning_effort,
|
|
180
175
|
},
|
|
181
176
|
rich=False,
|
|
@@ -219,8 +214,8 @@ def run_v1_server():
|
|
|
219
214
|
|
|
220
215
|
@pytest.fixture
|
|
221
216
|
async def live_ctx():
|
|
222
|
-
"""A live `ModelContext` (the e2e default model + endpoint,
|
|
223
|
-
`Agent` directly — the agent-surface counterpart of `run_v1`."""
|
|
217
|
+
"""A live `ModelContext` (the e2e default model + endpoint, provider-default
|
|
218
|
+
sampling) for driving `Agent` directly — the agent-surface counterpart of `run_v1`."""
|
|
224
219
|
from verifiers.v1.clients import EvalClientConfig, ModelContext, resolve_client
|
|
225
220
|
from verifiers.v1.types import SamplingConfig
|
|
226
221
|
|
|
@@ -229,7 +224,7 @@ async def live_ctx():
|
|
|
229
224
|
yield ModelContext(
|
|
230
225
|
model="deepseek/deepseek-v4-flash",
|
|
231
226
|
client=client,
|
|
232
|
-
sampling=SamplingConfig(max_tokens=2048
|
|
227
|
+
sampling=SamplingConfig(max_tokens=2048),
|
|
233
228
|
)
|
|
234
229
|
finally:
|
|
235
230
|
await client.close()
|
|
@@ -252,7 +247,7 @@ def run_v0():
|
|
|
252
247
|
legacy={"id": env_id, "args": args or {}},
|
|
253
248
|
num_tasks=1,
|
|
254
249
|
num_rollouts=n,
|
|
255
|
-
sampling={"max_tokens": max_tokens
|
|
250
|
+
sampling={"max_tokens": max_tokens},
|
|
256
251
|
rich=False,
|
|
257
252
|
output_dir=output_dir,
|
|
258
253
|
)
|
|
@@ -24,7 +24,9 @@ class CounterTaskConfig(vf.TaskConfig):
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
class CounterTask(vf.Task[vf.TaskData, CounterState, CounterTaskConfig]):
|
|
27
|
-
|
|
27
|
+
@classmethod
|
|
28
|
+
def toolsets(cls, config: CounterTaskConfig) -> list[vf.Toolset]:
|
|
29
|
+
return [CounterToolset(config.tools)]
|
|
28
30
|
|
|
29
31
|
@vf.reward(weight=1.0)
|
|
30
32
|
async def counted(self, trace: vf.Trace) -> float:
|
|
@@ -28,7 +28,9 @@ class ACPResumeConfig(vf.TasksetConfig):
|
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
class ACPResumeTask(vf.Task[vf.TaskData, vf.State, ACPResumeTaskConfig]):
|
|
31
|
-
|
|
31
|
+
@classmethod
|
|
32
|
+
def toolsets(cls, config: ACPResumeTaskConfig) -> list[vf.Toolset]:
|
|
33
|
+
return [ResumeToolset(config.tools)]
|
|
32
34
|
|
|
33
35
|
@vf.reward(weight=1.0)
|
|
34
36
|
async def resumed(self, trace: vf.Trace) -> float:
|
|
@@ -29,7 +29,9 @@ class EchoToolTaskConfig(vf.TaskConfig):
|
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
class EchoToolTask(vf.Task[vf.TaskData, vf.State, EchoToolTaskConfig]):
|
|
32
|
-
|
|
32
|
+
@classmethod
|
|
33
|
+
def toolsets(cls, config: EchoToolTaskConfig) -> list[vf.Toolset]:
|
|
34
|
+
return [EchoToolset(config.tools)]
|
|
33
35
|
|
|
34
36
|
@vf.reward(weight=1.0)
|
|
35
37
|
async def echoed(self, trace: vf.Trace) -> float:
|
|
@@ -26,8 +26,16 @@ class VisionToolset(vf.Toolset[vf.ToolsetConfig]):
|
|
|
26
26
|
]
|
|
27
27
|
|
|
28
28
|
|
|
29
|
-
class
|
|
30
|
-
tools = (
|
|
29
|
+
class ToolResponseImageTaskConfig(vf.TaskConfig):
|
|
30
|
+
tools: vf.ToolsetConfig = vf.ToolsetConfig()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class ToolResponseImageTask(
|
|
34
|
+
vf.Task[vf.TaskData, vf.State, ToolResponseImageTaskConfig]
|
|
35
|
+
):
|
|
36
|
+
@classmethod
|
|
37
|
+
def toolsets(cls, config: ToolResponseImageTaskConfig) -> list[vf.Toolset]:
|
|
38
|
+
return [VisionToolset(config.tools)]
|
|
31
39
|
|
|
32
40
|
@vf.reward(weight=1.0)
|
|
33
41
|
async def preserved_image_tool_result(self, trace: vf.Trace) -> float:
|
|
@@ -39,7 +47,13 @@ class ToolResponseImageTask(vf.Task):
|
|
|
39
47
|
return 0.0
|
|
40
48
|
|
|
41
49
|
|
|
42
|
-
class
|
|
50
|
+
class ToolResponseImageConfig(vf.TasksetConfig):
|
|
51
|
+
task: ToolResponseImageTaskConfig = ToolResponseImageTaskConfig()
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class ToolResponseImageTaskset(
|
|
55
|
+
vf.Taskset[ToolResponseImageTask, ToolResponseImageConfig]
|
|
56
|
+
):
|
|
43
57
|
def load(self) -> list[ToolResponseImageTask]:
|
|
44
58
|
return [
|
|
45
59
|
ToolResponseImageTask(
|
|
@@ -10,9 +10,7 @@ def test_color_images_are_rendered_once(monkeypatch) -> None:
|
|
|
10
10
|
return render(image)
|
|
11
11
|
|
|
12
12
|
monkeypatch.setattr(taskset, "image_data_url", counted)
|
|
13
|
-
tasks = taskset.ColorCodewordTaskset(taskset.ColorCodewordConfig()).
|
|
14
|
-
num_tasks=100
|
|
15
|
-
)
|
|
13
|
+
tasks = list(taskset.ColorCodewordTaskset(taskset.ColorCodewordConfig()).head(100))
|
|
16
14
|
|
|
17
15
|
assert len(tasks) == 100
|
|
18
16
|
assert calls == list(taskset.COLOR_RGB.values())
|
|
@@ -109,7 +109,7 @@ async def test_single_turn(run_v1, harness, harness_runtime, tmp_path):
|
|
|
109
109
|
assert trace.stop_condition == "agent_completed"
|
|
110
110
|
assert trace.reward == 1.0
|
|
111
111
|
# The seat's resolved identity rides the trace (policy metadata for trainers).
|
|
112
|
-
assert trace.agent is not None and trace.agent.config.sampling.
|
|
112
|
+
assert trace.agent is not None and trace.agent.config.sampling.max_tokens == 2048
|
|
113
113
|
# Every sampled turn has one per-call record, linked to its assistant node.
|
|
114
114
|
sampled = [i for i, n in enumerate(trace.nodes) if n.sampled]
|
|
115
115
|
assert [c.node for c in trace.calls if c.error is None] == sampled
|
|
@@ -118,6 +118,26 @@ async def test_single_turn(run_v1, harness, harness_runtime, tmp_path):
|
|
|
118
118
|
assert call.time.duration > 0
|
|
119
119
|
|
|
120
120
|
|
|
121
|
+
@pytest.mark.e2e
|
|
122
|
+
@pytest.mark.browser_use
|
|
123
|
+
@pytest.mark.docker
|
|
124
|
+
async def test_browser_use(run_v1, tmp_path):
|
|
125
|
+
"""The browser_use harness runs in an explicitly browser-capable runtime."""
|
|
126
|
+
image = (
|
|
127
|
+
"mcr.microsoft.com/playwright/python:v1.61.0-noble@"
|
|
128
|
+
"sha256:a9731514f24121d1dcd25d58d0a38146646d290a5998fd80d3e533e7b5e21c69"
|
|
129
|
+
)
|
|
130
|
+
(trace,) = await run_v1(
|
|
131
|
+
"echo-v1",
|
|
132
|
+
harness="browser_use",
|
|
133
|
+
runtime={"type": "docker", "image": image},
|
|
134
|
+
output_dir=tmp_path,
|
|
135
|
+
max_turns=2,
|
|
136
|
+
)
|
|
137
|
+
assert trace.ok
|
|
138
|
+
assert trace.reward == 1.0
|
|
139
|
+
|
|
140
|
+
|
|
121
141
|
@pytest.mark.e2e
|
|
122
142
|
@pytest.mark.parametrize("harness_runtime", USER_RUNTIMES, indirect=True)
|
|
123
143
|
async def test_user(run_v1, harness_runtime, tmp_path):
|
|
@@ -335,6 +355,7 @@ async def test_agentic(run_v1, harness, harness_runtime, tmp_path):
|
|
|
335
355
|
runtime={"type": harness_runtime},
|
|
336
356
|
output_dir=tmp_path,
|
|
337
357
|
max_turns=10,
|
|
358
|
+
max_tokens=8192,
|
|
338
359
|
)
|
|
339
360
|
assert trace.ok
|
|
340
361
|
assert trace.num_turns >= 1 # ran a command, then finished
|
|
@@ -366,7 +387,7 @@ async def test_multi_agent_env(run_v1, tmp_path):
|
|
|
366
387
|
# agent info (completion order — the gathered seats land in either order).
|
|
367
388
|
(line,) = (tmp_path / "traces.jsonl").read_text().splitlines()
|
|
368
389
|
row = json.loads(line)
|
|
369
|
-
assert row["env"] == "duet-v1"
|
|
390
|
+
assert row["env"] == {"id": "duet-v1"}
|
|
370
391
|
by_name = {t["agent"]["name"]: t for t in row["traces"]}
|
|
371
392
|
assert set(by_name) == {"a", "b"}
|
|
372
393
|
assert by_name["a"]["agent"]["trainable"] is True
|
|
@@ -401,21 +422,21 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
|
|
|
401
422
|
model's call. Exercises the config surface too: a policy-only prompt
|
|
402
423
|
override (the verdict contract is appended regardless) and
|
|
403
424
|
reward-composition weights."""
|
|
425
|
+
policy = tmp_path / "judge_policy.txt"
|
|
426
|
+
policy.write_text("Check EMPIRICALLY that the agent echoed the word back.")
|
|
404
427
|
traces = await run_v1(
|
|
405
428
|
"echo-v1",
|
|
406
|
-
harness=None,
|
|
429
|
+
harness=None,
|
|
407
430
|
env={
|
|
408
431
|
"id": "agentic-judge",
|
|
409
|
-
# The solver owns the shared box, so the container is pinned here.
|
|
410
432
|
"solver": {"harness": {"id": "bash"}, "runtime": {"type": "docker"}},
|
|
411
|
-
# The judge reads the trace and reasons before it writes the
|
|
412
|
-
# verdict file; the shared 2048-token run cap truncates it mid-audit.
|
|
413
433
|
"judge": {
|
|
414
434
|
"harness": {"id": "bash"},
|
|
415
435
|
"max_output_tokens": 8192,
|
|
416
436
|
},
|
|
417
437
|
"task": {
|
|
418
|
-
"prompt": "
|
|
438
|
+
"prompt": {"path": str(policy)},
|
|
439
|
+
"hint": "Do not rely on README.md",
|
|
419
440
|
},
|
|
420
441
|
"score": {"task_weight": 0.5},
|
|
421
442
|
},
|
|
@@ -431,7 +452,7 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
|
|
|
431
452
|
# The task's own reward keeps its raw score; the rescale lands on the weight.
|
|
432
453
|
assert solver.rewards["echoed"].score == 1.0
|
|
433
454
|
assert solver.rewards["echoed"].weight == 0.5
|
|
434
|
-
assert isinstance(judge.info.get("verdict"), dict)
|
|
455
|
+
assert isinstance(judge.info.get("verdict"), dict)
|
|
435
456
|
assert 0.0 <= solver.rewards["judge"].score <= 1.0
|
|
436
457
|
|
|
437
458
|
|
|
@@ -371,32 +371,20 @@ async def test_rubric_view_full_trace(tmp_path, fake_judge_model):
|
|
|
371
371
|
assert all("SECRET REASONING" not in prompt for prompt in fake_judge_model)
|
|
372
372
|
|
|
373
373
|
|
|
374
|
-
async def test_config_prompt_overrides_class_template(fake_judge_model):
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
)
|
|
374
|
+
async def test_config_prompt_overrides_class_template(tmp_path, fake_judge_model):
|
|
375
|
+
# Config `prompt` is a file path; the same {field} placeholders work.
|
|
376
|
+
file = tmp_path / "judge.txt"
|
|
377
|
+
file.write_text("Q:{question} A:{answer} R:{response}")
|
|
378
|
+
judge = vf.ReferenceJudge(vf.ReferenceJudgeConfig(prompt=file))
|
|
378
379
|
assert judge.build_messages(question="q", answer="a", response="r") == "Q:q A:a R:r"
|
|
379
380
|
# A template needn't use every evaluate field: score also passes {positive}/{negative},
|
|
380
381
|
# which str.format ignores when the (custom) prompt doesn't reference them.
|
|
381
382
|
trace = make_trace()
|
|
382
383
|
assert await judge.score(trace.task.data, trace) == 1.0
|
|
383
384
|
assert fake_judge_model[0] == "Q:Capital of France? A:Paris R:It is Paris."
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
async def test_prompt_file(tmp_path, fake_judge_model):
|
|
387
|
-
# The prompt template can come from a file; the same {field} placeholders work.
|
|
388
|
-
file = tmp_path / "judge.txt"
|
|
389
|
-
file.write_text("Q:{question} A:{answer} R:{response}")
|
|
390
|
-
trace = make_trace()
|
|
391
|
-
judge = vf.ReferenceJudge(vf.ReferenceJudgeConfig(prompt_file=file))
|
|
392
|
-
assert await judge.score(trace.task.data, trace) == 1.0
|
|
393
|
-
assert fake_judge_model[0] == "Q:Capital of France? A:Paris R:It is Paris."
|
|
394
385
|
# a bad path fails at judge construction, not mid-eval at score time
|
|
395
386
|
with pytest.raises(FileNotFoundError):
|
|
396
|
-
vf.ReferenceJudge(vf.ReferenceJudgeConfig(
|
|
397
|
-
# inline and file prompts are mutually exclusive
|
|
398
|
-
with pytest.raises(ValueError, match="not both"):
|
|
399
|
-
vf.ReferenceJudgeConfig(prompt="inline", prompt_file=file)
|
|
387
|
+
vf.ReferenceJudge(vf.ReferenceJudgeConfig(prompt=tmp_path / "missing.txt"))
|
|
400
388
|
|
|
401
389
|
|
|
402
390
|
# --- reference input/verdict knobs ------------------------------------------------------------
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"""`Taskset` iteration and the `head`/`shuffle` views over list, generator,
|
|
2
|
+
and `INFINITE` `load` implementations."""
|
|
3
|
+
|
|
4
|
+
import itertools
|
|
5
|
+
|
|
6
|
+
import pytest
|
|
7
|
+
|
|
8
|
+
import verifiers.v1 as vf
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class CountTask(vf.Task[vf.TaskData]):
|
|
12
|
+
pass
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class InfiniteTaskset(vf.Taskset[CountTask, vf.TasksetConfig]):
|
|
16
|
+
INFINITE = True
|
|
17
|
+
|
|
18
|
+
def load(self):
|
|
19
|
+
for i in itertools.count():
|
|
20
|
+
yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class FiniteTaskset(vf.Taskset[CountTask, vf.TasksetConfig]):
|
|
24
|
+
def load(self):
|
|
25
|
+
for i in range(10):
|
|
26
|
+
yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def idxs(tasks) -> list[int]:
|
|
30
|
+
return [task.data.idx for task in tasks]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def test_head_bounds_an_infinite_taskset() -> None:
|
|
34
|
+
tasks = list(InfiniteTaskset(vf.TasksetConfig()).head(5))
|
|
35
|
+
assert idxs(tasks) == [0, 1, 2, 3, 4]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def test_iteration_materializes_a_finite_taskset() -> None:
|
|
39
|
+
taskset = FiniteTaskset(vf.TasksetConfig())
|
|
40
|
+
assert len(list(taskset)) == 10
|
|
41
|
+
assert idxs(taskset.head(4)) == [0, 1, 2, 3]
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def test_head_returns_the_same_taskset_type() -> None:
|
|
45
|
+
view = FiniteTaskset(vf.TasksetConfig()).head(4)
|
|
46
|
+
assert isinstance(view, FiniteTaskset)
|
|
47
|
+
assert view.task_type() is CountTask
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def test_shuffle_samples_the_whole_taskset_reproducibly() -> None:
|
|
51
|
+
taskset = FiniteTaskset(vf.TasksetConfig())
|
|
52
|
+
first = idxs(taskset.shuffle().head(5))
|
|
53
|
+
assert first == idxs(taskset.shuffle().head(5))
|
|
54
|
+
assert len(first) == 5 and set(first) <= set(range(10))
|
|
55
|
+
assert first != [0, 1, 2, 3, 4] # sampled from the whole set, not the head
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def test_shuffle_seed_changes_the_sample() -> None:
|
|
59
|
+
taskset = FiniteTaskset(vf.TasksetConfig())
|
|
60
|
+
seeded = idxs(taskset.shuffle(seed=7).head(5))
|
|
61
|
+
assert seeded == idxs(taskset.shuffle(seed=7).head(5)) # reproducible per seed
|
|
62
|
+
assert seeded != idxs(taskset.shuffle().head(5)) # differs from the default seed
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def test_shuffle_raises_on_infinite() -> None:
|
|
66
|
+
with pytest.raises(ValueError, match="infinite"):
|
|
67
|
+
InfiniteTaskset(vf.TasksetConfig()).shuffle()
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def test_head_then_shuffle_bounds_an_infinite_taskset() -> None:
|
|
71
|
+
head = idxs(InfiniteTaskset(vf.TasksetConfig()).head(5).shuffle())
|
|
72
|
+
assert sorted(head) == [0, 1, 2, 3, 4]
|
|
73
|
+
assert head != [0, 1, 2, 3, 4] # shuffled within the bounded head
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def test_head_only_builds_what_the_run_takes() -> None:
|
|
77
|
+
built: list[int] = []
|
|
78
|
+
|
|
79
|
+
class RecordingTaskset(InfiniteTaskset):
|
|
80
|
+
def load(self):
|
|
81
|
+
for i in itertools.count():
|
|
82
|
+
built.append(i)
|
|
83
|
+
yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
|
|
84
|
+
|
|
85
|
+
list(RecordingTaskset(vf.TasksetConfig()).head(3))
|
|
86
|
+
assert built == [0, 1, 2]
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def test_views_do_not_mutate_the_base_taskset() -> None:
|
|
90
|
+
taskset = InfiniteTaskset(vf.TasksetConfig())
|
|
91
|
+
view = taskset.head(3)
|
|
92
|
+
assert view.INFINITE is False and taskset.INFINITE is True
|
|
93
|
+
assert idxs(taskset.head(2)) == [0, 1] # base iterates untransformed
|
|
@@ -4,6 +4,12 @@ from pydantic_config import BaseConfig
|
|
|
4
4
|
|
|
5
5
|
from verifiers.v1.acp import ACP
|
|
6
6
|
from verifiers.v1.agent import Agent, Agents, Interaction, Segment, make_agent
|
|
7
|
+
from verifiers.v1.artifacts import (
|
|
8
|
+
ARTIFACTS_DIR,
|
|
9
|
+
Artifact,
|
|
10
|
+
collect,
|
|
11
|
+
restore,
|
|
12
|
+
)
|
|
7
13
|
from verifiers.v1.clients import (
|
|
8
14
|
BaseClientConfig,
|
|
9
15
|
Client,
|
|
@@ -109,10 +115,10 @@ from verifiers.v1.taskset import Taskset
|
|
|
109
115
|
from verifiers.v1.trace import (
|
|
110
116
|
TRACE_VERSION,
|
|
111
117
|
AgentInfo,
|
|
118
|
+
AgentSpan,
|
|
112
119
|
Branch,
|
|
113
120
|
Error,
|
|
114
121
|
EvalRunInfo,
|
|
115
|
-
GenerationSpan,
|
|
116
122
|
ModelCall,
|
|
117
123
|
Reward,
|
|
118
124
|
RunInfo,
|
|
@@ -138,7 +144,6 @@ from verifiers.v1.types import (
|
|
|
138
144
|
Response,
|
|
139
145
|
Sampling,
|
|
140
146
|
SamplingConfig,
|
|
141
|
-
StrictBaseModel,
|
|
142
147
|
SystemMessage,
|
|
143
148
|
TextContentPart,
|
|
144
149
|
Tool,
|
|
@@ -171,7 +176,6 @@ __all__ = [ # noqa: RUF022 - grouped by public API area
|
|
|
171
176
|
"Response",
|
|
172
177
|
"Sampling",
|
|
173
178
|
"SamplingConfig",
|
|
174
|
-
"StrictBaseModel",
|
|
175
179
|
"SystemMessage",
|
|
176
180
|
"TextContentPart",
|
|
177
181
|
"Tool",
|
|
@@ -207,7 +211,7 @@ __all__ = [ # noqa: RUF022 - grouped by public API area
|
|
|
207
211
|
"Timing",
|
|
208
212
|
"TimeSpan",
|
|
209
213
|
"TimeSplit",
|
|
210
|
-
"
|
|
214
|
+
"AgentSpan",
|
|
211
215
|
"Error",
|
|
212
216
|
# decorators
|
|
213
217
|
"stop",
|
|
@@ -297,6 +301,11 @@ __all__ = [ # noqa: RUF022 - grouped by public API area
|
|
|
297
301
|
"PATCH_CAP_BYTES",
|
|
298
302
|
"capture_patch",
|
|
299
303
|
"resolve_head",
|
|
304
|
+
# grading artifacts
|
|
305
|
+
"ARTIFACTS_DIR",
|
|
306
|
+
"Artifact",
|
|
307
|
+
"collect",
|
|
308
|
+
"restore",
|
|
300
309
|
# scoring
|
|
301
310
|
"compare_stdout_results",
|
|
302
311
|
"extract_boxed_answer",
|
|
@@ -335,7 +335,7 @@ class Agent:
|
|
|
335
335
|
if self._server is None:
|
|
336
336
|
return None
|
|
337
337
|
if self._server.tunnel is not None or (
|
|
338
|
-
run_is_local and not shared_tools and not
|
|
338
|
+
run_is_local and not shared_tools and not task.toolsets(task.config)
|
|
339
339
|
):
|
|
340
340
|
return self._server
|
|
341
341
|
return None
|
|
@@ -517,7 +517,10 @@ class Agent:
|
|
|
517
517
|
)
|
|
518
518
|
run_is_local = runtime_is_local(runtime_config)
|
|
519
519
|
validate_pairing(
|
|
520
|
-
self.harness,
|
|
520
|
+
self.harness,
|
|
521
|
+
type(task),
|
|
522
|
+
runtime_config,
|
|
523
|
+
tools=[*task.toolsets(task.config), *shared_tools.values()],
|
|
521
524
|
)
|
|
522
525
|
# Timeout precedence: agent-level wins, else the task's, else no limit.
|
|
523
526
|
agent_timeout = (
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"""Artifact collection and restoration across runtimes."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import shlex
|
|
7
|
+
import uuid
|
|
8
|
+
from pathlib import PurePosixPath
|
|
9
|
+
from typing import TYPE_CHECKING
|
|
10
|
+
|
|
11
|
+
from pydantic import BaseModel, Field
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from verifiers.v1.runtimes import Runtime
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
ARTIFACTS_DIR = "/logs/artifacts"
|
|
19
|
+
"""Implicit artifact directory; tasks that write here need no declaration."""
|
|
20
|
+
|
|
21
|
+
MAX_ARTIFACT_BYTES = 32 * 1024 * 1024
|
|
22
|
+
"""Ceiling per collection. Sized for a delta, not a tree: the grading box boots from the
|
|
23
|
+
agent's image, so the repo is already there and only its output has to travel."""
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class Artifact(BaseModel):
|
|
27
|
+
"""One path to restore at the same location in another runtime."""
|
|
28
|
+
|
|
29
|
+
source: str
|
|
30
|
+
exclude: list[str] = Field(default_factory=list)
|
|
31
|
+
"""`tar --exclude` patterns, applied when `source` is a directory."""
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
async def collect(
|
|
35
|
+
runtime: Runtime, artifacts: list[Artifact] | None = None
|
|
36
|
+
) -> dict[str, bytes]:
|
|
37
|
+
"""Tar the convention dir and every declared path out of `runtime`.
|
|
38
|
+
|
|
39
|
+
Keyed by source path; the values are tar archives. Insertion order is the order
|
|
40
|
+
they were declared, and a path cannot be collected twice.
|
|
41
|
+
|
|
42
|
+
A declared source that is missing raises: it was declared because grading needs it,
|
|
43
|
+
and grading a partial state scores the rollout wrong rather than failing it. The
|
|
44
|
+
implicit convention sweep is exempt — most tasks never write there.
|
|
45
|
+
|
|
46
|
+
Each source is archived separately so its exclude patterns stay local.
|
|
47
|
+
"""
|
|
48
|
+
# Resolve relative sources against the runtime workdir. Joining also normalises
|
|
49
|
+
# `/work/` to `/work`, so one tree cannot key two entries (the source is both the
|
|
50
|
+
# dict key and `restore`'s rm -rf target).
|
|
51
|
+
workdir = PurePosixPath(getattr(runtime.config, "workdir", "") or "/")
|
|
52
|
+
declared = [
|
|
53
|
+
a.model_copy(update={"source": str(workdir / a.source)})
|
|
54
|
+
for a in artifacts or []
|
|
55
|
+
]
|
|
56
|
+
convention = PurePosixPath(ARTIFACTS_DIR)
|
|
57
|
+
sweep = not any(
|
|
58
|
+
(p := PurePosixPath(a.source)) == convention
|
|
59
|
+
or p.is_relative_to(convention)
|
|
60
|
+
or convention.is_relative_to(p)
|
|
61
|
+
for a in declared
|
|
62
|
+
)
|
|
63
|
+
entries = ([Artifact(source=ARTIFACTS_DIR)] if sweep else []) + declared
|
|
64
|
+
|
|
65
|
+
collected: dict[str, bytes] = {}
|
|
66
|
+
budget = MAX_ARTIFACT_BYTES
|
|
67
|
+
for artifact in entries:
|
|
68
|
+
source = artifact.source
|
|
69
|
+
if (await runtime.run(["test", "-e", source], {})).exit_code != 0:
|
|
70
|
+
if sweep and source == ARTIFACTS_DIR:
|
|
71
|
+
continue
|
|
72
|
+
raise RuntimeError(
|
|
73
|
+
f"declared artifact {source!r} does not exist in the runtime"
|
|
74
|
+
)
|
|
75
|
+
archive = await _tar_out(runtime, artifact, budget)
|
|
76
|
+
budget -= len(archive)
|
|
77
|
+
collected[source] = archive
|
|
78
|
+
|
|
79
|
+
logger.debug("collected artifact roots: %s", list(collected))
|
|
80
|
+
return collected
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
async def restore(runtime: Runtime, collected: dict[str, bytes]) -> None:
|
|
84
|
+
"""Extract `collected` in `runtime` at the original absolute paths."""
|
|
85
|
+
if not collected:
|
|
86
|
+
return
|
|
87
|
+
# Restoring into the subprocess runtime would extract absolute paths onto the
|
|
88
|
+
# developer's filesystem, so refuse it before any archive reaches the host.
|
|
89
|
+
if getattr(runtime.config, "type", None) == "subprocess":
|
|
90
|
+
raise RuntimeError(
|
|
91
|
+
"refusing to restore artifacts into the subprocess runtime: extraction "
|
|
92
|
+
"writes to absolute paths on the host. Grade in a container."
|
|
93
|
+
)
|
|
94
|
+
# Clear every root up front, not per entry: a later nested root would otherwise
|
|
95
|
+
# delete content an earlier one just restored. Clearing also drops any file or
|
|
96
|
+
# symlink the image left at the target.
|
|
97
|
+
roots = " ".join(shlex.quote(root) for root in collected)
|
|
98
|
+
await _run(runtime, f"rm -rf -- {roots}", "clear artifact roots")
|
|
99
|
+
for root, archive in collected.items():
|
|
100
|
+
path = f"/tmp/vf-artifact-{uuid.uuid4().hex}.tar"
|
|
101
|
+
await runtime.write(path, archive)
|
|
102
|
+
await _run(
|
|
103
|
+
runtime,
|
|
104
|
+
f"tar -xf {shlex.quote(path)} -C / && rm -f {shlex.quote(path)}",
|
|
105
|
+
f"restore artifact {root!r}",
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
async def _tar_out(runtime: Runtime, artifact: Artifact, budget: int) -> bytes:
|
|
110
|
+
path = f"/tmp/vf-artifact-{uuid.uuid4().hex}.tar"
|
|
111
|
+
excludes = " ".join(f"--exclude={shlex.quote(p)}" for p in artifact.exclude)
|
|
112
|
+
try:
|
|
113
|
+
await _run(
|
|
114
|
+
runtime,
|
|
115
|
+
f"tar -cf {shlex.quote(path)} -C / {excludes} -- "
|
|
116
|
+
f"{shlex.quote(artifact.source.lstrip('/'))}",
|
|
117
|
+
f"collect artifact {artifact.source!r}",
|
|
118
|
+
)
|
|
119
|
+
# Size it in the box: an oversized collection is refused before it reaches host
|
|
120
|
+
# memory, not after.
|
|
121
|
+
sized = await runtime.run(["sh", "-c", f"wc -c < {shlex.quote(path)}"], {})
|
|
122
|
+
if (raw := sized.stdout.strip()).isdigit() and int(raw) > budget:
|
|
123
|
+
raise RuntimeError(
|
|
124
|
+
f"artifact {artifact.source!r} takes the collection over the "
|
|
125
|
+
f"{MAX_ARTIFACT_BYTES} byte limit. The grading box boots from the "
|
|
126
|
+
"agent's image, so only the delta needs to travel — narrow the source "
|
|
127
|
+
"or add `exclude` patterns."
|
|
128
|
+
)
|
|
129
|
+
return await runtime.read(path)
|
|
130
|
+
finally:
|
|
131
|
+
# Best-effort: the box is about to be destroyed and the name is unique per call.
|
|
132
|
+
try:
|
|
133
|
+
await runtime.run(["rm", "-f", path], {})
|
|
134
|
+
except Exception:
|
|
135
|
+
logger.debug("failed to remove %s", path, exc_info=True)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
async def _run(runtime: Runtime, command: str, action: str) -> None:
|
|
139
|
+
result = await runtime.run(["sh", "-c", command], {})
|
|
140
|
+
if result.exit_code:
|
|
141
|
+
detail = (result.stderr or result.stdout).strip()[-500:]
|
|
142
|
+
raise RuntimeError(f"failed to {action}: {detail}")
|