verifiers 0.2.2.dev50__tar.gz → 0.2.2.dev52__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/PKG-INFO +1 -1
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/conftest.py +4 -9
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/test_color_codeword_tasks.py +1 -3
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/test_e2e.py +1 -1
- verifiers-0.2.2.dev52/tests/v1/test_taskset.py +93 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/debug.py +8 -1
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/eval/runner.py +18 -4
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/validate.py +8 -1
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/taskset.py +2 -2
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/env.py +2 -2
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/gepa/runner.py +4 -1
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/judge.py +2 -2
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/loaders.py +4 -4
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/mcp/server.py +2 -2
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/state.py +2 -2
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/task.py +31 -33
- verifiers-0.2.2.dev52/verifiers/v1/taskset.py +116 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/generic.py +1 -1
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/sampling.py +4 -5
- verifiers-0.2.2.dev50/tests/v1/test_taskset.py +0 -71
- verifiers-0.2.2.dev50/verifiers/v1/taskset.py +0 -103
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/.gitignore +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/LICENSE +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/README.md +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/pyproject.toml +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/conftest.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_build_script.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_client_config.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_env_group.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_env_server.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_environment.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_imports.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_init_script.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_logging.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_parser.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_rubric.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_types.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/duet_v1.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/test_configs.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/test_envs.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/test_graph.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/test_judges.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/tests/v1/test_trace.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/decorators.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/errors.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/types.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/acp/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/acp/_runner.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/agent.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/agent.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/cli/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/cli/debug.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/cli/env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/cli/eval.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/cli/init.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/cli/replay.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/cli/serve.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/cli/validate.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/harness.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/judge.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/legacy.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/retries.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/configs/task.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/envs/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/envs/agentic_judge/env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/envs/best_of_n/env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/envs/single_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/envs/single_agent/env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/envs/user_sim/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/envs/user_sim/env.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/episode.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/errors.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/graph.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harness.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/bash/program.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/pool/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/pool/harness.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/push.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/retries.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/runtimes/docker/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/runtimes/docker/egress.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/session.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/trace.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/types.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/compile.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/git.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.2.2.dev50 → verifiers-0.2.2.dev52}/verifiers/v1/utils/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.2.2.
|
|
3
|
+
Version: 0.2.2.dev52
|
|
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
|
|
@@ -135,10 +135,6 @@ def _eval_config(
|
|
|
135
135
|
`{id: ...}` config; `runtime` places the `agent` seat's harness (an agent field, not a
|
|
136
136
|
harness one); `model` overrides the default text model (e.g. a VLM for an image task).
|
|
137
137
|
|
|
138
|
-
`temperature=0` (greedy) makes the run reproducible; `max_tokens` is generous headroom,
|
|
139
|
-
not a target — these trivial tasks finish in a few hundred tokens, so capping tighter only
|
|
140
|
-
risks truncating the reasoning before the answer (which tanks the reward).
|
|
141
|
-
|
|
142
138
|
`harness=None` leaves every seat on its own story — the multi-agent case: there
|
|
143
139
|
is no run-level harness, so a single-agent test's `harness` lands on the `agent`
|
|
144
140
|
seat and a multi-agent test pins its seats through `env` role fields instead."""
|
|
@@ -175,7 +171,6 @@ def _eval_config(
|
|
|
175
171
|
num_rollouts=n,
|
|
176
172
|
sampling={
|
|
177
173
|
"max_tokens": max_tokens,
|
|
178
|
-
"temperature": 0,
|
|
179
174
|
"reasoning_effort": reasoning_effort,
|
|
180
175
|
},
|
|
181
176
|
rich=False,
|
|
@@ -219,8 +214,8 @@ def run_v1_server():
|
|
|
219
214
|
|
|
220
215
|
@pytest.fixture
|
|
221
216
|
async def live_ctx():
|
|
222
|
-
"""A live `ModelContext` (the e2e default model + endpoint,
|
|
223
|
-
`Agent` directly — the agent-surface counterpart of `run_v1`."""
|
|
217
|
+
"""A live `ModelContext` (the e2e default model + endpoint, provider-default
|
|
218
|
+
sampling) for driving `Agent` directly — the agent-surface counterpart of `run_v1`."""
|
|
224
219
|
from verifiers.v1.clients import EvalClientConfig, ModelContext, resolve_client
|
|
225
220
|
from verifiers.v1.types import SamplingConfig
|
|
226
221
|
|
|
@@ -229,7 +224,7 @@ async def live_ctx():
|
|
|
229
224
|
yield ModelContext(
|
|
230
225
|
model="deepseek/deepseek-v4-flash",
|
|
231
226
|
client=client,
|
|
232
|
-
sampling=SamplingConfig(max_tokens=2048
|
|
227
|
+
sampling=SamplingConfig(max_tokens=2048),
|
|
233
228
|
)
|
|
234
229
|
finally:
|
|
235
230
|
await client.close()
|
|
@@ -252,7 +247,7 @@ def run_v0():
|
|
|
252
247
|
legacy={"id": env_id, "args": args or {}},
|
|
253
248
|
num_tasks=1,
|
|
254
249
|
num_rollouts=n,
|
|
255
|
-
sampling={"max_tokens": max_tokens
|
|
250
|
+
sampling={"max_tokens": max_tokens},
|
|
256
251
|
rich=False,
|
|
257
252
|
output_dir=output_dir,
|
|
258
253
|
)
|
|
@@ -10,9 +10,7 @@ def test_color_images_are_rendered_once(monkeypatch) -> None:
|
|
|
10
10
|
return render(image)
|
|
11
11
|
|
|
12
12
|
monkeypatch.setattr(taskset, "image_data_url", counted)
|
|
13
|
-
tasks = taskset.ColorCodewordTaskset(taskset.ColorCodewordConfig()).
|
|
14
|
-
num_tasks=100
|
|
15
|
-
)
|
|
13
|
+
tasks = list(taskset.ColorCodewordTaskset(taskset.ColorCodewordConfig()).head(100))
|
|
16
14
|
|
|
17
15
|
assert len(tasks) == 100
|
|
18
16
|
assert calls == list(taskset.COLOR_RGB.values())
|
|
@@ -109,7 +109,7 @@ async def test_single_turn(run_v1, harness, harness_runtime, tmp_path):
|
|
|
109
109
|
assert trace.stop_condition == "agent_completed"
|
|
110
110
|
assert trace.reward == 1.0
|
|
111
111
|
# The seat's resolved identity rides the trace (policy metadata for trainers).
|
|
112
|
-
assert trace.agent is not None and trace.agent.config.sampling.
|
|
112
|
+
assert trace.agent is not None and trace.agent.config.sampling.max_tokens == 2048
|
|
113
113
|
# Every sampled turn has one per-call record, linked to its assistant node.
|
|
114
114
|
sampled = [i for i, n in enumerate(trace.nodes) if n.sampled]
|
|
115
115
|
assert [c.node for c in trace.calls if c.error is None] == sampled
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"""`Taskset` iteration and the `head`/`shuffle` views over list, generator,
|
|
2
|
+
and `INFINITE` `load` implementations."""
|
|
3
|
+
|
|
4
|
+
import itertools
|
|
5
|
+
|
|
6
|
+
import pytest
|
|
7
|
+
|
|
8
|
+
import verifiers.v1 as vf
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class CountTask(vf.Task[vf.TaskData]):
|
|
12
|
+
pass
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class InfiniteTaskset(vf.Taskset[CountTask, vf.TasksetConfig]):
|
|
16
|
+
INFINITE = True
|
|
17
|
+
|
|
18
|
+
def load(self):
|
|
19
|
+
for i in itertools.count():
|
|
20
|
+
yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class FiniteTaskset(vf.Taskset[CountTask, vf.TasksetConfig]):
|
|
24
|
+
def load(self):
|
|
25
|
+
for i in range(10):
|
|
26
|
+
yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def idxs(tasks) -> list[int]:
|
|
30
|
+
return [task.data.idx for task in tasks]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def test_head_bounds_an_infinite_taskset() -> None:
|
|
34
|
+
tasks = list(InfiniteTaskset(vf.TasksetConfig()).head(5))
|
|
35
|
+
assert idxs(tasks) == [0, 1, 2, 3, 4]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def test_iteration_materializes_a_finite_taskset() -> None:
|
|
39
|
+
taskset = FiniteTaskset(vf.TasksetConfig())
|
|
40
|
+
assert len(list(taskset)) == 10
|
|
41
|
+
assert idxs(taskset.head(4)) == [0, 1, 2, 3]
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def test_head_returns_the_same_taskset_type() -> None:
|
|
45
|
+
view = FiniteTaskset(vf.TasksetConfig()).head(4)
|
|
46
|
+
assert isinstance(view, FiniteTaskset)
|
|
47
|
+
assert view.task_type() is CountTask
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def test_shuffle_samples_the_whole_taskset_reproducibly() -> None:
|
|
51
|
+
taskset = FiniteTaskset(vf.TasksetConfig())
|
|
52
|
+
first = idxs(taskset.shuffle().head(5))
|
|
53
|
+
assert first == idxs(taskset.shuffle().head(5))
|
|
54
|
+
assert len(first) == 5 and set(first) <= set(range(10))
|
|
55
|
+
assert first != [0, 1, 2, 3, 4] # sampled from the whole set, not the head
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def test_shuffle_seed_changes_the_sample() -> None:
|
|
59
|
+
taskset = FiniteTaskset(vf.TasksetConfig())
|
|
60
|
+
seeded = idxs(taskset.shuffle(seed=7).head(5))
|
|
61
|
+
assert seeded == idxs(taskset.shuffle(seed=7).head(5)) # reproducible per seed
|
|
62
|
+
assert seeded != idxs(taskset.shuffle().head(5)) # differs from the default seed
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def test_shuffle_raises_on_infinite() -> None:
|
|
66
|
+
with pytest.raises(ValueError, match="infinite"):
|
|
67
|
+
InfiniteTaskset(vf.TasksetConfig()).shuffle()
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def test_head_then_shuffle_bounds_an_infinite_taskset() -> None:
|
|
71
|
+
head = idxs(InfiniteTaskset(vf.TasksetConfig()).head(5).shuffle())
|
|
72
|
+
assert sorted(head) == [0, 1, 2, 3, 4]
|
|
73
|
+
assert head != [0, 1, 2, 3, 4] # shuffled within the bounded head
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def test_head_only_builds_what_the_run_takes() -> None:
|
|
77
|
+
built: list[int] = []
|
|
78
|
+
|
|
79
|
+
class RecordingTaskset(InfiniteTaskset):
|
|
80
|
+
def load(self):
|
|
81
|
+
for i in itertools.count():
|
|
82
|
+
built.append(i)
|
|
83
|
+
yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
|
|
84
|
+
|
|
85
|
+
list(RecordingTaskset(vf.TasksetConfig()).head(3))
|
|
86
|
+
assert built == [0, 1, 2]
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def test_views_do_not_mutate_the_base_taskset() -> None:
|
|
90
|
+
taskset = InfiniteTaskset(vf.TasksetConfig())
|
|
91
|
+
view = taskset.head(3)
|
|
92
|
+
assert view.INFINITE is False and taskset.INFINITE is True
|
|
93
|
+
assert idxs(taskset.head(2)) == [0, 1] # base iterates untransformed
|
|
@@ -263,7 +263,14 @@ async def debug_task(task: Task, config: DebugConfig) -> tuple[Trace, bool]:
|
|
|
263
263
|
|
|
264
264
|
async def run_debug(config: DebugConfig) -> list[Trace]:
|
|
265
265
|
taskset = vf.load_taskset(config.taskset)
|
|
266
|
-
|
|
266
|
+
if config.num_tasks is None and taskset.INFINITE:
|
|
267
|
+
raise ValueError(
|
|
268
|
+
f"{type(taskset).__name__} is infinite - bound the run with -n"
|
|
269
|
+
)
|
|
270
|
+
selected = taskset.shuffle() if config.shuffle else taskset
|
|
271
|
+
if config.num_tasks is not None:
|
|
272
|
+
selected = selected.head(config.num_tasks)
|
|
273
|
+
tasks = list(selected)
|
|
267
274
|
if isinstance(config.runtime, vf.SubprocessConfig) and any(
|
|
268
275
|
type(t).NEEDS_CONTAINER or t.data.image for t in tasks
|
|
269
276
|
):
|
|
@@ -26,7 +26,15 @@ logger = logging.getLogger(__name__)
|
|
|
26
26
|
async def run_eval(env: Env, config: EvalConfig) -> list[Episode]:
|
|
27
27
|
logger.info("eval config:\n%s", config.model_dump_json(indent=2))
|
|
28
28
|
client = resolve_client(config.client)
|
|
29
|
-
|
|
29
|
+
taskset = env.taskset
|
|
30
|
+
if config.num_tasks is None and taskset.INFINITE:
|
|
31
|
+
raise ValueError(
|
|
32
|
+
f"{type(taskset).__name__} is infinite - bound the run with -n"
|
|
33
|
+
)
|
|
34
|
+
selected = taskset.shuffle() if config.shuffle else taskset
|
|
35
|
+
if config.num_tasks is not None:
|
|
36
|
+
selected = selected.head(config.num_tasks)
|
|
37
|
+
tasks = list(selected)
|
|
30
38
|
ctx = ModelContext(client=client, model=config.model, sampling=config.sampling)
|
|
31
39
|
semaphore = (
|
|
32
40
|
asyncio.Semaphore(config.max_concurrent) if config.max_concurrent else None
|
|
@@ -132,9 +140,15 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
|
|
|
132
140
|
|
|
133
141
|
# The client owns the taskset: load it here, once — the server (and its pool
|
|
134
142
|
# workers) never load data, they rebuild each dispatched task from its request.
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
143
|
+
taskset = load_taskset(config.env.taskset)
|
|
144
|
+
if config.num_tasks is None and taskset.INFINITE:
|
|
145
|
+
raise ValueError(
|
|
146
|
+
f"{type(taskset).__name__} is infinite - bound the run with -n"
|
|
147
|
+
)
|
|
148
|
+
selected = taskset.shuffle() if config.shuffle else taskset
|
|
149
|
+
if config.num_tasks is not None:
|
|
150
|
+
selected = selected.head(config.num_tasks)
|
|
151
|
+
tasks = list(selected)
|
|
138
152
|
# Spawned processes inherit no logging — hand them the main process's setup so
|
|
139
153
|
# their rollout logs land in the output dir.
|
|
140
154
|
level = "DEBUG" if config.verbose else "INFO"
|
|
@@ -203,7 +203,14 @@ async def _validate_task(task: Task, config: ValidateConfig) -> ResultRow:
|
|
|
203
203
|
|
|
204
204
|
async def run_validate(config: ValidateConfig) -> list[dict]:
|
|
205
205
|
taskset = vf.load_taskset(config.taskset)
|
|
206
|
-
|
|
206
|
+
if config.num_tasks is None and taskset.INFINITE:
|
|
207
|
+
raise ValueError(
|
|
208
|
+
f"{type(taskset).__name__} is infinite - bound the run with -n"
|
|
209
|
+
)
|
|
210
|
+
selected = taskset.shuffle() if config.shuffle else taskset
|
|
211
|
+
if config.num_tasks is not None:
|
|
212
|
+
selected = selected.head(config.num_tasks)
|
|
213
|
+
tasks = list(selected)
|
|
207
214
|
if isinstance(config.runtime, vf.SubprocessConfig) and any(
|
|
208
215
|
type(t).NEEDS_CONTAINER or t.data.image for t in tasks
|
|
209
216
|
):
|
|
@@ -17,8 +17,8 @@ class TasksetConfig(BaseConfig):
|
|
|
17
17
|
task: SerializeAsAny[TaskConfig] = TaskConfig()
|
|
18
18
|
"""Config passed to each task, under `--env.taskset.task.*`."""
|
|
19
19
|
system_prompt: Path | None = None
|
|
20
|
-
"""File whose text overrides each task's `TaskData.system_prompt`
|
|
21
|
-
|
|
20
|
+
"""File whose text overrides each task's `TaskData.system_prompt` on
|
|
21
|
+
iteration (e.g. a GEPA `best_system_prompt.txt`)."""
|
|
22
22
|
|
|
23
23
|
@property
|
|
24
24
|
def name(self) -> str:
|
|
@@ -33,7 +33,7 @@ from verifiers.v1.retries import run_episode_with_retry
|
|
|
33
33
|
from verifiers.v1.runtimes import SubprocessConfig, runtime_is_local
|
|
34
34
|
from verifiers.v1.task import Task, resolve_server_config
|
|
35
35
|
from verifiers.v1.trace import Error, Trace
|
|
36
|
-
from verifiers.v1.utils.generic import
|
|
36
|
+
from verifiers.v1.utils.generic import concrete_type
|
|
37
37
|
from verifiers.v1.utils.memory import trim_memory_periodically
|
|
38
38
|
|
|
39
39
|
logger = logging.getLogger(__name__)
|
|
@@ -83,7 +83,7 @@ class Env(ABC, Generic[ConfigT]):
|
|
|
83
83
|
def __init__(self, config: ConfigT) -> None:
|
|
84
84
|
from verifiers.v1.loaders import load_harness, load_taskset
|
|
85
85
|
|
|
86
|
-
config_cls =
|
|
86
|
+
config_cls = concrete_type(type(self), EnvConfig, origin=Env) or EnvConfig
|
|
87
87
|
if not isinstance(config, config_cls):
|
|
88
88
|
raise TypeError(
|
|
89
89
|
f"{type(self).__name__} declares Env[{config_cls.__name__}], "
|
|
@@ -37,7 +37,10 @@ class _GEPALog:
|
|
|
37
37
|
|
|
38
38
|
def run_gepa(env: Env, config: GEPAConfig) -> GEPAResult:
|
|
39
39
|
logger.info("gepa config:\n%s", config.model_dump_json(indent=2))
|
|
40
|
-
|
|
40
|
+
# Global shuffle: an infinite taskset raises here — run it with
|
|
41
|
+
# shuffle=false (there is no whole set to sample from).
|
|
42
|
+
taskset = env.taskset.shuffle() if config.shuffle else env.taskset
|
|
43
|
+
all_tasks = list(taskset.head(config.num_train + config.num_val))
|
|
41
44
|
train_tasks, val_tasks = split_tasks(all_tasks, config.num_train, config.num_val)
|
|
42
45
|
selected_tasks = [*train_tasks, *val_tasks]
|
|
43
46
|
# Seed from the tasks GEPA actually evaluates (train ∪ val), not the full pre-split pool —
|
|
@@ -63,7 +63,7 @@ from verifiers.v1.configs.judge import (
|
|
|
63
63
|
from verifiers.v1.dialects.chat import message_to_wire
|
|
64
64
|
from verifiers.v1.scoring import parse_judge_choice
|
|
65
65
|
from verifiers.v1.types import Messages, StrictBaseModel, Usage
|
|
66
|
-
from verifiers.v1.utils.generic import
|
|
66
|
+
from verifiers.v1.utils.generic import concrete_type
|
|
67
67
|
|
|
68
68
|
if TYPE_CHECKING:
|
|
69
69
|
from verifiers.v1.task import TaskData
|
|
@@ -111,7 +111,7 @@ ConfigT = TypeVar("ConfigT", bound=JudgeConfig, default=JudgeConfig)
|
|
|
111
111
|
|
|
112
112
|
def judge_config_cls(cls: type) -> type[JudgeConfig]:
|
|
113
113
|
"""Resolve a judge's config specialization through its MRO, else `JudgeConfig`."""
|
|
114
|
-
return
|
|
114
|
+
return concrete_type(cls, JudgeConfig) or JudgeConfig
|
|
115
115
|
|
|
116
116
|
|
|
117
117
|
class Judge(Generic[ParsedT, ConfigT]):
|
|
@@ -20,7 +20,7 @@ from verifiers.v1.harness import Harness
|
|
|
20
20
|
from verifiers.v1.judge import Judge, judge_config_cls
|
|
21
21
|
from verifiers.v1.task import Task
|
|
22
22
|
from verifiers.v1.taskset import Taskset
|
|
23
|
-
from verifiers.v1.utils.generic import
|
|
23
|
+
from verifiers.v1.utils.generic import concrete_type, prefix_validation_error
|
|
24
24
|
from verifiers.v1.utils.install import ensure_installed
|
|
25
25
|
|
|
26
26
|
|
|
@@ -208,7 +208,7 @@ def load_judge(config: JudgeConfig) -> Judge:
|
|
|
208
208
|
def taskset_config_type(taskset_id: str) -> type[TasksetConfig]:
|
|
209
209
|
"""Resolve the taskset's config specialization through its MRO."""
|
|
210
210
|
return (
|
|
211
|
-
|
|
211
|
+
concrete_type(taskset_class(taskset_id), TasksetConfig, origin=Taskset)
|
|
212
212
|
or TasksetConfig
|
|
213
213
|
)
|
|
214
214
|
|
|
@@ -216,7 +216,7 @@ def taskset_config_type(taskset_id: str) -> type[TasksetConfig]:
|
|
|
216
216
|
def harness_config_type(harness_id: str) -> type[HarnessConfig]:
|
|
217
217
|
"""Resolve the harness's config specialization through its MRO."""
|
|
218
218
|
return (
|
|
219
|
-
|
|
219
|
+
concrete_type(harness_class(harness_id), HarnessConfig, origin=Harness)
|
|
220
220
|
or HarnessConfig
|
|
221
221
|
)
|
|
222
222
|
|
|
@@ -231,7 +231,7 @@ def env_config_type(taskset_id: str, env_id: str = "") -> type[EnvConfig]:
|
|
|
231
231
|
its MRO — `SingleAgentEnvConfig` for a plain taskset. The run's `env` field
|
|
232
232
|
narrows to this, which is what gives `--env.<role>.model` addressing."""
|
|
233
233
|
return (
|
|
234
|
-
|
|
234
|
+
concrete_type(environment_class(taskset_id, env_id), EnvConfig, origin=Env)
|
|
235
235
|
or EnvConfig
|
|
236
236
|
)
|
|
237
237
|
|
|
@@ -13,7 +13,7 @@ from pydantic import TypeAdapter, ValidationError
|
|
|
13
13
|
from pydantic_config import BaseConfig
|
|
14
14
|
|
|
15
15
|
from verifiers.v1.state import State, StateT, state_cls
|
|
16
|
-
from verifiers.v1.utils.generic import
|
|
16
|
+
from verifiers.v1.utils.generic import concrete_type
|
|
17
17
|
|
|
18
18
|
if TYPE_CHECKING:
|
|
19
19
|
from httpx import AsyncClient, Response
|
|
@@ -286,7 +286,7 @@ class ServerBase(Generic[ConfigT, StateT]):
|
|
|
286
286
|
@classmethod
|
|
287
287
|
def _config_cls(cls) -> type[BaseConfig]:
|
|
288
288
|
"""Resolve the server's config specialization through its MRO."""
|
|
289
|
-
if config_cls :=
|
|
289
|
+
if config_cls := concrete_type(cls, BaseConfig):
|
|
290
290
|
return config_cls
|
|
291
291
|
raise TypeError(
|
|
292
292
|
f"{cls.__name__} must parameterize its config, e.g. Toolset[MyConfig]"
|
|
@@ -8,7 +8,7 @@ from pydantic import ConfigDict
|
|
|
8
8
|
from typing_extensions import TypeVar
|
|
9
9
|
|
|
10
10
|
from verifiers.v1.types import StrictBaseModel
|
|
11
|
-
from verifiers.v1.utils.generic import
|
|
11
|
+
from verifiers.v1.utils.generic import concrete_type
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class State(StrictBaseModel):
|
|
@@ -20,4 +20,4 @@ StateT = TypeVar("StateT", bound=State, default=State)
|
|
|
20
20
|
|
|
21
21
|
def state_cls(cls: type) -> type[State]:
|
|
22
22
|
"""Resolve a class's `State` specialization through its MRO, else `State`."""
|
|
23
|
-
return
|
|
23
|
+
return concrete_type(cls, State) or State
|
|
@@ -39,7 +39,7 @@ from verifiers.v1.decorators import discover_decorated, invoke_all
|
|
|
39
39
|
from verifiers.v1.errors import TaskError, boundary
|
|
40
40
|
from verifiers.v1.state import StateT
|
|
41
41
|
from verifiers.v1.types import Messages, StrictBaseModel, content_text
|
|
42
|
-
from verifiers.v1.utils.generic import
|
|
42
|
+
from verifiers.v1.utils.generic import concrete_type
|
|
43
43
|
|
|
44
44
|
if TYPE_CHECKING:
|
|
45
45
|
from verifiers.v1.judge import Judge
|
|
@@ -50,27 +50,6 @@ if TYPE_CHECKING:
|
|
|
50
50
|
logger = logging.getLogger(__name__)
|
|
51
51
|
|
|
52
52
|
|
|
53
|
-
def _requires_runtime(fn) -> bool:
|
|
54
|
-
param = inspect.signature(fn).parameters.get("runtime")
|
|
55
|
-
# A defaulted runtime parameter can still be called offline with None.
|
|
56
|
-
return param is not None and param.default is inspect.Parameter.empty
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
def _record_result(
|
|
60
|
-
trace: Trace,
|
|
61
|
-
name: str,
|
|
62
|
-
result,
|
|
63
|
-
weight: float | None = None,
|
|
64
|
-
) -> None:
|
|
65
|
-
"""Record a scalar or keyed scoring result."""
|
|
66
|
-
values = list(result.items()) if isinstance(result, Mapping) else [(name, result)]
|
|
67
|
-
for key, value in values:
|
|
68
|
-
if weight is None:
|
|
69
|
-
trace.record_metric(key, value)
|
|
70
|
-
else:
|
|
71
|
-
trace.record_reward(key, value, weight)
|
|
72
|
-
|
|
73
|
-
|
|
74
53
|
class TaskResources(StrictBaseModel):
|
|
75
54
|
model_config = ConfigDict(frozen=True)
|
|
76
55
|
|
|
@@ -149,12 +128,12 @@ ConfigT = TypeVar("ConfigT", bound=TaskConfig, default=TaskConfig)
|
|
|
149
128
|
|
|
150
129
|
def task_data_cls(cls: type) -> type[TaskData]:
|
|
151
130
|
"""Resolve a task's `TaskData` specialization through its MRO, else `TaskData`."""
|
|
152
|
-
return
|
|
131
|
+
return concrete_type(cls, TaskData) or TaskData
|
|
153
132
|
|
|
154
133
|
|
|
155
134
|
def task_config_cls(cls: type) -> type[TaskConfig]:
|
|
156
135
|
"""Resolve a task's `TaskConfig` specialization through its MRO, else `TaskConfig`."""
|
|
157
|
-
return
|
|
136
|
+
return concrete_type(cls, TaskConfig) or TaskConfig
|
|
158
137
|
|
|
159
138
|
|
|
160
139
|
def resolve_server_config(
|
|
@@ -239,6 +218,11 @@ class Task(Generic[DataT, StateT, ConfigT]):
|
|
|
239
218
|
trace: Trace,
|
|
240
219
|
runtime: Runtime | None = None,
|
|
241
220
|
) -> None:
|
|
221
|
+
def requires_runtime(fn) -> bool:
|
|
222
|
+
param = inspect.signature(fn).parameters.get("runtime")
|
|
223
|
+
# A defaulted runtime parameter can still be called offline with None.
|
|
224
|
+
return param is not None and param.default is inspect.Parameter.empty
|
|
225
|
+
|
|
242
226
|
judges = self.plugged_judges()
|
|
243
227
|
available = {"task": self.data, "trace": trace}
|
|
244
228
|
if runtime is not None:
|
|
@@ -249,36 +233,50 @@ class Task(Generic[DataT, StateT, ConfigT]):
|
|
|
249
233
|
rewards = discover_decorated(self, "reward")
|
|
250
234
|
if runtime is None:
|
|
251
235
|
skipped = [
|
|
252
|
-
fn.__name__ for fn in (*metrics, *rewards) if
|
|
236
|
+
fn.__name__ for fn in (*metrics, *rewards) if requires_runtime(fn)
|
|
253
237
|
] + [
|
|
254
238
|
judge.reward_name
|
|
255
239
|
for judge in judges
|
|
256
|
-
if
|
|
240
|
+
if requires_runtime(judge.score)
|
|
257
241
|
]
|
|
258
242
|
if skipped:
|
|
259
243
|
logger.info(
|
|
260
244
|
"score: no runtime — skipped runtime-dependent signals: %s",
|
|
261
245
|
skipped,
|
|
262
246
|
)
|
|
263
|
-
metrics = [fn for fn in metrics if not
|
|
264
|
-
rewards = [fn for fn in rewards if not
|
|
247
|
+
metrics = [fn for fn in metrics if not requires_runtime(fn)]
|
|
248
|
+
rewards = [fn for fn in rewards if not requires_runtime(fn)]
|
|
265
249
|
judges = [
|
|
266
|
-
judge for judge in judges if not
|
|
250
|
+
judge for judge in judges if not requires_runtime(judge.score)
|
|
267
251
|
]
|
|
268
252
|
|
|
269
253
|
metric_results = await invoke_all(metrics, available)
|
|
270
254
|
for fn, result in zip(metrics, metric_results):
|
|
271
|
-
|
|
255
|
+
if isinstance(result, Mapping):
|
|
256
|
+
trace.record_metrics(result)
|
|
257
|
+
else:
|
|
258
|
+
trace.record_metric(fn.__name__, result)
|
|
272
259
|
reward_results = await invoke_all(rewards, available)
|
|
273
260
|
for fn, result in zip(rewards, reward_results):
|
|
274
|
-
|
|
275
|
-
|
|
261
|
+
weight = getattr(fn, "_vf_weight", 1.0)
|
|
262
|
+
items = (
|
|
263
|
+
result.items()
|
|
264
|
+
if isinstance(result, Mapping)
|
|
265
|
+
else [(fn.__name__, result)]
|
|
276
266
|
)
|
|
267
|
+
for key, value in items:
|
|
268
|
+
trace.record_reward(key, value, weight)
|
|
277
269
|
judge_results = await invoke_all(
|
|
278
270
|
[judge.score for judge in judges], available
|
|
279
271
|
)
|
|
280
272
|
for judge, result in zip(judges, judge_results):
|
|
281
|
-
|
|
273
|
+
items = (
|
|
274
|
+
result.items()
|
|
275
|
+
if isinstance(result, Mapping)
|
|
276
|
+
else [(judge.reward_name, result)]
|
|
277
|
+
)
|
|
278
|
+
for key, value in items:
|
|
279
|
+
trace.record_reward(key, value, judge.config.weight)
|
|
282
280
|
|
|
283
281
|
|
|
284
282
|
TaskT = TypeVar("TaskT", bound=Task)
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"""The taskset: a thin loader that yields typed tasks.
|
|
2
|
+
|
|
3
|
+
A `Taskset` is the data half of an environment: config in, tasks out. `load()` is
|
|
4
|
+
the main hook that builds each task:
|
|
5
|
+
|
|
6
|
+
def load(self) -> Iterable[MyTask]:
|
|
7
|
+
for i in ...:
|
|
8
|
+
yield MyTask(MyData(idx=i, ...), self.config.task)
|
|
9
|
+
|
|
10
|
+
`load` may also be a generator for infinite tasksets. There is a one-to-one
|
|
11
|
+
mapping between taskset and task type, i.e. a taskset may only yield one task
|
|
12
|
+
type.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import copy
|
|
18
|
+
import itertools
|
|
19
|
+
import random
|
|
20
|
+
from abc import ABC, abstractmethod
|
|
21
|
+
from collections.abc import Callable, Iterable, Iterator
|
|
22
|
+
from typing import TYPE_CHECKING, ClassVar, Generic, Self
|
|
23
|
+
|
|
24
|
+
from pydantic_config import BaseConfig
|
|
25
|
+
from typing_extensions import TypeVar
|
|
26
|
+
|
|
27
|
+
from verifiers.v1.configs.taskset import TasksetConfig
|
|
28
|
+
from verifiers.v1.task import Task, TaskT, resolve_server_config
|
|
29
|
+
from verifiers.v1.utils.generic import concrete_type
|
|
30
|
+
from verifiers.v1.utils.sampling import SEED
|
|
31
|
+
|
|
32
|
+
if TYPE_CHECKING:
|
|
33
|
+
from verifiers.v1.mcp import Toolset
|
|
34
|
+
|
|
35
|
+
TasksetConfigT = TypeVar("TasksetConfigT", bound=TasksetConfig, default=TasksetConfig)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class Taskset(ABC, Generic[TaskT, TasksetConfigT]):
|
|
39
|
+
INFINITE: bool = False
|
|
40
|
+
"""Whether the taskset is infinite (yields tasks forever). Class-declared;
|
|
41
|
+
a `head(n)` view shadows it per instance (bounded by construction)."""
|
|
42
|
+
|
|
43
|
+
tools: ClassVar[tuple[type[Toolset], ...]] = ()
|
|
44
|
+
"""Tool servers shared by all tasks in the taskset. The environment will
|
|
45
|
+
spawn a single, global instance, reused across tasks."""
|
|
46
|
+
|
|
47
|
+
def __init__(self, config: TasksetConfigT) -> None:
|
|
48
|
+
self.config = config
|
|
49
|
+
override = config.system_prompt
|
|
50
|
+
self.system_prompt = override.read_text() if override is not None else None
|
|
51
|
+
self.transform: Callable[[Iterator[TaskT]], Iterator[TaskT]] | None = None
|
|
52
|
+
"""Iteration transform carried by `head`/`shuffle` views (see `view`)."""
|
|
53
|
+
|
|
54
|
+
@abstractmethod
|
|
55
|
+
def load(self) -> Iterable[TaskT]:
|
|
56
|
+
"""Build and yield the taskset's tasks; may be a generator (see module doc)."""
|
|
57
|
+
|
|
58
|
+
def __iter__(self) -> Iterator[TaskT]:
|
|
59
|
+
"""Lazily iterate `load()` with the config-layer system prompt applied and
|
|
60
|
+
any view transform on top — the read path; `load` is the subclass hook."""
|
|
61
|
+
prompt = self.system_prompt
|
|
62
|
+
tasks = (
|
|
63
|
+
task.with_system_prompt(prompt) if prompt is not None else task
|
|
64
|
+
for task in self.load()
|
|
65
|
+
)
|
|
66
|
+
yield from self.transform(tasks) if self.transform is not None else tasks
|
|
67
|
+
|
|
68
|
+
def view(self, transform: Callable[[Iterator[TaskT]], Iterator[TaskT]]) -> Self:
|
|
69
|
+
"""A shallow copy of this taskset iterating through `transform`, composed
|
|
70
|
+
onto any transform this taskset already carries."""
|
|
71
|
+
clone = copy.copy(self)
|
|
72
|
+
prev = self.transform
|
|
73
|
+
clone.transform = (
|
|
74
|
+
transform if prev is None else lambda tasks: transform(prev(tasks))
|
|
75
|
+
)
|
|
76
|
+
return clone
|
|
77
|
+
|
|
78
|
+
def head(self, num_tasks: int) -> Self:
|
|
79
|
+
"""A lazy, always-finite view of the first `num_tasks` tasks."""
|
|
80
|
+
view = self.view(lambda tasks: itertools.islice(tasks, num_tasks))
|
|
81
|
+
view.INFINITE = False
|
|
82
|
+
return view
|
|
83
|
+
|
|
84
|
+
def shuffle(self, seed: int | None = None) -> Self:
|
|
85
|
+
"""A shuffled view under `seed` — the shared fixed seed when None, so runs
|
|
86
|
+
sample reproducibly (materializes the receiver on iteration); raises on an
|
|
87
|
+
infinite taskset — bound it first (`head(n).shuffle()`)."""
|
|
88
|
+
if self.INFINITE:
|
|
89
|
+
raise ValueError(
|
|
90
|
+
f"{type(self).__name__} is infinite - cannot shuffle; "
|
|
91
|
+
"bound it first with head(num_tasks)"
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
def shuffled(tasks: Iterator[TaskT]) -> Iterator[TaskT]:
|
|
95
|
+
materialized = list(tasks)
|
|
96
|
+
random.Random(SEED if seed is None else seed).shuffle(materialized)
|
|
97
|
+
return iter(materialized)
|
|
98
|
+
|
|
99
|
+
return self.view(shuffled)
|
|
100
|
+
|
|
101
|
+
@classmethod
|
|
102
|
+
def task_type(cls) -> type[Task]:
|
|
103
|
+
return concrete_type(cls, Task, origin=Taskset) or Task
|
|
104
|
+
|
|
105
|
+
def server_config(self, server_cls: type) -> BaseConfig:
|
|
106
|
+
"""The config a `tools` entry is built with, resolved off `self.config` (the
|
|
107
|
+
taskset config; see `resolve_server_config`). Override to pair explicitly."""
|
|
108
|
+
return resolve_server_config(
|
|
109
|
+
type(self).__name__,
|
|
110
|
+
self.config,
|
|
111
|
+
server_cls,
|
|
112
|
+
sole=len(set(type(self).tools)) == 1,
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
def tool_servers(self) -> list[Toolset]:
|
|
116
|
+
return [cls(self.server_config(cls)) for cls in type(self).tools]
|
|
@@ -39,7 +39,7 @@ def deep_merge(base: dict, override: dict) -> dict:
|
|
|
39
39
|
return merged
|
|
40
40
|
|
|
41
41
|
|
|
42
|
-
def
|
|
42
|
+
def concrete_type(
|
|
43
43
|
cls: type, bound: type[T], *, origin: type | None = None
|
|
44
44
|
) -> type[T] | None:
|
|
45
45
|
"""Find a concrete bounded type through `cls`'s MRO, most-derived first."""
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
"""Shared sampling: an optional fixed-seed shuffle, then an optional head-slice.
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
`Taskset.
|
|
7
|
-
sample plain index lists here directly.
|
|
3
|
+
With `--shuffle`, a shuffle under the fixed `SEED` so the sampled subset is the *same*
|
|
4
|
+
every run (reproducible), then an optional slice to the first `limit`. Used by the paths
|
|
5
|
+
that sample plain index lists (the server eval path and the legacy bridge); tasksets
|
|
6
|
+
shuffle themselves (`Taskset.shuffle`, same default seed).
|
|
8
7
|
"""
|
|
9
8
|
|
|
10
9
|
import random
|