ivanoctaviogaitansantos commited on
Commit
b542d86
·
verified ·
1 Parent(s): 9337604

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +40 -29
app.py CHANGED
@@ -112,7 +112,8 @@ She is {pose}, in a {setting}. {atmosphere}.
112
 
113
  gen = HyperrealisticPromptGenerator()
114
 
115
- API_KEY = os.getenv("SAMBANOVA_API_KEY")
 
116
  API_URL = "https://api.sambanova.ai/v1/chat/completions"
117
  headers = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
118
 
@@ -127,7 +128,7 @@ def process_image(image):
127
 
128
  def analizar_imagen_y_generar_prompt(image_base64):
129
  if not API_KEY:
130
- return "``````"
131
  messages = [
132
  {"role": "system", "content": "Describe images in detailed English."},
133
  {
@@ -144,36 +145,40 @@ def analizar_imagen_y_generar_prompt(image_base64):
144
  response.raise_for_status()
145
  text_resp = response.json()["choices"][0]["message"]["content"]
146
  return f"```\n{text_resp}\n```"
147
- except Exception:
148
- return f"```\n[Error generating prompt]\n```"
149
 
150
 
151
  # ==============================================================
152
  # FUNCIÓN PRINCIPAL DE CHAT Y PROMPT
153
  # ==============================================================
154
 
155
- def chat_sambanova(user_message, image_input, auto_mode, chat_history, loading_state):
156
  updated_history = chat_history[:] if chat_history else []
157
  image_base64 = process_image(image_input) if image_input else None
158
 
159
- loading_state = "Procesando..."
160
- yield "", updated_history, "", loading_state
161
 
162
  if not API_KEY:
163
  error_msg = "Error: SAMBANOVA_API_KEY no configurada."
164
  updated_history.append((user_message, error_msg))
 
165
  yield "", updated_history, error_msg, ""
166
  return
167
 
 
168
  if auto_mode and image_base64:
169
  prompt = analizar_imagen_y_generar_prompt(image_base64)
170
- updated_history.append((user_message or "Análisis automático", f"IA - Prompt generado:\n{prompt}"))
171
- yield "", updated_history, "", ""
172
  return
173
 
 
174
  messages = [{"role": "system", "content": "Eres un asistente útil"}]
175
  for user_msg, ai_msg in updated_history:
176
- messages.append({"role": "user", "content": [{"type": "text", "text": user_msg}]})
 
177
  messages.append({"role": "assistant", "content": ai_msg})
178
 
179
  user_content = [{"type": "text", "text": user_message}]
@@ -187,7 +192,7 @@ def chat_sambanova(user_message, image_input, auto_mode, chat_history, loading_s
187
  response = requests.post(API_URL, headers=headers, json=json_data, stream=True)
188
  response.raise_for_status()
189
  collected_text = ""
190
- updated_history.append((user_message, ""))
191
 
192
  for line in response.iter_lines(decode_unicode=True):
193
  if line.startswith("data: "):
@@ -200,14 +205,15 @@ def chat_sambanova(user_message, image_input, auto_mode, chat_history, loading_s
200
  text_fragment = delta.get("content", "")
201
  collected_text += text_fragment
202
  updated_history[-1] = (user_message, collected_text)
203
- yield "", updated_history, "", "Procesando..."
 
204
  except json.JSONDecodeError:
205
  continue
206
- yield "", updated_history, "", ""
207
  except Exception as e:
208
- error_msg = f"Error inesperado: {str(e)}"
209
  updated_history[-1] = (user_message, error_msg)
210
- yield "", updated_history, error_msg, ""
211
 
212
 
213
  def generar_prompt_interno():
@@ -232,49 +238,54 @@ with gr.Blocks(css=css_batuto, theme="gradio/soft") as demo:
232
  gr.Markdown("# ⚡ BATUTO / Prompt Studio — Hyperrealistic Generator")
233
 
234
  chat_history = gr.State([])
235
- error_display = gr.Textbox(label="System messages", interactive=False, visible=True)
236
- loading_state = gr.State("")
237
-
238
  chatbot = gr.Chatbot(label="💬 BATUTO Assistant (SambaNova - Llama-4 Maverick)", type='messages')
239
  prompt_output = gr.Markdown(label="🎨 Prompt generado", elem_classes=["prompt-output"])
240
 
241
  with gr.Row():
242
- msg = gr.Textbox(label="Tu mensaje", scale=4)
243
  img_input = gr.Image(label="Sube una imagen (opcional)", type="pil", scale=2)
244
 
245
  with gr.Row():
246
- auto_mode = gr.Checkbox(label="Modo automático (Generar prompt desde imagen)", value=False)
 
247
  btn_send = gr.Button("Enviar mensaje", variant="primary")
248
  btn_gen_prompt = gr.Button("🎲 Generar prompt automático", variant="secondary")
249
  copy_button = gr.Button("📋 Copiar Prompt")
250
 
251
- with gr.Row():
252
- loading = gr.Markdown(value="", label="Estado")
253
 
 
254
  btn_send.click(
255
  fn=chat_sambanova,
256
- inputs=[msg, img_input, auto_mode, chat_history, loading_state],
257
- outputs=[msg, chatbot, chat_history, error_display, loading]
258
  )
259
  msg.submit(
260
  fn=chat_sambanova,
261
- inputs=[msg, img_input, auto_mode, chat_history, loading_state],
262
- outputs=[msg, chatbot, chat_history, error_display, loading]
263
  )
264
  btn_gen_prompt.click(
265
  fn=generar_prompt_interno,
266
  inputs=[],
267
- outputs=[msg, prompt_output]
268
  )
269
 
 
270
  copy_button.click(
271
  None,
272
  [],
273
  [],
274
- _js="""() => {
275
  const el = document.querySelector('.prompt-output');
276
  if (el) {
277
- navigator.clipboard.writeText(el.innerText);
 
 
278
  alert('✅ Prompt copiado al portapapeles');
279
  } else {
280
  alert('❌ No se encontró el prompt para copiar');
 
112
 
113
  gen = HyperrealisticPromptGenerator()
114
 
115
+ # Asegúrate de configurar SAMBANOVA_API_KEY en tu entorno
116
+ API_KEY = os.getenv("SAMBANOVA_API_KEY")
117
  API_URL = "https://api.sambanova.ai/v1/chat/completions"
118
  headers = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
119
 
 
128
 
129
  def analizar_imagen_y_generar_prompt(image_base64):
130
  if not API_KEY:
131
+ return "```\n[Error: SAMBANOVA_API_KEY no configurada]\n```"
132
  messages = [
133
  {"role": "system", "content": "Describe images in detailed English."},
134
  {
 
145
  response.raise_for_status()
146
  text_resp = response.json()["choices"][0]["message"]["content"]
147
  return f"```\n{text_resp}\n```"
148
+ except Exception as e:
149
+ return f"```\n[Error generating prompt: {str(e)}]\n```"
150
 
151
 
152
  # ==============================================================
153
  # FUNCIÓN PRINCIPAL DE CHAT Y PROMPT
154
  # ==============================================================
155
 
156
+ def chat_sambanova(user_message, image_input, auto_mode, chat_history):
157
  updated_history = chat_history[:] if chat_history else []
158
  image_base64 = process_image(image_input) if image_input else None
159
 
160
+ # Inicializa el estado de carga y borra el mensaje de entrada
161
+ yield "", updated_history, "", "Procesando..."
162
 
163
  if not API_KEY:
164
  error_msg = "Error: SAMBANOVA_API_KEY no configurada."
165
  updated_history.append((user_message, error_msg))
166
+ # Devuelve el mensaje de error y limpia el estado de carga
167
  yield "", updated_history, error_msg, ""
168
  return
169
 
170
+ # Si está en modo automático y hay imagen, analiza la imagen
171
  if auto_mode and image_base64:
172
  prompt = analizar_imagen_y_generar_prompt(image_base64)
173
+ updated_history.append((user_message or "Análisis automático (Imagen)", f"IA - Prompt generado:\n{prompt}"))
174
+ yield "", updated_history, "", "" # Limpia el estado de carga al terminar
175
  return
176
 
177
+ # Si es un chat normal, prepara los mensajes para la API
178
  messages = [{"role": "system", "content": "Eres un asistente útil"}]
179
  for user_msg, ai_msg in updated_history:
180
+ # Asegúrate de que el contenido del usuario en el historial anterior sea solo texto si no se manejan imágenes correctamente
181
+ messages.append({"role": "user", "content": user_msg})
182
  messages.append({"role": "assistant", "content": ai_msg})
183
 
184
  user_content = [{"type": "text", "text": user_message}]
 
192
  response = requests.post(API_URL, headers=headers, json=json_data, stream=True)
193
  response.raise_for_status()
194
  collected_text = ""
195
+ updated_history.append((user_message, "")) # Añade una entrada vacía para ir actualizando
196
 
197
  for line in response.iter_lines(decode_unicode=True):
198
  if line.startswith("data: "):
 
205
  text_fragment = delta.get("content", "")
206
  collected_text += text_fragment
207
  updated_history[-1] = (user_message, collected_text)
208
+ # No actualices el estado de carga aquí, déjalo en "Procesando..." hasta el final
209
+ yield "", updated_history, "", "Procesando..."
210
  except json.JSONDecodeError:
211
  continue
212
+ yield "", updated_history, "", "" # Limpia el estado de carga al terminar
213
  except Exception as e:
214
+ error_msg = f"Error inesperado de la API: {str(e)}"
215
  updated_history[-1] = (user_message, error_msg)
216
+ yield "", updated_history, error_msg, "" # Muestra el error y limpia el estado de carga
217
 
218
 
219
  def generar_prompt_interno():
 
238
  gr.Markdown("# ⚡ BATUTO / Prompt Studio — Hyperrealistic Generator")
239
 
240
  chat_history = gr.State([])
241
+ # Cambié error_display a gr.Markdown para mejor visualización del estado
242
+ error_display = gr.Markdown(label="System messages", value="", visible=True)
243
+
244
  chatbot = gr.Chatbot(label="💬 BATUTO Assistant (SambaNova - Llama-4 Maverick)", type='messages')
245
  prompt_output = gr.Markdown(label="🎨 Prompt generado", elem_classes=["prompt-output"])
246
 
247
  with gr.Row():
248
+ msg = gr.Textbox(label="Tu mensaje", scale=4, placeholder="Escribe tu mensaje o usa el modo automático...")
249
  img_input = gr.Image(label="Sube una imagen (opcional)", type="pil", scale=2)
250
 
251
  with gr.Row():
252
+ # Ahora auto_mode solo devuelve el estado
253
+ auto_mode = gr.Checkbox(label="Modo automático (Generar prompt desde imagen)", value=False)
254
  btn_send = gr.Button("Enviar mensaje", variant="primary")
255
  btn_gen_prompt = gr.Button("🎲 Generar prompt automático", variant="secondary")
256
  copy_button = gr.Button("📋 Copiar Prompt")
257
 
258
+ # Mantiene el estado de carga visible
259
+ loading_state = gr.Markdown(value="", label="Estado")
260
 
261
+ # Modificado para usar loading_state y error_display
262
  btn_send.click(
263
  fn=chat_sambanova,
264
+ inputs=[msg, img_input, auto_mode, chat_history], # Removido loading_state de inputs
265
+ outputs=[msg, chatbot, chat_history, error_display, loading_state] # Usando loading_state como salida
266
  )
267
  msg.submit(
268
  fn=chat_sambanova,
269
+ inputs=[msg, img_input, auto_mode, chat_history], # Removido loading_state de inputs
270
+ outputs=[msg, chatbot, chat_history, error_display, loading_state] # Usando loading_state como salida
271
  )
272
  btn_gen_prompt.click(
273
  fn=generar_prompt_interno,
274
  inputs=[],
275
+ outputs=[prompt_output, error_display] # prompt_output es ahora la primera salida
276
  )
277
 
278
+ # CORRECCIÓN: Se cambió el argumento _js a js para compatibilidad con Gradio.
279
  copy_button.click(
280
  None,
281
  [],
282
  [],
283
+ js="""() => {
284
  const el = document.querySelector('.prompt-output');
285
  if (el) {
286
+ // Intenta obtener el contenido de la etiqueta <p> dentro del Markdown para evitar copiar la etiqueta
287
+ const promptText = el.innerText.replace('🎨 Prompt generado', '').trim();
288
+ navigator.clipboard.writeText(promptText);
289
  alert('✅ Prompt copiado al portapapeles');
290
  } else {
291
  alert('❌ No se encontró el prompt para copiar');