"""
Response factory functions for each RAG mode.
"""
from typing import Any, Dict, List, Optional
from .builder import RAGResponse, ResponseBuilder
[docs]
def create_llm_only_response(query: str, answer: str, include_warning: bool = True) -> Dict[str, Any]:
"""Factory pour réponse mode llm_only."""
builder = ResponseBuilder(mode="llm_only", query=query).set_answer(answer).set_sources([])
if include_warning:
builder.add_metadata(
"warning",
"WARNING: Cette réponse est générée uniquement par le LLM "
"et n'est pas basée sur votre base documentaire. "
"Elle peut contenir des inexactitudes.",
)
return builder.build()
[docs]
def create_rag_response(
query: str,
answer: str,
documents: List[Dict[str, Any]],
context_summary: Optional[Dict[str, Any]] = None,
acts: Optional[Dict[str, Dict[str, Any]]] = None,
) -> Dict[str, Any]:
"""Factory pour réponse mode rag (hybrid RAG)."""
builder = ResponseBuilder(mode="rag", query=query).set_answer(answer).set_sources(documents).set_acts(acts or {})
if context_summary:
builder.add_metadata("context_summary", context_summary)
return builder.build()
[docs]
def create_summarize_response(
query: str, answer: str, documents: List[Dict[str, Any]], acts: Optional[Dict[str, Dict[str, Any]]] = None
) -> Dict[str, Any]:
"""Factory for summarize-mode response."""
return (
ResponseBuilder(mode="summarize", query=query)
.set_answer(answer)
.set_sources(documents)
.set_acts(acts or {})
.build()
)
[docs]
def create_compare_response(
query: str,
answer: str,
documents: List[Dict[str, Any]],
documents_compared: List[str],
acts: Optional[Dict[str, Dict[str, Any]]] = None,
) -> Dict[str, Any]:
"""Factory for compare-mode response."""
return (
ResponseBuilder(mode="compare", query=query)
.set_answer(answer)
.set_sources(documents)
.set_acts(acts or {})
.add_metadata("documents_compared", documents_compared)
.build()
)
[docs]
def create_empty_response(
mode: str,
query: str,
empty_message: Optional[str] = None,
) -> Dict[str, Any]:
"""Factory for an empty response (no results).
Si empty_message est None, un message par défaut adapté au mode est utilisé.
Passer une string vide pour ne pas afficher de message.
"""
if empty_message is None:
if mode in ["rag", "hybrid"]:
empty_message = (
"Aucun document pertinent trouvé dans la base de données. "
"La base peut être vide ou en cours de population par les workers. "
"Vous pouvez utiliser le mode 'llm_only' pour une réponse basée sur les connaissances générales."
)
else:
empty_message = "Aucun document pertinent trouvé."
return (
ResponseBuilder(mode=mode, query=query)
.set_answer(empty_message)
.set_sources([])
.set_acts({})
.add_metadata("database_empty", True)
.build()
)