From 9c63d6b24c315c5b0a7126e6668c3b2a1c9567cf Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Mon, 27 Apr 2026 02:51:44 -0400 Subject: [PATCH] feat: app lifespan starts/stops EmbeddingWorker (T97.3) --- chat/app.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/chat/app.py b/chat/app.py index c9daf90..9e2c74b 100644 --- a/chat/app.py +++ b/chat/app.py @@ -16,6 +16,7 @@ from chat.db.migrate import apply_migrations from chat.eventlog.log import read_events from chat.eventlog.projector import apply_event from chat.services.background import BackgroundWorker +from chat.services.embedding_worker import EmbeddingWorker from chat.services.snapshot import latest_snapshot_path, restore_from_snapshot # Trigger handler registration: @@ -85,9 +86,23 @@ async def lifespan(app: FastAPI): await worker.start() app.state.background_worker = worker + # T97: separate worker for the async embedding pass. Each + # ``memory_written`` enqueues an EmbeddingJob; the worker drains the + # queue, calls ``generate_embedding``, and emits ``embedding_indexed``. + # Phase 4's pseudo-embedding path is local so the worker doesn't need + # an LLM client; we still pass one so the Phase 4.5 swap to a real + # model is a one-line change. + embedding_worker = EmbeddingWorker( + conn_factory=lambda: open_db(settings.db_path), + client=_factory(), + ) + await embedding_worker.start() + app.state.embedding_worker = embedding_worker + try: yield finally: + await embedding_worker.stop() await worker.stop()