feat: Intégration de l'API OpenRouter, suppression de Groq et mise à jour du README

This commit is contained in:
xavier committed 2026-08-18 13:08:18 +02:00
1 parent 909e2e995a
commit 317ecddc56
5 files changed
+128 -121

No files matched your search

+54 -27
View File
@@ -1,36 +1,63 @@
import os
import time
import openai
from openai import OpenAI
from modules.logger import log_event
def interroger_openrouter(prompt_securise):
"""Module dédié à OpenRouter.ai pour accéder à +100 modèles gratuitement."""
api_key = os.getenv("OPENROUTER_API_KEY")
if not api_key: raise Exception("Clé API OpenRouter manquante.")
# Initialisation du client OpenRouter avec l'API compatible OpenAI
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=os.getenv("OPENROUTER_API_KEY", "VOTRE_CLE_ICI") # À définir dans le .env
)
def interroger_openrouter(prompt, type_modele="openrouter_chat", max_retries=3):
"""
Interroge l'API OpenRouter avec gestion des erreurs 402 (Plafond) et 429 (Rate Limit).
Sélectionne un modèle gratuit selon l'intention (Chat ou Code).
"""
# Client compatible OpenAI pointant vers l'agrégateur OpenRouter
client = OpenAI(base_url="https://openrouter.ai/api/v1", api_key=api_key)
# Liste de modèles 100% gratuits et performants sur OpenRouter
modeles = [
"meta-llama/llama-3.1-8b-instruct:free",
"mistralai/mistral-7b-instruct:free",
"google/gemma-2-9b-it:free",
"microsoft/phi-3-mini-128k-instruct:free"
]
for modele in modeles:
# Sélection des modèles 100% gratuits et performants sur OpenRouter
if type_modele == "openrouter_code":
nom_modele_api = "qwen/qwen-2.5-coder-32b-instruct:free"
nom_affichage = "OpenRouter (Qwen Coder - Gratuit)"
couleur = "#10a37f" # Vert émeraude
else:
nom_modele_api = "meta-llama/llama-3.1-8b-instruct:free"
nom_affichage = "OpenRouter (Llama 3.1 - Gratuit)"
couleur = "#4a90e2" # Bleu clair
for tentative in range(max_retries):
try:
resp = client.chat.completions.create(
model=modele,
messages=[
{"role": "system", "content": "Réponds en français et en format Markdown."},
{"role": "user", "content": prompt_securise}
]
start_time = time.time()
response = client.chat.completions.create(
model=nom_modele_api,
messages=[{"role": "user", "content": prompt}]
)
if resp and resp.choices:
log_event("INFO", f"OPENROUTER-{modele}", "Succès de la requête.")
return resp.choices[0].message.content, "#8b5cf6", "OPENROUTER (Gratuit)", modele
texte = response.choices[0].message.content
return texte, couleur, "OpenRouter", nom_affichage
except openai.RateLimitError as e:
temps_attente = 2 ** tentative
log_event("WARNING", "OPENROUTER", f"Limite de taux atteinte (429). Essai {tentative + 1}/{max_retries}. Attente de {temps_attente}s...")
time.sleep(temps_attente)
if tentative == max_retries - 1:
log_event("ERROR", "OPENROUTER", "Échec définitif suite aux limites de taux (429).")
raise Exception("Service temporairement saturé. Veuillez réessayer.")
except openai.APIStatusError as e:
if e.status_code == 402:
log_event("CRITICAL", "OPENROUTER", "Erreur 402 : Fonds insuffisants ou limite de clé atteinte.")
raise Exception("Action requise : Limite de facturation atteinte sur OpenRouter.")
else:
log_event("ERROR", "OPENROUTER", f"Code {e.status_code} : {e.message}")
raise Exception(f"Erreur API OpenRouter : {e.status_code}")
except openai.APIConnectionError as e:
log_event("ERROR", "OPENROUTER", f"Erreur réseau : {e}")
raise Exception("Impossible de joindre les serveurs d'OpenRouter.")
except Exception as e:
log_event("WARNING", f"OPENROUTER-{modele}", f"Erreur: {e}")
log_event("ERROR", "OPENROUTER", f"Erreur inattendue : {e}")
raise e
raise Exception("Tous les modèles gratuits OpenRouter ont échoué.")
return None, None, None, None