from __future__ import annotations import time from fastapi import APIRouter, Depends from app.api.deps import get_embeddings_service, require_auth from app.models.schemas import SemanticRouterRequest, SemanticRouterResponse from app.services.embeddings_service import EmbeddingService from app.services.semantic_router_service import SemanticRouterService router = APIRouter() @router.post( "/semantic-router/route", response_model=SemanticRouterResponse, summary="Route a query to the best matching route using semantic similarity", ) async def route_query( body: SemanticRouterRequest, token: str = Depends(require_auth), embedding_service: EmbeddingService = Depends(get_embeddings_service), ) -> SemanticRouterResponse: start = time.perf_counter() svc = SemanticRouterService(embedding_service) routes_dict = [r.model_dump() for r in body.routes] result = svc.route(body.query, routes_dict, body.threshold) elapsed_ms = round((time.perf_counter() - start) * 1000, 3) return SemanticRouterResponse( success=result["success"], time_ms=elapsed_ms, name=result.get("name"), models=result.get("models", []), error=result.get("error"), confidence=result.get("confidence"), margin=result.get("margin"), threshold=result.get("threshold"), matched_utterance=result.get("matched_utterance"), )