Spaces:
Sleeping
Sleeping
| 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) | |