| import json |
| from langchain_core.messages import HumanMessage |
| from llm_factory import get_llm |
| import base64 |
|
|
| |
| text_llm = get_llm(model_type="text", temperature=0.1) |
| vision_llm = get_llm(model_type="vision", temperature=0.1) |
|
|
| import io |
| from pypdf import PdfReader |
| from services.rag_service import rag_service |
|
|
| async def run_bio_analysis_agent(file_data: bytes, mime_type: str) -> dict: |
| try: |
| print(f"Processing file with mime_type: {mime_type}") |
| |
| prompt_text = """ |
| Tu es un Expert Biologiste et Pharmacien. |
| |
| TA MISSION : |
| Analyser ce rapport de laboratoire et extraire les données structurées. |
| |
| FORMAT DE SORTIE ATTENDU (JSON uniquement) : |
| { |
| "patient_name": "Nom du patient ou 'Inconnu'", |
| "date": "Date du rapport ou 'Inconnue'", |
| "critical_alerts": ["Liste des valeurs critiques nécessitant une attention immédiate"], |
| "results": [ |
| { |
| "test_name": "Nom de l'analyse (ex: Hémoglobine)", |
| "value": "Valeur numérique (ex: 10.5)", |
| "unit": "Unité (ex: g/dL)", |
| "ref_range": "Plage de référence (ex: 12-16)", |
| "status": "LOW" | "HIGH" | "NORMAL", |
| "interpretation": "Brève interprétation clinique" |
| } |
| ], |
| "global_interpretation": "Synthèse globale de l'état du patient basés sur les résultats.", |
| "recommendations": ["Actions recommandées"] |
| } |
| |
| RÉPOND UNIQUEMENT AVEC LE JSON. PAS DE MARKDOWN. |
| """ |
|
|
| message_content = [] |
| selected_llm = text_llm |
|
|
| if mime_type == "application/pdf": |
| |
| try: |
| pdf_file = io.BytesIO(file_data) |
| reader = PdfReader(pdf_file) |
| extracted_text = "" |
| for page in reader.pages: |
| extracted_text += page.extract_text() + "\n" |
| |
| print(f"Extracted {len(extracted_text)} chars from PDF") |
| message_content.append({"type": "text", "text": prompt_text + "\n\nVOICI LE CONTENU DU RAPPORT :\n" + extracted_text}) |
| selected_llm = text_llm |
| except Exception as pdf_err: |
| print(f"PDF Extraction failed: {pdf_err}") |
| return {"error": "PDF parsing failed", "details": str(pdf_err)} |
|
|
| elif mime_type.startswith("image/"): |
| |
| b64_data = base64.b64encode(file_data).decode("utf-8") |
| message_content.append({"type": "text", "text": prompt_text}) |
| message_content.append({ |
| "type": "image_url", |
| "image_url": {"url": f"data:{mime_type};base64,{b64_data}"} |
| }) |
| selected_llm = vision_llm |
| else: |
| return {"error": "Unsupported file type", "details": mime_type} |
| |
| message = HumanMessage(content=message_content) |
| |
| response = await selected_llm.ainvoke([message]) |
| |
| |
| content = response.content.strip() |
| if content.startswith("```json"): |
| content = content[7:-3] |
| elif content.startswith("```"): |
| content = content[3:-3] |
| |
| try: |
| |
| rag_service.add_document("default", f"Résultat Analyse Labo:\n{content}", "lab_result") |
| |
| return json.loads(content) |
| except json.JSONDecodeError as e: |
| print(f"JSON Parse Error: {e}") |
| print(f"Raw Content: {content}") |
| |
| |
| rag_service.add_document("default", f"Tentative Analyse Labo (Brut):\n{content}", "lab_result_raw") |
| |
| return { |
| "error": "Failed to parse JSON", |
| "raw_content": content |
| } |
| |
| except Exception as e: |
| print(f"CRITICAL ERROR in run_bio_analysis_agent: {str(e)}") |
| import traceback |
| traceback.print_exc() |
| return { |
| "error": "Analysis failed", |
| "details": str(e) |
| } |
|
|