Spaces:
Running
Running
from flask import Flask, request, jsonify | |
from transformers import AutoModelForCausalLM, AutoTokenizer | |
import torch | |
import os | |
app = Flask(__name__) | |
# Configuraci贸n CORS para permitir solicitudes desde tu dominio | |
def after_request(response): | |
response.headers.add('Access-Control-Allow-Origin', 'https://justbyte.es') | |
response.headers.add('Access-Control-Allow-Headers', 'Content-Type') | |
response.headers.add('Access-Control-Allow-Methods', 'POST') | |
return response | |
# Cargar el modelo y tokenizador (se carga una sola vez al iniciar) | |
def load_model(): | |
global model, tokenizer | |
print("Cargando modelo Zephyr-7B...") | |
# Cargar el modelo y tokenizador | |
model_name = "HuggingFaceH4/zephyr-7b-beta" | |
tokenizer = AutoTokenizer.from_pretrained(model_name) | |
model = AutoModelForCausalLM.from_pretrained( | |
model_name, | |
torch_dtype=torch.float16, # Usar precisi贸n reducida para ahorrar memoria | |
device_map="auto", # Distribuir el modelo autom谩ticamente | |
load_in_8bit=True # Cuantizaci贸n a 8 bits para reducir uso de memoria | |
) | |
print("Modelo cargado correctamente!") | |
# Cargar el prompt desde el archivo | |
def get_system_prompt(): | |
with open("prompt.txt", "r", encoding="utf-8") as f: | |
return f.read().strip() | |
def generate_response(): | |
try: | |
# Obtener la pregunta del usuario | |
data = request.json | |
user_message = data.get('message', '') | |
if not user_message: | |
return jsonify({"error": "No se proporcion贸 ninguna pregunta"}), 400 | |
# Obtener el prompt del sistema | |
system_prompt = get_system_prompt() | |
# Crear el formato de conversaci贸n para Zephyr | |
messages = [ | |
{"role": "system", "content": system_prompt}, | |
{"role": "user", "content": user_message} | |
] | |
# Convertir mensajes al formato que espera el modelo | |
prompt = tokenizer.apply_chat_template(messages, tokenize=False) | |
# Generar respuesta | |
inputs = tokenizer(prompt, return_tensors="pt").to(model.device) | |
# Configuraci贸n de generaci贸n | |
generation_config = { | |
"max_new_tokens": 500, | |
"temperature": 0.7, | |
"top_p": 0.9, | |
"do_sample": True, | |
"pad_token_id": tokenizer.eos_token_id | |
} | |
# Generar respuesta | |
with torch.no_grad(): | |
outputs = model.generate(**inputs, **generation_config) | |
# Decodificar la respuesta | |
full_response = tokenizer.decode(outputs[0], skip_special_tokens=True) | |
# Extraer solo la respuesta del asistente (despu茅s del 煤ltimo mensaje del usuario) | |
assistant_response = full_response.split("assistant:")[-1].strip() | |
return jsonify({"response": assistant_response}) | |
except Exception as e: | |
print(f"Error: {str(e)}") | |
return jsonify({"error": f"Error al generar respuesta: {str(e)}"}), 500 | |
if __name__ == '__main__': | |
# Puerto que Hugging Face Spaces utiliza | |
port = int(os.environ.get('PORT', 7860)) | |
app.run(host='0.0.0.0', port=port) | |