verifiers 0.2.2.dev49__tar.gz → 0.2.2.dev51__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.dev51}/PKG-INFO +1 -1
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/test_color_codeword_tasks.py +1 -3
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/test_e2e.py +3 -3
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/test_judges.py +6 -18
- verifiers-0.2.2.dev51/tests/v1/test_taskset.py +93 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/debug.py +8 -1
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/eval/runner.py +18 -4
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/validate.py +8 -1
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/judge.py +3 -10
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/taskset.py +5 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/env.py +2 -2
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/envs/agentic_judge/env.py +11 -21
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/gepa/adapter.py +4 -8
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/gepa/runner.py +18 -2
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/judge.py +6 -6
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/loaders.py +4 -4
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/mcp/server.py +2 -2
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/state.py +2 -2
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/task.py +42 -34
- verifiers-0.2.2.dev51/verifiers/v1/taskset.py +116 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/tasksets/lean/taskset.py +1 -2
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/generic.py +1 -1
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/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/taskset.py +0 -98
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/.gitignore +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/LICENSE +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/README.md +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/pyproject.toml +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/conftest.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_build_script.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_client_config.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_env_group.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_env_server.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_environment.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_imports.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_init_script.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_logging.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_parser.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_rubric.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_types.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/conftest.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/duet_v1.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/test_configs.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/test_envs.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/test_graph.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/test_trace.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/decorators.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/errors.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/types.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/acp/_runner.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/agent.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/agent.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/cli/debug.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/cli/env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/cli/eval.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/cli/init.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/cli/replay.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/cli/serve.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/cli/validate.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/legacy.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/retries.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/task.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/envs/user_sim/env.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/episode.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/errors.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/graph.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/bash/program.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/pool/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/pool/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/push.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/retries.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/runtimes/docker/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/session.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/trace.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/types.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/compile.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/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.dev51
|
|
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
|
|
@@ -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())
|
|
@@ -401,6 +401,8 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
|
|
|
401
401
|
model's call. Exercises the config surface too: a policy-only prompt
|
|
402
402
|
override (the verdict contract is appended regardless) and
|
|
403
403
|
reward-composition weights."""
|
|
404
|
+
policy = tmp_path / "judge_policy.txt"
|
|
405
|
+
policy.write_text("Check EMPIRICALLY that the agent echoed the word back.")
|
|
404
406
|
traces = await run_v1(
|
|
405
407
|
"echo-v1",
|
|
406
408
|
harness=None, # seats pin their own harness; there is no run-level one
|
|
@@ -414,9 +416,7 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
|
|
|
414
416
|
"harness": {"id": "bash"},
|
|
415
417
|
"max_output_tokens": 8192,
|
|
416
418
|
},
|
|
417
|
-
"task": {
|
|
418
|
-
"prompt": "Check EMPIRICALLY that the agent echoed the word back.",
|
|
419
|
-
},
|
|
419
|
+
"task": {"prompt": str(policy)},
|
|
420
420
|
"score": {"task_weight": 0.5},
|
|
421
421
|
},
|
|
422
422
|
output_dir=tmp_path,
|
|
@@ -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
|
|
@@ -263,7 +263,14 @@ async def debug_task(task: Task, config: DebugConfig) -> tuple[Trace, bool]:
|
|
|
263
263
|
|
|
264
264
|
async def run_debug(config: DebugConfig) -> list[Trace]:
|
|
265
265
|
taskset = vf.load_taskset(config.taskset)
|
|
266
|
-
|
|
266
|
+
if config.num_tasks is None and taskset.INFINITE:
|
|
267
|
+
raise ValueError(
|
|
268
|
+
f"{type(taskset).__name__} is infinite - bound the run with -n"
|
|
269
|
+
)
|
|
270
|
+
selected = taskset.shuffle() if config.shuffle else taskset
|
|
271
|
+
if config.num_tasks is not None:
|
|
272
|
+
selected = selected.head(config.num_tasks)
|
|
273
|
+
tasks = list(selected)
|
|
267
274
|
if isinstance(config.runtime, vf.SubprocessConfig) and any(
|
|
268
275
|
type(t).NEEDS_CONTAINER or t.data.image for t in tasks
|
|
269
276
|
):
|
|
@@ -26,7 +26,15 @@ logger = logging.getLogger(__name__)
|
|
|
26
26
|
async def run_eval(env: Env, config: EvalConfig) -> list[Episode]:
|
|
27
27
|
logger.info("eval config:\n%s", config.model_dump_json(indent=2))
|
|
28
28
|
client = resolve_client(config.client)
|
|
29
|
-
|
|
29
|
+
taskset = env.taskset
|
|
30
|
+
if config.num_tasks is None and taskset.INFINITE:
|
|
31
|
+
raise ValueError(
|
|
32
|
+
f"{type(taskset).__name__} is infinite - bound the run with -n"
|
|
33
|
+
)
|
|
34
|
+
selected = taskset.shuffle() if config.shuffle else taskset
|
|
35
|
+
if config.num_tasks is not None:
|
|
36
|
+
selected = selected.head(config.num_tasks)
|
|
37
|
+
tasks = list(selected)
|
|
30
38
|
ctx = ModelContext(client=client, model=config.model, sampling=config.sampling)
|
|
31
39
|
semaphore = (
|
|
32
40
|
asyncio.Semaphore(config.max_concurrent) if config.max_concurrent else None
|
|
@@ -132,9 +140,15 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
|
|
|
132
140
|
|
|
133
141
|
# The client owns the taskset: load it here, once — the server (and its pool
|
|
134
142
|
# workers) never load data, they rebuild each dispatched task from its request.
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
143
|
+
taskset = load_taskset(config.env.taskset)
|
|
144
|
+
if config.num_tasks is None and taskset.INFINITE:
|
|
145
|
+
raise ValueError(
|
|
146
|
+
f"{type(taskset).__name__} is infinite - bound the run with -n"
|
|
147
|
+
)
|
|
148
|
+
selected = taskset.shuffle() if config.shuffle else taskset
|
|
149
|
+
if config.num_tasks is not None:
|
|
150
|
+
selected = selected.head(config.num_tasks)
|
|
151
|
+
tasks = list(selected)
|
|
138
152
|
# Spawned processes inherit no logging — hand them the main process's setup so
|
|
139
153
|
# their rollout logs land in the output dir.
|
|
140
154
|
level = "DEBUG" if config.verbose else "INFO"
|
|
@@ -203,7 +203,14 @@ async def _validate_task(task: Task, config: ValidateConfig) -> ResultRow:
|
|
|
203
203
|
|
|
204
204
|
async def run_validate(config: ValidateConfig) -> list[dict]:
|
|
205
205
|
taskset = vf.load_taskset(config.taskset)
|
|
206
|
-
|
|
206
|
+
if config.num_tasks is None and taskset.INFINITE:
|
|
207
|
+
raise ValueError(
|
|
208
|
+
f"{type(taskset).__name__} is infinite - bound the run with -n"
|
|
209
|
+
)
|
|
210
|
+
selected = taskset.shuffle() if config.shuffle else taskset
|
|
211
|
+
if config.num_tasks is not None:
|
|
212
|
+
selected = selected.head(config.num_tasks)
|
|
213
|
+
tasks = list(selected)
|
|
207
214
|
if isinstance(config.runtime, vf.SubprocessConfig) and any(
|
|
208
215
|
type(t).NEEDS_CONTAINER or t.data.image for t in tasks
|
|
209
216
|
):
|
|
@@ -5,7 +5,7 @@ from collections.abc import Sequence
|
|
|
5
5
|
from pathlib import Path
|
|
6
6
|
from typing import Any
|
|
7
7
|
|
|
8
|
-
from pydantic import BaseModel, SerializeAsAny
|
|
8
|
+
from pydantic import BaseModel, SerializeAsAny
|
|
9
9
|
|
|
10
10
|
from verifiers.v1.clients import BaseClientConfig
|
|
11
11
|
from verifiers.v1.types import ID, SamplingConfig
|
|
@@ -20,15 +20,8 @@ class JudgeConfig(BaseClientConfig):
|
|
|
20
20
|
weight: float = 1.0
|
|
21
21
|
model: str = "openai/gpt-5.4-nano"
|
|
22
22
|
sampling: SamplingConfig = SamplingConfig()
|
|
23
|
-
prompt:
|
|
24
|
-
|
|
25
|
-
"""Prompt file override, mutually exclusive with `prompt`."""
|
|
26
|
-
|
|
27
|
-
@model_validator(mode="after")
|
|
28
|
-
def check_prompt_source(self) -> "JudgeConfig":
|
|
29
|
-
if self.prompt is not None and self.prompt_file is not None:
|
|
30
|
-
raise ValueError("set `prompt` or `prompt_file`, not both")
|
|
31
|
-
return self
|
|
23
|
+
prompt: Path | None = None
|
|
24
|
+
"""File whose text overrides the judge's default prompt template."""
|
|
32
25
|
|
|
33
26
|
|
|
34
27
|
Judges = list[SerializeAsAny[JudgeConfig]]
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"""The taskset plugin's config: which rows load, under `--env.taskset.*`."""
|
|
2
2
|
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
3
5
|
from pydantic import SerializeAsAny
|
|
4
6
|
from pydantic_config import BaseConfig
|
|
5
7
|
|
|
@@ -14,6 +16,9 @@ class TasksetConfig(BaseConfig):
|
|
|
14
16
|
positional `eval <taskset-id>`)."""
|
|
15
17
|
task: SerializeAsAny[TaskConfig] = TaskConfig()
|
|
16
18
|
"""Config passed to each task, under `--env.taskset.task.*`."""
|
|
19
|
+
system_prompt: Path | None = None
|
|
20
|
+
"""File whose text overrides each task's `TaskData.system_prompt` on
|
|
21
|
+
iteration (e.g. a GEPA `best_system_prompt.txt`)."""
|
|
17
22
|
|
|
18
23
|
@property
|
|
19
24
|
def name(self) -> str:
|
|
@@ -33,7 +33,7 @@ from verifiers.v1.retries import run_episode_with_retry
|
|
|
33
33
|
from verifiers.v1.runtimes import SubprocessConfig, runtime_is_local
|
|
34
34
|
from verifiers.v1.task import Task, resolve_server_config
|
|
35
35
|
from verifiers.v1.trace import Error, Trace
|
|
36
|
-
from verifiers.v1.utils.generic import
|
|
36
|
+
from verifiers.v1.utils.generic import concrete_type
|
|
37
37
|
from verifiers.v1.utils.memory import trim_memory_periodically
|
|
38
38
|
|
|
39
39
|
logger = logging.getLogger(__name__)
|
|
@@ -83,7 +83,7 @@ class Env(ABC, Generic[ConfigT]):
|
|
|
83
83
|
def __init__(self, config: ConfigT) -> None:
|
|
84
84
|
from verifiers.v1.loaders import load_harness, load_taskset
|
|
85
85
|
|
|
86
|
-
config_cls =
|
|
86
|
+
config_cls = concrete_type(type(self), EnvConfig, origin=Env) or EnvConfig
|
|
87
87
|
if not isinstance(config, config_cls):
|
|
88
88
|
raise TypeError(
|
|
89
89
|
f"{type(self).__name__} declares Env[{config_cls.__name__}], "
|
|
@@ -180,41 +180,31 @@ class JudgeTask(vf.Task):
|
|
|
180
180
|
class JudgeTaskConfig(vf.BaseConfig):
|
|
181
181
|
"""The judge's minted task: the grading policy and what lands in its box."""
|
|
182
182
|
|
|
183
|
-
prompt: Path |
|
|
184
|
-
"""Grading-policy
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
`.txt` file): task-family pointers into the trace or box — e.g. for math,
|
|
192
|
-
where the reference answer lives in the record; for SWE, to diff the repo
|
|
193
|
-
or read `info.patch`."""
|
|
183
|
+
prompt: Path | None = None
|
|
184
|
+
"""Grading-policy file. Replaces only the policy body — the verdict contract
|
|
185
|
+
and workspace note are always appended. May reference `{prompt}` (the solver
|
|
186
|
+
task's prompt); if it doesn't, the task statement is appended after."""
|
|
187
|
+
hint: Path | None = None
|
|
188
|
+
"""Optional hints file injected as their own section: task-family pointers
|
|
189
|
+
into the trace or box — e.g. for math, where the reference answer lives in
|
|
190
|
+
the record; for SWE, to diff the repo or read `info.patch`."""
|
|
194
191
|
rubric: Path | None = None
|
|
195
192
|
"""Criteria the judge grades against: a `.toml`/`.json` file with a
|
|
196
193
|
`criteria` list — the plugged rubric judge's format, so the same rubric
|
|
197
194
|
files work for both. None grades the single built-in `solved` criterion."""
|
|
198
195
|
|
|
199
|
-
@staticmethod
|
|
200
|
-
def _resolve(value: Path | str) -> str:
|
|
201
|
-
path = Path(value)
|
|
202
|
-
if isinstance(value, Path) or path.suffix in (".md", ".txt"):
|
|
203
|
-
return path.read_text(encoding="utf-8")
|
|
204
|
-
return str(value)
|
|
205
|
-
|
|
206
196
|
def build_prompt(self) -> str:
|
|
207
197
|
if self.prompt is None:
|
|
208
198
|
return GRADE_PROMPT + "\n\n" + TASK_SECTION
|
|
209
|
-
return self.
|
|
199
|
+
return self.prompt.read_text()
|
|
210
200
|
|
|
211
201
|
def build_hint(self) -> str | None:
|
|
212
|
-
return self.
|
|
202
|
+
return self.hint.read_text() if self.hint is not None else None
|
|
213
203
|
|
|
214
204
|
def criteria(self) -> list[Criterion]:
|
|
215
205
|
if self.rubric is None:
|
|
216
206
|
return [SOLVED]
|
|
217
|
-
text = self.rubric.read_text(
|
|
207
|
+
text = self.rubric.read_text()
|
|
218
208
|
data = (
|
|
219
209
|
tomllib.loads(text)
|
|
220
210
|
if self.rubric.suffix.lower() == ".toml"
|
|
@@ -68,14 +68,10 @@ class GEPAAdapter:
|
|
|
68
68
|
)
|
|
69
69
|
|
|
70
70
|
async def _run_batch(self, batch: list[int], system_prompt: str) -> list[Episode]:
|
|
71
|
-
# Inject the candidate
|
|
72
|
-
#
|
|
73
|
-
tasks
|
|
74
|
-
|
|
75
|
-
t.data.model_copy(update={"system_prompt": system_prompt}), t.config
|
|
76
|
-
)
|
|
77
|
-
for t in (self.tasks[idx] for idx in batch)
|
|
78
|
-
]
|
|
71
|
+
# Inject the candidate as a copy of each base task with its system_prompt overridden
|
|
72
|
+
# (`with_system_prompt` copies rather than reconstructs, so subclass state survives and
|
|
73
|
+
# the shared base task in `self.tasks` is left untouched for the next candidate).
|
|
74
|
+
tasks = [self.tasks[idx].with_system_prompt(system_prompt) for idx in batch]
|
|
79
75
|
slots = [slot for task in tasks for slot in self.env.slots(task)]
|
|
80
76
|
results = await asyncio.gather(
|
|
81
77
|
*(
|
|
@@ -37,7 +37,10 @@ class _GEPALog:
|
|
|
37
37
|
|
|
38
38
|
def run_gepa(env: Env, config: GEPAConfig) -> GEPAResult:
|
|
39
39
|
logger.info("gepa config:\n%s", config.model_dump_json(indent=2))
|
|
40
|
-
|
|
40
|
+
# Global shuffle: an infinite taskset raises here — run it with
|
|
41
|
+
# shuffle=false (there is no whole set to sample from).
|
|
42
|
+
taskset = env.taskset.shuffle() if config.shuffle else env.taskset
|
|
43
|
+
all_tasks = list(taskset.head(config.num_train + config.num_val))
|
|
41
44
|
train_tasks, val_tasks = split_tasks(all_tasks, config.num_train, config.num_val)
|
|
42
45
|
selected_tasks = [*train_tasks, *val_tasks]
|
|
43
46
|
# Seed from the tasks GEPA actually evaluates (train ∪ val), not the full pre-split pool —
|
|
@@ -105,7 +108,20 @@ def run_gepa(env: Env, config: GEPAConfig) -> GEPAResult:
|
|
|
105
108
|
"skip_perfect_score": False,
|
|
106
109
|
"logger": _GEPALog(),
|
|
107
110
|
}
|
|
108
|
-
|
|
111
|
+
result = optimize(**optimize_kwargs)
|
|
112
|
+
if run_dir is not None:
|
|
113
|
+
# Persist the winning prompt as a plain file so it can be handed straight to
|
|
114
|
+
# eval/train via `--env.taskset.system-prompt` (see TasksetConfig).
|
|
115
|
+
candidate = result.best_candidate
|
|
116
|
+
best = (
|
|
117
|
+
candidate.get("system_prompt", "")
|
|
118
|
+
if isinstance(candidate, dict)
|
|
119
|
+
else str(candidate)
|
|
120
|
+
)
|
|
121
|
+
best_path = run_dir / "best_system_prompt.txt"
|
|
122
|
+
best_path.write_text(best, encoding="utf-8")
|
|
123
|
+
logger.info("best system prompt: %s", best_path)
|
|
124
|
+
return result
|
|
109
125
|
finally:
|
|
110
126
|
loop.run_until_complete(serving.__aexit__(None, None, None))
|
|
111
127
|
finally:
|
|
@@ -63,7 +63,7 @@ from verifiers.v1.configs.judge import (
|
|
|
63
63
|
from verifiers.v1.dialects.chat import message_to_wire
|
|
64
64
|
from verifiers.v1.scoring import parse_judge_choice
|
|
65
65
|
from verifiers.v1.types import Messages, StrictBaseModel, Usage
|
|
66
|
-
from verifiers.v1.utils.generic import
|
|
66
|
+
from verifiers.v1.utils.generic import concrete_type
|
|
67
67
|
|
|
68
68
|
if TYPE_CHECKING:
|
|
69
69
|
from verifiers.v1.task import TaskData
|
|
@@ -111,18 +111,18 @@ ConfigT = TypeVar("ConfigT", bound=JudgeConfig, default=JudgeConfig)
|
|
|
111
111
|
|
|
112
112
|
def judge_config_cls(cls: type) -> type[JudgeConfig]:
|
|
113
113
|
"""Resolve a judge's config specialization through its MRO, else `JudgeConfig`."""
|
|
114
|
-
return
|
|
114
|
+
return concrete_type(cls, JudgeConfig) or JudgeConfig
|
|
115
115
|
|
|
116
116
|
|
|
117
117
|
class Judge(Generic[ParsedT, ConfigT]):
|
|
118
118
|
prompt: str | None = None
|
|
119
|
-
"""Default prompt template, overridden by config."""
|
|
119
|
+
"""Default prompt template, overridden by a config `prompt` file."""
|
|
120
120
|
schema: type[BaseModel] | None = None
|
|
121
121
|
|
|
122
122
|
def __init__(self, config: ConfigT | None = None) -> None:
|
|
123
123
|
self.config = cast(ConfigT, config or judge_config_cls(type(self))())
|
|
124
|
-
if self.config.
|
|
125
|
-
self.prompt = self.config.
|
|
124
|
+
if self.config.prompt is not None:
|
|
125
|
+
self.prompt = self.config.prompt.read_text()
|
|
126
126
|
|
|
127
127
|
@property
|
|
128
128
|
def reward_name(self) -> str:
|
|
@@ -132,7 +132,7 @@ class Judge(Generic[ParsedT, ConfigT]):
|
|
|
132
132
|
return judge_key(self.config) or fallback or "judge"
|
|
133
133
|
|
|
134
134
|
def build_messages(self, **fields: Any) -> str | Messages:
|
|
135
|
-
template = self.
|
|
135
|
+
template = self.prompt
|
|
136
136
|
if template is None:
|
|
137
137
|
raise ValueError(
|
|
138
138
|
f"{type(self).__name__} has no `prompt`; set it or override build_messages"
|
|
@@ -20,7 +20,7 @@ from verifiers.v1.harness import Harness
|
|
|
20
20
|
from verifiers.v1.judge import Judge, judge_config_cls
|
|
21
21
|
from verifiers.v1.task import Task
|
|
22
22
|
from verifiers.v1.taskset import Taskset
|
|
23
|
-
from verifiers.v1.utils.generic import
|
|
23
|
+
from verifiers.v1.utils.generic import concrete_type, prefix_validation_error
|
|
24
24
|
from verifiers.v1.utils.install import ensure_installed
|
|
25
25
|
|
|
26
26
|
|
|
@@ -208,7 +208,7 @@ def load_judge(config: JudgeConfig) -> Judge:
|
|
|
208
208
|
def taskset_config_type(taskset_id: str) -> type[TasksetConfig]:
|
|
209
209
|
"""Resolve the taskset's config specialization through its MRO."""
|
|
210
210
|
return (
|
|
211
|
-
|
|
211
|
+
concrete_type(taskset_class(taskset_id), TasksetConfig, origin=Taskset)
|
|
212
212
|
or TasksetConfig
|
|
213
213
|
)
|
|
214
214
|
|
|
@@ -216,7 +216,7 @@ def taskset_config_type(taskset_id: str) -> type[TasksetConfig]:
|
|
|
216
216
|
def harness_config_type(harness_id: str) -> type[HarnessConfig]:
|
|
217
217
|
"""Resolve the harness's config specialization through its MRO."""
|
|
218
218
|
return (
|
|
219
|
-
|
|
219
|
+
concrete_type(harness_class(harness_id), HarnessConfig, origin=Harness)
|
|
220
220
|
or HarnessConfig
|
|
221
221
|
)
|
|
222
222
|
|
|
@@ -231,7 +231,7 @@ def env_config_type(taskset_id: str, env_id: str = "") -> type[EnvConfig]:
|
|
|
231
231
|
its MRO — `SingleAgentEnvConfig` for a plain taskset. The run's `env` field
|
|
232
232
|
narrows to this, which is what gives `--env.<role>.model` addressing."""
|
|
233
233
|
return (
|
|
234
|
-
|
|
234
|
+
concrete_type(environment_class(taskset_id, env_id), EnvConfig, origin=Env)
|
|
235
235
|
or EnvConfig
|
|
236
236
|
)
|
|
237
237
|
|
|
@@ -13,7 +13,7 @@ from pydantic import TypeAdapter, ValidationError
|
|
|
13
13
|
from pydantic_config import BaseConfig
|
|
14
14
|
|
|
15
15
|
from verifiers.v1.state import State, StateT, state_cls
|
|
16
|
-
from verifiers.v1.utils.generic import
|
|
16
|
+
from verifiers.v1.utils.generic import concrete_type
|
|
17
17
|
|
|
18
18
|
if TYPE_CHECKING:
|
|
19
19
|
from httpx import AsyncClient, Response
|
|
@@ -286,7 +286,7 @@ class ServerBase(Generic[ConfigT, StateT]):
|
|
|
286
286
|
@classmethod
|
|
287
287
|
def _config_cls(cls) -> type[BaseConfig]:
|
|
288
288
|
"""Resolve the server's config specialization through its MRO."""
|
|
289
|
-
if config_cls :=
|
|
289
|
+
if config_cls := concrete_type(cls, BaseConfig):
|
|
290
290
|
return config_cls
|
|
291
291
|
raise TypeError(
|
|
292
292
|
f"{cls.__name__} must parameterize its config, e.g. Toolset[MyConfig]"
|
|
@@ -8,7 +8,7 @@ from pydantic import ConfigDict
|
|
|
8
8
|
from typing_extensions import TypeVar
|
|
9
9
|
|
|
10
10
|
from verifiers.v1.types import StrictBaseModel
|
|
11
|
-
from verifiers.v1.utils.generic import
|
|
11
|
+
from verifiers.v1.utils.generic import concrete_type
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class State(StrictBaseModel):
|
|
@@ -20,4 +20,4 @@ StateT = TypeVar("StateT", bound=State, default=State)
|
|
|
20
20
|
|
|
21
21
|
def state_cls(cls: type) -> type[State]:
|
|
22
22
|
"""Resolve a class's `State` specialization through its MRO, else `State`."""
|
|
23
|
-
return
|
|
23
|
+
return concrete_type(cls, State) or State
|