feat(rag): implement database routing in query endpoint

Log database routing decisions and add databases_used to response metadata.
When template specifies databases: ["oxigraph"], Qdrant vector search is skipped.
This commit is contained in:
kempersc 2026-01-09 12:15:49 +01:00
parent 35a057981c
commit 787f4dacb0

View file

@ -3020,9 +3020,13 @@ async def dspy_query(request: DSPyQueryRequest) -> DSPyQueryResponse:
# Check if this is a factual query that can skip LLM (template-driven, not hardcoded)
# Fast path rule: If "prose" is NOT in response_modes, LLM generation is skipped
if template_result.matched and not template_result.requires_llm():
# Log database routing decision
databases_used = template_result.databases if hasattr(template_result, 'databases') else ["oxigraph", "qdrant"]
qdrant_skipped = "qdrant" not in databases_used
logger.info(
f"[FAST-PATH] Template '{template_result.template_id}' uses response_modes={template_result.response_modes} - "
f"skipping LLM generation (confidence={template_result.confidence:.2f})"
f"[FAST-PATH] Template '{template_result.template_id}' uses response_modes={template_result.response_modes}, "
f"databases={databases_used} - skipping LLM generation{', Qdrant skipped' if qdrant_skipped else ''} "
f"(confidence={template_result.confidence:.2f})"
)
# Execute SPARQL directly
@ -3159,6 +3163,7 @@ async def dspy_query(request: DSPyQueryRequest) -> DSPyQueryResponse:
"primary_type": viz_types[0] if viz_types else "table",
"sparql_query": sparql_query,
"response_modes": template_result.response_modes,
"databases_used": databases_used, # For transparency/debugging
},
retrieved_results=sparql_results,
query_type="factual",