perf(revert-service): offload sync embed_texts to thread

_restore_in_place_document and _reinsert_document_from_revision are
async helpers invoked by the synchronous-feeling POST /api/threads/.../revert
route; both ran embed_texts inline, blocking the event loop while the
HTTP client waited.
This commit is contained in:
CREDO23 2026-05-20 10:04:26 +02:00
parent a3d6fa6196
commit a8de98895a

View file

@ -29,6 +29,7 @@ same trap waiting to happen).
from __future__ import annotations from __future__ import annotations
import asyncio
import logging import logging
from dataclasses import dataclass from dataclasses import dataclass
from datetime import UTC, datetime from datetime import UTC, datetime
@ -234,7 +235,7 @@ async def _restore_in_place_document(
if isinstance(c, dict) and isinstance(c.get("content"), str) if isinstance(c, dict) and isinstance(c.get("content"), str)
] ]
if chunk_texts: if chunk_texts:
chunk_embeddings = embed_texts(chunk_texts) chunk_embeddings = await asyncio.to_thread(embed_texts, chunk_texts)
session.add_all( session.add_all(
[ [
Chunk(document_id=doc.id, content=text, embedding=embedding) Chunk(document_id=doc.id, content=text, embedding=embedding)
@ -244,7 +245,9 @@ async def _restore_in_place_document(
] ]
) )
if isinstance(revision.content_before, str): if isinstance(revision.content_before, str):
doc.embedding = embed_texts([revision.content_before])[0] doc.embedding = (
await asyncio.to_thread(embed_texts, [revision.content_before])
)[0]
doc.updated_at = datetime.now(UTC) doc.updated_at = datetime.now(UTC)
return RevertOutcome(status="ok", message="Document restored from snapshot.") return RevertOutcome(status="ok", message="Document restored from snapshot.")
@ -320,7 +323,7 @@ async def _reinsert_document_from_revision(
session.add(new_doc) session.add(new_doc)
await session.flush() await session.flush()
new_doc.embedding = embed_texts([content])[0] new_doc.embedding = (await asyncio.to_thread(embed_texts, [content]))[0]
chunk_texts = [] chunk_texts = []
chunks_before = revision.chunks_before chunks_before = revision.chunks_before
if isinstance(chunks_before, list): if isinstance(chunks_before, list):
@ -330,7 +333,7 @@ async def _reinsert_document_from_revision(
if isinstance(c, dict) and isinstance(c.get("content"), str) if isinstance(c, dict) and isinstance(c.get("content"), str)
] ]
if chunk_texts: if chunk_texts:
chunk_embeddings = embed_texts(chunk_texts) chunk_embeddings = await asyncio.to_thread(embed_texts, chunk_texts)
session.add_all( session.add_all(
[ [
Chunk(document_id=new_doc.id, content=text, embedding=embedding) Chunk(document_id=new_doc.id, content=text, embedding=embedding)