chaterapia_demo / app.py
Juliofc's picture
Create app.py
a9915d8 verified
raw
history blame
4.37 kB
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
import gradio as gr
import os
import torch
os.system('pip install dashscope')
from http import HTTPStatus
import dashscope
from dashscope import Generation
from dashscope.api_entities.dashscope_response import Role
from typing import List, Optional, Tuple, Dict
from urllib.error import HTTPError
default_system = 'You are a helpful assistant.'
device = "cuda" if torch.cuda.is_available() else "cpu"
print(device)
# Aseg煤rate de que tu token de Hugging Face est谩 cargado como una variable de entorno
hf_token = os.environ.get("token")
if hf_token is not None:
from huggingface_hub import HfFolder
HfFolder.save_token(hf_token)
else:
print("No se encontr贸 el token de Hugging Face. Aseg煤rate de que la variable de entorno HF_TOKEN est茅 configurada.")
# Configuraci贸n inicial
tokenizer = AutoTokenizer.from_pretrained("Juliofc/chaterapia_model")
model_base = AutoModelForCausalLM.from_pretrained("google/gemma-2b-it").to(device)
model_base.resize_token_embeddings(len(tokenizer))
model_with_adapter = PeftModel.from_pretrained(model_base, "Juliofc/chaterapia_model").to(device)
CHAT_TEMPLATE= """{% for message in messages %}
{% if message['role'] == 'user' %}
{{'<user> ' + message['content'].strip() + ' </user>' }}
{% elif message['role'] == 'system' %}
{{'<system>\\n' + message['content'].strip() + '\\n</system>\\n\\n' }}
{% elif message['role'] == 'assistant' %}
{{ message['content'].strip() + ' </assistant>' + eos_token }}
{% elif message['role'] == 'input' %}
{{'<input> ' + message['content'] + ' </input>' }}
{% endif %}
{% endfor %}""" # Aseg煤rate de usar tu CHAT_TEMPLATE aqu铆
tokenizer.chat_template = CHAT_TEMPLATE
chat_history = [] # Historial de chat global
def generate_response(user_input):
global chat_history
# Agregar input del usuario al historial
chat_history.append({"content": user_input, "role": "user"})
# Preparaci贸n del input para el modelo
user_input = tokenizer.apply_chat_template(chat_history, tokenize=False)
input_tokens = tokenizer(user_input, return_tensors='pt', padding=True, truncation=True, max_length=1024).to(device)
# Generaci贸n de la respuesta del modelo
output_tokens = model_with_adapter.generate(**input_tokens, max_length=1024, pad_token_id=tokenizer.eos_token_id, top_k=50, do_sample=True, top_p=0.95, temperature=0.7)
generated_text = tokenizer.decode(output_tokens[0], skip_special_tokens=True)
# Extracci贸n de la respuesta generada
last_us = generated_text.rfind("</user>") + len("</user>")
last_as = generated_text.rfind("</assistant>")
generated_text = generated_text[last_us:last_as].strip()
# Agregar la respuesta del bot al historial
chat_history.append({"content": generated_text, "role": "assistant"})
print(chat_history)
return generated_text
def respond(message):
if message: # Verificar si el mensaje no est谩 vac铆o
bot_response = generate_response(message)
return [(message, bot_response)]
return [("", "")]
def clear_chat_and_history():
global chat_history
chat_history.clear() # Vaciar el historial de chat
# Devolver valores que efectivamente "limpien" los componentes de Gradio visualmente
# En este caso, estamos limpiando el Textbox y el Chatbot, pero como el Chatbot
# no puede ser "limpiado" directamente de esta manera, simplemente retornamos una lista vac铆a
# que ser谩 interpretada como ning煤n mensaje nuevo para mostrar.
return "", []
with gr.Blocks() as demo:
with gr.Row():
msg = gr.Textbox(label="Tu mensaje", placeholder="Escribe aqu铆...", lines=1)
send_btn = gr.Button("Enviar")
chatbot = gr.Chatbot()
# Usar un Button regular en lugar de ClearButton para tener control sobre la funci贸n que se ejecuta
clear_btn = gr.Button("Limpiar Chat")
# Acci贸n al presionar el bot贸n Enviar
send_btn.click(fn=respond, inputs=msg, outputs=chatbot)
# Configurar el bot贸n de limpieza para ejecutar clear_chat_and_history cuando se presione
# y actualizar tanto el msg como el chatbot con los valores retornados por la funci贸n
clear_btn.click(fn=clear_chat_and_history, inputs=None, outputs=[msg, chatbot])
demo.launch()