Source code for rag_service.routers.search

"""POST /search endpoint — hybrid/semantic/lexical search handler."""

import logging
import time
import uuid
from typing import Any, Dict, List, Optional, cast

from fastapi import APIRouter, Depends, HTTPException
from lalandre_core.config import get_config
from lalandre_core.utils import as_dict
from lalandre_rag.response import build_source_trace
from rag_service.bootstrap import RagComponents
from rag_service.metrics import observe_provider_error, observe_search_request
from rag_service.models import SearchRequest, SearchResponse, SearchResult
from rag_service.routers._deps import get_components

logger = logging.getLogger(__name__)
router = APIRouter()

_ALLOWED_SEARCH_GRANULARITIES: set[Optional[str]] = {None, "chunks", "all"}
_VALID_SEARCH_MODES = ["semantic", "lexical", "hybrid"]