import httpx from openai import AsyncOpenAI from services.runtime_settings import get_ai_settings _client_cache: dict[tuple[str, str], AsyncOpenAI] = {} _http_client_cache: dict[tuple[str, str], httpx.AsyncClient] = {} async def get_openai_client() -> tuple[AsyncOpenAI, dict]: settings = await get_ai_settings() cache_key = ( settings.get("ai_base_url") or "", settings.get("ai_api_key") or "", ) if cache_key not in _client_cache: for http_client in _http_client_cache.values(): await http_client.aclose() _client_cache.clear() _http_client_cache.clear() http_client = httpx.AsyncClient(timeout=httpx.Timeout(600.0, connect=30.0)) _http_client_cache[cache_key] = http_client _client_cache[cache_key] = AsyncOpenAI( api_key=settings.get("ai_api_key") or "missing", base_url=settings.get("ai_base_url"), http_client=http_client, ) return _client_cache[cache_key], settings