Batuto_Qwin / app.py
ivanoctaviogaitansantos's picture
Update app.py
f958119 verified
import os
import gradio as gr
from sambanova import SambaNova
# Configuración - IMPORTANTE: Configura esto en Secrets de Hugging Face
API_KEY = os.getenv("SAMBANOVA_API_KEY")
def chat_with_sambanova(message, history):
"""
Función de chat para Batuto_Qwin usando SambaNova API
"""
if not API_KEY:
return "❌ Error: Configura SAMBANOVA_API_KEY en los Secrets de Hugging Face"
try:
# Inicializar cliente SambaNova
client = SambaNova(
api_key=API_KEY,
base_url="https://api.sambanova.ai/v1",
)
# Construir mensajes desde el historial
messages = [
{"role": "system", "content": "Eres Batuto_Qwin, un asistente inteligente, rápido y muy útil. Responde en español de forma clara y concisa."}
]
# Procesar historial de conversación
for user_msg, bot_msg in history:
messages.append({"role": "user", "content": user_msg})
if bot_msg: # Solo agregar si no está vacío
messages.append({"role": "assistant", "content": bot_msg})
# Agregar mensaje actual del usuario
messages.append({"role": "user", "content": message})
# Llamar a la API de SambaNova
response = client.chat.completions.create(
model="Qwen3-32B", # Modelo Qwen
messages=messages,
temperature=0.7, # Balance entre creatividad y precisión
top_p=0.9,
max_tokens=1024
)
return response.choices[0].message.content
except Exception as e:
error_msg = str(e)
if "401" in error_msg:
return "❌ Error de autenticación: Verifica tu API Key de SambaNova"
elif "404" in error_msg:
return "❌ Error: Modelo Qwen3-32B no disponible"
elif "429" in error_msg:
return "❌ Límite de tasa excedido: Espera un momento"
else:
return f"❌ Error: {error_msg}"
# Crear interfaz Gradio para Batuto_Qwin
with gr.Blocks(
title="🤖 Batuto_Qwin",
theme=gr.themes.Soft(primary_hue="emerald"),
css="""
.gradio-container {
max-width: 800px !important;
margin: auto;
}
.header {
text-align: center;
padding: 20px;
}
"""
) as demo:
# Header personalizado para Batuto_Qwin
with gr.Column(elem_classes="header"):
gr.Markdown("""
# 🤖 Batuto_Qwin
### *Tu asistente inteligente con Qwen3-32B*
**Características:**
🚀 Rápido y eficiente • 🧠 Basado en Qwen3-32B • 💬 Conversaciones naturales
""")
# Chatbot
chatbot = gr.Chatbot(
label="💬 Conversación con Batuto_Qwin",
height=450,
show_copy_button=True,
type="messages",
avatar_images=(
"👤", # Avatar usuario
"🤖" # Avatar Batuto_Qwin
)
)
# Input area
with gr.Row():
msg = gr.Textbox(
label="",
placeholder="Escribe tu mensaje para Batuto_Qwin...",
scale=4,
max_lines=3,
container=False
)
# Botones con estilo
with gr.Row():
submit_btn = gr.Button("🚀 Enviar a Batuto_Qwin", variant="primary", scale=2)
clear_btn = gr.Button("🧹 Limpiar", variant="secondary", scale=1)
# Estado del sistema
with gr.Row():
status = gr.Markdown(
f"**Estado del sistema:** {'✅ Conectado a SambaNova' if API_KEY else '❌ Esperando configuración de API Key'}"
)
# Función de respuesta
def respond(message, chat_history):
if not message or not message.strip():
return "", chat_history
# Mostrar mensaje del usuario inmediatamente
chat_history.append({"role": "user", "content": message})
# Obtener respuesta de Batuto_Qwin
bot_message = chat_with_sambanova(message, chat_history)
# Actualizar historial con respuesta
chat_history.append({"role": "assistant", "content": bot_message})
return "", chat_history
# Event handlers
submit_btn.click(
respond,
inputs=[msg, chatbot],
outputs=[msg, chatbot]
)
msg.submit(
respond,
inputs=[msg, chatbot],
outputs=[msg, chatbot]
)
clear_btn.click(
lambda: ([], ""),
outputs=[chatbot, msg]
)
# Ejemplos de uso
with gr.Accordion("💡 Ejemplos para probar", open=False):
gr.Examples(
examples=[
"Explícame qué es Batuto_Qwin",
"Ayúdame a escribir un código Python simple",
"¿Cuáles son las ventajas de Qwen3-32B?",
"Háblame sobre inteligencia artificial"
],
inputs=msg
)
if __name__ == "__main__":
demo.launch(
share=False,
show_error=True,
favicon_path="https://em-content.zobj.net/source/microsoft/319/robot_1f916.png"
)