fix: stabilize background operations and large embedding results
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
"""Process-local retrieval activity, shared by search, RAG and Agent callers."""
|
||||
import asyncio
|
||||
from functools import wraps
|
||||
|
||||
active = 0
|
||||
completed = 0
|
||||
failed = 0
|
||||
cancelled = 0
|
||||
|
||||
|
||||
def track_search(operation):
|
||||
@wraps(operation)
|
||||
async def wrapped(self, request):
|
||||
global active, completed, failed, cancelled
|
||||
if request.mode == 'fts':
|
||||
return await operation(self, request)
|
||||
active += 1
|
||||
try:
|
||||
result = await operation(self, request)
|
||||
completed += 1
|
||||
return result
|
||||
except asyncio.CancelledError:
|
||||
cancelled += 1
|
||||
raise
|
||||
except Exception:
|
||||
failed += 1
|
||||
raise
|
||||
finally:
|
||||
active -= 1
|
||||
return wrapped
|
||||
@@ -10,6 +10,7 @@ from __future__ import annotations
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from app import repository
|
||||
from app.retrieval.activity import track_search
|
||||
from app.contracts import (
|
||||
Citation,
|
||||
PageMeta,
|
||||
@@ -52,6 +53,7 @@ class RetrievalEngine:
|
||||
# remain authoritative, including monkeypatches on the singleton.
|
||||
self._routed_defaults = (embedding, vector_store) if route_embeddings else None
|
||||
|
||||
@track_search
|
||||
async def search(self, request: SearchRequest) -> SearchResponse:
|
||||
if request.mode == SearchMode.fts:
|
||||
return self._search_fts(request)
|
||||
|
||||
@@ -20,6 +20,7 @@ from typing import Protocol
|
||||
|
||||
from app.database.db import connect, transaction
|
||||
from app.errors import ApiError
|
||||
from app.operation_logs import log_event
|
||||
from app.retrieval.vectorstore import VectorHit
|
||||
from app.retrieval.provenance import record_embedding
|
||||
from app.retrieval.hybrid import rrf_fuse
|
||||
@@ -101,6 +102,8 @@ async def embed_remote(texts: list[str], *, accept_local=False, strict=False, lo
|
||||
source=result.source,
|
||||
)
|
||||
except Exception as exc:
|
||||
log_event('vectors', 'embedding.failed', level='ERROR' if strict else 'WARNING', error=exc,
|
||||
count=len(texts), fallback='none' if strict else 'local_index')
|
||||
# Avoid logging provider exceptions containing credentials or note text.
|
||||
record_embedding(fallback_reason="REMOTE_EMBEDDING_UNAVAILABLE")
|
||||
logger.warning("Remote embedding unavailable (%s); using local index", type(exc).__name__)
|
||||
|
||||
Reference in New Issue
Block a user