Spaces:
Sleeping
Sleeping
| """ | |
| MediGuard AI — Generate Answer Node | |
| Produces a RAG-grounded medical answer with citations. | |
| """ | |
| from __future__ import annotations | |
| import logging | |
| from typing import Any | |
| from src.services.agents.prompts import RAG_GENERATION_SYSTEM | |
| logger = logging.getLogger(__name__) | |
| def generate_answer_node(state: dict, *, context: Any) -> dict: | |
| """Generate a cited medical answer from relevant documents.""" | |
| query = state.get("rewritten_query") or state.get("query", "") | |
| documents = state.get("relevant_documents", []) | |
| if context.tracer: | |
| context.tracer.trace(name="generate_answer_node", metadata={"query": query}) | |
| biomarkers = state.get("biomarkers") | |
| patient_context = state.get("patient_context", "") | |
| # Build evidence block | |
| evidence_parts: list[str] = [] | |
| for i, doc in enumerate(documents, 1): | |
| meta = doc.get("metadata", {}) | |
| title = meta.get("title", doc.get("title", "Unknown")) | |
| section = meta.get("section_title", doc.get("section", "")) | |
| text = (doc.get("content") or doc.get("text", ""))[:2000] | |
| header = f"[{i}] {title}" | |
| if section: | |
| header += f" — {section}" | |
| evidence_parts.append(f"{header}\n{text}") | |
| evidence_block = "\n\n---\n\n".join(evidence_parts) if evidence_parts else "(No evidence retrieved)" | |
| # Build user message | |
| user_msg = f"Question: {query}\n\n" | |
| if biomarkers: | |
| user_msg += f"Biomarkers: {biomarkers}\n\n" | |
| if patient_context: | |
| user_msg += f"Patient context: {patient_context}\n\n" | |
| user_msg += f"Evidence:\n{evidence_block}" | |
| try: | |
| response = context.llm.invoke( | |
| [ | |
| {"role": "system", "content": RAG_GENERATION_SYSTEM}, | |
| {"role": "user", "content": user_msg}, | |
| ] | |
| ) | |
| answer = response.content.strip() | |
| except Exception as exc: | |
| logger.error("Generation LLM failed: %s", exc) | |
| answer = ( | |
| "I apologize, but I'm temporarily unable to generate a response. " | |
| "Please consult a healthcare professional for guidance." | |
| ) | |
| return {"final_answer": answer, "errors": [str(exc)]} | |
| return {"final_answer": answer} | |