verifiers 0.2.1.dev58__tar.gz → 0.2.1.dev60__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.dev58 → verifiers-0.2.1.dev60}/PKG-INFO +1 -1
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/v1/test_e2e.py +6 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/__init__.py +6 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/cli/dashboard/eval.py +15 -5
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/cli/debug.py +1 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/dialects/anthropic.py +41 -9
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/dialects/base.py +15 -1
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/dialects/chat.py +45 -16
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/dialects/responses.py +31 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/errors.py +15 -2
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/graph.py +7 -12
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/interception/server.py +269 -142
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/legacy.py +31 -5
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/rollout.py +1 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/trace.py +87 -8
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/.gitignore +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/LICENSE +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/README.md +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/pyproject.toml +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/AGENTS.md +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/conftest.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_browser_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_build_script.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_client_config.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_composable_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_env_group.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_env_server.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_environment.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_environment_extra.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_error_chain.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_eval_display.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_eval_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_gym_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_imports.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_init_script.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_install_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_interception_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_logging.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_math_rubric.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_message_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_openenv_client.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_parser.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_path_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_renderer_client.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_rubric.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_rubric_group.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_save_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_setup_script.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_think_parser.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_tool_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_tool_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_types.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/test_xml_parser.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/v1/conftest.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/v1/test_configs.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/v1/test_envs.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/v1/test_graph.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/v1/test_judges.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/v1/test_scoring.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/v1/test_taskset.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/tests/v1/test_trace.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/cli/tui.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/clients/client.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/decorators.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/environment.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/errors.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/gepa/config.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/gepa/display.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/scripts/build.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/scripts/init.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/scripts/install.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/serve/types.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/types.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/cli/dashboard/replay.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/cli/gepa.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/cli/replay.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/configs/debug.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/configs/replay.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/env.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/episode.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/gepa/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/gepa/adapter.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/gepa/config.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/gepa/dataset.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/gepa/reflection.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/gepa/runner.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harness.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/default/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/default/harness.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/default/program.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/null/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/null/harness.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/null/program.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/pi/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/pi/harness.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/interception/base.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/interception/tunnel/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/interception/tunnel/base.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/interception/tunnel/custom.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/interception/tunnel/prime.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/judge.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/judges/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/judges/reference.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/judges/reference.txt +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/judges/rubric.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/judges/rubric.txt +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/push.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/retries.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/runtimes/docker.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/scoring.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/session.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/state.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/task.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/tasksets/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/tasksets/lean/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/tasksets/lean/scoring.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/tasksets/lean/taskset.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/types.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/utils/aio.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/utils/generic.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/utils/image.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/utils/interrupt.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/utils/logging.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/utils/memory.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/verifiers/v1/utils/sampling.py +0 -0
- {verifiers-0.2.1.dev58 → verifiers-0.2.1.dev60}/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.1.
|
|
3
|
+
Version: 0.2.1.dev60
|
|
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
|
|
@@ -18,6 +18,12 @@ async def test_single_turn(run_v1, harness, harness_runtime, tmp_path):
|
|
|
18
18
|
assert trace.errors == []
|
|
19
19
|
assert trace.num_turns == 1
|
|
20
20
|
assert trace.reward == 1.0
|
|
21
|
+
# Every sampled turn has one per-call record, linked to its assistant node.
|
|
22
|
+
sampled = [i for i, n in enumerate(trace.nodes) if n.sampled]
|
|
23
|
+
assert [c.node for c in trace.calls if c.error is None] == sampled
|
|
24
|
+
for call in trace.calls:
|
|
25
|
+
assert call.model and call.sampling is not None
|
|
26
|
+
assert call.time.duration > 0
|
|
21
27
|
|
|
22
28
|
|
|
23
29
|
@pytest.mark.e2e
|
|
@@ -105,8 +105,11 @@ from verifiers.v1.trace import (
|
|
|
105
105
|
Branch,
|
|
106
106
|
Error,
|
|
107
107
|
EvalRunInfo,
|
|
108
|
+
GenerationSpan,
|
|
109
|
+
ModelCall,
|
|
108
110
|
RunInfo,
|
|
109
111
|
TimeSpan,
|
|
112
|
+
TimeSplit,
|
|
110
113
|
Timing,
|
|
111
114
|
Trace,
|
|
112
115
|
TraceTask,
|
|
@@ -172,6 +175,7 @@ __all__ = [
|
|
|
172
175
|
"AgentInfo",
|
|
173
176
|
"RunInfo",
|
|
174
177
|
"EvalRunInfo",
|
|
178
|
+
"ModelCall",
|
|
175
179
|
"TrainRunInfo",
|
|
176
180
|
"VersionInfo",
|
|
177
181
|
"State",
|
|
@@ -182,6 +186,8 @@ __all__ = [
|
|
|
182
186
|
"KeptTokens",
|
|
183
187
|
"Timing",
|
|
184
188
|
"TimeSpan",
|
|
189
|
+
"TimeSplit",
|
|
190
|
+
"GenerationSpan",
|
|
185
191
|
"Error",
|
|
186
192
|
# decorators
|
|
187
193
|
"stop",
|
|
@@ -300,6 +300,7 @@ def _breakdown(done: list[Trace]) -> Table | None:
|
|
|
300
300
|
have_cost = have_cached = have_reasoning = have_judge = False
|
|
301
301
|
phase_secs: dict[str, float] = {}
|
|
302
302
|
phase_count: dict[str, int] = {}
|
|
303
|
+
model_secs = harness_secs = 0.0
|
|
303
304
|
for trace in done:
|
|
304
305
|
prompt, completion, cached, reasoning, _ = _tokens(trace)
|
|
305
306
|
total_in += prompt
|
|
@@ -326,6 +327,8 @@ def _breakdown(done: list[Trace]) -> Table | None:
|
|
|
326
327
|
if span.end: # phase was timed for this rollout
|
|
327
328
|
phase_secs[phase] = phase_secs.get(phase, 0.0) + span.duration
|
|
328
329
|
phase_count[phase] = phase_count.get(phase, 0) + 1
|
|
330
|
+
model_secs += trace.timing.generation.model.duration
|
|
331
|
+
harness_secs += trace.timing.generation.harness.duration
|
|
329
332
|
if (
|
|
330
333
|
total_in
|
|
331
334
|
or total_out
|
|
@@ -353,11 +356,18 @@ def _breakdown(done: list[Trace]) -> Table | None:
|
|
|
353
356
|
cost += f" + {format_cost_usd(total_judge_cost)} judge"
|
|
354
357
|
usage.append(cost)
|
|
355
358
|
grid.add_row("usage", " · ".join(usage))
|
|
356
|
-
time_segments = [
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
if
|
|
360
|
-
|
|
359
|
+
time_segments = []
|
|
360
|
+
for phase in ("boot", "setup", "generation", "finalize", "scoring"):
|
|
361
|
+
count = phase_count.get(phase)
|
|
362
|
+
if not count:
|
|
363
|
+
continue
|
|
364
|
+
segment = f"{phase} {format_time(phase_secs[phase] / count)}"
|
|
365
|
+
if phase == "generation":
|
|
366
|
+
segment += (
|
|
367
|
+
f" (model {format_time(model_secs / count)}"
|
|
368
|
+
f" + harness {format_time(harness_secs / count)})"
|
|
369
|
+
)
|
|
370
|
+
time_segments.append(segment)
|
|
361
371
|
if time_segments:
|
|
362
372
|
grid.add_row("time", " · ".join(time_segments))
|
|
363
373
|
return grid if grid.row_count else None
|
|
@@ -243,6 +243,7 @@ async def debug_task(task: Task, config: DebugConfig) -> tuple[Trace, bool]:
|
|
|
243
243
|
except Exception as e:
|
|
244
244
|
record_debug_error(trace, debug, e, setup_timeout, config.timeout.total)
|
|
245
245
|
finally:
|
|
246
|
+
trace.split_generation()
|
|
246
247
|
trace.info["debug"] = debug
|
|
247
248
|
try:
|
|
248
249
|
await runtime.stop()
|
|
@@ -11,6 +11,7 @@ from collections.abc import Callable, Mapping
|
|
|
11
11
|
from dataclasses import dataclass, field
|
|
12
12
|
|
|
13
13
|
from anthropic.types import Message as AnthropicMessage
|
|
14
|
+
from anthropic.types import Usage as AnthropicUsage
|
|
14
15
|
|
|
15
16
|
from verifiers.v1.dialects.base import Dialect, StreamParser, parse_sse_event
|
|
16
17
|
from verifiers.v1.types import (
|
|
@@ -21,6 +22,7 @@ from verifiers.v1.types import (
|
|
|
21
22
|
ImageUrlSource,
|
|
22
23
|
Messages,
|
|
23
24
|
Response,
|
|
25
|
+
Sampling,
|
|
24
26
|
SamplingConfig,
|
|
25
27
|
SystemMessage,
|
|
26
28
|
TextContentPart,
|
|
@@ -242,11 +244,35 @@ class AnthropicStreamParser(StreamParser):
|
|
|
242
244
|
return response_from_wire(self.validate_response(self.message))
|
|
243
245
|
|
|
244
246
|
|
|
247
|
+
class ModdedUsage(AnthropicUsage):
|
|
248
|
+
"""The SDK closes `service_tier` to a fixed Literal, but Anthropic-compatible gateways
|
|
249
|
+
report their own tiers (e.g. Prime's `provisioned`). Widen to a plain string — we don't
|
|
250
|
+
consume it — so parsing stays lenient about the label instead of dropping it."""
|
|
251
|
+
|
|
252
|
+
service_tier: str | None = None # type: ignore[assignment]
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
class ModdedAnthropicMessage(AnthropicMessage):
|
|
256
|
+
usage: ModdedUsage # type: ignore[assignment]
|
|
257
|
+
|
|
258
|
+
|
|
245
259
|
class AnthropicDialect(Dialect[dict, AnthropicMessage]):
|
|
260
|
+
sampling_fields = frozenset(
|
|
261
|
+
{
|
|
262
|
+
"temperature",
|
|
263
|
+
"top_p",
|
|
264
|
+
"top_k",
|
|
265
|
+
"max_tokens",
|
|
266
|
+
"stop_sequences",
|
|
267
|
+
"thinking",
|
|
268
|
+
"tool_choice",
|
|
269
|
+
"output_config",
|
|
270
|
+
}
|
|
271
|
+
)
|
|
246
272
|
routes = ("/v1/messages",)
|
|
247
273
|
aux_routes = ("/v1/messages/count_tokens",)
|
|
248
274
|
upstream_path = "/v1/messages"
|
|
249
|
-
response_type =
|
|
275
|
+
response_type = ModdedAnthropicMessage
|
|
250
276
|
|
|
251
277
|
def auth_headers(self, api_key: str) -> dict[str, str]:
|
|
252
278
|
return {"x-api-key": api_key, "anthropic-version": "2023-06-01"}
|
|
@@ -276,17 +302,23 @@ class AnthropicDialect(Dialect[dict, AnthropicMessage]):
|
|
|
276
302
|
def parse_response(self, response: AnthropicMessage) -> Response:
|
|
277
303
|
return response_from_wire(response)
|
|
278
304
|
|
|
279
|
-
def validate_response(self, raw: dict) -> AnthropicMessage:
|
|
280
|
-
usage = raw.get("usage")
|
|
281
|
-
tier = usage.get("service_tier") if usage else None
|
|
282
|
-
if tier not in (None, "standard", "priority", "batch"):
|
|
283
|
-
raw = {**raw, "usage": usage.copy()}
|
|
284
|
-
raw["usage"].pop("service_tier")
|
|
285
|
-
return super().validate_response(raw)
|
|
286
|
-
|
|
287
305
|
def stream_parser(self) -> StreamParser:
|
|
288
306
|
return AnthropicStreamParser(self.validate_response)
|
|
289
307
|
|
|
308
|
+
def parse_sampling(self, body: dict) -> Sampling:
|
|
309
|
+
settings = {k: v for k, v in body.items() if k in self.sampling_fields}
|
|
310
|
+
# Lift `output_config.effort` (where `apply_overrides` puts the eval's
|
|
311
|
+
# reasoning effort) onto the typed knob; keep any other output-config keys.
|
|
312
|
+
if isinstance(config := settings.get("output_config"), dict):
|
|
313
|
+
config = dict(config)
|
|
314
|
+
if config.get("effort"):
|
|
315
|
+
settings["reasoning_effort"] = config.pop("effort")
|
|
316
|
+
if config:
|
|
317
|
+
settings["output_config"] = config
|
|
318
|
+
else:
|
|
319
|
+
settings.pop("output_config")
|
|
320
|
+
return Sampling.model_validate(settings)
|
|
321
|
+
|
|
290
322
|
def apply_overrides(self, body: dict, model: str, sampling: SamplingConfig) -> dict:
|
|
291
323
|
# Preserve native fields except the eval's model + sampling. `temperature`/`top_p` are
|
|
292
324
|
# authoritative (always dropped, the eval's applied if set); `max_tokens` is required by
|
|
@@ -21,7 +21,7 @@ from typing import ClassVar, Generic, TypeVar
|
|
|
21
21
|
from pydantic import BaseModel
|
|
22
22
|
from pydantic_core import from_json
|
|
23
23
|
|
|
24
|
-
from verifiers.v1.types import Messages, Response, SamplingConfig, Tool
|
|
24
|
+
from verifiers.v1.types import Messages, Response, Sampling, SamplingConfig, Tool
|
|
25
25
|
|
|
26
26
|
ReqT = TypeVar("ReqT")
|
|
27
27
|
RespT = TypeVar("RespT", bound=BaseModel)
|
|
@@ -121,6 +121,12 @@ class Dialect(ABC, Generic[ReqT, RespT]):
|
|
|
121
121
|
`dialects.DIALECTS` and a harness speaking that format works end-to-end (the eval client and
|
|
122
122
|
interception server are generic over this interface)."""
|
|
123
123
|
|
|
124
|
+
sampling_fields: ClassVar[frozenset[str]] = frozenset()
|
|
125
|
+
"""Request keys that are call settings — what shapes generation given the same
|
|
126
|
+
conversation: decoding knobs, budgets/stops, reasoning effort, output contract.
|
|
127
|
+
A whitelist, so payload, conversation state, and tracking fields can never leak
|
|
128
|
+
into the per-call record by omission; an unlisted knob is simply not recorded."""
|
|
129
|
+
|
|
124
130
|
routes: ClassVar[tuple[str, ...]]
|
|
125
131
|
"""The endpoint path(s) a program's SDK posts model turns to. The interception server serves
|
|
126
132
|
one handler per route, so the wire format is resolved from the route the SDK chose (it
|
|
@@ -167,6 +173,14 @@ class Dialect(ABC, Generic[ReqT, RespT]):
|
|
|
167
173
|
def parse_request(self, body: ReqT) -> tuple[Messages, list[Tool] | None]:
|
|
168
174
|
"""The native request -> vf prompt + tools (for the trace)."""
|
|
169
175
|
|
|
176
|
+
def parse_sampling(self, body: ReqT) -> Sampling:
|
|
177
|
+
"""The native request's call settings -> the canonical `Sampling` (for the
|
|
178
|
+
trace's per-call records): the `sampling_fields` whitelist, with this format's
|
|
179
|
+
aliases mapped onto the typed knobs; dialect-specific keys ride as extras."""
|
|
180
|
+
return Sampling.model_validate(
|
|
181
|
+
{k: v for k, v in body.items() if k in self.sampling_fields}
|
|
182
|
+
)
|
|
183
|
+
|
|
170
184
|
@abstractmethod
|
|
171
185
|
def parse_response(self, response: RespT) -> Response:
|
|
172
186
|
"""A native (non-streamed) response -> the vf `Response` we consume."""
|
|
@@ -20,6 +20,7 @@ from verifiers.v1.types import (
|
|
|
20
20
|
Message,
|
|
21
21
|
Messages,
|
|
22
22
|
Response,
|
|
23
|
+
Sampling,
|
|
23
24
|
SamplingConfig,
|
|
24
25
|
SystemMessage,
|
|
25
26
|
Tool,
|
|
@@ -271,27 +272,47 @@ class ChatStreamParser(StreamParser):
|
|
|
271
272
|
if self.reasoning_details:
|
|
272
273
|
self.message["reasoning_details"] = self.reasoning_details
|
|
273
274
|
head = self.head or {}
|
|
274
|
-
|
|
275
|
-
|
|
275
|
+
completion = {
|
|
276
|
+
"id": head.get("id", "vf-intercept"),
|
|
277
|
+
"object": "chat.completion",
|
|
278
|
+
"created": head.get("created", int(time.time())),
|
|
279
|
+
"model": head.get("model", ""),
|
|
280
|
+
"choices": [
|
|
276
281
|
{
|
|
277
|
-
"
|
|
278
|
-
"
|
|
279
|
-
"
|
|
280
|
-
"model": head.get("model", ""),
|
|
281
|
-
"choices": [
|
|
282
|
-
{
|
|
283
|
-
"index": 0,
|
|
284
|
-
"message": self.message,
|
|
285
|
-
"finish_reason": self.finish_reason or "stop",
|
|
286
|
-
}
|
|
287
|
-
],
|
|
288
|
-
"usage": self.usage,
|
|
282
|
+
"index": 0,
|
|
283
|
+
"message": self.message,
|
|
284
|
+
"finish_reason": self.finish_reason or "stop",
|
|
289
285
|
}
|
|
290
|
-
|
|
291
|
-
|
|
286
|
+
],
|
|
287
|
+
"usage": self.usage,
|
|
288
|
+
}
|
|
289
|
+
return response_from_wire(ModdedChatCompletion.model_validate(completion))
|
|
292
290
|
|
|
293
291
|
|
|
294
292
|
class ChatDialect(Dialect[dict, ChatCompletion]):
|
|
293
|
+
sampling_fields = frozenset(
|
|
294
|
+
{
|
|
295
|
+
"temperature",
|
|
296
|
+
"top_p",
|
|
297
|
+
"top_k",
|
|
298
|
+
"min_p",
|
|
299
|
+
"max_tokens",
|
|
300
|
+
"max_completion_tokens",
|
|
301
|
+
"reasoning_effort",
|
|
302
|
+
"seed",
|
|
303
|
+
"stop",
|
|
304
|
+
"n",
|
|
305
|
+
"logprobs",
|
|
306
|
+
"top_logprobs",
|
|
307
|
+
"logit_bias",
|
|
308
|
+
"frequency_penalty",
|
|
309
|
+
"presence_penalty",
|
|
310
|
+
"repetition_penalty",
|
|
311
|
+
"response_format",
|
|
312
|
+
"tool_choice",
|
|
313
|
+
"parallel_tool_calls",
|
|
314
|
+
}
|
|
315
|
+
)
|
|
295
316
|
routes = ("/v1/chat/completions",)
|
|
296
317
|
upstream_path = "/chat/completions"
|
|
297
318
|
response_type = ModdedChatCompletion
|
|
@@ -311,6 +332,14 @@ class ChatDialect(Dialect[dict, ChatCompletion]):
|
|
|
311
332
|
tool_names[call.id] = call.name
|
|
312
333
|
return messages, parse_tools(body.get("tools"))
|
|
313
334
|
|
|
335
|
+
def parse_sampling(self, body: dict) -> Sampling:
|
|
336
|
+
settings = {k: v for k, v in body.items() if k in self.sampling_fields}
|
|
337
|
+
# Canonicalize the max-tokens alias; when both ride the wire (an eval override
|
|
338
|
+
# on top of a harness's `max_completion_tokens`), the override wins.
|
|
339
|
+
if (mct := settings.pop("max_completion_tokens", None)) is not None:
|
|
340
|
+
settings.setdefault("max_tokens", mct)
|
|
341
|
+
return Sampling.model_validate(settings)
|
|
342
|
+
|
|
314
343
|
def parse_response(self, response: ChatCompletion) -> Response:
|
|
315
344
|
return response_from_wire(response)
|
|
316
345
|
|
|
@@ -32,6 +32,7 @@ from verifiers.v1.types import (
|
|
|
32
32
|
ImageUrlSource,
|
|
33
33
|
Messages,
|
|
34
34
|
Response,
|
|
35
|
+
Sampling,
|
|
35
36
|
SamplingConfig,
|
|
36
37
|
SystemMessage,
|
|
37
38
|
TextContentPart,
|
|
@@ -277,6 +278,20 @@ class ResponsesStreamParser(StreamParser):
|
|
|
277
278
|
|
|
278
279
|
|
|
279
280
|
class ResponsesDialect(Dialect[dict, OpenAIResponse]):
|
|
281
|
+
sampling_fields = frozenset(
|
|
282
|
+
{
|
|
283
|
+
"temperature",
|
|
284
|
+
"top_p",
|
|
285
|
+
"max_output_tokens",
|
|
286
|
+
"max_tool_calls",
|
|
287
|
+
"reasoning",
|
|
288
|
+
"text",
|
|
289
|
+
"tool_choice",
|
|
290
|
+
"parallel_tool_calls",
|
|
291
|
+
"top_logprobs",
|
|
292
|
+
"truncation",
|
|
293
|
+
}
|
|
294
|
+
)
|
|
280
295
|
routes = ("/v1/responses",)
|
|
281
296
|
upstream_path = "/responses"
|
|
282
297
|
response_type = OpenAIResponse
|
|
@@ -286,6 +301,22 @@ class ResponsesDialect(Dialect[dict, OpenAIResponse]):
|
|
|
286
301
|
# trailing `[DONE]`, so the turn-ending event is the final event, not the sentinel.
|
|
287
302
|
return any(marker in chunk for marker in _TERMINAL_MARKERS)
|
|
288
303
|
|
|
304
|
+
def parse_sampling(self, body: dict) -> Sampling:
|
|
305
|
+
settings = {k: v for k, v in body.items() if k in self.sampling_fields}
|
|
306
|
+
# Lift `reasoning.effort` onto the typed knob; keep any other reasoning keys
|
|
307
|
+
# (e.g. `summary`) as the wire sent them.
|
|
308
|
+
if isinstance(reasoning := settings.get("reasoning"), dict):
|
|
309
|
+
reasoning = dict(reasoning)
|
|
310
|
+
if reasoning.get("effort"):
|
|
311
|
+
settings["reasoning_effort"] = reasoning.pop("effort")
|
|
312
|
+
if reasoning:
|
|
313
|
+
settings["reasoning"] = reasoning
|
|
314
|
+
else:
|
|
315
|
+
settings.pop("reasoning")
|
|
316
|
+
if "max_output_tokens" in settings:
|
|
317
|
+
settings["max_tokens"] = settings.pop("max_output_tokens")
|
|
318
|
+
return Sampling.model_validate(settings)
|
|
319
|
+
|
|
289
320
|
def parse_request(self, body: dict) -> tuple[Messages, list[Tool] | None]:
|
|
290
321
|
prompt: Messages = []
|
|
291
322
|
if instructions := body.get("instructions"):
|
|
@@ -44,7 +44,12 @@ class ProviderError(RolloutError):
|
|
|
44
44
|
|
|
45
45
|
class OverlongPromptError(ProviderError):
|
|
46
46
|
"""The prompt exceeded the model's context window — a budget limit, ended as a clean
|
|
47
|
-
truncation rather than recorded as an error.
|
|
47
|
+
truncation rather than recorded as an error. Defaults to a 400 (what the interception
|
|
48
|
+
server surfaces for it — deterministic, so an SDK never retries it); `model_error`
|
|
49
|
+
keeps the provider's real status when the failure carried one."""
|
|
50
|
+
|
|
51
|
+
def __init__(self, message: str = "", *, status_code: int = 400) -> None:
|
|
52
|
+
super().__init__(message, status_code=status_code)
|
|
48
53
|
|
|
49
54
|
|
|
50
55
|
class HarnessError(RolloutError):
|
|
@@ -128,10 +133,18 @@ def model_error(
|
|
|
128
133
|
becomes a plain `ProviderError`. `status_code` is the HTTP status surfaced to the harness (whose
|
|
129
134
|
SDK then retries 5xx/429/timeout and not 4xx); derived from an SDK error when not given. Accepts
|
|
130
135
|
an SDK error (the renderer) or the provider's raw error body (the httpx proxy)."""
|
|
136
|
+
from openai import APIStatusError
|
|
137
|
+
|
|
131
138
|
# Some SDK errors stringify empty; fall back to the type so the message is never blank.
|
|
132
139
|
text = str(e) or (type(e).__name__ if isinstance(e, BaseException) else "")
|
|
133
140
|
if any(phrase in text.casefold() for phrase in _CONTEXT_LENGTH_PHRASES):
|
|
134
|
-
|
|
141
|
+
# Keep the provider's real status when the failure carried one; else the class
|
|
142
|
+
# default (the 400 the interception server surfaces for overlong prompts).
|
|
143
|
+
if status_code is None and isinstance(e, APIStatusError):
|
|
144
|
+
status_code = e.status_code
|
|
145
|
+
return OverlongPromptError(
|
|
146
|
+
text, **({} if status_code is None else {"status_code": status_code})
|
|
147
|
+
)
|
|
135
148
|
return ProviderError(
|
|
136
149
|
text,
|
|
137
150
|
status_code=status_code if status_code is not None else _provider_status(e),
|
|
@@ -31,7 +31,6 @@ from renderers.base import MultiModalData, PlaceholderRange, RenderedTokens
|
|
|
31
31
|
|
|
32
32
|
from verifiers.v1.types import (
|
|
33
33
|
AssistantMessage,
|
|
34
|
-
FinishReason,
|
|
35
34
|
KeptTokens,
|
|
36
35
|
Message,
|
|
37
36
|
Response,
|
|
@@ -39,7 +38,6 @@ from verifiers.v1.types import (
|
|
|
39
38
|
TextContentPart,
|
|
40
39
|
Tool,
|
|
41
40
|
ToolMessage,
|
|
42
|
-
Usage,
|
|
43
41
|
)
|
|
44
42
|
|
|
45
43
|
if TYPE_CHECKING:
|
|
@@ -104,17 +102,12 @@ class MessageNode(StrictBaseModel):
|
|
|
104
102
|
logprobs: list[float] = Field(default_factory=list)
|
|
105
103
|
"""Sampling logprobs for the sampled tokens — length equals the number of True entries in
|
|
106
104
|
`mask`; empty for input messages."""
|
|
107
|
-
finish_reason: FinishReason = None
|
|
108
|
-
"""The response's finish reason (assistant nodes only) — kept for truncation detection."""
|
|
109
105
|
multi_modal_data: SkipJsonSchema[MultiModalData | None] = None
|
|
110
106
|
"""The renderer items for the images this message's content introduces (pixel tensors,
|
|
111
107
|
grids, hashes, placeholders) — the only carrier of the pixels from the env server to the
|
|
112
108
|
trainer. `Branch.multi_modal_data` concatenates them along the path into the training
|
|
113
109
|
`mm_kwargs`. Rides the wire as raw bytes (msgpack `bin`) since pydantic can't JSON the numpy;
|
|
114
110
|
kept off disk by the dump-site `exclude` in prime-rl (the tensors bloat the rollout jsonl)."""
|
|
115
|
-
usage: Usage | None = None
|
|
116
|
-
"""Provider-reported token usage for this message's response (assistant nodes). Preserved
|
|
117
|
-
on the wire and on disk, including cache-read tokens when the provider reports them."""
|
|
118
111
|
routed_experts: SkipJsonSchema[np.ndarray | None] = None
|
|
119
112
|
"""This node's slice of the MoE expert-routing array — uint8 `[len(token_ids), layers,
|
|
120
113
|
top_k]`, the expert ids inference selected for exactly this node's tokens. Attributed from
|
|
@@ -343,10 +336,12 @@ class PendingTurn:
|
|
|
343
336
|
for span in tail_spans
|
|
344
337
|
]
|
|
345
338
|
|
|
346
|
-
def commit(self, response: Response, tools: list[Tool] | None = None) ->
|
|
347
|
-
|
|
339
|
+
def commit(self, response: Response, tools: list[Tool] | None = None) -> int:
|
|
340
|
+
"""Add this turn to the graph; returns the committed assistant node's id."""
|
|
341
|
+
assistant_id = _commit_turn(self, response)
|
|
348
342
|
if tools:
|
|
349
343
|
self.trace.tools = tools
|
|
344
|
+
return assistant_id
|
|
350
345
|
|
|
351
346
|
|
|
352
347
|
def prepare_turn(trace: Trace, prompt: list[Message]) -> PendingTurn:
|
|
@@ -486,7 +481,7 @@ def _attribute_kept_tokens(
|
|
|
486
481
|
node.kept_tokens = KeptTokens(ids=ids.copy(), counts=counts.copy())
|
|
487
482
|
|
|
488
483
|
|
|
489
|
-
def _commit_turn(turn: PendingTurn, response: Response) ->
|
|
484
|
+
def _commit_turn(turn: PendingTurn, response: Response) -> int:
|
|
490
485
|
trace = turn.trace
|
|
491
486
|
prompt = turn.prompt
|
|
492
487
|
tokens = response.tokens
|
|
@@ -573,8 +568,6 @@ def _commit_turn(turn: PendingTurn, response: Response) -> None:
|
|
|
573
568
|
else [],
|
|
574
569
|
# TurnTokens is discarded after commit, so transfer its logprobs without copying.
|
|
575
570
|
logprobs=tokens.completion_logprobs if tokens else [],
|
|
576
|
-
finish_reason=response.finish_reason,
|
|
577
|
-
usage=response.usage,
|
|
578
571
|
)
|
|
579
572
|
)
|
|
580
573
|
# Register the assistant so the next turn's prompt (which restates it) reuses this node.
|
|
@@ -596,6 +589,8 @@ def _commit_turn(turn: PendingTurn, response: Response) -> None:
|
|
|
596
589
|
# completion-aligned, so only the sampled node carries them).
|
|
597
590
|
_attribute_kept_tokens(trace, assistant_id, tokens.kept_tokens if tokens else None)
|
|
598
591
|
|
|
592
|
+
return assistant_id
|
|
593
|
+
|
|
599
594
|
|
|
600
595
|
# --- walking the graph (views) ---------------------------------------------------------
|
|
601
596
|
|