diff --git a/modules/ai_media.py b/modules/ai_media.py index c4ac7f2..5704848 100644 --- a/modules/ai_media.py +++ b/modules/ai_media.py @@ -5,26 +5,6 @@ import concurrent.futures import base64 from modules.logger import log_event -def obtenir_modele_image_hf_dynamique(api_key: str) -> str: - """Interroge le Hub HF pour trouver le modèle image gratuit le plus populaire ET actif (warm).""" - url = "https://huggingface.co/api/models" - params = { - "pipeline_tag": "text-to-image", - "sort": "downloads", - "direction": -1, - "inference": "warm", # GARANTIT que le modèle est gratuit et en ligne - "limit": 3 - } - headers = {"Authorization": f"Bearer {api_key}"} if api_key else {} - try: - resp = requests.get(url, headers=headers, params=params, timeout=5) - if resp.status_code == 200 and len(resp.json()) > 0: - return resp.json()[0]["id"] - except Exception: - pass - # Secours absolu si l'API de liste ne répond pas - return "runwayml/stable-diffusion-v1-5" - def generer_image_cloudflare(prompt: str) -> bytes: account_id = os.getenv("CLOUDFLARE_ACCOUNT_ID") api_token = os.getenv("CLOUDFLARE_API_TOKEN") @@ -79,20 +59,30 @@ def generer_image_huggingface(prompt: str) -> tuple: api_key = os.getenv("HUGGINGFACE_API_KEY") if not api_key: return None, "Clé API manquante", None - # Sélection dynamique HF + Utilisation de la passerelle de secours réseau (router) - modele_cible = obtenir_modele_image_hf_dynamique(api_key) - url = f"https://router.huggingface.co/hf-inference/models/{modele_cible}" - headers = {"Authorization": f"Bearer {api_key}"} + # LISTE DE REPLI HF : Modèles garantis sur le tier 100% gratuit + modeles_gratuits = [ + "runwayml/stable-diffusion-v1-5", # L'indestructible par défaut + "prompthero/openjourney", # Excellent pour un style Midjourney + "stabilityai/stable-diffusion-2-1" + ] - try: - resp = requests.post(url, headers=headers, json={"inputs": prompt}, timeout=120) - if resp.status_code == 200: - return resp.content, "Succès", modele_cible - else: - return None, f"Erreur HTTP {resp.status_code} : {resp.text}", modele_cible - except Exception as e: - log_event("WARNING", "MEDIA", f"Échec HF : {e}") - return None, f"Exception système : {str(e)}", "Inconnu" + for modele_cible in modeles_gratuits: + url = f"https://router.huggingface.co/hf-inference/models/{modele_cible}" + headers = {"Authorization": f"Bearer {api_key}"} + + try: + resp = requests.post(url, headers=headers, json={"inputs": prompt}, timeout=60) + if resp.status_code == 200: + return resp.content, "Succès", modele_cible + else: + log_event("WARNING", "MEDIA", f"Échec HF ({modele_cible}) : {resp.status_code} - {resp.text}") + continue # Le modèle a été rejeté, on tente immédiatement le suivant + except Exception as e: + log_event("WARNING", "MEDIA", f"Exception HF ({modele_cible}) : {str(e)}") + continue + + # Si la boucle se termine sans aucun succès + return None, "Tous les modèles gratuits ont été rejetés (410) ou sont indisponibles", "Inconnu" def generer_les_images(prompt: str, fichiers: list, premium: bool) -> tuple: trace = []