|
""" |
|
Interfaz web usando Gradio para el GPT local |
|
""" |
|
import gradio as gr |
|
from models.model_loader import ModelLoader |
|
from models.text_generator import TextGenerator |
|
import logging |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
class GradioInterface: |
|
def __init__(self): |
|
self.model_loader = ModelLoader() |
|
self.text_generator = TextGenerator(self.model_loader) |
|
self.available_models = [ |
|
"microsoft/DialoGPT-small", |
|
"gpt2", |
|
"distilgpt2" |
|
] |
|
|
|
def load_model_ui(self, model_name): |
|
"""Cargar modelo desde la interfaz""" |
|
if self.model_loader.load_model(model_name): |
|
self.text_generator.reset_chat_history() |
|
return f"✅ Modelo '{model_name}' cargado exitosamente" |
|
else: |
|
return f"❌ Error al cargar el modelo '{model_name}'" |
|
|
|
def chat_response(self, message, history, temperature, max_length, top_p): |
|
"""Generar respuesta de chat""" |
|
if not self.model_loader.is_loaded(): |
|
return history + [("Error", "Por favor, carga un modelo primero")] |
|
|
|
try: |
|
|
|
response = self.text_generator.generate_response( |
|
message, |
|
temperature=temperature, |
|
max_length=max_length, |
|
top_p=top_p |
|
) |
|
|
|
|
|
history.append((message, response)) |
|
return history |
|
|
|
except Exception as e: |
|
error_msg = f"Error: {str(e)}" |
|
history.append((message, error_msg)) |
|
return history |
|
|
|
def generate_text_ui(self, prompt, temperature, max_length, top_p): |
|
"""Generar texto desde prompt""" |
|
if not self.model_loader.is_loaded(): |
|
return "Error: Por favor, carga un modelo primero" |
|
|
|
return self.text_generator.generate_text( |
|
prompt, |
|
temperature=temperature, |
|
max_length=max_length, |
|
top_p=top_p |
|
) |
|
|
|
def reset_chat(self): |
|
"""Reiniciar chat""" |
|
self.text_generator.reset_chat_history() |
|
return [], "Chat reiniciado" |
|
|
|
def get_model_status(self): |
|
"""Obtener estado del modelo""" |
|
info = self.model_loader.get_model_info() |
|
stats = self.text_generator.get_generation_stats() |
|
|
|
status = f""" |
|
**Estado del Modelo:** |
|
- {info['status']} |
|
- Dispositivo: {info.get('device', 'N/A')} |
|
- Tipo: {info.get('model_type', 'N/A')} |
|
- Vocabulario: {info.get('vocab_size', 'N/A')} |
|
|
|
**Estadísticas de Chat:** |
|
- Longitud del historial: {stats['history_length']} tokens |
|
- Dispositivo activo: {stats['device']} |
|
""" |
|
return status |
|
|
|
def create_interface(self): |
|
"""Crear la interfaz Gradio simplificada""" |
|
|
|
with gr.Blocks(title="GPT Local") as demo: |
|
gr.Markdown("# 🤖 GPT Local con Hugging Face") |
|
|
|
with gr.Tab("💬 Chat"): |
|
chatbot = gr.Chatbot(height=400) |
|
msg = gr.Textbox(placeholder="Escribe tu mensaje...", label="Mensaje") |
|
|
|
with gr.Row(): |
|
send_btn = gr.Button("Enviar", variant="primary") |
|
clear_btn = gr.Button("Limpiar") |
|
|
|
|
|
with gr.Row(): |
|
temperature = gr.Slider(0.1, 2.0, 0.7, label="Temperatura") |
|
max_length = gr.Slider(50, 500, 200, label="Longitud Máxima") |
|
|
|
with gr.Tab("⚙️ Configuración"): |
|
model_dropdown = gr.Dropdown( |
|
choices=self.available_models, |
|
value=self.available_models[0], |
|
label="Modelo" |
|
) |
|
load_btn = gr.Button("Cargar Modelo") |
|
status_text = gr.Textbox(label="Estado", interactive=False) |
|
|
|
|
|
def respond(message, history, temp, max_len): |
|
if not message.strip(): |
|
return history, "" |
|
|
|
try: |
|
response = self.text_generator.generate_response( |
|
message, temperature=temp, max_length=max_len |
|
) |
|
history.append((message, response)) |
|
return history, "" |
|
except Exception as e: |
|
history.append((message, f"Error: {str(e)}")) |
|
return history, "" |
|
|
|
def load_model(model_name): |
|
try: |
|
if self.model_loader.load_model(model_name): |
|
self.text_generator.reset_chat_history() |
|
return f"✅ Modelo '{model_name}' cargado" |
|
else: |
|
return f"❌ Error al cargar '{model_name}'" |
|
except Exception as e: |
|
return f"❌ Error: {str(e)}" |
|
|
|
def clear_chat(): |
|
self.text_generator.reset_chat_history() |
|
return [] |
|
|
|
|
|
msg.submit(respond, [msg, chatbot, temperature, max_length], [chatbot, msg]) |
|
send_btn.click(respond, [msg, chatbot, temperature, max_length], [chatbot, msg]) |
|
clear_btn.click(clear_chat, outputs=chatbot) |
|
load_btn.click(load_model, model_dropdown, status_text) |
|
|
|
|
|
demo.load(lambda: load_model(self.available_models[0]), outputs=status_text) |
|
|
|
return demo |
|
|
|
def launch(self, **kwargs): |
|
"""Lanzar la interfaz""" |
|
demo = self.create_interface() |
|
demo.launch(**kwargs) |
|
|