from __future__ import annotations from dataclasses import dataclass from typing import Any from .model_registry import normalize_model_name PRIORITY_SUPPORTED_MODELS = frozenset( ( "gpt-5.4", "gpt-5.2", "gpt-5.1", "gpt-5", "gpt-5.1-codex", "gpt-5-codex", ) ) _TRUE_STRINGS = {"1", "true", "yes", "on"} _FALSE_STRINGS = {"0", "false", "no", "off"} def parse_optional_bool(value: Any) -> bool | None: if isinstance(value, bool): return value if isinstance(value, str): normalized = value.strip().lower() if normalized in _TRUE_STRINGS: return True if normalized in _FALSE_STRINGS: return False return None def supports_priority_service_tier(model: str | None) -> bool: return normalize_model_name(model) in PRIORITY_SUPPORTED_MODELS @dataclass(frozen=True) class ServiceTierResolution: service_tier: str | None error_message: str | None = None warning_message: str | None = None used_server_default: bool = False def resolve_service_tier( model: str | None, *, request_fast_mode: Any = None, request_service_tier: Any = None, server_fast_mode: bool = False, ) -> ServiceTierResolution: explicit_fast_mode = parse_optional_bool(request_fast_mode) tier: str | None = None explicit_request = False used_server_default = False if explicit_fast_mode is not None: tier = "priority" if explicit_fast_mode else None explicit_request = True elif isinstance(request_service_tier, str) and request_service_tier.strip(): tier = request_service_tier.strip().lower() explicit_request = True elif server_fast_mode: tier = "priority" used_server_default = True if tier == "priority" and not supports_priority_service_tier(model): normalized = normalize_model_name(model) message = ( f"Fast mode is not supported for model '{normalized}'. " "Use a supported GPT-5 priority-processing model or disable fast mode for this request." ) if explicit_request: return ServiceTierResolution( service_tier=None, error_message=message, used_server_default=used_server_default, ) return ServiceTierResolution( service_tier=None, warning_message=message, used_server_default=used_server_default, ) return ServiceTierResolution( service_tier=tier, used_server_default=used_server_default, )