Hodely commited on
Commit
acceed5
·
verified ·
1 Parent(s): d3f31fd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +69 -86
app.py CHANGED
@@ -1,87 +1,70 @@
1
- from flask import Flask, request, jsonify
2
- from flask_cors import CORS
3
- from transformers import pipeline
4
- import os # Necesario para acceder a variables de entorno
5
-
6
- app = Flask(__name__)
7
- CORS(app) # Habilita CORS para permitir peticiones desde tu frontend
8
-
9
- # Nombre del modelo de Hugging Face
10
- MODEL_ID = "sarvamai/sarvam-m"
11
-
12
- # Variable para almacenar el pipeline de la IA
13
- pipe = None
14
-
15
- # Función para cargar el modelo
16
- # Se llama al inicio para que el modelo esté listo
17
- def load_model():
18
- global pipe
19
- try:
20
- print(f"Cargando modelo '{MODEL_ID}'. Esto puede tardar unos minutos...")
21
- # El token de Hugging Face se obtiene automáticamente de la variable de entorno HF_TOKEN
22
- # que configuras como un "Secret" en Hugging Face Spaces.
23
- # No necesitas pasarlo explícitamente aquí si está en los Secrets.
24
- # device=-1 usa CPU, device=0 usa GPU si está disponible (en Spaces, se elegirá automáticamente si el hardware lo soporta)
25
- pipe = pipeline("text-generation", model=MODEL_ID, device=-1)
26
- print(f"Modelo '{MODEL_ID}' cargado con éxito.")
27
- except Exception as e:
28
- print(f"Error al cargar el modelo '{MODEL_ID}': {e}")
29
- pipe = None
30
- print("El servidor no podrá responder a las solicitudes de IA.")
31
-
32
- # Cargar el modelo cuando la aplicación Flask se inicia
33
- # Usamos app.before_first_request para asegurar que se carga una vez al inicio
34
- @app.before_first_request
35
- def init_model():
36
- load_model()
37
-
38
- @app.route('/chat', methods=['POST'])
39
- def chat():
40
- if pipe is None:
41
- return jsonify({"error": "El modelo de IA no está cargado. Por favor, revisa el log del servidor."}), 503
42
-
43
- data = request.json
44
- messages = data.get('messages') # El frontend envía el historial completo
45
-
46
- if not messages:
47
- return jsonify({"error": "No se proporcionaron mensajes."}), 400
48
-
49
- try:
50
- # Construimos un prompt simple para el modelo de text-generation
51
- # concatenando el historial de mensajes.
52
- # Esta es una una simplificación; los modelos de chat suelen tener un formato específico.
53
- prompt = ""
54
- for msg in messages:
55
- if msg['role'] == 'user':
56
- prompt += f"Usuario: {msg['content']}\n"
57
- elif msg['role'] == 'assistant':
58
- prompt += f"Asistente: {msg['content']}\n"
59
- prompt += "Asistente:" # Indicamos que esperamos la respuesta del asistente
60
-
61
- # Ajusta parámetros como max_new_tokens, temperature, do_sample según tu necesidad
62
- response = pipe(prompt, max_new_tokens=250, temperature=0.7, do_sample=True, clean_up_tokenization_spaces=True)
63
-
64
- # La respuesta del pipe es una lista. Tomamos el primer elemento.
65
- generated_text = response[0]['generated_text']
66
-
67
- # Extraemos la parte de la respuesta de la IA.
68
- # Esto puede ser complicado con text-generation si el modelo repite el prompt.
69
- # Aquí asumimos que la respuesta de la IA comienza después del último "Asistente:"
70
- ai_response_content = generated_text.split("Asistente:", 1)[-1].strip()
71
-
72
- # A veces el modelo puede generar texto vacío o solo espacios.
73
- if not ai_response_content:
74
- ai_response_content = "Lo siento, no pude generar una respuesta clara. ¿Puedes intentarlo de nuevo?"
75
-
76
- return jsonify({"response": ai_response_content})
77
-
78
- except Exception as e:
79
- print(f"Error en la inferencia de la IA: {e}")
80
- return jsonify({"error": f"Error interno del servidor: {str(e)}"}), 500
81
-
82
- if __name__ == '__main__':
83
- # Obtener el puerto de la variable de entorno que proporciona Hugging Face Spaces
84
- # Por defecto, en Gradio Spaces, es 7860
85
- port = int(os.environ.get('PORT', 7860))
86
- # ¡NUNCA USES debug=True EN PRODUCCIÓN! Solo para desarrollo.
87
  app.run(debug=False, host='0.0.0.0', port=port)
 
1
+ from flask import Flask, request, jsonify
2
+ from flask_cors import CORS
3
+ from transformers import pipeline
4
+ import os
5
+
6
+ app = Flask(__name__)
7
+ CORS(app) # Habilita CORS para permitir peticiones desde tu frontend
8
+
9
+ # Nombre del modelo de Hugging Face
10
+ MODEL_ID = "sarvamai/sarvam-m"
11
+
12
+ # Variable para almacenar el pipeline de la IA
13
+ pipe = None
14
+
15
+ # Función para cargar el modelo
16
+ def load_model():
17
+ global pipe
18
+ try:
19
+ print(f"Cargando modelo '{MODEL_ID}'. Esto puede tardar unos minutos...")
20
+ # El token de Hugging Face se obtiene automáticamente de la variable de entorno HF_TOKEN
21
+ # que configuras como un "Secret" en Hugging Face Spaces.
22
+ pipe = pipeline("text-generation", model=MODEL_ID, device=-1) # device=-1 usa CPU
23
+ print(f"Modelo '{MODEL_ID}' cargado con éxito.")
24
+ except Exception as e:
25
+ print(f"Error al cargar el modelo '{MODEL_ID}': {e}")
26
+ pipe = None
27
+ print("El servidor no podrá responder a las solicitudes de IA.")
28
+
29
+ # Cargar el modelo inmediatamente después de crear la aplicación Flask
30
+ # Esto se asegura de que el modelo se cargue al inicio del servidor
31
+ with app.app_context():
32
+ load_model()
33
+
34
+ @app.route('/chat', methods=['POST'])
35
+ def chat():
36
+ if pipe is None:
37
+ return jsonify({"error": "El modelo de IA no está cargado. Por favor, revisa el log del servidor."}), 503
38
+
39
+ data = request.json
40
+ messages = data.get('messages') # El frontend envía el historial completo
41
+
42
+ if not messages:
43
+ return jsonify({"error": "No se proporcionaron mensajes."}), 400
44
+
45
+ try:
46
+ prompt = ""
47
+ for msg in messages:
48
+ if msg['role'] == 'user':
49
+ prompt += f"Usuario: {msg['content']}\n"
50
+ elif msg['role'] == 'assistant':
51
+ prompt += f"Asistente: {msg['content']}\n"
52
+ prompt += "Asistente:"
53
+
54
+ response = pipe(prompt, max_new_tokens=250, temperature=0.7, do_sample=True, clean_up_tokenization_spaces=True)
55
+
56
+ generated_text = response[0]['generated_text']
57
+ ai_response_content = generated_text.split("Asistente:", 1)[-1].strip()
58
+
59
+ if not ai_response_content:
60
+ ai_response_content = "Lo siento, no pude generar una respuesta clara. ¿Puedes intentarlo de nuevo?"
61
+
62
+ return jsonify({"response": ai_response_content})
63
+
64
+ except Exception as e:
65
+ print(f"Error en la inferencia de la IA: {e}")
66
+ return jsonify({"error": f"Error interno del servidor: {str(e)}"}), 500
67
+
68
+ if __name__ == '__main__':
69
+ port = int(os.environ.get('PORT', 7860))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  app.run(debug=False, host='0.0.0.0', port=port)