askbyte commited on
Commit
928cd07
verified
1 Parent(s): 43f1789

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +84 -30
app.py CHANGED
@@ -1,40 +1,94 @@
1
- import torch
2
- from transformers import AutoTokenizer, AutoModelForCausalLM
3
  from flask import Flask, request, jsonify
4
- from threading import Thread
 
 
5
 
6
  app = Flask(__name__)
7
 
8
- tokenizer = AutoTokenizer.from_pretrained("HuggingFaceH4/zephyr-7b-beta")
9
- model = AutoModelForCausalLM.from_pretrained(
10
- "HuggingFaceH4/zephyr-7b-beta",
11
- torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
12
- device_map="auto"
13
- )
14
-
15
- @app.route("/api/chat", methods=["POST"])
16
- def chat():
17
- data = request.get_json()
18
- question = data.get("question", "")
19
-
20
- prompt = f"""Eres BITER, un mentor experto en negocios con mentalidad de CEO. Respondes SIEMPRE en espa帽ol y ayudas a emprendedores a tomar decisiones r谩pidas, inteligentes y estrat茅gicas.
21
-
22
- Tu estilo es directo, profesional y humano. Tus respuestas son claras, realistas, y con visi贸n pr谩ctica. Nunca usas tecnicismos innecesarios. A veces puedes ser exigente si la idea no est谩 bien pensada, pero siempre propones formas de mejorarla.
23
 
24
- Solo respondes a la 煤ltima pregunta del usuario.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
 
26
- Usuario: {question}
27
- BITER:"""
 
 
28
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
 
30
- inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
31
- outputs = model.generate(**inputs, max_new_tokens=200)
32
- response = tokenizer.decode(outputs[0], skip_special_tokens=True)
33
- respuesta_final = response.split("BITER:")[-1].strip()
34
-
35
- return jsonify({"choices": [{"message": {"content": respuesta_final}}]})
36
 
37
- def run():
38
- app.run(host='0.0.0.0', port=7860)
 
 
39
 
40
- Thread(target=run).start()
 
 
 
1
  from flask import Flask, request, jsonify
2
+ from transformers import AutoModelForCausalLM, AutoTokenizer
3
+ import torch
4
+ import os
5
 
6
  app = Flask(__name__)
7
 
8
+ # Configuraci贸n CORS para permitir solicitudes desde tu dominio
9
+ @app.after_request
10
+ def after_request(response):
11
+ response.headers.add('Access-Control-Allow-Origin', 'https://justbyte.es')
12
+ response.headers.add('Access-Control-Allow-Headers', 'Content-Type')
13
+ response.headers.add('Access-Control-Allow-Methods', 'POST')
14
+ return response
 
 
 
 
 
 
 
 
15
 
16
+ # Cargar el modelo y tokenizador (se carga una sola vez al iniciar)
17
+ @app.before_first_request
18
+ def load_model():
19
+ global model, tokenizer
20
+
21
+ print("Cargando modelo Zephyr-7B...")
22
+
23
+ # Cargar el modelo y tokenizador
24
+ model_name = "HuggingFaceH4/zephyr-7b-beta"
25
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
26
+ model = AutoModelForCausalLM.from_pretrained(
27
+ model_name,
28
+ torch_dtype=torch.float16, # Usar precisi贸n reducida para ahorrar memoria
29
+ device_map="auto", # Distribuir el modelo autom谩ticamente
30
+ load_in_8bit=True # Cuantizaci贸n a 8 bits para reducir uso de memoria
31
+ )
32
+
33
+ print("Modelo cargado correctamente!")
34
 
35
+ # Cargar el prompt desde el archivo
36
+ def get_system_prompt():
37
+ with open("prompt.txt", "r", encoding="utf-8") as f:
38
+ return f.read().strip()
39
 
40
+ @app.route('/generate', methods=['POST'])
41
+ def generate_response():
42
+ try:
43
+ # Obtener la pregunta del usuario
44
+ data = request.json
45
+ user_message = data.get('message', '')
46
+
47
+ if not user_message:
48
+ return jsonify({"error": "No se proporcion贸 ninguna pregunta"}), 400
49
+
50
+ # Obtener el prompt del sistema
51
+ system_prompt = get_system_prompt()
52
+
53
+ # Crear el formato de conversaci贸n para Zephyr
54
+ messages = [
55
+ {"role": "system", "content": system_prompt},
56
+ {"role": "user", "content": user_message}
57
+ ]
58
+
59
+ # Convertir mensajes al formato que espera el modelo
60
+ prompt = tokenizer.apply_chat_template(messages, tokenize=False)
61
+
62
+ # Generar respuesta
63
+ inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
64
+
65
+ # Configuraci贸n de generaci贸n
66
+ generation_config = {
67
+ "max_new_tokens": 500,
68
+ "temperature": 0.7,
69
+ "top_p": 0.9,
70
+ "do_sample": True,
71
+ "pad_token_id": tokenizer.eos_token_id
72
+ }
73
+
74
+ # Generar respuesta
75
+ with torch.no_grad():
76
+ outputs = model.generate(**inputs, **generation_config)
77
+
78
+ # Decodificar la respuesta
79
+ full_response = tokenizer.decode(outputs[0], skip_special_tokens=True)
80
+
81
+ # Extraer solo la respuesta del asistente (despu茅s del 煤ltimo mensaje del usuario)
82
+ assistant_response = full_response.split("assistant:")[-1].strip()
83
+
84
+ return jsonify({"response": assistant_response})
85
 
86
+ except Exception as e:
87
+ print(f"Error: {str(e)}")
88
+ return jsonify({"error": f"Error al generar respuesta: {str(e)}"}), 500
 
 
 
89
 
90
+ if __name__ == '__main__':
91
+ # Puerto que Hugging Face Spaces utiliza
92
+ port = int(os.environ.get('PORT', 7860))
93
+ app.run(host='0.0.0.0', port=port)
94