perf: client httpx riusato per gli embedding (lazy, chiuso a shutdown)

- _get_http(): creazione lazy, keep-alive riusato tra le chiamate
- lifespan shutdown: aclose del client
- verificato sul server: status + search OK (istanza di test)
This commit is contained in:
Matteo Benedetto
2026-08-16 19:18:41 +02:00
parent ec0fdb972a
commit 748356d769
+21 -8
View File
@@ -82,6 +82,10 @@ async def lifespan(_app: FastAPI):
await cleanup_task
except asyncio.CancelledError:
pass
global _http
if _http is not None:
await _http.aclose()
_http = None
app = FastAPI(title="Memory Gateway", version="2.5.0", lifespan=lifespan)
@@ -184,16 +188,25 @@ def _parse_ts(value: Optional[str]) -> Optional[float]:
# ---------------------------------------------------------------------------
# Embedding via Ollama (BGE-M3)
# Embedding via Ollama (BGE-M3) — client httpx riusato (creato lazy, chiuso a shutdown)
# ---------------------------------------------------------------------------
_http: Optional[httpx.AsyncClient] = None
def _get_http() -> httpx.AsyncClient:
global _http
if _http is None:
_http = httpx.AsyncClient(timeout=30)
return _http
async def embed(text: str) -> list[float]:
async with httpx.AsyncClient(timeout=30) as client:
r = await client.post(
f"{OLLAMA_URL}/api/embed",
json={"model": EMBED_MODEL, "input": text},
)
r.raise_for_status()
return r.json()["embeddings"][0]
r = await _get_http().post(
f"{OLLAMA_URL}/api/embed",
json={"model": EMBED_MODEL, "input": text},
)
r.raise_for_status()
return r.json()["embeddings"][0]
# ---------------------------------------------------------------------------