-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
181 lines (148 loc) · 7.1 KB
/
app.py
File metadata and controls
181 lines (148 loc) · 7.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
import os
from dotenv import load_dotenv
from flask import Flask, request, jsonify, render_template
import openai
# Cargar variables de entorno desde el archivo .env
load_dotenv()
app = Flask(__name__)
# Configura la API key desde la variable de entorno
openai.api_key = os.getenv("OPENAI_API_KEY")
@app.route("/")
def index():
return render_template("index.html")
# Modificar la función generate_menu para asegurar el procesamiento correcto de los datos
@app.route("/api/generate-menu", methods=["POST"])
def generate_menu():
try:
if not openai.api_key:
return jsonify({"error": "API key no configurada"}), 500
data = request.get_json()
if not data:
return jsonify({"error": "No se recibieron datos"}), 400
# Procesar todos los datos como texto
perfil = str(data.get("perfil_cliente", "")).strip()
ingredientes = str(data.get("ingredientes", "")).strip()
presupuesto = str(data.get("presupuesto", "")).strip()
tiempo_max = str(data.get("tiempo_max", "")).strip()
restricciones = str(data.get("restricciones", "")).strip()
estilo = str(data.get("estilo", "")).strip()
# Validar que ningún campo esté vacío
if not all([perfil, ingredientes, presupuesto, tiempo_max, restricciones, estilo]):
return jsonify({"error": "Todos los campos son requeridos"}), 400
# Nuevo prompt mejorado
prompt = f"""
Actúa como un chef profesional con experiencia en alta cocina, marketing gastronómico y control de costos.
Analiza cuidadosamente la siguiente información proporcionada por el usuario:
**DATOS DEL CLIENTE** 📋:
- **Perfil del cliente:** "{perfil}"
- **Ingredientes disponibles:** "{ingredientes}"
- **Presupuesto aproximado por plato:** "{presupuesto}"
- **Tiempo de preparación deseado:** "{tiempo_max}"
- **Restricciones o alergias:** "{restricciones}"
- **Estilo de cocina:** "{estilo}"
**INSTRUCCIONES** 📝:
Diseña un menú de 3 tiempos que se adapte perfectamente a estas especificaciones.
Cada plato debe presentarse en el siguiente formato, usando títulos en **negrita** y algunos emojis para hacerlo atractivo:
**NOMBRE DEL PLATO** 🍽️
Tipo: Entrada/Principal/Postre
Ingredientes: lista detallada
Descripción: texto atractivo para el menú, incluye algunos emojis relacionados con el plato
Tiempo: preparación en minutos
Costo: USD
Precio sugerido: USD
**Recomendación de emplatado:** sugerencia creativa para la presentación del plato 🍴
**CONSIDERACIONES**:
- Adapta el lenguaje al perfil del cliente descrito
- Usa creativamente los ingredientes disponibles
- Respeta estrictamente las restricciones dietéticas
- Sugiere precios que reflejen el mercado objetivo
- Mantén coherencia con el estilo de cocina solicitado
- Si el cliente requiere un trato especial (por ejemplo, alergias, dieta estricta, o preferencias particulares), incluye una **solución técnica profesional** para afrontarlo, explicando brevemente cómo se garantiza la seguridad o satisfacción del cliente 👨🍳
Por favor, estructura la respuesta en tres secciones claras, usando títulos en **negrita** y emojis:
**ENTRADA** 🥗
(detalle del primer plato, con recomendación de emplatado y emojis)
**PLATO PRINCIPAL** 🍲
(detalle del plato fuerte, con recomendación de emplatado y emojis)
**POSTRE** 🍰
(detalle del postre, con recomendación de emplatado y emojis)
"""
# Usar la nueva interfaz de openai>=1.0.0
response = openai.chat.completions.create(
model="gpt-3.5-turbo-0125", # Modelo más económico disponible actualmente
messages=[
{"role": "system", "content": "Eres un chef experto que genera menús creativos y detallados."},
{"role": "user", "content": prompt},
],
temperature=0.8,
max_tokens=1000,
top_p=1,
frequency_penalty=0.2,
presence_penalty=0.2,
)
if not response.choices:
return jsonify({"error": "No se recibió respuesta de la IA"}), 500
generated_text = response.choices[0].message.content.strip()
return jsonify({"menu": generated_text}), 200
except Exception as e:
print(f"Error: {str(e)}") # Para debug
return jsonify({"error": f"Error generando el menú: {str(e)}"}), 500
@app.route("/api/chat", methods=["POST"])
def chat():
try:
data = request.get_json()
message = data.get("message", "")
context = data.get("context", "")
previous_menu = data.get("previousMenu", "")
# Si es una pregunta sobre el creador
if "creador" in message.lower() or "creator" in message.lower():
return jsonify({
"response": "Soy un asistente chef creado por Sebastian Jaque, un desarrollador y estudiante del Diplomado en IA.",
"showCreatorInfo": True
})
# Si es solicitud de nuevo menú
if "nuevo menú" in message.lower() or "otro menú" in message.lower():
return jsonify({
"response": "Por supuesto, generemos un nuevo menú juntos.",
"action": "restart"
})
# Crear prompt para mantener contexto
prompt = f"""
Como chef experto, responde a la siguiente consulta:
Contexto previo: {context}
Menú actual: {previous_menu}
Pregunta del cliente: {message}
Proporciona una respuesta profesional y detallada, manteniendo el rol de chef experto.
Si la pregunta no está clara, solicita más detalles.
"""
response = openai.chat.completions.create(
model="gpt-3.5-turbo-0125",
messages=[
{"role": "system", "content": "Eres un chef experto que mantiene conversaciones profesionales sobre gastronomía."},
{"role": "user", "content": prompt}
],
temperature=0.7,
max_tokens=500
)
ai_response = response.choices[0].message.content.strip()
return jsonify({
"response": ai_response,
"followUpOptions": True
})
except Exception as e:
print(f"Error en chat: {str(e)}")
return jsonify({"error": "Error procesando la solicitud"}), 500
# Código temporal para pruebas - ELIMINAR EN PRODUCCIÓN
@app.route("/test-api")
def test_api():
try:
# Usar la nueva interfaz de openai>=1.0.0
response = openai.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "Di hola"}],
max_tokens=10
)
return jsonify({"status": "OK", "response": response.choices[0].message.content})
except Exception as e:
return jsonify({"error": str(e)}), 500
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)