Coverage for .venv/lib/python3.13/site-packages/litellm/proxy/_experimental/mcp_server/byok_credential_cache.py: 100%
16 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 12:01 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 12:01 +0000
1"""Per-worker cache of stored BYOK credentials, keyed so peer workers can evict it over the auth cache pub/sub."""
3from dataclasses import dataclass
4from typing import Final
6from litellm.caching.in_memory_cache import InMemoryCache
7from litellm.constants import MCP_BYOK_CREDENTIAL_CACHE_MAX_SIZE, MCP_BYOK_CREDENTIAL_CACHE_TTL_SECONDS
9_CACHE_KEY_PREFIX: Final = "mcp_byok_credential"
12@dataclass(frozen=True, slots=True)
13class CachedByokCredential:
14 credential: str | None
17byok_credential_cache: Final = InMemoryCache(
18 max_size_in_memory=MCP_BYOK_CREDENTIAL_CACHE_MAX_SIZE,
19 default_ttl=MCP_BYOK_CREDENTIAL_CACHE_TTL_SECONDS,
20)
23def byok_credential_cache_key(user_id: str, server_id: str) -> str:
24 return f"{_CACHE_KEY_PREFIX}:{user_id}:{server_id}"
27def get_cached_byok_credential(user_id: str, server_id: str) -> CachedByokCredential | None:
28 cached: Final = byok_credential_cache.get_cache( # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType] # InMemoryCache is untyped
29 byok_credential_cache_key(user_id, server_id)
30 )
31 return cached if isinstance(cached, CachedByokCredential) else None
34def cache_byok_credential(user_id: str, server_id: str, credential: str | None) -> None:
35 byok_credential_cache.set_cache( # pyright: ignore[reportUnknownMemberType] # InMemoryCache is untyped
36 byok_credential_cache_key(user_id, server_id),
37 CachedByokCredential(credential=credential),
38 )