verifiers 0.2.1.dev19__tar.gz → 0.2.1.dev21__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.dev19 → verifiers-0.2.1.dev21}/PKG-INFO +1 -1
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/v1/test_color_codeword_tasks.py +3 -3
- verifiers-0.2.1.dev21/tests/v1/test_taskset.py +71 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/cli/dashboard/eval.py +14 -11
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/cli/debug.py +15 -9
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/cli/eval/runner.py +15 -2
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/cli/validate.py +1 -2
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/configs/debug.py +1 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/configs/eval.py +1 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/configs/validate.py +1 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/gepa/config.py +1 -1
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/gepa/dataset.py +8 -12
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/gepa/runner.py +2 -4
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/legacy.py +1 -1
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/rollout.py +8 -2
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/serve/server.py +40 -8
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/serve/types.py +5 -4
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/taskset.py +46 -4
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/textarena/taskset.py +7 -6
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/trace.py +1 -0
- verifiers-0.2.1.dev21/verifiers/v1/utils/sampling.py +25 -0
- verifiers-0.2.1.dev19/verifiers/v1/utils/sampling.py +0 -26
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/.gitignore +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/LICENSE +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/README.md +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/pyproject.toml +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/AGENTS.md +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/conftest.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_build_script.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_client_config.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_env_group.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_env_server.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_environment.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_envs.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_imports.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_init_script.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_logging.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_parser.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_rubric.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_types.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_wordle_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/v1/conftest.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/v1/test_configs.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/v1/test_envs.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/v1/test_graph.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/v1/test_judges.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/tests/v1/test_trace.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/decorators.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/errors.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/types.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/configs/replay.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/env.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/episode.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/errors.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/graph.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/harness.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/default/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/default/harness.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/default/program.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/judge.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/push.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/retries.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/docker.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/state.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/task.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/types.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.1.dev19 → verifiers-0.2.1.dev21}/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.dev21
|
|
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,9 @@ def test_color_images_are_rendered_once(monkeypatch) -> None:
|
|
|
10
10
|
return render(color, size)
|
|
11
11
|
|
|
12
12
|
monkeypatch.setattr(taskset, "color_data_url", counted)
|
|
13
|
-
tasks = taskset.ColorCodewordTaskset(
|
|
14
|
-
|
|
15
|
-
)
|
|
13
|
+
tasks = taskset.ColorCodewordTaskset(taskset.ColorCodewordConfig()).select(
|
|
14
|
+
num_tasks=100
|
|
15
|
+
)
|
|
16
16
|
|
|
17
17
|
assert len(tasks) == 100
|
|
18
18
|
assert calls == list(taskset.COLOR_MAP)
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""`Taskset.select` over list, generator, and `INFINITE` `load` implementations."""
|
|
2
|
+
|
|
3
|
+
import itertools
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
import verifiers.v1 as vf
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class CountTask(vf.Task[vf.TaskData]):
|
|
11
|
+
pass
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class InfiniteTaskset(vf.Taskset[CountTask, vf.TasksetConfig]):
|
|
15
|
+
INFINITE = True
|
|
16
|
+
|
|
17
|
+
def load(self):
|
|
18
|
+
for i in itertools.count():
|
|
19
|
+
yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class FiniteTaskset(vf.Taskset[CountTask, vf.TasksetConfig]):
|
|
23
|
+
def load(self):
|
|
24
|
+
for i in range(10):
|
|
25
|
+
yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def idxs(tasks: list[CountTask]) -> list[int]:
|
|
29
|
+
return [task.data.idx for task in tasks]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def test_select_bounds_an_infinite_taskset() -> None:
|
|
33
|
+
tasks = InfiniteTaskset(vf.TasksetConfig()).select(num_tasks=5)
|
|
34
|
+
assert idxs(tasks) == [0, 1, 2, 3, 4]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def test_select_infinite_requires_num_tasks() -> None:
|
|
38
|
+
with pytest.raises(ValueError, match="infinite"):
|
|
39
|
+
InfiniteTaskset(vf.TasksetConfig()).select()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def test_select_infinite_ignores_shuffle() -> None:
|
|
43
|
+
tasks = InfiniteTaskset(vf.TasksetConfig()).select(num_tasks=3, shuffle=True)
|
|
44
|
+
assert idxs(tasks) == [0, 1, 2]
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def test_select_finite() -> None:
|
|
48
|
+
taskset = FiniteTaskset(vf.TasksetConfig())
|
|
49
|
+
assert len(taskset.select()) == 10
|
|
50
|
+
assert idxs(taskset.select(num_tasks=4)) == [0, 1, 2, 3]
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def test_select_shuffle_samples_the_whole_taskset_reproducibly() -> None:
|
|
54
|
+
taskset = FiniteTaskset(vf.TasksetConfig())
|
|
55
|
+
first = idxs(taskset.select(num_tasks=5, shuffle=True))
|
|
56
|
+
assert first == idxs(taskset.select(num_tasks=5, shuffle=True))
|
|
57
|
+
assert len(first) == 5 and set(first) <= set(range(10))
|
|
58
|
+
assert first != [0, 1, 2, 3, 4] # sampled from the whole set, not the head
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def test_select_only_builds_what_the_run_takes() -> None:
|
|
62
|
+
built: list[int] = []
|
|
63
|
+
|
|
64
|
+
class RecordingTaskset(InfiniteTaskset):
|
|
65
|
+
def load(self):
|
|
66
|
+
for i in itertools.count():
|
|
67
|
+
built.append(i)
|
|
68
|
+
yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
|
|
69
|
+
|
|
70
|
+
RecordingTaskset(vf.TasksetConfig()).select(num_tasks=3)
|
|
71
|
+
assert built == [0, 1, 2]
|
|
@@ -40,6 +40,7 @@ _LABEL_WIDTH = len("timeouts")
|
|
|
40
40
|
|
|
41
41
|
_STYLE = {
|
|
42
42
|
"pending": "dim",
|
|
43
|
+
"boot": "orange3",
|
|
43
44
|
"setup": "yellow",
|
|
44
45
|
"running": "cyan",
|
|
45
46
|
"finalize": "magenta",
|
|
@@ -49,6 +50,7 @@ _STYLE = {
|
|
|
49
50
|
}
|
|
50
51
|
_MARK_LABEL = {
|
|
51
52
|
"pending": "pending",
|
|
53
|
+
"boot": "boot",
|
|
52
54
|
"setup": "setup",
|
|
53
55
|
"running": "rollout",
|
|
54
56
|
"finalize": "finalize",
|
|
@@ -317,7 +319,7 @@ def _breakdown(done: list[Trace]) -> Table | None:
|
|
|
317
319
|
if judge.cost is not None:
|
|
318
320
|
total_judge_cost += judge.cost
|
|
319
321
|
have_judge = True
|
|
320
|
-
for phase in ("setup", "generation", "finalize", "scoring"):
|
|
322
|
+
for phase in ("boot", "setup", "generation", "finalize", "scoring"):
|
|
321
323
|
span = getattr(trace.timing, phase)
|
|
322
324
|
if span.end: # phase was timed for this rollout
|
|
323
325
|
phase_secs[phase] = phase_secs.get(phase, 0.0) + span.duration
|
|
@@ -351,7 +353,7 @@ def _breakdown(done: list[Trace]) -> Table | None:
|
|
|
351
353
|
grid.add_row("usage", " · ".join(usage))
|
|
352
354
|
time_segments = [
|
|
353
355
|
f"{phase} {format_time(phase_secs[phase] / phase_count[phase])}"
|
|
354
|
-
for phase in ("setup", "generation", "finalize", "scoring")
|
|
356
|
+
for phase in ("boot", "setup", "generation", "finalize", "scoring")
|
|
355
357
|
if phase_count.get(phase)
|
|
356
358
|
]
|
|
357
359
|
if time_segments:
|
|
@@ -383,11 +385,12 @@ def _tokens(trace: Trace) -> tuple[int, int, int | None, int | None, int]:
|
|
|
383
385
|
|
|
384
386
|
|
|
385
387
|
def _started(rollout: Rollout) -> float:
|
|
386
|
-
# Sort key: when a rollout began (its
|
|
387
|
-
# yet, so it sorts last (+inf) — behind
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
388
|
+
# Sort key: when a rollout began (its boot start; setup for pre-boot-span traces on
|
|
389
|
+
# resume). A still-pending rollout has no trace yet, so it sorts last (+inf) — behind
|
|
390
|
+
# everything already in flight, in task order.
|
|
391
|
+
if rollout.trace is None:
|
|
392
|
+
return float("inf")
|
|
393
|
+
return rollout.trace.timing.boot.start or rollout.trace.timing.setup.start
|
|
391
394
|
|
|
392
395
|
|
|
393
396
|
def _groups(rollouts: list[Rollout]) -> list[list[Rollout]]:
|
|
@@ -450,14 +453,14 @@ def Rows(groups: list[list[Rollout]], now: float, runtime_type: str) -> Table:
|
|
|
450
453
|
)
|
|
451
454
|
runtime = f"{runtime_type}({descriptor})" if descriptor else runtime_type
|
|
452
455
|
turns = t.num_turns
|
|
453
|
-
start = t.timing.setup.start
|
|
456
|
+
start = t.timing.boot.start or t.timing.setup.start
|
|
454
457
|
end = (
|
|
455
458
|
t.timing.scoring.end
|
|
456
459
|
or t.timing.finalize.end
|
|
457
460
|
or t.timing.generation.end
|
|
458
|
-
# a rollout that errored in setup has only
|
|
459
|
-
# else (still running) the timer would grow off `now` forever
|
|
460
|
-
or (t.timing.setup.end if t.is_completed else 0)
|
|
461
|
+
# a rollout that errored in boot/setup has only that span's end — freeze there
|
|
462
|
+
# once done, else (still running) the timer would grow off `now` forever
|
|
463
|
+
or ((t.timing.setup.end or t.timing.boot.end) if t.is_completed else 0)
|
|
461
464
|
or now
|
|
462
465
|
)
|
|
463
466
|
prompt, completion, cached, reasoning, nbranches = _tokens(t)
|
|
@@ -30,7 +30,6 @@ from verifiers.v1.task import Task
|
|
|
30
30
|
from verifiers.v1.trace import Error, Trace, TraceTask
|
|
31
31
|
from verifiers.v1.utils.interrupt import install_interrupt
|
|
32
32
|
from verifiers.v1.utils.logging import setup_logging
|
|
33
|
-
from verifiers.v1.utils.sampling import sample
|
|
34
33
|
|
|
35
34
|
logger = logging.getLogger(__name__)
|
|
36
35
|
|
|
@@ -138,15 +137,19 @@ def record_debug_error(
|
|
|
138
137
|
setup_timeout: float | None,
|
|
139
138
|
action_timeout: float | None,
|
|
140
139
|
) -> None:
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
140
|
+
now = time.time()
|
|
141
|
+
for span in (trace.timing.boot, trace.timing.setup, trace.timing.generation):
|
|
142
|
+
if span.start and not span.end:
|
|
143
|
+
span.end = now
|
|
145
144
|
in_action = bool(trace.timing.generation.start)
|
|
146
|
-
stage =
|
|
145
|
+
stage = (
|
|
146
|
+
"debug action" if in_action else "setup" if trace.timing.setup.start else "boot"
|
|
147
|
+
)
|
|
147
148
|
timeout = action_timeout if in_action else setup_timeout
|
|
148
149
|
error_start = (
|
|
149
|
-
trace.timing.generation.start
|
|
150
|
+
trace.timing.generation.start
|
|
151
|
+
if in_action
|
|
152
|
+
else trace.timing.setup.start or trace.timing.boot.start
|
|
150
153
|
)
|
|
151
154
|
debug.update(error_info(error, error_start, timeout, stage))
|
|
152
155
|
debug.setdefault("runtime", runtime_info(runtime))
|
|
@@ -226,8 +229,11 @@ async def debug_task(task: Task, config: DebugConfig) -> tuple[Trace, bool]:
|
|
|
226
229
|
else task.data.timeout.setup
|
|
227
230
|
)
|
|
228
231
|
try:
|
|
229
|
-
trace.timing.
|
|
232
|
+
trace.timing.boot.start = time.time()
|
|
230
233
|
await runtime.start()
|
|
234
|
+
now = time.time()
|
|
235
|
+
trace.timing.boot.end = now
|
|
236
|
+
trace.timing.setup.start = now
|
|
231
237
|
debug["runtime"] = runtime_info(runtime)
|
|
232
238
|
await asyncio.wait_for(
|
|
233
239
|
invoke(task.setup, {"trace": trace, "runtime": runtime}),
|
|
@@ -267,7 +273,7 @@ async def debug_task(task: Task, config: DebugConfig) -> tuple[Trace, bool]:
|
|
|
267
273
|
|
|
268
274
|
async def run_debug(config: DebugConfig) -> list[Trace]:
|
|
269
275
|
taskset = vf.load_taskset(config.taskset)
|
|
270
|
-
tasks =
|
|
276
|
+
tasks = taskset.select(config.num_tasks, config.shuffle)
|
|
271
277
|
if isinstance(config.runtime, vf.SubprocessConfig) and any(
|
|
272
278
|
type(t).NEEDS_CONTAINER or t.data.image for t in tasks
|
|
273
279
|
):
|
|
@@ -21,7 +21,7 @@ logger = logging.getLogger(__name__)
|
|
|
21
21
|
async def run_eval(env: Environment, config: EvalConfig) -> list[Trace]:
|
|
22
22
|
logger.info("eval config:\n%s", config.model_dump_json(indent=2))
|
|
23
23
|
client = resolve_client(config.client)
|
|
24
|
-
tasks =
|
|
24
|
+
tasks = env.taskset.select(config.num_tasks, config.shuffle)
|
|
25
25
|
ctx = ModelContext(client=client, model=config.model, sampling=config.sampling)
|
|
26
26
|
# One episode of `num_rollouts` rollouts per task; the shared semaphore bounds total
|
|
27
27
|
# concurrent rollouts (across episodes), so group rewards still see their whole episode.
|
|
@@ -162,7 +162,20 @@ async def run_eval_server(config: EvalConfig) -> list[Trace]:
|
|
|
162
162
|
await client.wait_for_server_startup(timeout=600)
|
|
163
163
|
info = await client.info()
|
|
164
164
|
group_scored = info.requires_group_scoring
|
|
165
|
-
|
|
165
|
+
if info.num_tasks is None: # infinite taskset - the run must be bounded
|
|
166
|
+
if config.num_tasks is None:
|
|
167
|
+
raise ValueError(
|
|
168
|
+
f"{config.env_id} is infinite - bound the run with -n/--num-tasks"
|
|
169
|
+
)
|
|
170
|
+
if config.shuffle:
|
|
171
|
+
logger.warning(
|
|
172
|
+
"shuffle is a no-op on an infinite taskset - "
|
|
173
|
+
"taking the first %d generated tasks",
|
|
174
|
+
config.num_tasks,
|
|
175
|
+
)
|
|
176
|
+
idxs = list(range(config.num_tasks))
|
|
177
|
+
else:
|
|
178
|
+
idxs = sample(list(range(info.num_tasks)), config.shuffle, config.num_tasks)
|
|
166
179
|
out = output_path(config)
|
|
167
180
|
finished: list[Trace] = []
|
|
168
181
|
if config.resume is not None:
|
|
@@ -26,7 +26,6 @@ from verifiers.v1.task import Task
|
|
|
26
26
|
from verifiers.v1.trace import Trace, TraceTask
|
|
27
27
|
from verifiers.v1.utils.interrupt import install_interrupt
|
|
28
28
|
from verifiers.v1.utils.logging import setup_logging
|
|
29
|
-
from verifiers.v1.utils.sampling import sample
|
|
30
29
|
|
|
31
30
|
logger = logging.getLogger(__name__)
|
|
32
31
|
|
|
@@ -198,7 +197,7 @@ async def _validate_task(task: Task, config: ValidateConfig) -> ResultRow:
|
|
|
198
197
|
|
|
199
198
|
async def run_validate(config: ValidateConfig) -> list[dict]:
|
|
200
199
|
taskset = vf.load_taskset(config.taskset)
|
|
201
|
-
tasks =
|
|
200
|
+
tasks = taskset.select(config.num_tasks, config.shuffle)
|
|
202
201
|
if isinstance(config.runtime, vf.SubprocessConfig) and any(
|
|
203
202
|
type(t).NEEDS_CONTAINER or t.data.image for t in tasks
|
|
204
203
|
):
|
|
@@ -22,6 +22,7 @@ class EvalConfig(EnvServerConfig):
|
|
|
22
22
|
sampling: SamplingConfig = SamplingConfig()
|
|
23
23
|
num_tasks: int | None = Field(
|
|
24
24
|
None,
|
|
25
|
+
ge=1,
|
|
25
26
|
validation_alias=AliasChoices("batch_size", "num_examples", "num_tasks", "n"),
|
|
26
27
|
)
|
|
27
28
|
"""How many tasks to evaluate (None = all)."""
|
|
@@ -26,6 +26,7 @@ class ValidateConfig(BaseConfig):
|
|
|
26
26
|
"""Run only `Task.setup` and `Task.validate`."""
|
|
27
27
|
num_tasks: int | None = Field(
|
|
28
28
|
None,
|
|
29
|
+
ge=1,
|
|
29
30
|
validation_alias=AliasChoices("num_tasks", "n", "num_examples", "batch_size"),
|
|
30
31
|
)
|
|
31
32
|
"""How many tasks to validate (None = all)."""
|
|
@@ -42,7 +42,7 @@ class GEPAConfig(EnvConfig):
|
|
|
42
42
|
"""Tasks held out to score each candidate system prompt for the pareto frontier."""
|
|
43
43
|
shuffle: bool = Field(True, validation_alias=AliasChoices("shuffle", "s"))
|
|
44
44
|
"""Shuffle tasks before splitting into train/val — v1 tasksets have no generic train/val
|
|
45
|
-
split, so GEPA carves one out of `
|
|
45
|
+
split, so GEPA carves one out of `Taskset.select` the way `run_eval` samples (fixed
|
|
46
46
|
seed, so the split is reproducible across runs)."""
|
|
47
47
|
seed: int = 0
|
|
48
48
|
"""Seed for GEPA's optimizer (candidate selection / minibatch sampling). Task shuffling
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
"""Train/val split and upfront validation for a GEPA run.
|
|
2
2
|
|
|
3
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
|
-
`
|
|
6
|
-
|
|
4
|
+
individual tasksets define ad hoc ones inconsistently), so GEPA carves one out of the tasks
|
|
5
|
+
`Taskset.select` hands it (the shared fixed-seed shuffle, reproducible across runs like every
|
|
6
|
+
other entrypoint): two disjoint slices.
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
9
|
from verifiers.v1.decorators import discover_decorated
|
|
10
10
|
from verifiers.v1.task import Task
|
|
11
|
-
from verifiers.v1.utils.sampling import sample
|
|
12
11
|
|
|
13
12
|
|
|
14
13
|
def reject_group_reward_tasksets(tasks: list[Task]) -> None:
|
|
@@ -26,19 +25,16 @@ def reject_group_reward_tasksets(tasks: list[Task]) -> None:
|
|
|
26
25
|
|
|
27
26
|
|
|
28
27
|
def split_tasks(
|
|
29
|
-
tasks: list[Task], num_train: int, num_val: int
|
|
28
|
+
tasks: list[Task], num_train: int, num_val: int
|
|
30
29
|
) -> tuple[list[Task], list[Task]]:
|
|
31
|
-
"""The
|
|
30
|
+
"""The selected tasks, split into disjoint `(train, val)` slices (`train` feeds reflection
|
|
32
31
|
minibatches; `val` scores each candidate for the pareto frontier)."""
|
|
33
|
-
|
|
34
|
-
tasks, shuffle
|
|
35
|
-
) # shared fixed-seed shuffle; GEPA does its own slicing below
|
|
36
|
-
if num_train + num_val > len(pool):
|
|
32
|
+
if num_train + num_val > len(tasks):
|
|
37
33
|
raise ValueError(
|
|
38
34
|
f"requested {num_train} train + {num_val} val tasks, but the taskset only "
|
|
39
|
-
f"loaded {len(
|
|
35
|
+
f"loaded {len(tasks)}"
|
|
40
36
|
)
|
|
41
|
-
return
|
|
37
|
+
return tasks[:num_train], tasks[num_train : num_train + num_val]
|
|
42
38
|
|
|
43
39
|
|
|
44
40
|
def resolve_gepa_seed_prompt(tasks: list[Task], initial_prompt: str | None) -> str:
|
|
@@ -38,10 +38,8 @@ class _GEPALog:
|
|
|
38
38
|
|
|
39
39
|
def run_gepa(env: Environment, config: GEPAConfig) -> GEPAResult:
|
|
40
40
|
logger.info("gepa config:\n%s", config.model_dump_json(indent=2))
|
|
41
|
-
all_tasks = env.taskset.
|
|
42
|
-
train_tasks, val_tasks = split_tasks(
|
|
43
|
-
all_tasks, config.num_train, config.num_val, config.shuffle
|
|
44
|
-
)
|
|
41
|
+
all_tasks = env.taskset.select(config.num_train + config.num_val, config.shuffle)
|
|
42
|
+
train_tasks, val_tasks = split_tasks(all_tasks, config.num_train, config.num_val)
|
|
45
43
|
selected_tasks = [*train_tasks, *val_tasks]
|
|
46
44
|
reject_group_reward_tasksets(
|
|
47
45
|
selected_tasks
|
|
@@ -329,7 +329,7 @@ class LegacyEnvServer(EnvServer):
|
|
|
329
329
|
self.dataset = self.env.get_dataset()
|
|
330
330
|
except ValueError:
|
|
331
331
|
self.dataset = self.env.get_eval_dataset()
|
|
332
|
-
self.
|
|
332
|
+
self.num_tasks: int | None = len(self.dataset) # drives the `info` response
|
|
333
333
|
self.requires_group_scoring = self.env.requires_group_rollouts
|
|
334
334
|
self._clients: dict[tuple[str, str], Any] = {}
|
|
335
335
|
|
|
@@ -37,6 +37,7 @@ logger = logging.getLogger(__name__)
|
|
|
37
37
|
|
|
38
38
|
class Phase(StrEnum):
|
|
39
39
|
PENDING = "pending"
|
|
40
|
+
BOOT = "boot"
|
|
40
41
|
SETUP = "setup"
|
|
41
42
|
RUNNING = "running"
|
|
42
43
|
FINALIZE = "finalize"
|
|
@@ -108,8 +109,8 @@ class Rollout:
|
|
|
108
109
|
state=state_cls(type(self.task))(),
|
|
109
110
|
)
|
|
110
111
|
self.trace = trace # expose for the --rich dashboard
|
|
111
|
-
self.phase = Phase.
|
|
112
|
-
trace.timing.
|
|
112
|
+
self.phase = Phase.BOOT # leaving the queue: the runtime boots now
|
|
113
|
+
trace.timing.boot.start = time.time()
|
|
113
114
|
self.runtime = make_runtime(self.runtime_config, name=trace.id)
|
|
114
115
|
runtime = self.runtime
|
|
115
116
|
trace.runtime = runtime.info
|
|
@@ -125,6 +126,10 @@ class Rollout:
|
|
|
125
126
|
try:
|
|
126
127
|
session = RolloutSession(ctx, trace, stops, self.limits)
|
|
127
128
|
await runtime.start()
|
|
129
|
+
now = time.time()
|
|
130
|
+
trace.timing.boot.end = now
|
|
131
|
+
trace.timing.setup.start = now
|
|
132
|
+
self.phase = Phase.SETUP
|
|
128
133
|
# Task setup and harness provisioning share one setup-stage deadline.
|
|
129
134
|
setup_deadline = (
|
|
130
135
|
None
|
|
@@ -228,6 +233,7 @@ class Rollout:
|
|
|
228
233
|
trace.is_completed = True
|
|
229
234
|
now = time.time()
|
|
230
235
|
for span in (
|
|
236
|
+
trace.timing.boot,
|
|
231
237
|
trace.timing.setup,
|
|
232
238
|
trace.timing.generation,
|
|
233
239
|
trace.timing.finalize,
|
|
@@ -26,6 +26,9 @@ from verifiers.v1.types import SamplingConfig
|
|
|
26
26
|
|
|
27
27
|
logger = logging.getLogger(__name__)
|
|
28
28
|
|
|
29
|
+
MAX_LAZY_TASKS = 1_000_000
|
|
30
|
+
"""Most tasks an infinite taskset's generator is willing to build (and cache) per worker."""
|
|
31
|
+
|
|
29
32
|
|
|
30
33
|
class EnvServer:
|
|
31
34
|
def __init__(
|
|
@@ -34,11 +37,20 @@ class EnvServer:
|
|
|
34
37
|
self.address = address
|
|
35
38
|
self.taskset_id = config.taskset.id
|
|
36
39
|
self.env = Environment(config)
|
|
37
|
-
|
|
40
|
+
# A finite taskset is materialized up front (its count is served via `info`); an
|
|
41
|
+
# infinite one is pulled off its generator on demand (see `_task`), so
|
|
42
|
+
# `num_tasks=None` on the wire ⟺ the taskset is infinite.
|
|
43
|
+
self._task_iter = iter(self.env.taskset.load())
|
|
44
|
+
self._tasks: list = []
|
|
45
|
+
self.num_tasks: int | None = None
|
|
46
|
+
if not type(self.env.taskset).INFINITE:
|
|
47
|
+
self._tasks = list(self._task_iter)
|
|
48
|
+
self.num_tasks = len(self._tasks)
|
|
38
49
|
# One task type per taskset (the authoring contract; its `load()` constructs it),
|
|
39
50
|
# so group scoring is a run-wide property.
|
|
40
|
-
|
|
41
|
-
|
|
51
|
+
first = self._task(0) if self.num_tasks != 0 else None
|
|
52
|
+
self.requires_group_scoring = first is not None and bool(
|
|
53
|
+
discover_decorated(first, "group_reward")
|
|
42
54
|
)
|
|
43
55
|
self._clients: dict[
|
|
44
56
|
tuple[str, str], Client
|
|
@@ -73,6 +85,26 @@ class EnvServer:
|
|
|
73
85
|
# of a spurious multiprocessing traceback, matching serve_env's own handling.
|
|
74
86
|
pass
|
|
75
87
|
|
|
88
|
+
def _task(self, idx: int):
|
|
89
|
+
"""The task at `idx`; an infinite taskset is generated (and cached) up to `idx`
|
|
90
|
+
on demand. Generation must be deterministic — every pool worker runs its own
|
|
91
|
+
`load()`, so idx-addressing relies on all of them producing the same sequence.
|
|
92
|
+
Lazy generation is capped at `MAX_LAZY_TASKS`: an idx that far ahead is a
|
|
93
|
+
runaway driver, and generating (and caching) toward it would hang the worker
|
|
94
|
+
and exhaust memory instead of failing the one request."""
|
|
95
|
+
while len(self._tasks) <= idx:
|
|
96
|
+
if idx >= MAX_LAZY_TASKS:
|
|
97
|
+
raise IndexError(
|
|
98
|
+
f"task_idx {idx} exceeds the lazy-generation cap ({MAX_LAZY_TASKS})"
|
|
99
|
+
)
|
|
100
|
+
try:
|
|
101
|
+
self._tasks.append(next(self._task_iter))
|
|
102
|
+
except StopIteration:
|
|
103
|
+
raise IndexError(
|
|
104
|
+
f"task_idx {idx} out of range ({len(self._tasks)} tasks)"
|
|
105
|
+
) from None
|
|
106
|
+
return self._tasks[idx]
|
|
107
|
+
|
|
76
108
|
def _client(self, client_config: ClientConfig, model: str) -> Client:
|
|
77
109
|
"""Cache clients because renderer initialization builds a tokenizer pool."""
|
|
78
110
|
key = (client_config.model_dump_json(), model)
|
|
@@ -96,14 +128,14 @@ class EnvServer:
|
|
|
96
128
|
|
|
97
129
|
async def _run_rollout(self, req: RunRolloutRequest) -> RunRolloutResponse:
|
|
98
130
|
ctx = self._context(req.client, req.model, req.sampling)
|
|
99
|
-
episode = self.env.episode(self.
|
|
131
|
+
episode = self.env.episode(self._task(req.task_idx), ctx, n=1)
|
|
100
132
|
traces = await episode.run()
|
|
101
133
|
# Trust the concrete trace; serialize it once before client-side re-typing.
|
|
102
134
|
return RunRolloutResponse.model_construct(trace=traces[0])
|
|
103
135
|
|
|
104
136
|
async def _run_group(self, req: RunGroupRequest) -> RunGroupResponse:
|
|
105
137
|
ctx = self._context(req.client, req.model, req.sampling)
|
|
106
|
-
episode = self.env.episode(self.
|
|
138
|
+
episode = self.env.episode(self._task(req.task_idx), ctx, n=req.n)
|
|
107
139
|
traces = await episode.run()
|
|
108
140
|
# Avoid a dump-and-validate copy for every trusted trace in the group.
|
|
109
141
|
return RunGroupResponse.model_construct(traces=traces)
|
|
@@ -118,7 +150,7 @@ class EnvServer:
|
|
|
118
150
|
response: BaseResponse = HealthResponse()
|
|
119
151
|
elif route == "info":
|
|
120
152
|
response = InfoResponse(
|
|
121
|
-
num_tasks=
|
|
153
|
+
num_tasks=self.num_tasks,
|
|
122
154
|
requires_group_scoring=self.requires_group_scoring,
|
|
123
155
|
)
|
|
124
156
|
elif route == "run_rollout":
|
|
@@ -151,10 +183,10 @@ class EnvServer:
|
|
|
151
183
|
|
|
152
184
|
async def run(self) -> None:
|
|
153
185
|
logger.info(
|
|
154
|
-
"EnvServer up: taskset=%s address=%s tasks=%
|
|
186
|
+
"EnvServer up: taskset=%s address=%s tasks=%s group_scoring=%s",
|
|
155
187
|
self.taskset_id,
|
|
156
188
|
self.address,
|
|
157
|
-
|
|
189
|
+
self.num_tasks if self.num_tasks is not None else "infinite",
|
|
158
190
|
self.requires_group_scoring,
|
|
159
191
|
)
|
|
160
192
|
poller = zmq.asyncio.Poller()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from typing import ClassVar
|
|
2
2
|
|
|
3
|
-
from pydantic import BaseModel, field_serializer
|
|
3
|
+
from pydantic import BaseModel, Field, field_serializer
|
|
4
4
|
|
|
5
5
|
from verifiers.v1.clients.config import ClientConfig
|
|
6
6
|
from verifiers.v1.task import WireTaskData
|
|
@@ -32,14 +32,15 @@ class InfoRequest(BaseRequest):
|
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
class InfoResponse(BaseResponse):
|
|
35
|
-
num_tasks: int =
|
|
35
|
+
num_tasks: int | None = None
|
|
36
|
+
"""Task count; `None` means the taskset is infinite (bound runs with `num_tasks`)."""
|
|
36
37
|
requires_group_scoring: bool = False
|
|
37
38
|
"""Whether tasks must be run and resumed as whole groups."""
|
|
38
39
|
|
|
39
40
|
|
|
40
41
|
class RunRolloutRequest(BaseRequest):
|
|
41
42
|
method: ClassVar[str] = "run_rollout"
|
|
42
|
-
task_idx: int
|
|
43
|
+
task_idx: int = Field(ge=0)
|
|
43
44
|
client: ClientConfig
|
|
44
45
|
model: str
|
|
45
46
|
sampling: SamplingConfig
|
|
@@ -56,7 +57,7 @@ class RunRolloutResponse(BaseResponse):
|
|
|
56
57
|
|
|
57
58
|
class RunGroupRequest(BaseRequest):
|
|
58
59
|
method: ClassVar[str] = "run_group"
|
|
59
|
-
task_idx: int
|
|
60
|
+
task_idx: int = Field(ge=0)
|
|
60
61
|
n: int
|
|
61
62
|
client: ClientConfig
|
|
62
63
|
model: str
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
"""The taskset: a thin loader that yields typed tasks.
|
|
2
2
|
|
|
3
3
|
A `Taskset` is the data half of an environment: config in, tasks out. `load()` — the one
|
|
4
|
-
subclass hook
|
|
5
|
-
|
|
4
|
+
subclass hook — builds each row's `TaskData` and wraps it in the task type with the
|
|
5
|
+
config's task-facing subtree:
|
|
6
6
|
|
|
7
|
-
def load(self) ->
|
|
7
|
+
def load(self) -> Iterable[MyTask]:
|
|
8
8
|
return [MyTask(MyData(idx=i, ...), self.config.task) for i in ...]
|
|
9
9
|
|
|
10
|
+
`load` may also be a generator — yielding each task as it's built, possibly forever (a
|
|
11
|
+
procedural taskset; declare `INFINITE = True`). Runs materialize the tasks they need
|
|
12
|
+
through `select`, which pulls only that many off a generator; the env server instead
|
|
13
|
+
pulls `load` on demand, task by task.
|
|
14
|
+
|
|
10
15
|
Load-time knobs (dataset, split, seed) live on the taskset config; the task-facing knobs
|
|
11
16
|
under its `task` subtree (`TasksetConfig.task`, a `TaskConfig`, everything under
|
|
12
17
|
`--taskset.task.*`); a worker-scoped shared tool server is declared on `tools` with its knobs
|
|
@@ -22,6 +27,9 @@ replay can rebuild every saved row as the declared type's data and re-wrap it.
|
|
|
22
27
|
|
|
23
28
|
from __future__ import annotations
|
|
24
29
|
|
|
30
|
+
import itertools
|
|
31
|
+
import logging
|
|
32
|
+
from collections.abc import Iterable
|
|
25
33
|
from typing import TYPE_CHECKING, ClassVar, Generic
|
|
26
34
|
|
|
27
35
|
from pydantic import SerializeAsAny
|
|
@@ -31,10 +39,13 @@ from typing_extensions import TypeVar
|
|
|
31
39
|
from verifiers.v1.task import TaskConfig, TaskT, resolve_server_config
|
|
32
40
|
from verifiers.v1.types import ID
|
|
33
41
|
from verifiers.v1.utils.install import env_name
|
|
42
|
+
from verifiers.v1.utils.sampling import sample
|
|
34
43
|
|
|
35
44
|
if TYPE_CHECKING:
|
|
36
45
|
from verifiers.v1.mcp import Toolset
|
|
37
46
|
|
|
47
|
+
logger = logging.getLogger(__name__)
|
|
48
|
+
|
|
38
49
|
|
|
39
50
|
class TasksetConfig(BaseConfig):
|
|
40
51
|
id: ID = ""
|
|
@@ -51,15 +62,46 @@ TasksetConfigT = TypeVar("TasksetConfigT", bound=TasksetConfig, default=TasksetC
|
|
|
51
62
|
|
|
52
63
|
|
|
53
64
|
class Taskset(Generic[TaskT, TasksetConfigT]):
|
|
65
|
+
INFINITE: ClassVar[bool] = False
|
|
66
|
+
"""Whether `load` yields tasks forever (a procedural generator). Infinity is inherent
|
|
67
|
+
to the taskset, not a config knob: consumers bound a run with `select(num_tasks)`
|
|
68
|
+
(`-n` on the CLI), and shuffle is impossible."""
|
|
69
|
+
|
|
54
70
|
tools: ClassVar[tuple[type[Toolset], ...]] = ()
|
|
55
71
|
"""Tool server classes shared by one environment worker's rollouts."""
|
|
56
72
|
|
|
57
73
|
def __init__(self, config: TasksetConfigT) -> None:
|
|
58
74
|
self.config = config
|
|
59
75
|
|
|
60
|
-
def load(self) ->
|
|
76
|
+
def load(self) -> Iterable[TaskT]:
|
|
61
77
|
raise NotImplementedError
|
|
62
78
|
|
|
79
|
+
def select(
|
|
80
|
+
self, num_tasks: int | None = None, shuffle: bool = False
|
|
81
|
+
) -> list[TaskT]:
|
|
82
|
+
"""Materialize the tasks a run needs: the first `num_tasks` off `load` (all of
|
|
83
|
+
them when `None`), pulled lazily — a generator `load` only builds what the run
|
|
84
|
+
takes. `shuffle` samples the subset from the whole taskset instead (the shared
|
|
85
|
+
fixed-seed shuffle, `verifiers.v1.utils.sampling`), which materializes everything
|
|
86
|
+
first; on an `INFINITE` taskset it's a no-op (warned) — the first `num_tasks`
|
|
87
|
+
generated tasks are already an arbitrary sample."""
|
|
88
|
+
if type(self).INFINITE:
|
|
89
|
+
if num_tasks is None:
|
|
90
|
+
raise ValueError(
|
|
91
|
+
f"{type(self).__name__} is infinite - select a bounded subset "
|
|
92
|
+
"with num_tasks (-n on the CLI)"
|
|
93
|
+
)
|
|
94
|
+
if shuffle:
|
|
95
|
+
logger.warning(
|
|
96
|
+
"shuffle is a no-op on an infinite taskset - "
|
|
97
|
+
"taking the first %d generated tasks",
|
|
98
|
+
num_tasks,
|
|
99
|
+
)
|
|
100
|
+
return list(itertools.islice(self.load(), num_tasks))
|
|
101
|
+
if shuffle:
|
|
102
|
+
return sample(self.load(), shuffle=True, limit=num_tasks)
|
|
103
|
+
return list(itertools.islice(self.load(), num_tasks))
|
|
104
|
+
|
|
63
105
|
def server_config(self, server_cls: type) -> BaseConfig:
|
|
64
106
|
"""The config a `tools` entry is built with, resolved off `self.config` (the
|
|
65
107
|
taskset config; see `resolve_server_config`). Override to pair explicitly."""
|