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()