Spaces:
Sleeping
Sleeping
File size: 3,618 Bytes
2415446 a1bab2d 2415446 | 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 | """Provider model-list metadata cache."""
from collections.abc import Iterable
from free_claude_code.application.model_metadata import ProviderModelInfo
from free_claude_code.config.provider_catalog import SUPPORTED_PROVIDER_IDS
class ProviderModelCache:
"""Store provider model metadata for instant model-list responses."""
def __init__(
self,
available_provider_ids: Iterable[str] = SUPPORTED_PROVIDER_IDS,
) -> None:
self._available_provider_ids = frozenset(available_provider_ids)
self._model_infos_by_provider: dict[str, dict[str, ProviderModelInfo]] = {}
def cache_model_infos(
self, provider_id: str, model_infos: Iterable[ProviderModelInfo]
) -> None:
"""Store provider model metadata by raw provider model id."""
if provider_id not in self._available_provider_ids:
return
clean_infos = {
info.model_id: info for info in model_infos if info.model_id.strip()
}
self._model_infos_by_provider[provider_id] = clean_infos
def set_available_providers(self, provider_ids: Iterable[str]) -> None:
"""Replace the provider scope and discard entries outside it."""
self._available_provider_ids = frozenset(provider_ids)
self._model_infos_by_provider = {
provider_id: infos
for provider_id, infos in self._model_infos_by_provider.items()
if provider_id in self._available_provider_ids
}
def add_provider(self, provider_id: str) -> None:
"""Make one dynamically authenticated provider cacheable."""
self._available_provider_ids = self._available_provider_ids | {provider_id}
def remove_provider(self, provider_id: str) -> None:
"""Evict one provider and stop accepting its discovered metadata."""
self._available_provider_ids = self._available_provider_ids - {provider_id}
self._model_infos_by_provider.pop(provider_id, None)
def cached_model_ids(self) -> dict[str, frozenset[str]]:
"""Return cached raw provider model ids by provider."""
return {
provider_id: frozenset(infos)
for provider_id, infos in self._model_infos_by_provider.items()
}
def has_provider(self, provider_id: str) -> bool:
"""Return whether this provider has any cached model-list result."""
return provider_id in self._model_infos_by_provider
def cached_model_supports_thinking(
self, provider_id: str, model_id: str
) -> bool | None:
"""Return cached thinking support when a provider exposes it."""
info = self._model_infos_by_provider.get(provider_id, {}).get(model_id)
if info is None:
return None
return info.supports_thinking
def cached_prefixed_model_infos(self) -> tuple[ProviderModelInfo, ...]:
"""Return cached provider models with user-selectable prefixed ids."""
infos: list[ProviderModelInfo] = []
for provider_id in SUPPORTED_PROVIDER_IDS:
provider_infos = self._model_infos_by_provider.get(provider_id, {})
infos.extend(
ProviderModelInfo(
model_id=f"{provider_id}/{info.model_id}",
supports_thinking=info.supports_thinking,
)
for info in sorted(
provider_infos.values(), key=lambda item: item.model_id
)
)
return tuple(infos)
def clear(self) -> None:
"""Clear all cached model metadata."""
self._model_infos_by_provider.clear()
|