32 lines
1020 B
Python
32 lines
1020 B
Python
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
|