CODIGOSDIOS / utils /data_manager.py
Josedcape's picture
Update utils/data_manager.py
5541846 verified
import pandas as pd
import streamlit as st
from dotenv import load_dotenv
import openai
import os
# Configuración de la clave API
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
# Clases para la gestión de pedidos
class PedidoAgent:
def __init__(self, menu_csv_path):
self.menu_csv_path = menu_csv_path
self.menu_data = self.load_menu()
def load_menu(self):
try:
df_menu = pd.read_csv(self.menu_csv_path)
productos = df_menu["Producto"].tolist()
precios = df_menu["Precio"].tolist()
return {"productos": productos, "precios": precios}
except Exception as e:
st.error(f"Error al cargar el menú: {e}")
return None
def realizar_pedido(self, state):
if not self.menu_data:
st.warning("No se pudo cargar el menú.")
return
productos = self.menu_data["productos"]
precios = self.menu_data["precios"]
# Interfaz de usuario para seleccionar productos y cantidades
with st.form("pedido_form"):
producto_seleccionado = st.selectbox("Producto:", productos)
cantidad = st.number_input("Cantidad:", min_value=1, value=1)
submitted = st.form_submit_button("Agregar al pedido")
if submitted:
precio = precios[productos.index(producto_seleccionado)]
state.pedidos.append(
{"Producto": producto_seleccionado, "Cantidad": cantidad, "Precio": precio}
)
st.success("Pedido agregado correctamente")
# Mostrar el pedido actual
st.subheader("Pedido actual:")
if state.pedidos:
df_pedidos = pd.DataFrame(state.pedidos)
st.table(df_pedidos)
class CalculoPedidoAgent:
def calcular_total(self, state):
st.subheader("Resumen del Pedido")
if state.pedidos:
df_pedidos = pd.DataFrame(state.pedidos)
st.table(df_pedidos)
total = df_pedidos["Cantidad"].mul(df_pedidos["Precio"]).sum()
st.markdown(f"**Total: ${total:.2f}**")
else:
st.info("El pedido está vacío.")
# Función para obtener respuesta de OpenAI
def obtener_respuesta(pregunta, modelo="gpt-4", temperatura=0.5):
respuesta = openai.Completion.create(
engine=modelo,
prompt=f"Pregunta: {pregunta}\nRespuesta:",
max_tokens=150,
temperature=temperatura,
).choices[0].text.strip()
return respuesta
# Configuración de Streamlit
st.set_page_config(page_title="Asistente Teológico", page_icon="📖")
# Estilos CSS personalizados
st.markdown(
"""
<style>
body {
background: #f2f3f5;
color: #333;
}
.stButton>button {
background-color: #4CAF50;
color: white;
border-radius: 10px;
}
.stTextInput>div>div>input {
border: 1px solid #4CAF50;
border-radius: 10px;
}
.stMarkdown>div>p {
color: #4CAF50;
font-weight: bold;
}
.stAudio {
margin-top: 20px;
border: 2px solid #4CAF50;
border-radius: 10px;
}
.stFileUploader>div>div>input {
border: 1px solid #4CAF50;
border-radius: 10px;
}
</style>
""",
unsafe_allow_html=True,
)
# Encabezado
st.image("biblia.jpg")
st.title("📖 Asistente Teológico - BOTIDINAMIX AI")
st.markdown("Bienvenido al Asistente Teológico, donde puedes preguntar sobre interpretaciones y reflexiones bíblicas.")
# Chat
st.subheader("🗣️ Chat con el Asistente")
if 'mensajes' not in st.session_state:
st.session_state.mensajes = []
for mensaje in st.session_state.mensajes:
with st.chat_message(mensaje["role"]):
st.markdown(mensaje["content"])
pregunta_usuario = st.text_input("Escribe tu pregunta sobre la Biblia:")
if st.button("Enviar"):
if pregunta_usuario:
st.session_state.mensajes.append({"role": "user", "content": pregunta_usuario, "timestamp": time.time()})
with st.chat_message("user"):
st.markdown(pregunta_usuario)
with st.spinner("Generando respuesta..."):
respuesta = obtener_respuesta(pregunta_usuario)
st.session_state.mensajes.append({"role": "assistant", "content": respuesta, "timestamp": time.time()})
with st.chat_message("assistant"):
st.markdown(respuesta)
else:
st.warning("Por favor, ingresa una pregunta antes de enviar.")
# Gestión de pedidos
st.subheader("📋 Gestión de Pedidos")
menu_csv_path = "menu.csv" # Ruta al archivo CSV del menú
if 'pedidos' not in st.session_state:
st.session_state.pedidos = []
pedido_agent = PedidoAgent(menu_csv_path)
calculo_pedido_agent = CalculoPedidoAgent()
pedido_agent.realizar_pedido(st.session_state)
calculo_pedido_agent.calcular_total(st.session_state)