Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -16,7 +16,6 @@ from reportlab.lib.pagesizes import letter
|
|
| 16 |
from reportlab.pdfgen import canvas
|
| 17 |
import csv
|
| 18 |
import pandas as pd
|
| 19 |
-
from crewai import Agent, Task, Crew, Process
|
| 20 |
|
| 21 |
# Configuración de NLTK
|
| 22 |
nltk.download('punkt')
|
|
@@ -142,53 +141,69 @@ def obtener_respuesta(pregunta, texto_preprocesado, modelo, temperatura=0.5):
|
|
| 142 |
return "Lo siento, no puedo procesar tu solicitud en este momento."
|
| 143 |
|
| 144 |
# Definición de Agentes
|
| 145 |
-
def
|
| 146 |
pedido_tool = PedidoTool(menu_df)
|
| 147 |
-
|
| 148 |
-
|
| 149 |
-
agente_pedido = Agent(
|
| 150 |
-
role='Agente de Pedido',
|
| 151 |
-
goal='Tomar pedidos de los clientes y verificar contra el menú.',
|
| 152 |
-
verbose=True,
|
| 153 |
-
memory=True,
|
| 154 |
-
backstory='Eres experto en recibir pedidos y asegurarte de que todo esté correcto antes de pasarlo a la cocina.',
|
| 155 |
-
tools=[pedido_tool]
|
| 156 |
-
)
|
| 157 |
-
|
| 158 |
-
agente_orden = Agent(
|
| 159 |
-
role='Agente de Orden',
|
| 160 |
-
goal='Calcular el costo total del pedido y procesar la orden de compra.',
|
| 161 |
-
verbose=True,
|
| 162 |
-
memory=True,
|
| 163 |
-
backstory='Eres el encargado de asegurarte que todos los pedidos sean correctamente procesados y calculados.',
|
| 164 |
-
tools=[orden_tool]
|
| 165 |
-
)
|
| 166 |
-
|
| 167 |
-
tarea_tomar_pedido = Task(
|
| 168 |
-
description='Recibir el pedido del cliente, verificar los elementos contra el menú y confirmar el pedido.',
|
| 169 |
-
expected_output='Un pedido confirmado con todos los elementos disponibles en el menú.',
|
| 170 |
-
agent=agente_pedido,
|
| 171 |
-
)
|
| 172 |
-
|
| 173 |
-
tarea_procesar_orden = Task(
|
| 174 |
-
description='Recibir el pedido confirmado, calcular el costo total y procesar la orden de compra.',
|
| 175 |
-
expected_output='Una orden de compra procesada con el costo total calculado.',
|
| 176 |
-
agent=agente_orden,
|
| 177 |
-
)
|
| 178 |
-
|
| 179 |
-
crew = Crew(
|
| 180 |
-
agents=[agente_pedido, agente_orden],
|
| 181 |
-
tasks=[tarea_tomar_pedido, tarea_procesar_orden],
|
| 182 |
-
process=Process.sequential
|
| 183 |
-
)
|
| 184 |
|
| 185 |
-
|
|
|
|
|
|
|
|
|
|
| 186 |
|
| 187 |
# Main App
|
| 188 |
def main():
|
| 189 |
# --- Diseño general ---
|
| 190 |
st.set_page_config(page_title="Asistente Virtual", page_icon="🤖")
|
| 191 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 192 |
# --- Opciones adicionales ---
|
| 193 |
st.markdown("---")
|
| 194 |
temperatura = st.slider("🌡️ Temperatura", min_value=0.0, max_value=1.0, value=0.5, step=0.1)
|
|
@@ -228,37 +243,6 @@ def main():
|
|
| 228 |
st.title("🤖 RESTAURANTE SAZON BURGER 🍔✨-BOTIDINAMIX AI")
|
| 229 |
st.markdown("---")
|
| 230 |
|
| 231 |
-
# --- Estilos CSS personalizados ---
|
| 232 |
-
st.markdown(
|
| 233 |
-
"""
|
| 234 |
-
<style>
|
| 235 |
-
body {
|
| 236 |
-
background-image: linear-gradient(to right, #FFA500, #FFD700);
|
| 237 |
-
}
|
| 238 |
-
h1, h2, h3, h4, h5, h6 {
|
| 239 |
-
color: green !important;
|
| 240 |
-
font-weight: bold !important;
|
| 241 |
-
}
|
| 242 |
-
.stChatFloatingInputContainer {
|
| 243 |
-
background-color: rgba(255, 255, 255, 0.8);
|
| 244 |
-
border-radius: 10px;
|
| 245 |
-
}
|
| 246 |
-
.stTextInput > div > div > input {
|
| 247 |
-
color: #333;
|
| 248 |
-
}
|
| 249 |
-
[data-testid="stChatMessage"] {
|
| 250 |
-
background-color: black !important;
|
| 251 |
-
color: gold !important;
|
| 252 |
-
border-radius: 10px;
|
| 253 |
-
}
|
| 254 |
-
[data-testid="stChatMessage"] p {
|
| 255 |
-
color: gold !important;
|
| 256 |
-
}
|
| 257 |
-
</style>
|
| 258 |
-
""",
|
| 259 |
-
unsafe_allow_html=True,
|
| 260 |
-
)
|
| 261 |
-
|
| 262 |
# --- Botones de historial ---
|
| 263 |
if st.button("Buscar Historial"):
|
| 264 |
st.session_state.mostrar_historial = True
|
|
@@ -320,10 +304,11 @@ def main():
|
|
| 320 |
with st.chat_message("user"):
|
| 321 |
st.markdown(pregunta_usuario)
|
| 322 |
|
| 323 |
-
|
| 324 |
-
|
| 325 |
-
|
| 326 |
-
st.
|
|
|
|
| 327 |
|
| 328 |
guardar_historial(st.session_state.mensajes)
|
| 329 |
else:
|
|
@@ -331,22 +316,27 @@ def main():
|
|
| 331 |
|
| 332 |
# --- Lectura del menú desde CSV y creación de agentes ---
|
| 333 |
st.subheader("📋 Menú y Pedidos")
|
| 334 |
-
menu_csv = st.file_uploader("
|
| 335 |
|
| 336 |
if menu_csv:
|
| 337 |
menu_df = leer_menu_csv(menu_csv)
|
| 338 |
st.success("Menú cargado exitosamente. Listo para tomar pedidos.")
|
| 339 |
st.write(menu_df)
|
| 340 |
|
| 341 |
-
# Definir y ejecutar agentes y tareas
|
| 342 |
-
crew = definir_agentes_y_tareas(menu_df)
|
| 343 |
-
|
| 344 |
# Captura de pedido
|
| 345 |
pedido_usuario = st.text_input("Ingresa tu pedido (separado por comas):")
|
| 346 |
if st.button("Tomar Pedido"):
|
| 347 |
if pedido_usuario:
|
| 348 |
-
|
| 349 |
-
st.info(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 350 |
else:
|
| 351 |
st.warning("Por favor, ingresa el pedido antes de continuar.")
|
| 352 |
|
|
|
|
| 16 |
from reportlab.pdfgen import canvas
|
| 17 |
import csv
|
| 18 |
import pandas as pd
|
|
|
|
| 19 |
|
| 20 |
# Configuración de NLTK
|
| 21 |
nltk.download('punkt')
|
|
|
|
| 141 |
return "Lo siento, no puedo procesar tu solicitud en este momento."
|
| 142 |
|
| 143 |
# Definición de Agentes
|
| 144 |
+
def tomar_pedido_agente(pedido, menu_df):
|
| 145 |
pedido_tool = PedidoTool(menu_df)
|
| 146 |
+
confirmados = pedido_tool.tomar_pedido(pedido)
|
| 147 |
+
return confirmados
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 148 |
|
| 149 |
+
def procesar_orden_agente(pedido, menu_df):
|
| 150 |
+
orden_tool = OrdenTool(menu_df)
|
| 151 |
+
total = orden_tool.procesar_orden(pedido)
|
| 152 |
+
return total
|
| 153 |
|
| 154 |
# Main App
|
| 155 |
def main():
|
| 156 |
# --- Diseño general ---
|
| 157 |
st.set_page_config(page_title="Asistente Virtual", page_icon="🤖")
|
| 158 |
|
| 159 |
+
# --- Estilos CSS personalizados ---
|
| 160 |
+
st.markdown(
|
| 161 |
+
"""
|
| 162 |
+
<style>
|
| 163 |
+
body {
|
| 164 |
+
background: rgb(241,241,234);
|
| 165 |
+
background: radial-gradient(circle, rgba(241,241,234,1) 4%, rgba(255,127,8,1) 36%, rgba(235,255,8,1) 94%, rgba(0,0,255,1) 99%);
|
| 166 |
+
}
|
| 167 |
+
h1, h2, h3, h4, h5, h6 {
|
| 168 |
+
color: green !important;
|
| 169 |
+
font-weight: bold !important;
|
| 170 |
+
}
|
| 171 |
+
.stChatFloatingInputContainer {
|
| 172 |
+
background-color: rgba(255, 255, 255, 0.8);
|
| 173 |
+
border-radius: 10px;
|
| 174 |
+
}
|
| 175 |
+
.stTextInput > div > div > input {
|
| 176 |
+
color: #333;
|
| 177 |
+
}
|
| 178 |
+
[data-testid="stChatMessage"] {
|
| 179 |
+
background-color: black !important;
|
| 180 |
+
color: gold !important;
|
| 181 |
+
border-radius: 10px;
|
| 182 |
+
}
|
| 183 |
+
[data-testid="stChatMessage"] p {
|
| 184 |
+
color: gold !important;
|
| 185 |
+
}
|
| 186 |
+
::-webkit-scrollbar {
|
| 187 |
+
width: 16px;
|
| 188 |
+
}
|
| 189 |
+
::-webkit-scrollbar-thumb {
|
| 190 |
+
background-color: #FFD700;
|
| 191 |
+
border-radius: 10px;
|
| 192 |
+
}
|
| 193 |
+
.st-spinner > div {
|
| 194 |
+
border-top-color: transparent;
|
| 195 |
+
border-right-color: transparent;
|
| 196 |
+
animation: spin 1s linear infinite;
|
| 197 |
+
}
|
| 198 |
+
@keyframes spin {
|
| 199 |
+
from { transform: rotate(0deg); }
|
| 200 |
+
to { transform: rotate(360deg); }
|
| 201 |
+
}
|
| 202 |
+
</style>
|
| 203 |
+
""",
|
| 204 |
+
unsafe_allow_html=True,
|
| 205 |
+
)
|
| 206 |
+
|
| 207 |
# --- Opciones adicionales ---
|
| 208 |
st.markdown("---")
|
| 209 |
temperatura = st.slider("🌡️ Temperatura", min_value=0.0, max_value=1.0, value=0.5, step=0.1)
|
|
|
|
| 243 |
st.title("🤖 RESTAURANTE SAZON BURGER 🍔✨-BOTIDINAMIX AI")
|
| 244 |
st.markdown("---")
|
| 245 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 246 |
# --- Botones de historial ---
|
| 247 |
if st.button("Buscar Historial"):
|
| 248 |
st.session_state.mostrar_historial = True
|
|
|
|
| 304 |
with st.chat_message("user"):
|
| 305 |
st.markdown(pregunta_usuario)
|
| 306 |
|
| 307 |
+
with st.spinner("Generando respuesta..."):
|
| 308 |
+
respuesta = obtener_respuesta(pregunta_usuario, texto_preprocesado, modelo="gpt-4", temperatura=0.5)
|
| 309 |
+
st.session_state.mensajes.append({"role": "assistant", "content": respuesta, "timestamp": time.time()})
|
| 310 |
+
with st.chat_message("assistant"):
|
| 311 |
+
st.markdown(respuesta)
|
| 312 |
|
| 313 |
guardar_historial(st.session_state.mensajes)
|
| 314 |
else:
|
|
|
|
| 316 |
|
| 317 |
# --- Lectura del menú desde CSV y creación de agentes ---
|
| 318 |
st.subheader("📋 Menú y Pedidos")
|
| 319 |
+
menu_csv = st.file_uploader("Sube el archivo CSV del menú", type=["csv"])
|
| 320 |
|
| 321 |
if menu_csv:
|
| 322 |
menu_df = leer_menu_csv(menu_csv)
|
| 323 |
st.success("Menú cargado exitosamente. Listo para tomar pedidos.")
|
| 324 |
st.write(menu_df)
|
| 325 |
|
|
|
|
|
|
|
|
|
|
| 326 |
# Captura de pedido
|
| 327 |
pedido_usuario = st.text_input("Ingresa tu pedido (separado por comas):")
|
| 328 |
if st.button("Tomar Pedido"):
|
| 329 |
if pedido_usuario:
|
| 330 |
+
confirmados = tomar_pedido_agente(pedido_usuario, menu_df)
|
| 331 |
+
st.info(f"Pedido confirmado: {confirmados}")
|
| 332 |
+
|
| 333 |
+
total = procesar_orden_agente(','.join(confirmados), menu_df)
|
| 334 |
+
st.success(f"Total del pedido: ${total}")
|
| 335 |
+
|
| 336 |
+
# Generar PDF de la orden
|
| 337 |
+
order_details = {item: {'price': menu_df[menu_df['item'] == item]['price'].values[0]} for item in confirmados}
|
| 338 |
+
pdf_path = generar_pdf_orden(order_details)
|
| 339 |
+
st.markdown(f"[Descargar PDF de la Orden]({pdf_path})", unsafe_allow_html=True)
|
| 340 |
else:
|
| 341 |
st.warning("Por favor, ingresa el pedido antes de continuar.")
|
| 342 |
|