caissaa23 commited on
Commit
0c0cae7
·
verified ·
1 Parent(s): 0a7cbad

Update chatbot_nuti.py

Browse files
Files changed (1) hide show
  1. chatbot_nuti.py +103 -54
chatbot_nuti.py CHANGED
@@ -1,56 +1,105 @@
1
- import openai
2
- import os
3
  import json
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
 
5
- openai.api_key = os.getenv("OPENAI_API_KEY")
6
-
7
- # Archivo para guardar historial de conversaciones
8
- HISTORIAL_FILE = "historial_nuti.json"
9
-
10
- def cargar_historial(usuario):
11
- if os.path.exists(HISTORIAL_FILE):
12
- with open(HISTORIAL_FILE, "r", encoding="utf-8") as f:
13
- data = json.load(f)
14
- return data.get(usuario, [])
15
- return []
16
-
17
- def guardar_historial(usuario, historial):
18
- if os.path.exists(HISTORIAL_FILE):
19
- with open(HISTORIAL_FILE, "r", encoding="utf-8") as f:
20
- data = json.load(f)
21
- else:
22
- data = {}
23
- data[usuario] = historial
24
- with open(HISTORIAL_FILE, "w", encoding="utf-8") as f:
25
- json.dump(data, f, indent=2, ensure_ascii=False)
26
-
27
- def buscar_respuesta(usuario, mensaje):
28
- """
29
- Genera una respuesta de Nuti inteligente y con memoria.
30
- """
31
- historial = cargar_historial(usuario)
32
-
33
- prompt = f"""
34
- Eres Nuti, un asistente nutricional amigable, motivador y educativo.
35
- Usuario: {usuario}
36
- Historial de conversación: {historial}
37
- Nuevo mensaje del usuario: "{mensaje}"
38
-
39
- Responde de forma clara, completa, personalizada y práctica.
40
- Incluye consejos de nutrición y motivación según la conversación previa.
41
- Mantén coherencia con lo que ya se ha dicho y no repitas consejos idénticos.
42
- """
43
- try:
44
- respuesta = openai.ChatCompletion.create(
45
- model="gpt-3.5-turbo",
46
- messages=[{"role": "user", "content": prompt}],
47
- max_tokens=250,
48
- temperature=0.9
49
- )
50
- texto_respuesta = respuesta['choices'][0]['message']['content'].strip()
51
- historial.append(f"Usuario: {mensaje}")
52
- historial.append(f"Nuti: {texto_respuesta}")
53
- guardar_historial(usuario, historial)
54
- return texto_respuesta
55
- except Exception as e:
56
- return f"🤖 Nuti dice: Lo siento, hubo un error generando la respuesta. ({e})"
 
 
 
1
  import json
2
+ import random
3
+ import os
4
+ from datetime import datetime
5
+
6
+ MEMORIA_FILE = "memoria_nuti.json"
7
+
8
+ # ------------------ FUNCIONES DE MEMORIA ------------------ #
9
+
10
+ def cargar_memoria():
11
+ if os.path.exists(MEMORIA_FILE):
12
+ with open(MEMORIA_FILE, "r", encoding="utf-8") as f:
13
+ return json.load(f)
14
+ return {}
15
+
16
+ def guardar_memoria(memoria):
17
+ with open(MEMORIA_FILE, "w", encoding="utf-8") as f:
18
+ json.dump(memoria, f, indent=4, ensure_ascii=False)
19
+
20
+ def recordar_usuario(email):
21
+ memoria = cargar_memoria()
22
+ return memoria.get(email, {"historial": [], "estado_emocional": "neutral"})
23
+
24
+ def actualizar_memoria(email, entrada, respuesta, estado=None):
25
+ memoria = cargar_memoria()
26
+ if email not in memoria:
27
+ memoria[email] = {"historial": [], "estado_emocional": "neutral"}
28
+ memoria[email]["historial"].append({"pregunta": entrada, "respuesta": respuesta, "fecha": str(datetime.now())})
29
+ if estado:
30
+ memoria[email]["estado_emocional"] = estado
31
+ guardar_memoria(memoria)
32
+
33
+ # ------------------ BASE DE CONOCIMIENTO ------------------ #
34
+
35
+ TEMAS_NUTRICION = {
36
+ "desayuno": [
37
+ "Un desayuno equilibrado con proteína y fruta mejora tu energía y concentración. 🍳🍓",
38
+ "Evita los cereales ultraprocesados, opta por avena o yogurt natural con fruta.",
39
+ ],
40
+ "almuerzo": [
41
+ "El almuerzo debe aportar energía sin pesadez. Incluye verduras, proteína y granos integrales. 🥗",
42
+ "Recuerda no saltarte comidas, eso puede afectar tu metabolismo y tu ánimo.",
43
+ ],
44
+ "emociones": [
45
+ "A veces comemos para calmar emociones. Tómate un momento para respirar y sentir. 🌿",
46
+ "Tu cuerpo refleja tus emociones. Cuida tu mente tanto como tu alimentación. 💚",
47
+ ],
48
+ "motivacion": [
49
+ "No se trata de ser perfecto, sino constante. Cada día cuenta. 🌞",
50
+ "Tu cuerpo es un proyecto a largo plazo, no una tarea rápida.",
51
+ ],
52
+ }
53
+
54
+ PALABRAS_CLAVE = {
55
+ "ansiedad": "Cuando sientas ansiedad, respira profundo. A veces no es hambre, sino emoción no atendida.",
56
+ "estrés": "Evita comer con prisa. El estrés afecta tu digestión y tu descanso.",
57
+ "agua": "Beber suficiente agua regula tu cuerpo y mente. Un vaso cada hora es un buen hábito. 💧",
58
+ "peso": "El peso no define tu valor. Enfócate en cómo te sientes y en tu bienestar integral.",
59
+ "deporte": "Moverte todos los días, aunque sea poco, mejora tu humor y tu digestión. 💪",
60
+ }
61
+
62
+ RESPUESTAS_LIBRES = [
63
+ "Cuéntame más sobre cómo te sientes con tu alimentación. 💬",
64
+ "Eso suena interesante. ¿Qué cambios te gustaría hacer en tu rutina?",
65
+ "Me gusta cómo piensas, tu enfoque hacia el bienestar es muy maduro. 🌿",
66
+ "Recuerda: equilibrio, no perfección. Un paso a la vez es progreso. ✨"
67
+ ]
68
+
69
+ # ------------------ FUNCIÓN PRINCIPAL ------------------ #
70
+
71
+ def buscar_respuesta(pregunta, email="usuario_desconocido"):
72
+ texto = pregunta.lower()
73
+ memoria_usuario = recordar_usuario(email)
74
+ estado = memoria_usuario.get("estado_emocional", "neutral")
75
+
76
+ # Detectar tono emocional del usuario
77
+ if any(p in texto for p in ["triste", "mal", "solo", "ansioso", "estresado", "deprimido"]):
78
+ estado = "triste"
79
+ elif any(p in texto for p in ["feliz", "contento", "motivado", "bien", "tranquilo"]):
80
+ estado = "positivo"
81
+
82
+ # Buscar respuestas por tema
83
+ for clave, respuestas in TEMAS_NUTRICION.items():
84
+ if clave in texto:
85
+ respuesta = random.choice(respuestas)
86
+ actualizar_memoria(email, pregunta, respuesta, estado)
87
+ return respuesta
88
+
89
+ # Buscar por palabra clave específica
90
+ for palabra, respuesta in PALABRAS_CLAVE.items():
91
+ if palabra in texto:
92
+ actualizar_memoria(email, pregunta, respuesta, estado)
93
+ return respuesta
94
+
95
+ # Si hay conversación previa, intenta mantener contexto
96
+ if memoria_usuario["historial"]:
97
+ ultima_respuesta = memoria_usuario["historial"][-1]["respuesta"]
98
+ respuesta = f"Me alegra que sigamos hablando de esto. {random.choice(RESPUESTAS_LIBRES)} (Antes me dijiste: '{ultima_respuesta[:60]}...')"
99
+ actualizar_memoria(email, pregunta, respuesta, estado)
100
+ return respuesta
101
 
102
+ # Respuesta por defecto
103
+ respuesta = random.choice(RESPUESTAS_LIBRES)
104
+ actualizar_memoria(email, pregunta, respuesta, estado)
105
+ return respuesta