sofia-ai-workspace / generation.py
GoGma's picture
Update generation.py
629e570 verified
import os
import requests
import random
import io
from datetime import datetime
from typing import Optional
from PIL import Image
# Configuración de carpetas
OUTPUT_DIR = "generated_images"
os.makedirs(OUTPUT_DIR, exist_ok=True)
def generate_image_from_prompt(
prompt: str,
negative_prompt: str = "",
model_name: str = "ignored", # Este argumento lo ignoramos
seed: Optional[int] = None,
) -> tuple[Optional[str], str]:
# 1. VALIDACIÓN DE CREDENCIALES
# Usamos HF_TOKEN que ya está en el environment de HuggingFace Spaces
api_key = os.getenv("HF_TOKEN")
if not api_key:
return None, "❌ Error Crítico: No existe HF_TOKEN en el entorno."
api_key = api_key.strip() # Limpieza de seguridad
# 2. DEFINICIÓN DE MODELOS (Principal y Respaldo)
# Usando modelos que funcionan con HuggingFace Inference API
primary_model = "black-forest-labs/FLUX.1-schnell"
backup_model = "stabilityai/stable-diffusion-2-1"
models_to_try = [primary_model, backup_model]
last_error = ""
# 3. BUCLE DE INTENTOS
for model in models_to_try:
try:
print(f"🔄 Intentando generar con modelo: {model}...")
# URL de HuggingFace Inference API
api_url = f"https://router.huggingface.co/models/{model}"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
# Payload para generación de imágenes
payload = {
"inputs": prompt,
}
# Añadir negative_prompt si existe
if negative_prompt:
payload["negative_prompt"] = negative_prompt
response = requests.post(
api_url,
headers=headers,
json=payload,
timeout=60 # Timeout más largo para generación de imágenes
)
# Si hay error, pasamos al siguiente modelo
if response.status_code != 200:
error_detail = response.text
print(f"⚠️ Fallo con {model}: {error_detail}")
last_error = f"Error {response.status_code} en {model}: {error_detail}"
continue # Salta al siguiente modelo
# Si es 200 OK, procesamos la imagen
# HuggingFace Inference API devuelve la imagen directamente como bytes
image_bytes = response.content
# Verificar que recibimos una imagen válida
try:
image = Image.open(io.BytesIO(image_bytes))
# Guardar la imagen
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
if seed is None: seed = random.randint(0, 999)
filename = f"sofia_{timestamp}_{seed}.png"
file_path = os.path.join(OUTPUT_DIR, filename)
image.save(file_path)
return file_path, f"✅ ÉXITO: Imagen creada con {model}"
except Exception as img_error:
last_error = f"Error al procesar imagen de {model}: {str(img_error)}"
continue
except Exception as e:
last_error = f"Excepción técnica con {model}: {str(e)}"
continue
# Si llega aquí, fallaron todos los modelos
return None, f"❌ ERROR FATAL: Fallaron todos los intentos.\nÚltimo error: {last_error}"