Spaces:
Runtime error
Runtime error
File size: 4,477 Bytes
ef54035 8e10d17 ef54035 8e10d17 ef54035 97860fd ef54035 062b289 ef54035 8e10d17 ef54035 062b289 97860fd ef54035 8e10d17 ef54035 062b289 97860fd ef54035 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from fastapi.middleware.cors import CORSMiddleware
from typing import Any
from tools.transcription import transcribe_audio
from tools.database import log_interaction
from fastapi import File, UploadFile, Form
import os
import shutil
import uvicorn
# On importe graphe LangGraph depuis main.py
from main import app as langgraph_app
# Initialisation de l'API
app = FastAPI(
title="Nova Health API",
description="API d'orientation médicale propulsée par l'IA"
)
# --- CONFIGURATION CORS ---
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
async def accueil():
"""Route d'accueil simple pour vérifier que l'API tourne."""
return {
"nom_projet": "Nova Health API",
"statut": "En ligne ",
"message": "Bienvenue ! Le système d'orientation médicale IA est opérationnel.",
"documentation": "Allez sur /docs pour tester l'API avec Swagger UI."
}
# --- MODÈLES DE DONNÉES (JSON) ---
# Ce que le frontend doit t'envoyer
class ChatRequest(BaseModel):
user_message: Any
user_lat: float
user_lon: float
# front
class ChatResponse(BaseModel):
intention: str
mot_cle: str
message:str
reponse_texte: Any
# --- LA ROUTE DE L'API ---
@app.post("/api/chat", response_model=ChatResponse)
async def chat_endpoint(request: ChatRequest):
"""
Reçoit le message et les coordonnées GPS du patient,
et renvoie l'orientation médicale formatée en JSON.
"""
try:
# On prépare les données pour ton routeur LangGraph
inputs = {
"user_message": request.user_message,
"user_lat": request.user_lat,
"user_lon": request.user_lon
}
# On fait réfléchir l'IA
result = langgraph_app.invoke(inputs)
log_interaction(
request.user_message,
request.user_lat,
request.user_lon,
result.get("intention", "INCONNU"),
result.get("mot_cle", ""),
result.get("message", ""),
result.get("reponse_texte", "")
)
# On renvoie le résultat au format JSON propre
return ChatResponse(
intention=result.get("intention", "INCONNU"),
mot_cle=result.get("mot_cle", ""),
message=result.get("message", ""),
reponse_texte=result.get("reponse_texte", "Désolé, une erreur est survenue lors de la recherche.")
)
except Exception as e:
# S'il y a un crash, on renvoie une erreur 500 propre au frontend
raise HTTPException(status_code=500, detail=str(e))
@app.post("/api/audio", response_model=ChatResponse)
async def audio_endpoint(
user_lat: float = Form(...),
user_lon: float = Form(...),
file: UploadFile = File(...)
):
temp_file_path = f"temp_{file.filename}"
try:
# 1. Sauvegarde
with open(temp_file_path, "wb") as buffer:
shutil.copyfileobj(file.file, buffer)
# 2. Transcription
texte_transcrit = transcribe_audio(temp_file_path)
print(f"[VOCAL] Message transcrit : {texte_transcrit}")
# 3. Appel LangGraph
print("[INFO] : Lancement du Graph")
inputs = {
"user_message": str(texte_transcrit),
"user_lat": float(user_lat),
"user_lon": float(user_lon)
}
result = langgraph_app.invoke(inputs)
log_interaction(
texte_transcrit,
user_lat,
user_lon,
result.get("intention", "INCONNU"),
result.get("mot_cle", ""),
result.get("message", ""),
result.get("reponse_texte", "")
)
# 4. RETOUR UNIFIÉ
return ChatResponse(
intention=result.get("intention", "INCONNU"),
mot_cle=result.get("mot_cle", ""),
message=result.get("message", ""),
reponse_texte=result.get("reponse_texte", "Désolé, une erreur est survenue lors de la recherche.")
)
except Exception as e:
print(f"Erreur Audio : {e}")
raise HTTPException(status_code=500, detail=f"Erreur : {str(e)}")
finally:
if os.path.exists(temp_file_path):
os.remove(temp_file_path)
|