IATest / app.py
SrGuanche's picture
Update app.py
d92f799 verified
import gradio as gr
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
import torch
from langdetect import detect
# --- CONFIG ---
MODEL_NAME = "distilgpt2" # Modelo ligero para CPU
TRANSLATE_TO_ES_MODEL = "Helsinki-NLP/opus-mt-mul-es"
TRANSLATE_FROM_ES_MODEL = "Helsinki-NLP/opus-mt-es-mul"
# --- Cargar modelos ---
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model = AutoModelForCausalLM.from_pretrained(MODEL_NAME)
generator = pipeline("text-generation", model=model, tokenizer=tokenizer, device=-1)
translator_to_es = pipeline("translation", model=TRANSLATE_TO_ES_MODEL, device=-1)
translator_from_es = pipeline("translation", model=TRANSLATE_FROM_ES_MODEL, device=-1)
# --- Funciones de traducción ---
def translate_to_es(text):
try:
lang = detect(text)
except:
lang = "es"
if lang != "es":
translated = translator_to_es(text)[0]["translation_text"]
return translated, lang
return text, lang
def translate_from_es(text, lang):
if lang != "es":
translated = translator_from_es(text)[0]["translation_text"]
return translated
return text
# --- Función principal del chatbot ---
def answer(history, message):
if not message.strip():
return history, ""
# Detectar idioma y traducir a español si es necesario
msg_es, lang = translate_to_es(message)
# Construir contexto
context = ""
for user, bot in history[-6:]:
context += f"Usuario: {user}\nIA: {bot}\n"
context += f"Usuario: {msg_es}\nIA:"
# Generar respuesta en español
output = generator(
context,
max_new_tokens=150,
do_sample=True,
top_k=50,
top_p=0.9,
temperature=0.8
)[0]["generated_text"]
if "IA:" in output:
response_es = output.split("IA:")[-1].strip()
else:
response_es = output
# Traducir de vuelta al idioma original
response_final = translate_from_es(response_es, lang)
# Actualizar historial
history.append((message, response_final))
return history, ""
# --- Interfaz Gradio ---
with gr.Blocks() as demo:
gr.Markdown("# 🤖 Chatbot Multilenguaje (Traducción automática)")
chat = gr.Chatbot()
msg = gr.Textbox(placeholder="Escribe tu mensaje…")
clear_btn = gr.Button("Limpiar")
state = gr.State([])
msg.submit(answer, [state, msg], [chat, msg])
clear_btn.click(lambda: [], None, chat)
demo.launch()