verifiers 0.2.1.dev6__tar.gz → 0.2.1.dev8__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.1.dev6 → verifiers-0.2.1.dev8}/PKG-INFO +1 -1
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/pyproject.toml +1 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/cli/debug.py +6 -9
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/cli/eval/main.py +1 -1
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/cli/eval/runner.py +3 -14
- verifiers-0.2.1.dev8/verifiers/v1/cli/gepa.py +74 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/cli/replay.py +4 -3
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/cli/validate.py +6 -10
- verifiers-0.2.1.dev8/verifiers/v1/gepa/__init__.py +12 -0
- verifiers-0.2.1.dev8/verifiers/v1/gepa/adapter.py +112 -0
- verifiers-0.2.1.dev8/verifiers/v1/gepa/config.py +78 -0
- verifiers-0.2.1.dev8/verifiers/v1/gepa/dataset.py +63 -0
- verifiers-0.2.1.dev8/verifiers/v1/gepa/reflection.py +28 -0
- verifiers-0.2.1.dev8/verifiers/v1/gepa/runner.py +122 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/legacy.py +2 -6
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/utils/interrupt.py +7 -5
- verifiers-0.2.1.dev8/verifiers/v1/utils/sampling.py +26 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/.gitignore +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/LICENSE +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/README.md +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/AGENTS.md +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/conftest.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_build_script.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_client_config.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_env_group.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_env_server.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_environment.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_envs.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_imports.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_init_script.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_logging.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_parser.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_rubric.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_types.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_wordle_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/v1/conftest.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/v1/test_configs.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/v1/test_envs.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/v1/test_graph.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/v1/test_judges.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/tests/v1/test_trace.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/decorators.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/errors.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/types.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/configs/debug.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/configs/replay.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/env.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/episode.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/errors.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/graph.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/harness.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/harnesses/default/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/harnesses/default/harness.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/harnesses/default/program.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/judge.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/push.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/retries.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/runtimes/docker.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/state.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/task.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/trace.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/types.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.1.dev6 → verifiers-0.2.1.dev8}/verifiers/v1/utils/memory.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.2.1.
|
|
3
|
+
Version: 0.2.1.dev8
|
|
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
|
|
@@ -170,6 +170,7 @@ debug = "verifiers.v1.cli.debug:main"
|
|
|
170
170
|
replay = "verifiers.v1.cli.replay:main"
|
|
171
171
|
serve = "verifiers.v1.cli.serve:main"
|
|
172
172
|
init = "verifiers.v1.cli.init:main"
|
|
173
|
+
gepa = "verifiers.v1.cli.gepa:main"
|
|
173
174
|
vf-gepa = "verifiers.scripts.gepa:main"
|
|
174
175
|
vf-init = "verifiers.scripts.init:main"
|
|
175
176
|
vf-install = "verifiers.scripts.install:main"
|
|
@@ -3,9 +3,7 @@
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import contextlib
|
|
5
5
|
import logging
|
|
6
|
-
import random
|
|
7
6
|
import shlex
|
|
8
|
-
import signal
|
|
9
7
|
import sys
|
|
10
8
|
import time
|
|
11
9
|
import traceback
|
|
@@ -30,7 +28,9 @@ from verifiers.v1.runtimes import ProgramResult, Runtime, make_runtime
|
|
|
30
28
|
from verifiers.v1.state import state_cls
|
|
31
29
|
from verifiers.v1.task import Task
|
|
32
30
|
from verifiers.v1.trace import Error, Trace, TraceTask
|
|
31
|
+
from verifiers.v1.utils.interrupt import install_interrupt
|
|
33
32
|
from verifiers.v1.utils.logging import setup_logging
|
|
33
|
+
from verifiers.v1.utils.sampling import sample
|
|
34
34
|
|
|
35
35
|
logger = logging.getLogger(__name__)
|
|
36
36
|
|
|
@@ -267,11 +267,7 @@ async def debug_task(task: Task, config: DebugConfig) -> tuple[Trace, bool]:
|
|
|
267
267
|
|
|
268
268
|
async def run_debug(config: DebugConfig) -> list[Trace]:
|
|
269
269
|
taskset = vf.load_taskset(config.taskset)
|
|
270
|
-
tasks = taskset.load()
|
|
271
|
-
if config.shuffle:
|
|
272
|
-
random.Random(0).shuffle(tasks)
|
|
273
|
-
if config.num_tasks is not None:
|
|
274
|
-
tasks = tasks[: config.num_tasks]
|
|
270
|
+
tasks = sample(taskset.load(), config.shuffle, config.num_tasks)
|
|
275
271
|
if isinstance(config.runtime, vf.SubprocessConfig) and any(
|
|
276
272
|
type(t).NEEDS_CONTAINER or t.data.image for t in tasks
|
|
277
273
|
):
|
|
@@ -327,8 +323,9 @@ def main(argv: list[str] | None = None) -> None:
|
|
|
327
323
|
sys.argv = [sys.argv[0], *argv]
|
|
328
324
|
config = cli(config_type)
|
|
329
325
|
setup_logging("DEBUG" if config.verbose else "INFO")
|
|
330
|
-
#
|
|
331
|
-
|
|
326
|
+
# Graceful shutdown: first Ctrl-C/SIGTERM unwinds each task's teardown `finally`;
|
|
327
|
+
# a second is swallowed so it can't orphan containers/sandboxes mid-cleanup.
|
|
328
|
+
install_interrupt()
|
|
332
329
|
asyncio.run(run_debug(config))
|
|
333
330
|
|
|
334
331
|
|
|
@@ -7,7 +7,7 @@ import sys
|
|
|
7
7
|
from pydantic_config import cli
|
|
8
8
|
|
|
9
9
|
import verifiers.v1 as vf
|
|
10
|
-
from verifiers.v1.utils.interrupt import
|
|
10
|
+
from verifiers.v1.utils.interrupt import install_interrupt
|
|
11
11
|
from verifiers.v1.utils.logging import setup_logging
|
|
12
12
|
from verifiers.v1.cli.output import output_path, write_config
|
|
13
13
|
from verifiers.v1.cli.resolve import (
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import contextlib
|
|
5
5
|
import logging
|
|
6
|
-
import random
|
|
7
6
|
import time
|
|
8
7
|
|
|
9
8
|
from verifiers.v1.clients import ModelContext, resolve_client
|
|
@@ -14,21 +13,15 @@ from verifiers.v1.cli.output import append_trace, output_path, save_config
|
|
|
14
13
|
from verifiers.v1.decorators import discover_decorated
|
|
15
14
|
from verifiers.v1.env import Environment
|
|
16
15
|
from verifiers.v1.trace import Trace
|
|
16
|
+
from verifiers.v1.utils.sampling import sample
|
|
17
17
|
|
|
18
18
|
logger = logging.getLogger(__name__)
|
|
19
19
|
|
|
20
|
-
_SHUFFLE_SEED = (
|
|
21
|
-
0 # fixed so `--shuffle` samples the same tasks every run (reproducible)
|
|
22
|
-
)
|
|
23
|
-
|
|
24
20
|
|
|
25
21
|
async def run_eval(env: Environment, config: EvalConfig) -> list[Trace]:
|
|
26
22
|
logger.info("eval config:\n%s", config.model_dump_json(indent=2))
|
|
27
23
|
client = resolve_client(config.client)
|
|
28
|
-
tasks = env.taskset.load()
|
|
29
|
-
if config.shuffle:
|
|
30
|
-
random.Random(_SHUFFLE_SEED).shuffle(tasks)
|
|
31
|
-
tasks = tasks if config.num_tasks is None else tasks[: config.num_tasks]
|
|
24
|
+
tasks = sample(env.taskset.load(), config.shuffle, config.num_tasks)
|
|
32
25
|
ctx = ModelContext(client=client, model=config.model, sampling=config.sampling)
|
|
33
26
|
# One episode of `num_rollouts` rollouts per task; the shared semaphore bounds total
|
|
34
27
|
# concurrent rollouts (across episodes), so group rewards still see their whole episode.
|
|
@@ -169,11 +162,7 @@ async def run_eval_server(config: EvalConfig) -> list[Trace]:
|
|
|
169
162
|
await client.wait_for_server_startup(timeout=600)
|
|
170
163
|
info = await client.info()
|
|
171
164
|
group_scored = info.requires_group_scoring
|
|
172
|
-
idxs = list(range(info.num_tasks))
|
|
173
|
-
if config.shuffle:
|
|
174
|
-
random.Random(_SHUFFLE_SEED).shuffle(idxs)
|
|
175
|
-
if config.num_tasks is not None:
|
|
176
|
-
idxs = idxs[: config.num_tasks]
|
|
165
|
+
idxs = sample(list(range(info.num_tasks)), config.shuffle, config.num_tasks)
|
|
177
166
|
out = output_path(config)
|
|
178
167
|
finished: list[Trace] = []
|
|
179
168
|
if config.resume is not None:
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""The GEPA entrypoint: `uv run gepa [<taskset-id>] --model <model> [options]`.
|
|
2
|
+
|
|
3
|
+
Registered as the `gepa` console script. Optimizes a v1 taskset's `Task.system_prompt` via
|
|
4
|
+
GEPA (Genetic-Pareto): alternating rollouts with a teacher LM reflecting on results — see
|
|
5
|
+
`verifiers.v1.gepa`. CLI resolution mirrors `eval`/`serve` (`verifiers.v1.cli.resolve`): a
|
|
6
|
+
leading bare token is the taskset id, the taskset/harness subconfigs are narrowed from their
|
|
7
|
+
`id`s so `--taskset.*` / `--harness.*` stay typed and `-h` renders them, `@ file.toml` loads,
|
|
8
|
+
and the actual parse is `pydantic_config.cli`. v1-native tasksets only — a legacy (v0) env is
|
|
9
|
+
rejected; run those through the existing `vf-gepa` command instead.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import logging
|
|
13
|
+
import sys
|
|
14
|
+
|
|
15
|
+
from pydantic_config import cli
|
|
16
|
+
|
|
17
|
+
import verifiers.v1 as vf
|
|
18
|
+
from verifiers.v1.cli.output import output_path, write_config
|
|
19
|
+
from verifiers.v1.cli.resolve import (
|
|
20
|
+
extract_id,
|
|
21
|
+
narrow_config,
|
|
22
|
+
references_config_file,
|
|
23
|
+
with_positional_taskset,
|
|
24
|
+
)
|
|
25
|
+
from verifiers.v1.gepa import GEPAConfig, run_gepa
|
|
26
|
+
from verifiers.v1.utils.interrupt import install_interrupt
|
|
27
|
+
from verifiers.v1.utils.logging import setup_logging
|
|
28
|
+
|
|
29
|
+
logger = logging.getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
USAGE = "usage: uv run gepa [<taskset-id>] [--harness.id <id>] --model <model> [options] [@ file.toml]"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def main(argv: list[str] | None = None) -> None:
|
|
35
|
+
argv = with_positional_taskset(list(sys.argv[1:]) if argv is None else list(argv))
|
|
36
|
+
|
|
37
|
+
if not argv or any(arg in ("-h", "--help") for arg in argv):
|
|
38
|
+
print(USAGE)
|
|
39
|
+
sys.argv = [sys.argv[0], "--help"]
|
|
40
|
+
cli(
|
|
41
|
+
narrow_config(GEPAConfig, argv)
|
|
42
|
+
) # full option help, narrowed to the given ids
|
|
43
|
+
return
|
|
44
|
+
if not extract_id(argv, "taskset") and not references_config_file(argv):
|
|
45
|
+
raise SystemExit(
|
|
46
|
+
USAGE
|
|
47
|
+
) # need a taskset (positional / --taskset.id) or a @ file.toml
|
|
48
|
+
|
|
49
|
+
config_type = narrow_config(GEPAConfig, argv)
|
|
50
|
+
sys.argv = [sys.argv[0], *argv] # let prime-pydantic-config render help/errors
|
|
51
|
+
config = cli(config_type)
|
|
52
|
+
if config.is_legacy:
|
|
53
|
+
raise SystemExit(
|
|
54
|
+
"gepa optimizes native v1 tasksets; run a legacy (v0) environment through "
|
|
55
|
+
"`vf-gepa` instead of `gepa`."
|
|
56
|
+
)
|
|
57
|
+
setup_logging("DEBUG" if config.verbose else "INFO")
|
|
58
|
+
if config.dry_run: # resolved + validated; write it to the output dir and exit
|
|
59
|
+
logger.info("wrote config to %s", write_config(config, output_path(config)))
|
|
60
|
+
return
|
|
61
|
+
|
|
62
|
+
# First Ctrl-C / SIGTERM warns and raises KeyboardInterrupt so a killed/timed-out run still
|
|
63
|
+
# runs the runner's `serving()` teardown (interception pool / tool-server runtimes); further
|
|
64
|
+
# signals during that cleanup are swallowed so an impatient second Ctrl-C can't orphan them.
|
|
65
|
+
install_interrupt()
|
|
66
|
+
|
|
67
|
+
env = vf.Environment(config)
|
|
68
|
+
try:
|
|
69
|
+
result = run_gepa(env, config)
|
|
70
|
+
except KeyboardInterrupt:
|
|
71
|
+
# Graceful cleanup already ran (run_gepa's finally tore down serving); exit on the
|
|
72
|
+
# conventional Ctrl-C code without dumping a traceback.
|
|
73
|
+
raise SystemExit(130)
|
|
74
|
+
print(f"best system prompt:\n{result.best_candidate.get('system_prompt', '')}")
|
|
@@ -10,7 +10,6 @@ config is the base for replay-specific overrides.
|
|
|
10
10
|
import asyncio
|
|
11
11
|
import contextlib
|
|
12
12
|
import logging
|
|
13
|
-
import signal
|
|
14
13
|
import sys
|
|
15
14
|
import time
|
|
16
15
|
import tomllib
|
|
@@ -31,6 +30,7 @@ from verifiers.v1.configs.replay import ReplayConfig
|
|
|
31
30
|
from verifiers.v1.state import state_cls
|
|
32
31
|
from verifiers.v1.task import Task, WireTaskData, task_data_cls
|
|
33
32
|
from verifiers.v1.trace import Trace
|
|
33
|
+
from verifiers.v1.utils.interrupt import install_interrupt
|
|
34
34
|
from verifiers.v1.utils.logging import setup_logging
|
|
35
35
|
|
|
36
36
|
logger = logging.getLogger(__name__)
|
|
@@ -220,8 +220,9 @@ def main(argv: list[str] | None = None) -> None:
|
|
|
220
220
|
logging.lastResort = None
|
|
221
221
|
else:
|
|
222
222
|
setup_logging(level, log_file=log_file, console=True)
|
|
223
|
-
#
|
|
224
|
-
|
|
223
|
+
# Graceful shutdown: first Ctrl-C/SIGTERM unwinds the scoring teardown `finally`;
|
|
224
|
+
# a second is swallowed so it can't orphan resources mid-cleanup.
|
|
225
|
+
install_interrupt()
|
|
225
226
|
asyncio.run(run_replay(config, source, out))
|
|
226
227
|
|
|
227
228
|
|
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import contextlib
|
|
5
5
|
import logging
|
|
6
|
-
import random
|
|
7
|
-
import signal
|
|
8
6
|
import sys
|
|
9
7
|
import time
|
|
10
8
|
from typing import Any
|
|
@@ -26,7 +24,9 @@ from verifiers.v1.runtimes import make_runtime
|
|
|
26
24
|
from verifiers.v1.state import state_cls
|
|
27
25
|
from verifiers.v1.task import Task
|
|
28
26
|
from verifiers.v1.trace import Trace, TraceTask
|
|
27
|
+
from verifiers.v1.utils.interrupt import install_interrupt
|
|
29
28
|
from verifiers.v1.utils.logging import setup_logging
|
|
29
|
+
from verifiers.v1.utils.sampling import sample
|
|
30
30
|
|
|
31
31
|
logger = logging.getLogger(__name__)
|
|
32
32
|
|
|
@@ -198,11 +198,7 @@ async def _validate_task(task: Task, config: ValidateConfig) -> ResultRow:
|
|
|
198
198
|
|
|
199
199
|
async def run_validate(config: ValidateConfig) -> list[dict]:
|
|
200
200
|
taskset = vf.load_taskset(config.taskset)
|
|
201
|
-
tasks = taskset.load()
|
|
202
|
-
if config.shuffle:
|
|
203
|
-
random.Random(0).shuffle(tasks)
|
|
204
|
-
if config.num_tasks is not None:
|
|
205
|
-
tasks = tasks[: config.num_tasks]
|
|
201
|
+
tasks = sample(taskset.load(), config.shuffle, config.num_tasks)
|
|
206
202
|
if isinstance(config.runtime, vf.SubprocessConfig) and any(
|
|
207
203
|
type(t).NEEDS_CONTAINER or t.data.image for t in tasks
|
|
208
204
|
):
|
|
@@ -273,9 +269,9 @@ def main(argv: list[str] | None = None) -> None:
|
|
|
273
269
|
setup_logging("DEBUG" if config.verbose else "INFO", console=not config.rich)
|
|
274
270
|
if config.rich:
|
|
275
271
|
logging.lastResort = None # drop stdlib records that bypass loguru
|
|
276
|
-
#
|
|
277
|
-
# (
|
|
278
|
-
|
|
272
|
+
# Graceful shutdown: first Ctrl-C/SIGTERM unwinds each task's teardown `finally`
|
|
273
|
+
# (containers/sandboxes); a second is swallowed so it can't orphan them mid-cleanup.
|
|
274
|
+
install_interrupt()
|
|
279
275
|
asyncio.run(run_validate(config))
|
|
280
276
|
|
|
281
277
|
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""GEPA (Genetic-Pareto) system-prompt optimization for native v1 environments.
|
|
2
|
+
|
|
3
|
+
`run_gepa(env, config)` drives the third-party `gepa` optimizer against a v1 `Environment`
|
|
4
|
+
via `GEPAAdapter`, seeding from and improving `Task.system_prompt`. The `gepa` console
|
|
5
|
+
script (`verifiers.v1.cli.gepa`) is a thin entrypoint over this package.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from verifiers.v1.gepa.adapter import GEPAAdapter
|
|
9
|
+
from verifiers.v1.gepa.config import GEPAConfig
|
|
10
|
+
from verifiers.v1.gepa.runner import run_gepa
|
|
11
|
+
|
|
12
|
+
__all__ = ["GEPAAdapter", "GEPAConfig", "run_gepa"]
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"""The GEPA <-> v1 bridge: run a candidate system prompt over a batch of tasks and score it.
|
|
2
|
+
|
|
3
|
+
GEPA's adapter protocol (`evaluate`, `make_reflective_dataset`) is synchronous and
|
|
4
|
+
`gepa.api.optimize` blocks, but v1 rollouts are async. The runner manages one event loop by
|
|
5
|
+
hand: it enters `env.serving()` on that loop and runs the blocking `optimize()` on the main
|
|
6
|
+
thread, so each synchronous `evaluate()` drives its batch of rollouts with
|
|
7
|
+
`loop.run_until_complete` — the one sync↔async hop. (Mirrors how v0 vf-gepa bridged; no worker
|
|
8
|
+
thread, so a Ctrl-C unwinds straight through `optimize()` into the runner's teardown.)
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import asyncio
|
|
12
|
+
from collections.abc import Awaitable
|
|
13
|
+
from dataclasses import dataclass, field
|
|
14
|
+
from typing import Any, Callable, Mapping, Sequence
|
|
15
|
+
|
|
16
|
+
from gepa.core.adapter import EvaluationBatch
|
|
17
|
+
from pydantic_core import to_jsonable_python
|
|
18
|
+
|
|
19
|
+
from verifiers.v1.clients import ModelContext
|
|
20
|
+
from verifiers.v1.env import Environment
|
|
21
|
+
from verifiers.v1.task import Task
|
|
22
|
+
from verifiers.v1.trace import Trace
|
|
23
|
+
|
|
24
|
+
Candidate = dict[str, str]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass
|
|
28
|
+
class GEPAAdapter:
|
|
29
|
+
"""Bridges GEPA's optimization loop with a native v1 `Environment`. `tasks` covers only the
|
|
30
|
+
trainset + valset tasks GEPA was given (not the whole taskset), keyed by `task.data.idx` —
|
|
31
|
+
GEPA's `batch` is a list of those idxs, and injecting the candidate rebuilds each `Task`
|
|
32
|
+
around a `data` row carrying the new `system_prompt`. `loop` is the runner's persistent event
|
|
33
|
+
loop (which holds `env.serving()` open); `evaluate` drives its rollouts on it with
|
|
34
|
+
`run_until_complete`."""
|
|
35
|
+
|
|
36
|
+
env: Environment
|
|
37
|
+
ctx: ModelContext
|
|
38
|
+
tasks: dict[int, Task]
|
|
39
|
+
loop: asyncio.AbstractEventLoop
|
|
40
|
+
semaphore: asyncio.Semaphore | None = None
|
|
41
|
+
on_complete: Callable[[Trace], Awaitable[None]] | None = None
|
|
42
|
+
"""Called with each rollout's trace as it finalizes — the runner's persist hook that
|
|
43
|
+
streams traces to `traces.jsonl`, exactly as `run_eval` does."""
|
|
44
|
+
reflection_columns: list[str] = field(default_factory=list)
|
|
45
|
+
propose_new_texts: Callable[..., Candidate] | None = None
|
|
46
|
+
"""Part of GEPA's adapter protocol — its proposer reads this attribute on every reflection
|
|
47
|
+
step. None = use GEPA's default reflection-LM proposer (the AttributeError from leaving it
|
|
48
|
+
undeclared silently disables all mutation proposals)."""
|
|
49
|
+
|
|
50
|
+
def evaluate(
|
|
51
|
+
self,
|
|
52
|
+
batch: list[int],
|
|
53
|
+
candidate: Candidate,
|
|
54
|
+
capture_traces: bool = False,
|
|
55
|
+
) -> EvaluationBatch[Trace, Trace]:
|
|
56
|
+
"""Run `candidate`'s system prompt on the tasks named by `batch` (`Task.idx` values)
|
|
57
|
+
and score them. Called synchronously by GEPA on the main thread; each batch's rollouts
|
|
58
|
+
run on the runner's persistent loop via `run_until_complete`."""
|
|
59
|
+
system_prompt = candidate.get("system_prompt", "")
|
|
60
|
+
traces = self.loop.run_until_complete(self._run_batch(batch, system_prompt))
|
|
61
|
+
scores = [trace.reward for trace in traces]
|
|
62
|
+
return EvaluationBatch(
|
|
63
|
+
outputs=traces,
|
|
64
|
+
scores=scores,
|
|
65
|
+
trajectories=traces if capture_traces else None,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
async def _run_batch(self, batch: list[int], system_prompt: str) -> list[Trace]:
|
|
69
|
+
# Inject the candidate by rebuilding each Task around a data row with the new
|
|
70
|
+
# system_prompt (TaskData is frozen; behavior/config carry over unchanged).
|
|
71
|
+
tasks = [
|
|
72
|
+
type(t)(
|
|
73
|
+
t.data.model_copy(update={"system_prompt": system_prompt}), t.config
|
|
74
|
+
)
|
|
75
|
+
for t in (self.tasks[idx] for idx in batch)
|
|
76
|
+
]
|
|
77
|
+
episodes = [self.env.episode(task, self.ctx, n=1) for task in tasks]
|
|
78
|
+
results = await asyncio.gather(
|
|
79
|
+
*(episode.run(self.semaphore, self.on_complete) for episode in episodes)
|
|
80
|
+
)
|
|
81
|
+
return [trace for episode_traces in results for trace in episode_traces]
|
|
82
|
+
|
|
83
|
+
def make_reflective_dataset(
|
|
84
|
+
self,
|
|
85
|
+
candidate: Candidate, # noqa: ARG002 - required by GEPA's adapter protocol
|
|
86
|
+
eval_batch: EvaluationBatch[Trace, Trace],
|
|
87
|
+
components_to_update: list[str],
|
|
88
|
+
) -> Mapping[str, Sequence[Mapping[str, Any]]]:
|
|
89
|
+
"""Build the reflective dataset the teacher LM reads to propose a new system prompt,
|
|
90
|
+
from `eval_batch.trajectories` (traces captured by a prior `evaluate(capture_traces=True)`
|
|
91
|
+
on the same batch)."""
|
|
92
|
+
traces = eval_batch.trajectories or []
|
|
93
|
+
records = []
|
|
94
|
+
for trace, score in zip(traces, eval_batch.scores):
|
|
95
|
+
record: dict[str, Any] = {
|
|
96
|
+
"query": trace.task.data.prompt_text,
|
|
97
|
+
"completion": trace.last_reply,
|
|
98
|
+
"reward": score,
|
|
99
|
+
}
|
|
100
|
+
if trace.has_error:
|
|
101
|
+
record["error"] = str(trace.error)
|
|
102
|
+
if trace.stop_condition:
|
|
103
|
+
record["stop_condition"] = trace.stop_condition
|
|
104
|
+
for column in self.reflection_columns:
|
|
105
|
+
if column in trace.info:
|
|
106
|
+
record[column] = to_jsonable_python(trace.info[column])
|
|
107
|
+
elif hasattr(trace.task.data, column):
|
|
108
|
+
record[column] = to_jsonable_python(
|
|
109
|
+
getattr(trace.task.data, column)
|
|
110
|
+
)
|
|
111
|
+
records.append(record)
|
|
112
|
+
return {comp: records for comp in components_to_update}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""The `GEPAConfig`: the single config object the `gepa` CLI parses.
|
|
2
|
+
|
|
3
|
+
GEPA optimizes one taskset's `Task.system_prompt` by alternating rollouts (`evaluate`) with a
|
|
4
|
+
teacher LM reflecting on the reflective dataset (`make_reflective_dataset`) — see
|
|
5
|
+
`verifiers.v1.gepa.adapter.GEPAAdapter`. This inherits `EnvConfig`'s fields (`taskset`,
|
|
6
|
+
`harness`, `max_turns`, token limits, timeouts) as top-level flags, the same way `EvalConfig`
|
|
7
|
+
does, and adds the optimization loop's own knobs (model, reflection model, train/val split,
|
|
8
|
+
budget). There is no worker pool here (`EnvServerConfig` is not a base) — GEPA always runs
|
|
9
|
+
in-process, since its adapter protocol is itself synchronous (see `GEPAAdapter`)."""
|
|
10
|
+
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from uuid import uuid4
|
|
13
|
+
|
|
14
|
+
from pydantic import AliasChoices, Field
|
|
15
|
+
|
|
16
|
+
from verifiers.v1.clients import EvalClientConfig
|
|
17
|
+
from verifiers.v1.env import EnvConfig
|
|
18
|
+
from verifiers.v1.types import SamplingConfig
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class GEPAConfig(EnvConfig):
|
|
22
|
+
"""The GEPA run plus its environment. `model` runs the rollouts under optimization;
|
|
23
|
+
`reflection_model` (defaults to `model`) proposes new system prompts from the reflective
|
|
24
|
+
dataset. No default for `model` — a GEPA run can spend a large eval budget, so pick it
|
|
25
|
+
explicitly rather than silently optimizing (and spending) against a fallback."""
|
|
26
|
+
|
|
27
|
+
uuid: str = Field(default_factory=lambda: str(uuid4()), exclude=True)
|
|
28
|
+
"""Auto-generated run id — the leaf of the output dir, so runs never overwrite.
|
|
29
|
+
Excluded from the saved config so re-running `@ config.toml` lands in a fresh dir."""
|
|
30
|
+
model: str = Field(..., validation_alias=AliasChoices("model", "m"))
|
|
31
|
+
"""Model id for rollouts under optimization."""
|
|
32
|
+
client: EvalClientConfig = EvalClientConfig()
|
|
33
|
+
sampling: SamplingConfig = SamplingConfig()
|
|
34
|
+
reflection_model: str | None = None
|
|
35
|
+
"""Teacher model that proposes new system prompts. None = reuse `model`."""
|
|
36
|
+
reflection_client: EvalClientConfig | None = None
|
|
37
|
+
"""Endpoint for `reflection_model`. None = reuse `client`."""
|
|
38
|
+
|
|
39
|
+
num_train: int = Field(100, ge=1)
|
|
40
|
+
"""Tasks reserved for reflection minibatches (GEPA never scores the full trainset at once)."""
|
|
41
|
+
num_val: int = Field(50, ge=1)
|
|
42
|
+
"""Tasks held out to score each candidate system prompt for the pareto frontier."""
|
|
43
|
+
shuffle: bool = Field(True, validation_alias=AliasChoices("shuffle", "s"))
|
|
44
|
+
"""Shuffle tasks before splitting into train/val — v1 tasksets have no generic train/val
|
|
45
|
+
split, so GEPA carves one out of `taskset.load()` the way `run_eval` samples (fixed
|
|
46
|
+
seed, so the split is reproducible across runs)."""
|
|
47
|
+
seed: int = 0
|
|
48
|
+
"""Seed for GEPA's optimizer (candidate selection / minibatch sampling). Task shuffling
|
|
49
|
+
uses a fixed seed, matching eval — so this doesn't change the train/val split."""
|
|
50
|
+
|
|
51
|
+
max_metric_calls: int = Field(
|
|
52
|
+
500, validation_alias=AliasChoices("max_metric_calls", "B")
|
|
53
|
+
)
|
|
54
|
+
"""Total rollouts GEPA may spend across the whole optimization run."""
|
|
55
|
+
reflection_minibatch_size: int = 3
|
|
56
|
+
"""Train tasks sampled per reflection step."""
|
|
57
|
+
perfect_score: float | None = None
|
|
58
|
+
"""Skip reflecting on a minibatch that already scores this well."""
|
|
59
|
+
reflection_columns: list[str] = Field(default_factory=list)
|
|
60
|
+
"""Extra per-trace fields (from `trace.info`, else `task`) to surface to the teacher LM."""
|
|
61
|
+
initial_prompt: str | None = None
|
|
62
|
+
"""Seed system prompt. None = the first loaded task's `Task.system_prompt`, if any task
|
|
63
|
+
sets one (see `resolve_gepa_seed_prompt`)."""
|
|
64
|
+
|
|
65
|
+
max_concurrent: int | None = Field(
|
|
66
|
+
128, validation_alias=AliasChoices("max_concurrent", "c")
|
|
67
|
+
)
|
|
68
|
+
"""Max rollouts in flight at once, across the whole run."""
|
|
69
|
+
output_dir: Path | None = Field(
|
|
70
|
+
None, validation_alias=AliasChoices("output_dir", "o")
|
|
71
|
+
)
|
|
72
|
+
"""Where to write results (config.toml + the streamed traces.jsonl, alongside GEPA's own
|
|
73
|
+
candidates.json / run_log.json). None = a fresh per-run dir under
|
|
74
|
+
`outputs/<taskset>--<model>--<harness>/<uuid>` (via `output_path`)."""
|
|
75
|
+
save_results: bool = True
|
|
76
|
+
verbose: bool = Field(False, validation_alias=AliasChoices("verbose", "v"))
|
|
77
|
+
dry_run: bool = False
|
|
78
|
+
"""Resolve + validate the config and dump it, then exit."""
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"""Train/val split and upfront validation for a GEPA run.
|
|
2
|
+
|
|
3
|
+
v1 tasksets have no generic train/val split concept (`TasksetConfig` has no `split` field;
|
|
4
|
+
individual tasksets define ad hoc ones inconsistently), so GEPA carves one out of
|
|
5
|
+
`taskset.load()` itself: the shared fixed-seed shuffle (`verifiers.v1.utils.sampling.sample`,
|
|
6
|
+
reproducible across runs like every other entrypoint), then two disjoint slices.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from verifiers.v1.decorators import discover_decorated
|
|
10
|
+
from verifiers.v1.task import Task
|
|
11
|
+
from verifiers.v1.utils.sampling import sample
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def reject_group_reward_tasksets(tasks: list[Task]) -> None:
|
|
15
|
+
"""GEPA scores one rollout per task (`n=1`) to get the per-task scalar its pareto frontier
|
|
16
|
+
needs, but `@group_reward`s compare a task's rollouts and need >=2 — so a group-reward
|
|
17
|
+
taskset can't be optimized this way (`Environment.episode` would raise on the first batch).
|
|
18
|
+
Reject it up front with a clear message instead of crashing mid-run. A taskset loads one task
|
|
19
|
+
type, so the first task is representative (as `run_eval` also assumes)."""
|
|
20
|
+
if tasks and discover_decorated(tasks[0], "group_reward"):
|
|
21
|
+
raise ValueError(
|
|
22
|
+
"this taskset defines @group_reward(s), which compare >=2 rollouts of a task; GEPA "
|
|
23
|
+
"optimizes a single system prompt from per-task scalar scores (one rollout per task) "
|
|
24
|
+
"and can't score group rewards. Optimize a taskset without @group_reward instead."
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def split_tasks(
|
|
29
|
+
tasks: list[Task], num_train: int, num_val: int, shuffle: bool
|
|
30
|
+
) -> tuple[list[Task], list[Task]]:
|
|
31
|
+
"""The taskset's tasks, split into disjoint `(train, val)` slices (`train` feeds reflection
|
|
32
|
+
minibatches; `val` scores each candidate for the pareto frontier)."""
|
|
33
|
+
pool = sample(
|
|
34
|
+
tasks, shuffle
|
|
35
|
+
) # shared fixed-seed shuffle; GEPA does its own slicing below
|
|
36
|
+
if num_train + num_val > len(pool):
|
|
37
|
+
raise ValueError(
|
|
38
|
+
f"requested {num_train} train + {num_val} val tasks, but the taskset only "
|
|
39
|
+
f"loaded {len(pool)}"
|
|
40
|
+
)
|
|
41
|
+
return pool[:num_train], pool[num_train : num_train + num_val]
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def resolve_gepa_seed_prompt(tasks: list[Task], initial_prompt: str | None) -> str:
|
|
45
|
+
"""The system prompt GEPA starts optimizing from: `initial_prompt` if given, else the first
|
|
46
|
+
task that sets `system_prompt`. Some tasksets (e.g. `gsm8k-v1`) bake instructions into
|
|
47
|
+
`prompt` rather than `system_prompt` and can't be optimized this way — pass `--initial-prompt`
|
|
48
|
+
to seed one explicitly.
|
|
49
|
+
|
|
50
|
+
How the resolved prompt reaches the model at rollout time — a real system message vs. folded
|
|
51
|
+
into the user prompt — is the harness's call: `Harness.resolve_prompt` owns that policy and
|
|
52
|
+
warns when it folds, so it isn't re-policed here."""
|
|
53
|
+
if initial_prompt is not None:
|
|
54
|
+
return initial_prompt
|
|
55
|
+
for task in tasks:
|
|
56
|
+
if task.data.system_prompt is not None:
|
|
57
|
+
return task.data.system_prompt
|
|
58
|
+
raise ValueError(
|
|
59
|
+
"no task in this taskset sets Task.system_prompt — some tasksets bake instructions "
|
|
60
|
+
"directly into `prompt` instead (e.g. gsm8k-v1) and can't be optimized this way. Pass "
|
|
61
|
+
"--initial-prompt to seed one explicitly, or pick a taskset whose load() sets "
|
|
62
|
+
"system_prompt on its task data (e.g. reverse-text-v1, lean, textarena)."
|
|
63
|
+
)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""The reflection (teacher) LM: GEPA's proposer calls this synchronously to turn a prompt into
|
|
2
|
+
text. Backed by a vf `Judge` — `Judge.complete` owns the model client (same key / header /
|
|
3
|
+
Prime-billing resolution rollouts use), so we never build one here. GEPA calls it from the
|
|
4
|
+
worker thread running `optimize()`, so each call drives the async `complete` on a private loop.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import asyncio
|
|
8
|
+
from typing import Callable
|
|
9
|
+
|
|
10
|
+
from verifiers.v1.gepa.config import GEPAConfig
|
|
11
|
+
from verifiers.v1.judge import Judge, JudgeConfig
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def build_reflection_lm(config: GEPAConfig) -> Callable[[str], str]:
|
|
15
|
+
client = config.reflection_client or config.client
|
|
16
|
+
judge = Judge(
|
|
17
|
+
JudgeConfig(
|
|
18
|
+
model=config.reflection_model or config.model,
|
|
19
|
+
base_url=client.base_url,
|
|
20
|
+
api_key_var=client.api_key_var,
|
|
21
|
+
headers=client.headers,
|
|
22
|
+
)
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
def reflection_lm(prompt: str) -> str:
|
|
26
|
+
return asyncio.run(judge.complete(prompt)).text
|
|
27
|
+
|
|
28
|
+
return reflection_lm
|