import os import time from dotenv import load_dotenv import openai from openai import OpenAI from modules.logger import log_event load_dotenv() api_key_openrouter = os.getenv("OPENROUTER_API_KEY") or "sk-or-v1-cle-non-definie" client = OpenAI( base_url="https://openrouter.ai/api/v1", api_key=api_key_openrouter ) CATALOGUE_MODELES = { "gratuit": { "openrouter_chat": "google/gemma-4-31b-it:free", "openrouter_code": "cohere/north-mini-code:free", "openrouter_droit": "z-ai/glm-5.2:free" }, "premium": { "openrouter_chat": "openai/gpt-4o-mini", "openrouter_code": "anthropic/claude-3.5-sonnet", "openrouter_droit": "mistralai/mistral-large-2411" } } def verifier_cle_api(): cle = os.getenv("OPENROUTER_API_KEY") if not cle or cle == "sk-or-v1-cle-non-definie": raise Exception("Clé OPENROUTER_API_KEY absente dans le fichier .env.") return cle def interroger_openrouter(prompt: str, type_modele: str = "openrouter_chat", premium: bool = False, max_retries: int = 2): verifier_cle_api() gamme = "premium" if premium else "gratuit" nom_modele_api = CATALOGUE_MODELES[gamme].get(type_modele, CATALOGUE_MODELES[gamme]["openrouter_chat"]) nom_affichage = f"OpenRouter ({nom_modele_api.split('/')[-1]})" couleur = "#d97757" if premium else "#4a90e2" for tentative in range(max_retries): try: response = client.chat.completions.create( model=nom_modele_api, messages=[{"role": "user", "content": prompt}], extra_headers={ "HTTP-Referer": "https://aethas38.duckdns.org", "X-Title": "Aethas38 Multi-IA" }, timeout=20.0 ) texte = response.choices[0].message.content usage = response.usage tokens_in = usage.prompt_tokens if usage else 0 tokens_out = usage.completion_tokens if usage else 0 return texte, couleur, "OpenRouter", nom_affichage, tokens_in, tokens_out except Exception as e: log_event("WARNING", "OPENROUTER", f"Tentative {tentative + 1} échouée pour {nom_modele_api} : {e}") if tentative == max_retries - 1: raise e time.sleep(1) return None, None, None, None, 0, 0 def interroger_openrouter_multi(prompt: str, type_modele: str = "openrouter_code", premium: bool = False) -> list: verifier_cle_api() if premium: modeles = ["anthropic/claude-3.5-sonnet", "openai/gpt-4o-mini"] else: # Modèles gratuits réactifs sans blocage de quota modeles = ["cohere/north-mini-code:free", "google/gemma-4-31b-it:free"] reponses = [] for modele in modeles: try: res = client.chat.completions.create( model=modele, messages=[{"role": "user", "content": prompt}], extra_headers={ "HTTP-Referer": "https://aethas38.duckdns.org", "X-Title": "Aethas38 Multi-IA" }, timeout=15.0 ) contenu = res.choices[0].message.content if contenu: reponses.append({"modele": modele, "texte": contenu}) except Exception as e: log_event("WARNING", "OPENROUTER_MULTI", f"Échec rapide pour {modele} : {e}") continue return reponses