Spaces:
vcollos
/
Runtime error

vcollos commited on
Commit
39e0918
·
verified ·
1 Parent(s): 2a1a9ad

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +196 -56
app.py CHANGED
@@ -12,6 +12,13 @@ from gradio_client import Client as client_gradio
12
  from supabase import create_client, Client
13
  from datetime import datetime
14
  import requests
 
 
 
 
 
 
 
15
 
16
  # Inicializa Supabase
17
  url: str = os.getenv('SUPABASE_URL')
@@ -21,6 +28,25 @@ supabase: Client = create_client(url, key)
21
  # Obtém token da Hugging Face
22
  hf_token = os.getenv("HF_TOKEN")
23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  # Inicializa o modelo base FLUX.1-dev
25
  base_model = "black-forest-labs/FLUX.1-dev"
26
  pipe = DiffusionPipeline.from_pretrained(
@@ -50,9 +76,9 @@ lora_models = {
50
  for name, details in lora_models.items():
51
  try:
52
  pipe.load_lora_weights(details["repo"], weight_name=details["weights"], adapter_name=name)
53
- print(f"✅ LoRA {name} carregado")
54
  except Exception as e:
55
- print(f"❌ Erro ao carregar o LoRA {name}: {e}")
56
 
57
  # Define seed máximo
58
  MAX_SEED = 2**32 - 1
@@ -73,48 +99,151 @@ def upload_image_to_supabase(image, filename):
73
  base_url = f"{url}/storage/v1/object/public/images"
74
  return f"{base_url}/{storage_path}"
75
  except Exception as e:
76
- print(f"❌ Erro no upload da imagem: {e}")
77
  return None
78
 
79
- def translate_text(text, source_lang="pt", target_lang="en"):
80
  """
81
- Traduz o texto de português para inglês usando a API do LibreTranslate.
82
- Se a tradução falhar, retorna o texto original.
83
  """
84
  try:
85
- # Usa a API pública do LibreTranslate
86
- url = "https://libretranslate.com/translate"
87
- payload = {
88
- "q": text,
89
- "source": source_lang,
90
- "target": target_lang,
91
- "format": "text"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
  }
93
- response = requests.post(url, json=payload)
94
 
95
- if response.status_code == 200:
96
- return response.json()["translatedText"]
97
- else:
98
- print(f" Erro na tradução (código {response.status_code}): {response.text}")
99
- return text
100
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  except Exception as e:
102
- print(f"❌ Erro ao traduzir texto: {e}")
103
  return text
104
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
  @spaces.GPU(duration=80)
106
- def run_lora(prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_option, lora_scale_1, lora_scale_2, cross_attention_scale, auto_translate, progress=gr.Progress(track_tqdm=True)):
107
  if randomize_seed:
108
  seed = random.randint(0, MAX_SEED)
109
  generator = torch.Generator(device="cuda").manual_seed(seed)
110
 
111
  original_prompt = prompt # Guarda o prompt original para metadados
112
 
113
- # Traduz o prompt se a opção estiver habilitada
114
- if auto_translate:
115
- translated_prompt = translate_text(prompt)
116
- print(f"📝 Prompt traduzido: {translated_prompt}")
117
- prompt = translated_prompt
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
 
119
  # Trunca o prompt para 77 tokens para evitar erro do CLIP
120
  prompt_tokens = prompt.split()[:77]
@@ -136,19 +265,18 @@ def run_lora(prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora
136
  prompt = f"{lora_models['Vivi']['trigger_word']} {prompt}"
137
 
138
  elif lora_option == "Ambos":
 
 
 
 
139
  selected_loras = ["Paula", "Vivi"]
140
- adapter_weights = [lora_scale_1, lora_scale_2]
141
 
142
  # Quando usando ambos, adiciona trigger words específicas para cada personagem
143
  # e ajusta o prompt para indicar que ambos devem aparecer na mesma cena
144
  prompt = f"{lora_models['Paula']['trigger_word']} and {lora_models['Vivi']['trigger_word']} together, a woman and a man, {prompt}"
145
 
146
  pipe.set_adapters(selected_loras, adapter_weights)
147
-
148
- # Ajusta a cross-attention quando usando ambos os LoRAs
149
- cross_attention_kwargs = {}
150
- if lora_option == "Ambos" and cross_attention_scale != 1.0:
151
- cross_attention_kwargs = {"scale": cross_attention_scale}
152
 
153
  # Gera a imagem com precisão de 16 bits
154
  with torch.autocast("cuda"):
@@ -158,8 +286,7 @@ def run_lora(prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora
158
  guidance_scale=cfg_scale,
159
  width=width,
160
  height=height,
161
- generator=generator,
162
- cross_attention_kwargs=cross_attention_kwargs
163
  ).images[0]
164
 
165
  # Define um nome único para a imagem
@@ -168,40 +295,41 @@ def run_lora(prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora
168
  try:
169
  image_url = upload_image_to_supabase(image, filename)
170
  if image_url:
171
- print(f"✅ Imagem salva no Supabase: {image_url}")
172
  else:
173
- print("❌ Erro: URL da imagem retornou None")
174
- return image, seed
175
  except Exception as e:
176
- print(f"❌ Erro ao fazer upload da imagem: {e}")
177
- return image, seed
178
 
179
  # Salva todos os metadados no Supabase
180
  try:
181
  response = supabase.table("images").insert({
182
  "prompt": original_prompt, # Salva o prompt original
 
183
  "full_prompt": prompt, # Salva o prompt completo com trigger words
184
- "translated": auto_translate, # Indica se o prompt foi traduzido
185
  "cfg_scale": cfg_scale,
186
  "steps": steps,
187
  "seed": seed,
188
  "lora_option": lora_option,
189
  "lora_scale_1": lora_scale_1,
190
  "lora_scale_2": lora_scale_2,
191
- "cross_attention_scale": cross_attention_scale,
192
  "image_url": image_url,
193
  "created_at": datetime.utcnow().isoformat()
194
  }).execute()
195
 
196
  if response.data:
197
- print("✅ Metadados salvos no Supabase")
198
  else:
199
- print("❌ Erro: Resposta vazia do Supabase")
200
 
201
  except Exception as e:
202
- print(f"❌ Erro ao salvar metadados no Supabase: {e}")
203
 
204
- return image, seed
205
 
206
  # Interface Gradio
207
  gr_theme = os.getenv("THEME")
@@ -210,7 +338,7 @@ with gr.Blocks(theme=gr_theme) as app:
210
 
211
  with gr.Row():
212
  with gr.Column(scale=2):
213
- prompt = gr.TextArea(label="Prompt", placeholder="Digite um prompt (máx 77 caracteres)", lines=3)
214
  generate_button = gr.Button("Gerar")
215
 
216
  with gr.Accordion("Configurações Básicas", open=True):
@@ -225,27 +353,39 @@ with gr.Blocks(theme=gr_theme) as app:
225
  lora_option = gr.Radio(["Nenhum", "Paula", "Vivi", "Ambos"], label="Escolha o LoRA", value="Ambos")
226
  lora_scale_1 = gr.Slider(label="LoRA Scale (Paula)", minimum=0, maximum=1, step=0.01, value=0.8)
227
  lora_scale_2 = gr.Slider(label="LoRA Scale (Vivi)", minimum=0, maximum=1, step=0.01, value=0.8)
228
- cross_attention_scale = gr.Slider(label="Cross-Attention Scale", minimum=0.1, maximum=1.5, step=0.05, value=1.0,
229
- info="Ajuste para controlar o balanceamento dos LoRAs (útil no modo 'Ambos')")
230
- auto_translate = gr.Checkbox(True, label="Traduzir automaticamente para inglês",
231
- info="Traduz o prompt do português para o inglês antes de gerar a imagem")
 
 
 
 
 
232
 
233
  with gr.Column(scale=2):
234
  result = gr.Image(label="Generated Image")
 
235
  gr.Markdown("""
 
 
 
 
 
 
236
  ### Dicas para gerar imagens com ambos personagens:
237
  1. Use o modo "Ambos" com valores balanceados (ex: 0.8 para ambos os LoRAs)
238
- 2. Inclua no prompt termos como "um homem e uma mulher juntos", "duas pessoas", etc.
239
  3. Lembre-se: Paula é uma mulher loira e Vivi é um homem de cabelo escuro
240
- 4. Seu prompt será automaticamente traduzido para inglês (se a opção estiver ativada)
241
- 5. Ajuste o Cross-Attention Scale para valores como 0.9 ou 1.1 para equilibrar a influência
242
  6. Experimente com seeds diferentes até encontrar uma que funcione bem
243
  """)
244
 
245
  generate_button.click(
246
  run_lora,
247
- inputs=[prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_option, lora_scale_1, lora_scale_2, cross_attention_scale, auto_translate],
248
- outputs=[result, seed],
249
  )
250
 
251
  app.queue()
 
12
  from supabase import create_client, Client
13
  from datetime import datetime
14
  import requests
15
+ import logging
16
+ from google.cloud import translate_v2 as translate
17
+ import google.generativeai as genai
18
+
19
+ # Configuração de logging
20
+ logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
21
+ logger = logging.getLogger(__name__)
22
 
23
  # Inicializa Supabase
24
  url: str = os.getenv('SUPABASE_URL')
 
28
  # Obtém token da Hugging Face
29
  hf_token = os.getenv("HF_TOKEN")
30
 
31
+ # Configura as chaves de API da OpenAI e Google AI
32
+ OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "")
33
+ GOOGLE_AI_KEY = os.getenv("GOOGLE_AI_KEY", "")
34
+
35
+ # Se as chaves não estiverem definidas, usa as fornecidas
36
+ if not OPENAI_API_KEY:
37
+ OPENAI_API_KEY = "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"
38
+ if not GOOGLE_AI_KEY:
39
+ GOOGLE_AI_KEY = "AIzaSyD4jxsvKv353nLwVlOYXQBL7Im3-0Vc_6g"
40
+
41
+ # Configura o Google AI Gemini
42
+ try:
43
+ genai.configure(api_key=GOOGLE_AI_KEY)
44
+ google_ai_available = True
45
+ logger.info("✅ Google AI Gemini configurado com sucesso")
46
+ except Exception as e:
47
+ google_ai_available = False
48
+ logger.error(f"❌ Erro ao configurar Google AI Gemini: {e}")
49
+
50
  # Inicializa o modelo base FLUX.1-dev
51
  base_model = "black-forest-labs/FLUX.1-dev"
52
  pipe = DiffusionPipeline.from_pretrained(
 
76
  for name, details in lora_models.items():
77
  try:
78
  pipe.load_lora_weights(details["repo"], weight_name=details["weights"], adapter_name=name)
79
+ logger.info(f"✅ LoRA {name} carregado")
80
  except Exception as e:
81
+ logger.error(f"❌ Erro ao carregar o LoRA {name}: {e}")
82
 
83
  # Define seed máximo
84
  MAX_SEED = 2**32 - 1
 
99
  base_url = f"{url}/storage/v1/object/public/images"
100
  return f"{base_url}/{storage_path}"
101
  except Exception as e:
102
+ logger.error(f"❌ Erro no upload da imagem: {e}")
103
  return None
104
 
105
+ def optimize_with_openai(text, character_option):
106
  """
107
+ Otimiza o prompt usando a API da OpenAI.
 
108
  """
109
  try:
110
+ # Determina o prompt de sistema com base na seleção de personagem
111
+ if character_option == "Paula":
112
+ system_prompt = """Você é um especialista em criar prompts para o modelo de imagem FLUX.1-dev.
113
+ Traduza e otimize este prompt em português para um prompt em inglês que irá gerar
114
+ uma imagem de uma mulher loira chamada Paula. Seu prompt deve ser detalhado, claro e
115
+ enfatizar características de uma mulher loira.
116
+ Responda APENAS com o prompt otimizado em inglês, sem explicações ou introduções."""
117
+ elif character_option == "Vivi":
118
+ system_prompt = """Você é um especialista em criar prompts para o modelo de imagem FLUX.1-dev.
119
+ Traduza e otimize este prompt em português para um prompt em inglês que irá gerar
120
+ uma imagem de um homem de cabelo escuro chamado Vivi. Seu prompt deve ser detalhado, claro e
121
+ enfatizar características de um homem moreno.
122
+ Responda APENAS com o prompt otimizado em inglês, sem explicações ou introduções."""
123
+ else: # both
124
+ system_prompt = """Você é um especialista em criar prompts para o modelo de imagem FLUX.1-dev.
125
+ Traduza e otimize este prompt em português para um prompt em inglês que irá gerar
126
+ uma imagem de duas pessoas juntas: uma mulher loira chamada Paula e um homem de cabelo escuro chamado Vivi.
127
+ Seu prompt deve ser detalhado, claro e deve enfatizar a presença dos DOIS personagens na mesma cena.
128
+ Responda APENAS com o prompt otimizado em inglês, sem explicações ou introduções."""
129
+
130
+ # Configuração do cabeçalho e corpo da requisição
131
+ headers = {
132
+ "Content-Type": "application/json",
133
+ "Authorization": f"Bearer {OPENAI_API_KEY}"
134
  }
 
135
 
136
+ data = {
137
+ "model": "gpt-4",
138
+ "messages": [
139
+ {"role": "system", "content": system_prompt},
140
+ {"role": "user", "content": text}
141
+ ],
142
+ "temperature": 0.7,
143
+ "max_tokens": 300
144
+ }
145
+
146
+ # Faz a requisição para a API da OpenAI
147
+ response = requests.post(
148
+ "https://api.openai.com/v1/chat/completions",
149
+ headers=headers,
150
+ json=data
151
+ )
152
+
153
+ response.raise_for_status()
154
+
155
+ # Extrai e retorna o prompt otimizado
156
+ optimized_prompt = response.json()["choices"][0]["message"]["content"].strip()
157
+ logger.info(f"✅ Prompt otimizado via OpenAI: {optimized_prompt}")
158
+
159
+ return optimized_prompt
160
+
161
  except Exception as e:
162
+ logger.error(f"❌ Erro ao otimizar prompt com OpenAI: {e}")
163
  return text
164
 
165
+ def optimize_with_google_ai(text, character_option):
166
+ """
167
+ Otimiza o prompt usando o Google AI Gemini.
168
+ """
169
+ try:
170
+ # Determina o prompt com base na seleção de personagem
171
+ if character_option == "Paula":
172
+ instruction = """Você é um especialista em criar prompts para modelos de imagem AI.
173
+ Traduza e otimize este prompt em português para um prompt em inglês que irá gerar
174
+ uma imagem de uma mulher loira chamada Paula. Seu prompt deve ser detalhado, claro e
175
+ enfatizar características de uma mulher loira.
176
+ Responda APENAS com o prompt otimizado em inglês, sem explicações ou introduções."""
177
+ elif character_option == "Vivi":
178
+ instruction = """Você é um especialista em criar prompts para modelos de imagem AI.
179
+ Traduza e otimize este prompt em português para um prompt em inglês que irá gerar
180
+ uma imagem de um homem de cabelo escuro chamado Vivi. Seu prompt deve ser detalhado, claro e
181
+ enfatizar características de um homem moreno.
182
+ Responda APENAS com o prompt otimizado em inglês, sem explicações ou introduções."""
183
+ else: # both
184
+ instruction = """Você é um especialista em criar prompts para modelos de imagem AI.
185
+ Traduza e otimize este prompt em português para um prompt em inglês que irá gerar
186
+ uma imagem de duas pessoas juntas: uma mulher loira chamada Paula e um homem de cabelo escuro chamado Vivi.
187
+ Seu prompt deve ser detalhado, claro e deve enfatizar a presença dos DOIS personagens na mesma cena.
188
+ Responda APENAS com o prompt otimizado em inglês, sem explicações ou introduções."""
189
+
190
+ # Configura o modelo Gemini
191
+ generation_config = {
192
+ "temperature": 0.7,
193
+ "top_p": 1,
194
+ "top_k": 32,
195
+ "max_output_tokens": 300,
196
+ }
197
+
198
+ model = genai.GenerativeModel(
199
+ model_name="gemini-pro",
200
+ generation_config=generation_config
201
+ )
202
+
203
+ # Cria a conversa
204
+ convo = model.start_chat(history=[])
205
+ convo.send_message(f"{instruction}\n\nPrompt original: {text}")
206
+
207
+ # Obtém a resposta
208
+ response = convo.last.text
209
+ logger.info(f"✅ Prompt otimizado via Google AI: {response}")
210
+
211
+ return response.strip()
212
+
213
+ except Exception as e:
214
+ logger.error(f"❌ Erro ao otimizar prompt com Google AI: {e}")
215
+ # Tenta o OpenAI como fallback
216
+ logger.info("🔄 Tentando OpenAI como fallback...")
217
+ return optimize_with_openai(text, character_option)
218
+
219
  @spaces.GPU(duration=80)
220
+ def run_lora(prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_option, lora_scale_1, lora_scale_2, lora_balance, ai_option, progress=gr.Progress(track_tqdm=True)):
221
  if randomize_seed:
222
  seed = random.randint(0, MAX_SEED)
223
  generator = torch.Generator(device="cuda").manual_seed(seed)
224
 
225
  original_prompt = prompt # Guarda o prompt original para metadados
226
 
227
+ # Determina qual personagem está sendo usado para a otimização
228
+ character_option = "Paula" if lora_option == "Paula" else "Vivi" if lora_option == "Vivi" else "both"
229
+
230
+ # Processa o prompt de acordo com a opção selecionada
231
+ processed_prompt = prompt # Valor padrão
232
+
233
+ if ai_option == "OpenAI":
234
+ processed_prompt = optimize_with_openai(prompt, character_option)
235
+ elif ai_option == "Google AI":
236
+ if google_ai_available:
237
+ processed_prompt = optimize_with_google_ai(prompt, character_option)
238
+ else:
239
+ logger.warning("Google AI indisponível, usando OpenAI como fallback")
240
+ processed_prompt = optimize_with_openai(prompt, character_option)
241
+ elif ai_option == "Nenhum":
242
+ # Mantém o prompt original, sem processamento
243
+ processed_prompt = prompt
244
+
245
+ # Atualiza o prompt com o texto processado
246
+ prompt = processed_prompt
247
 
248
  # Trunca o prompt para 77 tokens para evitar erro do CLIP
249
  prompt_tokens = prompt.split()[:77]
 
265
  prompt = f"{lora_models['Vivi']['trigger_word']} {prompt}"
266
 
267
  elif lora_option == "Ambos":
268
+ # Usa o balance slider para ajustar a proporção entre os dois LoRAs
269
+ p_weight = lora_scale_1 * lora_balance
270
+ v_weight = lora_scale_2 * (2 - lora_balance)
271
+
272
  selected_loras = ["Paula", "Vivi"]
273
+ adapter_weights = [p_weight, v_weight]
274
 
275
  # Quando usando ambos, adiciona trigger words específicas para cada personagem
276
  # e ajusta o prompt para indicar que ambos devem aparecer na mesma cena
277
  prompt = f"{lora_models['Paula']['trigger_word']} and {lora_models['Vivi']['trigger_word']} together, a woman and a man, {prompt}"
278
 
279
  pipe.set_adapters(selected_loras, adapter_weights)
 
 
 
 
 
280
 
281
  # Gera a imagem com precisão de 16 bits
282
  with torch.autocast("cuda"):
 
286
  guidance_scale=cfg_scale,
287
  width=width,
288
  height=height,
289
+ generator=generator
 
290
  ).images[0]
291
 
292
  # Define um nome único para a imagem
 
295
  try:
296
  image_url = upload_image_to_supabase(image, filename)
297
  if image_url:
298
+ logger.info(f"✅ Imagem salva no Supabase: {image_url}")
299
  else:
300
+ logger.error("❌ Erro: URL da imagem retornou None")
301
+ return image, seed, prompt
302
  except Exception as e:
303
+ logger.error(f"❌ Erro ao fazer upload da imagem: {e}")
304
+ return image, seed, prompt
305
 
306
  # Salva todos os metadados no Supabase
307
  try:
308
  response = supabase.table("images").insert({
309
  "prompt": original_prompt, # Salva o prompt original
310
+ "processed_prompt": processed_prompt, # Salva o prompt processado pela IA
311
  "full_prompt": prompt, # Salva o prompt completo com trigger words
312
+ "ai_option": ai_option,
313
  "cfg_scale": cfg_scale,
314
  "steps": steps,
315
  "seed": seed,
316
  "lora_option": lora_option,
317
  "lora_scale_1": lora_scale_1,
318
  "lora_scale_2": lora_scale_2,
319
+ "lora_balance": lora_balance,
320
  "image_url": image_url,
321
  "created_at": datetime.utcnow().isoformat()
322
  }).execute()
323
 
324
  if response.data:
325
+ logger.info("✅ Metadados salvos no Supabase")
326
  else:
327
+ logger.error("❌ Erro: Resposta vazia do Supabase")
328
 
329
  except Exception as e:
330
+ logger.error(f"❌ Erro ao salvar metadados no Supabase: {e}")
331
 
332
+ return image, seed, prompt
333
 
334
  # Interface Gradio
335
  gr_theme = os.getenv("THEME")
 
338
 
339
  with gr.Row():
340
  with gr.Column(scale=2):
341
+ prompt = gr.TextArea(label="Prompt em Português", placeholder="Digite um prompt em português descrevendo o que você quer", lines=3)
342
  generate_button = gr.Button("Gerar")
343
 
344
  with gr.Accordion("Configurações Básicas", open=True):
 
353
  lora_option = gr.Radio(["Nenhum", "Paula", "Vivi", "Ambos"], label="Escolha o LoRA", value="Ambos")
354
  lora_scale_1 = gr.Slider(label="LoRA Scale (Paula)", minimum=0, maximum=1, step=0.01, value=0.8)
355
  lora_scale_2 = gr.Slider(label="LoRA Scale (Vivi)", minimum=0, maximum=1, step=0.01, value=0.8)
356
+ lora_balance = gr.Slider(label="Balanço entre personagens", minimum=0.5, maximum=1.5, step=0.05, value=1.0,
357
+ info="Valores acima de 1.0 favorecem Paula, abaixo de 1.0 favorecem Vivi")
358
+
359
+ with gr.Accordion("Processamento de Prompt", open=True):
360
+ ai_option = gr.Radio(
361
+ ["Nenhum", "OpenAI", "Google AI"],
362
+ label="Método de Otimização",
363
+ value="Google AI" if google_ai_available else "OpenAI"
364
+ )
365
 
366
  with gr.Column(scale=2):
367
  result = gr.Image(label="Generated Image")
368
+ final_prompt = gr.Textbox(label="Prompt Final (usado para gerar a imagem)", lines=3)
369
  gr.Markdown("""
370
+ ### Como funciona:
371
+ 1. Escreva seu prompt em português
372
+ 2. Escolha entre Google AI (recomendado) ou OpenAI para traduzir e otimizar seu prompt
373
+ 3. O sistema irá transformar sua descrição em português em um prompt profissional em inglês
374
+ 4. O prompt será específico para o(s) personagem(ns) selecionado(s)
375
+
376
  ### Dicas para gerar imagens com ambos personagens:
377
  1. Use o modo "Ambos" com valores balanceados (ex: 0.8 para ambos os LoRAs)
378
+ 2. Inclua no prompt termos como "um homem e uma mulher juntos", "um casal", etc.
379
  3. Lembre-se: Paula é uma mulher loira e Vivi é um homem de cabelo escuro
380
+ 4. Ajuste o Balanço para favorecer um personagem ou outro se necessário
381
+ 5. A otimização via IA produzirá melhores resultados do que prompts diretos
382
  6. Experimente com seeds diferentes até encontrar uma que funcione bem
383
  """)
384
 
385
  generate_button.click(
386
  run_lora,
387
+ inputs=[prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_option, lora_scale_1, lora_scale_2, lora_balance, ai_option],
388
+ outputs=[result, seed, final_prompt],
389
  )
390
 
391
  app.queue()