File size: 2,624 Bytes
35205e8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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,
    )