Public Access
73 lines
3.2 KiB
Python
73 lines
3.2 KiB
Python
import os
|
|
import time
|
|
import openai
|
|
from openai import OpenAI
|
|
from modules.logger import log_event
|
|
|
|
# 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", premium=False, max_retries=3):
|
|
"""
|
|
Interroge l'API OpenRouter avec gestion des erreurs 402 (Plafond) et 429 (Rate Limit).
|
|
Bascule entre les modèles gratuits et premiums (VIP/Payant) selon le choix utilisateur.
|
|
"""
|
|
|
|
# Sélection dynamique des modèles selon l'abonnement
|
|
if premium:
|
|
if type_modele == "openrouter_code":
|
|
nom_modele_api = "anthropic/claude-3.5-sonnet"
|
|
nom_affichage = "OpenRouter (Claude 3.5 Sonnet - Premium)"
|
|
couleur = "#d97757" # Orange Anthropic
|
|
else:
|
|
nom_modele_api = "openai/gpt-4o-mini"
|
|
nom_affichage = "OpenRouter (GPT-4o Mini - Premium)"
|
|
couleur = "#10a37f" # Vert OpenAI
|
|
else:
|
|
if type_modele == "openrouter_code":
|
|
nom_modele_api = "qwen/qwen-2.5-coder-32b-instruct:free"
|
|
nom_affichage = "OpenRouter (Qwen Coder - Gratuit)"
|
|
couleur = "#4a90e2" # Bleu clair
|
|
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:
|
|
start_time = time.time()
|
|
response = client.chat.completions.create(
|
|
model=nom_modele_api,
|
|
messages=[{"role": "user", "content": prompt}]
|
|
)
|
|
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é sur OpenRouter. 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("ERROR", "OPENROUTER", f"Erreur inattendue : {e}")
|
|
raise e
|
|
|
|
return None, None, None, None |