Spaces:
Running
Running
| """ | |
| MediGuard AI RAG-Helper | |
| Main LangGraph Workflow - Clinical Insight Guild Orchestration | |
| """ | |
| from langgraph.graph import END, StateGraph | |
| from src.pdf_processor import get_all_retrievers | |
| from src.state import GuildState | |
| class ClinicalInsightGuild: | |
| """ | |
| Main workflow orchestrator for MediGuard AI RAG-Helper. | |
| Coordinates all specialist agents in the Clinical Insight Guild. | |
| """ | |
| def __init__(self): | |
| """Initialize the guild with all specialist agents""" | |
| print("\n" + "=" * 70) | |
| print("INITIALIZING: Clinical Insight Guild") | |
| print("=" * 70) | |
| # Load retrievers | |
| print("\nLoading RAG retrievers...") | |
| retrievers = get_all_retrievers() | |
| # Import and initialize all agents | |
| from src.agents.biomarker_analyzer import biomarker_analyzer_agent | |
| from src.agents.biomarker_linker import create_biomarker_linker_agent | |
| from src.agents.clinical_guidelines import create_clinical_guidelines_agent | |
| from src.agents.confidence_assessor import confidence_assessor_agent | |
| from src.agents.disease_explainer import create_disease_explainer_agent | |
| from src.agents.response_synthesizer import response_synthesizer_agent | |
| self.biomarker_analyzer = biomarker_analyzer_agent | |
| self.disease_explainer = create_disease_explainer_agent(retrievers["disease_explainer"]) | |
| self.biomarker_linker = create_biomarker_linker_agent(retrievers["biomarker_linker"]) | |
| self.clinical_guidelines = create_clinical_guidelines_agent(retrievers["clinical_guidelines"]) | |
| self.confidence_assessor = confidence_assessor_agent | |
| self.response_synthesizer = response_synthesizer_agent | |
| print("All agents initialized successfully") | |
| # Build workflow graph | |
| self.workflow = self._build_workflow() | |
| print("Workflow graph compiled") | |
| print("=" * 70 + "\n") | |
| def _build_workflow(self): | |
| """ | |
| Build the LangGraph workflow. | |
| Execution flow: | |
| 1. Biomarker Analyzer (validates all biomarkers) | |
| 2. Parallel execution: | |
| - Disease Explainer (RAG for pathophysiology) | |
| - Biomarker-Disease Linker (connects values to prediction) | |
| - Clinical Guidelines (RAG for recommendations) | |
| 3. Confidence Assessor (evaluates reliability) | |
| 4. Response Synthesizer (compiles final output) | |
| """ | |
| # Create state graph | |
| workflow = StateGraph(GuildState) | |
| # Add all agent nodes | |
| workflow.add_node("biomarker_analyzer", self.biomarker_analyzer.analyze) | |
| workflow.add_node("disease_explainer", self.disease_explainer.explain) | |
| workflow.add_node("biomarker_linker", self.biomarker_linker.link) | |
| workflow.add_node("clinical_guidelines", self.clinical_guidelines.recommend) | |
| workflow.add_node("confidence_assessor", self.confidence_assessor.assess) | |
| workflow.add_node("response_synthesizer", self.response_synthesizer.synthesize) | |
| # Define execution flow | |
| # Start -> Biomarker Analyzer | |
| workflow.set_entry_point("biomarker_analyzer") | |
| # Biomarker Analyzer -> Parallel specialists | |
| workflow.add_edge("biomarker_analyzer", "disease_explainer") | |
| workflow.add_edge("biomarker_analyzer", "biomarker_linker") | |
| workflow.add_edge("biomarker_analyzer", "clinical_guidelines") | |
| # All parallel specialists -> Confidence Assessor | |
| workflow.add_edge("disease_explainer", "confidence_assessor") | |
| workflow.add_edge("biomarker_linker", "confidence_assessor") | |
| workflow.add_edge("clinical_guidelines", "confidence_assessor") | |
| # Confidence Assessor -> Response Synthesizer | |
| workflow.add_edge("confidence_assessor", "response_synthesizer") | |
| # Response Synthesizer -> END | |
| workflow.add_edge("response_synthesizer", END) | |
| # Compile workflow (returns CompiledGraph with invoke method) | |
| return workflow.compile() | |
| def run(self, patient_input) -> dict: | |
| """ | |
| Execute the complete Clinical Insight Guild workflow. | |
| Args: | |
| patient_input: PatientInput object with biomarkers and ML prediction | |
| Returns: | |
| Complete structured response dictionary | |
| """ | |
| from datetime import datetime | |
| from src.config import BASELINE_SOP | |
| print("\n" + "=" * 70) | |
| print("STARTING: Clinical Insight Guild Workflow") | |
| print("=" * 70) | |
| print(f"Patient: {patient_input.patient_context.get('patient_id', 'Unknown')}") | |
| print(f"Predicted Disease: {patient_input.model_prediction['disease']}") | |
| print(f"Model Confidence: {patient_input.model_prediction['confidence']:.1%}") | |
| print("=" * 70 + "\n") | |
| # Initialize state from PatientInput | |
| initial_state: GuildState = { | |
| "patient_biomarkers": patient_input.biomarkers, | |
| "model_prediction": patient_input.model_prediction, | |
| "patient_context": patient_input.patient_context, | |
| "plan": None, | |
| "sop": BASELINE_SOP, | |
| "agent_outputs": [], | |
| "biomarker_flags": [], | |
| "safety_alerts": [], | |
| "final_response": None, | |
| "biomarker_analysis": None, | |
| "processing_timestamp": datetime.now().isoformat(), | |
| "sop_version": "Baseline", | |
| } | |
| # Run workflow | |
| final_state = self.workflow.invoke(initial_state) | |
| print("\n" + "=" * 70) | |
| print("COMPLETED: Clinical Insight Guild Workflow") | |
| print("=" * 70) | |
| print(f"Total Agents Executed: {len(final_state.get('agent_outputs', []))}") | |
| print("Workflow execution successful") | |
| print("=" * 70 + "\n") | |
| # Return full state so callers can access agent_outputs, | |
| # biomarker_flags, safety_alerts, and final_response | |
| return dict(final_state) | |
| def create_guild() -> ClinicalInsightGuild: | |
| """Factory function to create and initialize the Clinical Insight Guild""" | |
| return ClinicalInsightGuild() | |
| if __name__ == "__main__": | |
| # Test workflow initialization | |
| print("Testing Clinical Insight Guild initialization...") | |
| guild = create_guild() | |
| print("\nGuild initialization successful!") | |
| print("Ready to process patient inputs.") | |