File size: 4,548 Bytes
e0e388a 5b1b4db e0e388a 5b1b4db 9ef5abc 5b1b4db 9ef5abc 5b1b4db 9ef5abc 5b1b4db 9ef5abc 5b1b4db 9ef5abc 5b1b4db 9ef5abc 5b1b4db 9ef5abc 5b1b4db 9ef5abc 5b1b4db 9ef5abc 5b1b4db 9ef5abc 5b1b4db 9ef5abc 5b1b4db 9ef5abc 5b1b4db 9ef5abc 5b1b4db e0e388a 5b1b4db e0e388a 5b1b4db | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | import gradio as gr
from huggingface_hub import InferenceClient
# Cliente de IA gratuito y sin límites
client = InferenceClient("Qwen/Qwen2.5-7B-Instruct")
def responder(mensaje, historial, sistema, temperatura):
# 1. Preparar el contexto y la personalidad
mensajes_api = [{"role": "system", "content": sistema}]
# 2. Cargar el historial previo para que la IA tenga memoria
for msg in historial:
mensajes_api.append({"role": "user", "content": msg[0]})
if msg[1] is not None:
mensajes_api.append({"role": "assistant", "content": msg[1]})
# 3. Añadir el mensaje actual del usuario
mensajes_api.append({"role": "user", "content": mensaje})
respuesta_generada = ""
try:
# Llamar al modelo de IA en la nube
stream = client.chat_completion(
mensajes_api,
max_tokens=1024,
temperature=temperatura,
stream=True
)
for chunk in stream:
texto = chunk.choices[0].delta.content
if texto is not None:
respuesta_generada += texto
yield respuesta_generada
except Exception as e:
yield f"⚠️ Error de conexión con el servidor: {str(e)}"
# --- INTERFAZ PROFESIONAL CON BOTONES FUNCIONALES ---
with gr.Blocks(theme=gr.themes.Ocean()) as demo:
gr.Markdown("<h1 style='text-align: center;'>🤖 Mi Inteligencia Artificial Privada</h1>")
with gr.Row():
# COLUMNA IZQUIERDA (Ajustes y Botones)
with gr.Column(scale=1, variant="panel"):
gr.Markdown("### ⚙️ Ajustes del Chat")
sistema_input = gr.Textbox(
value="Eres un asistente ultra-inteligente, amigable y experto. Respondes siempre en español.",
label="Instrucciones de la IA (Personalidad)",
lines=3
)
temp_input = gr.Slider(minimum=0.1, maximum=1.5, value=0.7, step=0.1, label="Nivel de Creatividad")
gr.Markdown("---")
gr.Markdown("### 🛠️ Herramientas")
# Botón funcional para borrar la memoria del chat
btn_limpiar = gr.Button("🗑️ Limpiar Conversación", variant="secondary")
# Panel de información desplegable
with gr.Accordion("ℹ️ Información del Servidor", open=False):
gr.Markdown("**Host:** Hugging Face Spaces\n**Motor IA:** Qwen 2.5 (7B)\n**Estado:** Online")
# COLUMNA DERECHA (La ventana principal del Chat)
with gr.Column(scale=3):
chatbot = gr.Chatbot(height=500, label="Chat en vivo", bubble_full_width=False)
with gr.Row():
mensaje_input = gr.Textbox(placeholder="Escribe tu mensaje aquí y presiona Enter...", show_label=False, scale=4)
btn_enviar = gr.Button("Enviar 🚀", variant="primary", scale=1)
# --- LÓGICA INTERNA DE LOS BOTONES ---
def procesar_mensaje(mensaje_usuario, historial):
# Muestra el mensaje del usuario en la pantalla inmediatamente
if not mensaje_usuario.strip():
return "", historial
return "", historial + [[mensaje_usuario, None]]
def generar_respuesta(historial, sistema, temperatura):
# Toma el último mensaje y genera la respuesta de la IA poco a poco
if not historial or historial[-1][0] is None:
yield historial
return
mensaje_usuario = historial[-1][0]
historial_previo = historial[:-1]
generador = responder(mensaje_usuario, historial_previo, sistema, temperatura)
for texto_parcial in generador:
historial[-1][1] = texto_parcial
yield historial
# 1. Acción al presionar "Enter" en la caja de texto
mensaje_input.submit(
procesar_mensaje, [mensaje_input, chatbot], [mensaje_input, chatbot], queue=False
).then(
generar_respuesta, [chatbot, sistema_input, temp_input], chatbot
)
# 2. Acción al presionar el botón "Enviar"
btn_enviar.click(
procesar_mensaje, [mensaje_input, chatbot], [mensaje_input, chatbot], queue=False
).then(
generar_respuesta, [chatbot, sistema_input, temp_input], chatbot
)
# 3. Acción al presionar el botón "Limpiar Conversación"
btn_limpiar.click(lambda: None, None, chatbot, queue=False)
if __name__ == "__main__":
demo.launch() |