Ntdeseb commited on
Commit
9ca5fd5
·
1 Parent(s): 6fe9f53

Add Hugging Face authentication for gated models - Add HF_TOKEN configuration for FLUX models - Improve error handling and logging - Add detailed setup instructions in README - Fix API external timeout and error handling

Browse files
Files changed (2) hide show
  1. README.md +41 -1
  2. app.py +76 -39
README.md CHANGED
@@ -21,7 +21,7 @@ Un generador de imágenes con IA con múltiples modelos de alta calidad optimiza
21
  - **SDXL Lightning** - Generación rápida de alta calidad (4 pasos)
22
  - **SDXL Lightning 4Step** - Versión optimizada de 4 pasos
23
 
24
- ### Modelos FLUX (Alta Calidad)
25
  - **FLUX.1-dev** - Modelo de desarrollo de alta calidad
26
  - **FLUX.1-schnell** - Modelo rápido de alta calidad
27
  - **FLUX.1-Kontext-Dev** - Modelo externo via API (requiere conexión)
@@ -30,6 +30,32 @@ Un generador de imágenes con IA con múltiples modelos de alta calidad optimiza
30
  - **SDXL Base** - Modelo base de Stable Diffusion XL
31
  - **Realistic Vision** - Especializado en retratos realistas
32
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  ## 🎯 Uso
34
 
35
  1. Selecciona un modelo del dropdown en "Advanced Settings"
@@ -45,6 +71,7 @@ Un generador de imágenes con IA con múltiples modelos de alta calidad optimiza
45
  - **Carga bajo demanda**: Los modelos se cargan solo cuando se necesitan
46
  - **Configuraciones específicas**: Cada modelo tiene sus propios parámetros de guidance y steps
47
  - **API Externa**: FLUX.1-Kontext-Dev usa la API del Space oficial
 
48
 
49
  ## 🔧 Configuraciones por Modelo
50
 
@@ -57,6 +84,19 @@ Un generador de imágenes con IA con múltiples modelos de alta calidad optimiza
57
 
58
  **FLUX.1-Kontext-Dev** se conecta a la API oficial del Space `black-forest-labs/FLUX.1-Kontext-Dev` para generar imágenes de alta calidad. Este modelo requiere conexión a internet y puede tener tiempos de respuesta variables.
59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  ---
61
 
62
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
21
  - **SDXL Lightning** - Generación rápida de alta calidad (4 pasos)
22
  - **SDXL Lightning 4Step** - Versión optimizada de 4 pasos
23
 
24
+ ### Modelos FLUX (Alta Calidad) 🔐
25
  - **FLUX.1-dev** - Modelo de desarrollo de alta calidad
26
  - **FLUX.1-schnell** - Modelo rápido de alta calidad
27
  - **FLUX.1-Kontext-Dev** - Modelo externo via API (requiere conexión)
 
30
  - **SDXL Base** - Modelo base de Stable Diffusion XL
31
  - **Realistic Vision** - Especializado en retratos realistas
32
 
33
+ ## 🔐 Configuración para Modelos Gated (FLUX)
34
+
35
+ Para usar los modelos FLUX, necesitas configurar tu token de Hugging Face:
36
+
37
+ ### 1. Obtener Token de Hugging Face
38
+ 1. Ve a [Hugging Face Settings](https://huggingface.co/settings/tokens)
39
+ 2. Crea un nuevo token con permisos de **read**
40
+ 3. Copia el token generado
41
+
42
+ ### 2. Configurar Token en el Space
43
+ 1. Ve a tu Space: https://huggingface.co/spaces/Ntdeseb/test
44
+ 2. Haz clic en **Settings** (⚙️)
45
+ 3. En la sección **Variables and secrets**
46
+ 4. Agrega una nueva variable:
47
+ - **Name**: `HF_TOKEN`
48
+ - **Value**: `hf_tu_token_aqui`
49
+ - **Type**: `Secret` ✅
50
+ 5. Guarda los cambios
51
+ 6. Reinicia el Space
52
+
53
+ ### 3. Verificar Acceso a Modelos FLUX
54
+ 1. Ve a [FLUX.1-dev](https://huggingface.co/black-forest-labs/FLUX.1-dev)
55
+ 2. Haz clic en **Access** para solicitar acceso
56
+ 3. Acepta los términos de licencia
57
+ 4. Repite para [FLUX.1-schnell](https://huggingface.co/black-forest-labs/FLUX.1-schnell)
58
+
59
  ## 🎯 Uso
60
 
61
  1. Selecciona un modelo del dropdown en "Advanced Settings"
 
71
  - **Carga bajo demanda**: Los modelos se cargan solo cuando se necesitan
72
  - **Configuraciones específicas**: Cada modelo tiene sus propios parámetros de guidance y steps
73
  - **API Externa**: FLUX.1-Kontext-Dev usa la API del Space oficial
74
+ - **Autenticación automática**: Manejo automático de tokens para modelos gated
75
 
76
  ## 🔧 Configuraciones por Modelo
77
 
 
84
 
85
  **FLUX.1-Kontext-Dev** se conecta a la API oficial del Space `black-forest-labs/FLUX.1-Kontext-Dev` para generar imágenes de alta calidad. Este modelo requiere conexión a internet y puede tener tiempos de respuesta variables.
86
 
87
+ ## 🐛 Solución de Problemas
88
+
89
+ ### Error de Autenticación
90
+ Si ves errores como "Cannot access gated repo":
91
+ 1. Verifica que el `HF_TOKEN` esté configurado correctamente
92
+ 2. Asegúrate de tener acceso a los modelos FLUX
93
+ 3. Reinicia el Space después de configurar el token
94
+
95
+ ### Error de API Externa
96
+ Si la API externa falla:
97
+ - El modelo FLUX.1-Kontext-Dev mostrará una imagen roja de error
98
+ - Usa los modelos locales como alternativa
99
+
100
  ---
101
 
102
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py CHANGED
@@ -6,10 +6,24 @@ import base64
6
  from PIL import Image
7
  import io
8
  import json
 
9
 
10
  # import spaces #[uncomment to use ZeroGPU]
11
  from diffusers import DiffusionPipeline
12
  import torch
 
 
 
 
 
 
 
 
 
 
 
 
 
13
 
14
  device = "cuda" if torch.cuda.is_available() else "cpu"
15
 
@@ -42,9 +56,25 @@ MAX_IMAGE_SIZE = 1024
42
  def load_model(model_id):
43
  global pipe, current_model_id
44
  if pipe is None or model_id != current_model_id:
45
- pipe = DiffusionPipeline.from_pretrained(model_id, torch_dtype=torch_dtype)
46
- pipe = pipe.to(device)
47
- current_model_id = model_id
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
 
49
  # Función para usar la API externa de FLUX.1-Kontext-Dev
50
  def use_external_api(prompt, negative_prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps):
@@ -71,7 +101,7 @@ def use_external_api(prompt, negative_prompt, seed, randomize_seed, width, heigh
71
  }
72
 
73
  # Hacer la petición a la API
74
- response = requests.post(api_url, files=files)
75
 
76
  if response.status_code == 200:
77
  result = response.json()
@@ -85,7 +115,7 @@ def use_external_api(prompt, negative_prompt, seed, randomize_seed, width, heigh
85
 
86
  return image, new_seed
87
  else:
88
- raise Exception(f"API Error: {response.status_code}")
89
 
90
  except Exception as e:
91
  print(f"Error usando API externa: {e}")
@@ -106,44 +136,51 @@ def infer(
106
  model_name,
107
  progress=gr.Progress(track_tqdm=True),
108
  ):
109
- # Verificar si es el modelo externo
110
- if model_name == "FLUX.1-Kontext-Dev (API External)":
111
- return use_external_api(prompt, negative_prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps)
112
-
113
- # Cargar el modelo seleccionado
114
- model_id = MODELS[model_name]
115
- load_model(model_id)
116
-
117
- if randomize_seed:
118
- seed = random.randint(0, MAX_SEED)
 
119
 
120
- generator = torch.Generator().manual_seed(seed)
121
 
122
- # Configuraciones específicas según el modelo
123
- if "turbo" in model_id.lower() or "lightning" in model_id.lower():
124
- # Modelos rápidos
125
- guidance_scale = 0.0
126
- num_inference_steps = 1 if "turbo" in model_id.lower() else 4
127
- elif "flux" in model_id.lower():
128
- # Modelos FLUX
129
- guidance_scale = 7.5
130
- num_inference_steps = 20
131
- elif "realistic" in model_id.lower():
132
- # Realistic Vision
133
- guidance_scale = 7.5
134
- num_inference_steps = 25
135
 
136
- image = pipe(
137
- prompt=prompt,
138
- negative_prompt=negative_prompt,
139
- guidance_scale=guidance_scale,
140
- num_inference_steps=num_inference_steps,
141
- width=width,
142
- height=height,
143
- generator=generator,
144
- ).images[0]
145
 
146
- return image, seed
 
 
 
 
 
 
147
 
148
 
149
  examples = [
 
6
  from PIL import Image
7
  import io
8
  import json
9
+ import os
10
 
11
  # import spaces #[uncomment to use ZeroGPU]
12
  from diffusers import DiffusionPipeline
13
  import torch
14
+ from huggingface_hub import login
15
+
16
+ # Configurar autenticación con Hugging Face
17
+ HF_TOKEN = os.getenv("HF_TOKEN")
18
+ if HF_TOKEN:
19
+ try:
20
+ login(token=HF_TOKEN)
21
+ print("✅ Autenticado con Hugging Face")
22
+ except Exception as e:
23
+ print(f"⚠️ Error de autenticación: {e}")
24
+ else:
25
+ print("⚠️ No se encontró HF_TOKEN - modelos gated no estarán disponibles")
26
+ print("💡 Para usar modelos FLUX, configura la variable de entorno HF_TOKEN en el Space")
27
 
28
  device = "cuda" if torch.cuda.is_available() else "cpu"
29
 
 
56
  def load_model(model_id):
57
  global pipe, current_model_id
58
  if pipe is None or model_id != current_model_id:
59
+ try:
60
+ # Usar token de autenticación si está disponible
61
+ if HF_TOKEN:
62
+ pipe = DiffusionPipeline.from_pretrained(
63
+ model_id,
64
+ torch_dtype=torch_dtype,
65
+ use_auth_token=HF_TOKEN
66
+ )
67
+ else:
68
+ pipe = DiffusionPipeline.from_pretrained(
69
+ model_id,
70
+ torch_dtype=torch_dtype
71
+ )
72
+ pipe = pipe.to(device)
73
+ current_model_id = model_id
74
+ print(f"✅ Modelo {model_id} cargado exitosamente")
75
+ except Exception as e:
76
+ print(f"❌ Error cargando modelo {model_id}: {e}")
77
+ raise e
78
 
79
  # Función para usar la API externa de FLUX.1-Kontext-Dev
80
  def use_external_api(prompt, negative_prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps):
 
101
  }
102
 
103
  # Hacer la petición a la API
104
+ response = requests.post(api_url, files=files, timeout=60)
105
 
106
  if response.status_code == 200:
107
  result = response.json()
 
115
 
116
  return image, new_seed
117
  else:
118
+ raise Exception(f"API Error: {response.status_code} - {response.text}")
119
 
120
  except Exception as e:
121
  print(f"Error usando API externa: {e}")
 
136
  model_name,
137
  progress=gr.Progress(track_tqdm=True),
138
  ):
139
+ try:
140
+ # Verificar si es el modelo externo
141
+ if model_name == "FLUX.1-Kontext-Dev (API External)":
142
+ return use_external_api(prompt, negative_prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps)
143
+
144
+ # Cargar el modelo seleccionado
145
+ model_id = MODELS[model_name]
146
+ load_model(model_id)
147
+
148
+ if randomize_seed:
149
+ seed = random.randint(0, MAX_SEED)
150
 
151
+ generator = torch.Generator().manual_seed(seed)
152
 
153
+ # Configuraciones específicas según el modelo
154
+ if "turbo" in model_id.lower() or "lightning" in model_id.lower():
155
+ # Modelos rápidos
156
+ guidance_scale = 0.0
157
+ num_inference_steps = 1 if "turbo" in model_id.lower() else 4
158
+ elif "flux" in model_id.lower():
159
+ # Modelos FLUX
160
+ guidance_scale = 7.5
161
+ num_inference_steps = 20
162
+ elif "realistic" in model_id.lower():
163
+ # Realistic Vision
164
+ guidance_scale = 7.5
165
+ num_inference_steps = 25
166
 
167
+ image = pipe(
168
+ prompt=prompt,
169
+ negative_prompt=negative_prompt,
170
+ guidance_scale=guidance_scale,
171
+ num_inference_steps=num_inference_steps,
172
+ width=width,
173
+ height=height,
174
+ generator=generator,
175
+ ).images[0]
176
 
177
+ return image, seed
178
+
179
+ except Exception as e:
180
+ print(f"Error en inferencia: {e}")
181
+ # Crear imagen de error
182
+ error_image = Image.new('RGB', (width, height), color='red')
183
+ return error_image, seed
184
 
185
 
186
  examples = [