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", 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). """ # 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: 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é. 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