Compare commits

..
1 Commits
Author SHA1 Message Date
xavier f794937fd8 fix: intégration du support natif Gemini et affichage des erreurs API détaillées
Build and Push Docker Image / build-and-push (push) Successful in 41s
2026-10-07 14:09:24 +02:00
+35 -15
View File
@@ -5,7 +5,6 @@ from .models import SystemSettings
def get_ai_response(messages: list, settings: SystemSettings) -> str: def get_ai_response(messages: list, settings: SystemSettings) -> str:
""" """
Route la conversation vers le premier fournisseur IA disponible configuré par l'admin. Route la conversation vers le premier fournisseur IA disponible configuré par l'admin.
Prend l'historique des messages et retourne le texte généré.
""" """
if not settings: if not settings:
raise HTTPException(status_code=500, detail="Configuration système introuvable.") raise HTTPException(status_code=500, detail="Configuration système introuvable.")
@@ -13,41 +12,62 @@ def get_ai_response(messages: list, settings: SystemSettings) -> str:
# Formatage de l'historique pour l'API (OpenAI compatible) # Formatage de l'historique pour l'API (OpenAI compatible)
formatted_messages = [{"role": msg.role, "content": msg.content} for msg in messages] formatted_messages = [{"role": msg.role, "content": msg.content} for msg in messages]
# 1. Test OpenRouter (Idéal car donne accès à tout) try:
# 1. Test OpenRouter
if settings.openrouter_api_key: if settings.openrouter_api_key:
client = OpenAI( client = OpenAI(
base_url="https://openrouter.ai/api/v1", base_url="https://openrouter.ai/api/v1",
api_key=settings.openrouter_api_key, api_key=settings.openrouter_api_key,
) )
model = "google/gemini-pro" # Fallback par défaut via OpenRouter model = "google/gemini-pro"
response = client.chat.completions.create(
model=model,
messages=formatted_messages,
extra_headers={"HTTP-Referer": "https://aethas38.duckdns.org", "X-Title": "AETHAS38"}
)
# 2. Test DeepSeek # 2. Test Gemini direct (Google propose désormais une API compatible OpenAI !)
elif settings.gemini_api_key:
client = OpenAI(
base_url="https://generativelanguage.googleapis.com/v1beta/openai/",
api_key=settings.gemini_api_key,
)
model = "gemini-1.5-flash"
response = client.chat.completions.create(
model=model,
messages=formatted_messages
)
# 3. Test DeepSeek
elif settings.deepseek_api_key: elif settings.deepseek_api_key:
client = OpenAI( client = OpenAI(
base_url="https://api.deepseek.com/v1", base_url="https://api.deepseek.com/v1",
api_key=settings.deepseek_api_key, api_key=settings.deepseek_api_key,
) )
model = "deepseek-chat" model = "deepseek-chat"
response = client.chat.completions.create(
model=model,
messages=formatted_messages
)
# 3. Test Groq # 4. Test Groq
elif settings.groq_api_key: elif settings.groq_api_key:
client = OpenAI( client = OpenAI(
base_url="https://api.groq.com/openai/v1", base_url="https://api.groq.com/openai/v1",
api_key=settings.groq_api_key, api_key=settings.groq_api_key,
) )
model = "llama3-8b-8192" model = "llama3-8b-8192"
else:
raise HTTPException(status_code=400, detail="Aucun moteur IA (OpenRouter, DeepSeek, Groq) n'est configuré avec une clé API.")
try:
response = client.chat.completions.create( response = client.chat.completions.create(
model=model, model=model,
messages=formatted_messages, messages=formatted_messages
# Identifiant unique de l'application pour OpenRouter
extra_headers={"HTTP-Referer": "https://aethas38.duckdns.org", "X-Title": "AETHAS38 Multi-IA"} if settings.openrouter_api_key else {}
) )
else:
raise HTTPException(status_code=400, detail="Aucune clé API IA n'est configurée.")
return response.choices[0].message.content return response.choices[0].message.content
except Exception as e: except Exception as e:
print(f"Erreur API IA : {str(e)}") # On capture l'erreur exacte et on la renvoie au frontend pour comprendre le blocage
raise HTTPException(status_code=502, detail="Erreur de communication avec le fournisseur IA.") print(f"Erreur détaillée : {str(e)}")
raise HTTPException(status_code=502, detail=f"Détail du fournisseur : {str(e)}")