BATUTO90
Update to FLUX.1-schnell Image Generator with InferenceClient
8596a86
import gradio as gr
import os
from huggingface_hub import InferenceClient
from PIL import Image
from io import BytesIO
# Modelo a utilizar
MODEL_NAME = "black-forest-labs/FLUX.1-schnell"
# Función principal de generación de imágenes
def generate_image(hf_token: str, prompt: str, negative_prompt: str, size: str) -> Image.Image:
"""
Genera una imagen usando el modelo FLUX.1-schnell a través de InferenceClient.
"""
if not hf_token:
raise gr.Error("Por favor, introduce tu HF Token para autenticarte.")
if not prompt:
raise gr.Error("El prompt no puede estar vacío.")
try:
# Inicializar el cliente con el token proporcionado por el usuario
client = InferenceClient(
provider="hf-inference",
api_key=hf_token,
)
# Parsear el tamaño de la imagen
# El formato es "Ancho x Alto (Descripción)", por lo que solo necesitamos la primera parte
width, height = map(int, size.split(' ')[0].split('x'))
# Parámetros de generación
params = {
"prompt": prompt,
"negative_prompt": negative_prompt,
"width": width,
"height": height,
"guidance_scale": 7.0,
"num_inference_steps": 50,
}
# Llamada a la API de generación de imágenes
image = client.text_to_image(
model=MODEL_NAME,
**params
)
return image
except Exception as e:
# Manejo de errores de la API o del cliente
error_message = f"Error al generar la imagen: {e}"
if "Invalid token" in str(e) or "Unauthorized" in str(e):
error_message = "Error de autenticación: El HF Token proporcionado no es válido o no tiene permisos."
elif "Model not found" in str(e):
error_message = f"Error: El modelo {MODEL_NAME} no se encontró o no está disponible."
raise gr.Error(error_message)
# Opciones de tamaño de imagen
SIZE_OPTIONS = [
"1024x1024 (Cuadrado)",
"1152x896 (Horizontal)",
"896x1152 (Vertical)",
"1216x832 (Horizontal)",
"832x1216 (Vertical)",
"1344x768 (Horizontal)",
"768x1344 (Vertical)",
"1536x640 (Horizontal)",
"640x1536 (Vertical)",
]
# Interfaz Gradio
with gr.Blocks(title="FLUX.1-schnell Image Generator", theme=gr.themes.Soft()) as demo:
gr.Markdown(f"# ⚡ Generador de Imágenes con {MODEL_NAME}")
gr.Markdown("Utiliza tu HF Token para generar imágenes de alta calidad con el modelo FLUX.1-schnell.")
with gr.Row():
with gr.Column(scale=1):
# Entrada del HF Token
hf_token_input = gr.Textbox(
label="🔑 Tu HF Token (con permisos de lectura)",
type="password",
placeholder="Ingresa tu token de Hugging Face aquí...",
info="Necesario para autenticar la llamada a la API de inferencia."
)
# Entrada del Prompt
prompt_input = gr.Textbox(
label="📝 Prompt (Descripción de la imagen)",
lines=3,
placeholder="Ej: Un astronauta montando a caballo en un planeta alienígena, estilo fotorrealista, 4k."
)
# Entrada del Prompt Negativo
negative_prompt_input = gr.Textbox(
label="🚫 Prompt Negativo (Cosas a evitar)",
lines=2,
placeholder="Ej: baja calidad, borroso, deforme, extra dedos, texto."
)
# Selector de Tamaño
size_selector = gr.Dropdown(
label="📐 Tamaño de la Imagen (Resolución)",
choices=SIZE_OPTIONS,
value=SIZE_OPTIONS[0],
interactive=True
)
# Botones de acción
with gr.Row():
generate_btn = gr.Button("✨ Generar Imagen", variant="primary")
# Botón para limpiar: Usa gr.ClearButton
clear_btn = gr.ClearButton(
value="🗑️ Limpiar Entradas",
components=[hf_token_input, prompt_input, negative_prompt_input, size_selector]
)
with gr.Column(scale=2):
# Salida de la Imagen
image_output = gr.Image(
label="🖼️ Imagen Generada",
type="pil",
show_download_button=True, # Habilita el botón de descarga
height=512 # Altura inicial para la visualización
)
# Enlazar la función al botón de generación
generate_btn.click(
fn=generate_image,
inputs=[hf_token_input, prompt_input, negative_prompt_input, size_selector],
outputs=[image_output]
)
# Ejecutar la aplicación
if __name__ == "__main__":
demo.launch()