Public Access
Auto-updater, limites CPU 60% et facturation corrigés
Build and Push Docker Image / build-and-push (push) Successful in 1m55s
Build and Push Docker Image / build-and-push (push) Successful in 1m55s
This commit is contained in:
1 parent
71d6f51ee0
commit
b4ed2947d4
15 files changed
+7413
-122
No files matched your search
+40
-35
@@ -1,31 +1,15 @@
|
||||
import os
|
||||
import time
|
||||
import json
|
||||
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"
|
||||
}
|
||||
}
|
||||
client = OpenAI(base_url="https://openrouter.ai/api/v1", api_key=api_key_openrouter)
|
||||
CATALOGUE_FILE = "/DATA/AppData/MULTI-IA-AETHAS38/catalogue_dynamique.json"
|
||||
|
||||
def verifier_cle_api():
|
||||
cle = os.getenv("OPENROUTER_API_KEY")
|
||||
@@ -33,23 +17,42 @@ def verifier_cle_api():
|
||||
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):
|
||||
def obtenir_modele_dynamique(premium: bool):
|
||||
"""Charge le catalogue dynamiquement selon l'état Premium ou Gratuit."""
|
||||
try:
|
||||
if os.path.exists(CATALOGUE_FILE):
|
||||
with open(CATALOGUE_FILE, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
if premium:
|
||||
paid_models = data.get("paid_models", [])
|
||||
claude = [m for m in paid_models if "claude-3.5-sonnet" in m.lower()]
|
||||
return claude[0] if claude else (paid_models[0] if paid_models else "anthropic/claude-3.5-sonnet")
|
||||
else:
|
||||
free_models = data.get("free_models", [])
|
||||
priorites = [m for m in free_models if "gemma" in m.lower() or "nemotron" in m.lower()]
|
||||
return priorites[0] if priorites else (free_models[0] if free_models else "google/gemma-2-9b-it:free")
|
||||
except Exception:
|
||||
pass
|
||||
# Fallbacks absolus si fichier introuvable
|
||||
return "anthropic/claude-3.5-sonnet" if premium else "google/gemma-2-9b-it:free"
|
||||
|
||||
def interroger_openrouter(prompt: str, type_modele: str = "openrouter_chat", premium: bool = False, max_retries: int = 2, chat_id: str = None):
|
||||
verifier_cle_api()
|
||||
gamme = "premium" if premium else "gratuit"
|
||||
nom_modele_api = CATALOGUE_MODELES[gamme].get(type_modele, CATALOGUE_MODELES[gamme]["openrouter_chat"])
|
||||
nom_modele_api = obtenir_modele_dynamique(premium)
|
||||
nom_affichage = f"OpenRouter ({nom_modele_api.split('/')[-1]})"
|
||||
couleur = "#d97757" if premium else "#4a90e2"
|
||||
|
||||
# Injection du Tracker Financier OpenRouter
|
||||
extra_body_data = {"session_id": chat_id} if chat_id else {}
|
||||
|
||||
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
|
||||
extra_headers={"HTTP-Referer": "https://aethas38.duckdns.org", "X-Title": "Aethas38 Multi-IA"},
|
||||
extra_body=extra_body_data,
|
||||
timeout=25.0
|
||||
)
|
||||
texte = response.choices[0].message.content
|
||||
usage = response.usage
|
||||
@@ -60,19 +63,23 @@ def interroger_openrouter(prompt: str, type_modele: str = "openrouter_chat", pre
|
||||
except Exception as e:
|
||||
log_event("WARNING", "OPENROUTER", f"Tentative {tentative + 1} échouée pour {nom_modele_api} : {e}")
|
||||
if tentative == max_retries - 1:
|
||||
# Force la MAJ du catalogue si le modèle crashe
|
||||
from modules.model_updater import trigger_update_now
|
||||
trigger_update_now()
|
||||
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:
|
||||
def interroger_openrouter_multi(prompt: str, type_modele: str = "openrouter_code", premium: bool = False, chat_id: str = None) -> list:
|
||||
verifier_cle_api()
|
||||
extra_body_data = {"session_id": chat_id} if chat_id else {}
|
||||
|
||||
modeles = [obtenir_modele_dynamique(premium)]
|
||||
if premium:
|
||||
modeles = ["anthropic/claude-3.5-sonnet", "openai/gpt-4o-mini"]
|
||||
modeles.append("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"]
|
||||
modeles.append("nvidia/nemotron-3-nano-30b-a3b:free")
|
||||
|
||||
reponses = []
|
||||
for modele in modeles:
|
||||
@@ -80,10 +87,8 @@ def interroger_openrouter_multi(prompt: str, type_modele: str = "openrouter_code
|
||||
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"
|
||||
},
|
||||
extra_headers={"HTTP-Referer": "https://aethas38.duckdns.org", "X-Title": "Aethas38 Multi-IA"},
|
||||
extra_body=extra_body_data,
|
||||
timeout=15.0
|
||||
)
|
||||
contenu = res.choices[0].message.content
|
||||
|
||||
Reference in new issue
Block a user