Public Access
96 lines
3.4 KiB
Python
96 lines
3.4 KiB
Python
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 |