from dotenv import load_dotenv
from langgraph_tools.nodes import ChatBotState
from langgraph_tools.graph import create_chat_graph
from langchain_core.messages import HumanMessage
import streamlit as st
import re
def validate_phone(phone: str) -> bool:
"""Valida que el número de teléfono tenga el formato correcto"""
phone_pattern = re.compile(r"^\d{10}$")
return bool(phone_pattern.match(phone))
def initialize_session_state():
"""Inicializa el estado de la sesión si no existe"""
if "messages" not in st.session_state:
st.session_state.messages = []
if "phone" not in st.session_state:
st.session_state.phone = None
if "current_state" not in st.session_state:
st.session_state.current_state = None
if "graph" not in st.session_state:
load_dotenv()
st.session_state.graph = create_chat_graph()
if "waiting_for_response" not in st.session_state:
st.session_state.waiting_for_response = False
def main():
st.markdown("
DonConfiao - Asistente Virtual
",
unsafe_allow_html=True)
# Inicializar estado de sesión
initialize_session_state()
# Solicitar número de teléfono en el sidebar
phone = st.sidebar.text_input(
"Ingresa tu número de teléfono (10 dígitos):",
value=st.session_state.phone if st.session_state.phone else "",
key="phone_input"
)
# Validar teléfono
if phone:
if validate_phone(phone):
st.session_state.phone = phone
if st.session_state.current_state is None:
st.session_state.current_state = ChatBotState(
messages=[],
query="",
category="",
response="",
phone=phone
)
else:
st.sidebar.error("Número inválido. Debe contener exactamente 10 dígitos.")
return
# Si no hay teléfono válido, no mostrar el chat
if not st.session_state.phone:
st.info("Por favor, ingresa un número de teléfono válido para comenzar.")
return
# Mostrar historial de mensajes
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# Input del usuario
user_input = st.chat_input("¿En qué puedo ayudarte hoy?")
if user_input and st.session_state.current_state:
# Agregar mensaje del usuario al historial inmediatamente
st.session_state.messages.append({"role": "user", "content": user_input})
st.session_state.waiting_for_response = True
# Mostrar el mensaje del usuario inmediatamente
with st.chat_message("user"):
st.markdown(user_input)
# Mostrar indicador de carga mientras se procesa la respuesta
with st.chat_message("assistant"):
with st.spinner("Generando respuesta..."):
# Actualizar estado y obtener respuesta
st.session_state.current_state["query"] = user_input
try:
result = st.session_state.graph.invoke(st.session_state.current_state)
# Actualizar estado
st.session_state.current_state = result
if "phone" not in st.session_state.current_state:
st.session_state.current_state["phone"] = st.session_state.phone
# Agregar respuesta al historial
response_text = f"**Categoría:** {result['category']}\n\n{result['response']}"
st.session_state.messages.append({"role": "assistant", "content": response_text})
st.markdown(response_text)
except Exception as e:
st.error(f"Error: {str(e)}")
st.session_state.waiting_for_response = False
if __name__ == "__main__":
main()