verifiers 0.2.1.dev20__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.dev20 → verifiers-0.2.1.dev21}/PKG-INFO +1 -1
- {verifiers-0.2.1.dev20 → 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.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/debug.py +1 -2
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/eval/runner.py +15 -2
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/validate.py +1 -2
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/configs/debug.py +1 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/configs/eval.py +1 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/configs/validate.py +1 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/gepa/config.py +1 -1
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/gepa/dataset.py +8 -12
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/gepa/runner.py +2 -4
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/legacy.py +1 -1
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/serve/server.py +40 -8
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/serve/types.py +5 -4
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/taskset.py +46 -4
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/textarena/taskset.py +7 -6
- verifiers-0.2.1.dev21/verifiers/v1/utils/sampling.py +25 -0
- verifiers-0.2.1.dev20/verifiers/v1/utils/sampling.py +0 -26
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/.gitignore +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/LICENSE +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/README.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/pyproject.toml +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/AGENTS.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/conftest.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_build_script.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_client_config.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_env_group.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_env_server.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_environment.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_envs.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_imports.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_init_script.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_logging.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_parser.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_rubric.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_types.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_wordle_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/conftest.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/test_configs.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/test_envs.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/test_graph.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/test_judges.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/tests/v1/test_trace.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/decorators.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → 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.dev20 → 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.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
- {verifiers-0.2.1.dev20 → 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.dev20 → 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.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → 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.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → 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.dev20 → 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.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
- {verifiers-0.2.1.dev20 → 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.dev20 → 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.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/errors.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/types.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/configs/replay.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/env.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/episode.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/errors.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/graph.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harness.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/default/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/default/harness.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/default/program.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/judge.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/push.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/retries.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/docker.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/state.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/task.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/trace.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/types.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.2.1.dev20 → verifiers-0.2.1.dev21}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.1.dev20 → 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]
|
|
@@ -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
|
|
|
@@ -274,7 +273,7 @@ async def debug_task(task: Task, config: DebugConfig) -> tuple[Trace, bool]:
|
|
|
274
273
|
|
|
275
274
|
async def run_debug(config: DebugConfig) -> list[Trace]:
|
|
276
275
|
taskset = vf.load_taskset(config.taskset)
|
|
277
|
-
tasks =
|
|
276
|
+
tasks = taskset.select(config.num_tasks, config.shuffle)
|
|
278
277
|
if isinstance(config.runtime, vf.SubprocessConfig) and any(
|
|
279
278
|
type(t).NEEDS_CONTAINER or t.data.image for t in tasks
|
|
280
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
|
|
|
@@ -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."""
|
|
@@ -6,8 +6,10 @@ outcome there; scoring reads that file instead of trusting conversational text.
|
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
import copy
|
|
9
|
+
import itertools
|
|
9
10
|
import json
|
|
10
11
|
import random
|
|
12
|
+
from collections.abc import Iterator
|
|
11
13
|
from typing import Literal
|
|
12
14
|
|
|
13
15
|
import verifiers.v1 as vf
|
|
@@ -88,7 +90,6 @@ class TextArenaConfig(vf.TasksetConfig):
|
|
|
88
90
|
"WordLadder-v0",
|
|
89
91
|
"WordSearch-v0",
|
|
90
92
|
]
|
|
91
|
-
num_tasks: int = 1000
|
|
92
93
|
task: TextArenaTaskConfig = TextArenaTaskConfig()
|
|
93
94
|
|
|
94
95
|
|
|
@@ -115,7 +116,9 @@ class TextArenaTask(vf.Task[TextArenaData, TextArenaState, TextArenaTaskConfig])
|
|
|
115
116
|
|
|
116
117
|
|
|
117
118
|
class TextArenaTaskset(vf.Taskset[TextArenaTask, TextArenaConfig]):
|
|
118
|
-
|
|
119
|
+
INFINITE = True
|
|
120
|
+
|
|
121
|
+
def load(self) -> Iterator[TextArenaTask]:
|
|
119
122
|
nltk.download("words", quiet=True)
|
|
120
123
|
nltk.download("averaged_perceptron_tagger_eng", quiet=True)
|
|
121
124
|
template = ta.make(env_id=self.config.game)
|
|
@@ -130,8 +133,8 @@ class TextArenaTaskset(vf.Taskset[TextArenaTask, TextArenaConfig]):
|
|
|
130
133
|
# seed-invariant; otherwise each task must expose its seeded board.
|
|
131
134
|
first = observation(0)
|
|
132
135
|
seed_specific = observation(1) != first
|
|
133
|
-
|
|
134
|
-
TextArenaTask(
|
|
136
|
+
for i in itertools.count():
|
|
137
|
+
yield TextArenaTask(
|
|
135
138
|
TextArenaData(
|
|
136
139
|
idx=i,
|
|
137
140
|
name=f"{self.config.game}#{i}",
|
|
@@ -141,8 +144,6 @@ class TextArenaTaskset(vf.Taskset[TextArenaTask, TextArenaConfig]):
|
|
|
141
144
|
),
|
|
142
145
|
self.config.task,
|
|
143
146
|
)
|
|
144
|
-
for i in range(self.config.num_tasks)
|
|
145
|
-
]
|
|
146
147
|
|
|
147
148
|
|
|
148
149
|
if __name__ == "__main__":
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""Shared sampling: an optional fixed-seed shuffle, then an optional head-slice.
|
|
2
|
+
|
|
3
|
+
Every entrypoint narrows its items the same way: with `--shuffle`, a shuffle under a fixed
|
|
4
|
+
seed so the sampled subset is the *same* every run (reproducible), then an optional slice to
|
|
5
|
+
the first `limit`. Taskset entrypoints (eval, validate, debug, GEPA) go through
|
|
6
|
+
`Taskset.select`, which shares this shuffle; the server eval path and the legacy bridge
|
|
7
|
+
sample plain index lists here directly.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import random
|
|
11
|
+
from collections.abc import Iterable
|
|
12
|
+
from typing import TypeVar
|
|
13
|
+
|
|
14
|
+
SEED = 0 # fixed so `--shuffle` samples the same items every run (reproducible)
|
|
15
|
+
|
|
16
|
+
T = TypeVar("T")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def sample(items: Iterable[T], shuffle: bool, limit: int | None = None) -> list[T]:
|
|
20
|
+
"""`items` optionally shuffled under the fixed seed, then optionally sliced to the first
|
|
21
|
+
`limit`. Returns a new list; the input is left untouched."""
|
|
22
|
+
items = list(items)
|
|
23
|
+
if shuffle:
|
|
24
|
+
random.Random(SEED).shuffle(items)
|
|
25
|
+
return items if limit is None else items[:limit]
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"""Shared task sampling: an optional fixed-seed shuffle, then an optional head-slice.
|
|
2
|
-
|
|
3
|
-
Every taskset entrypoint — eval, server eval, debug, validate, legacy eval, and GEPA — narrows
|
|
4
|
-
the loaded tasks (or their indices) the same way: with `--shuffle`, a shuffle under a fixed seed
|
|
5
|
-
so the sampled subset is the *same* every run (reproducible), then an optional slice to the
|
|
6
|
-
first `limit`. GEPA layers its disjoint train/val split on top of this shuffle (see
|
|
7
|
-
`verifiers.v1.gepa.dataset`).
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
import random
|
|
11
|
-
from typing import TypeVar
|
|
12
|
-
|
|
13
|
-
_SHUFFLE_SEED = (
|
|
14
|
-
0 # fixed so `--shuffle` samples the same items every run (reproducible)
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
T = TypeVar("T")
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def sample(items: list[T], shuffle: bool, limit: int | None = None) -> list[T]:
|
|
21
|
-
"""`items` optionally shuffled under the fixed seed, then optionally sliced to the first
|
|
22
|
-
`limit`. Returns a new list; the input is left untouched."""
|
|
23
|
-
items = list(items)
|
|
24
|
-
if shuffle:
|
|
25
|
-
random.Random(_SHUFFLE_SEED).shuffle(items)
|
|
26
|
-
return items if limit is None else items[:limit]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|