import streamlit as st import streamlit.components.v1 as components import asyncio # Your services from services.zep_service import zep_service from services.anam_service import anam_service from config.settings import settings # ------------------------------- # STREAMLIT UI CONFIG # ------------------------------- st.set_page_config( page_title="Zep AI Assistant", layout="wide" ) st.title("AI Consultant") st.caption("Powered by Zep Knowledge Graph + Anam AI Avatar") st.markdown("""
""", unsafe_allow_html=True) # Custom CSS for cleaner UI st.markdown(""" """, unsafe_allow_html=True) # ------------------------------- # Session Setup (Zep) # ------------------------------- if "session_id" not in st.session_state: st.session_state.session_id = None if "user_id" not in st.session_state: st.session_state.user_id = None if "anam_session_token" not in st.session_state: st.session_state.anam_session_token = None # Sidebar for session management with st.sidebar: st.header("Session Management") # User name input user_name = st.text_input( "Your Name", value="Demo User", key="user_name_input") if st.button("Initialize New Session", type="primary"): # Generate user_id from name user_id = user_name.lower().replace(" ", "-") session_id = f"session-{user_id}" loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) try: # Create Zep user loop.run_until_complete( zep_service.create_user( user_id=user_id, first_name=user_name.split()[0] if user_name else "Demo" ) ) # Create Zep thread loop.run_until_complete( zep_service.create_thread( thread_id=session_id, user_id=user_id ) ) # Clear old session data st.session_state.user_id = user_id st.session_state.session_id = session_id st.session_state.anam_session_token = None st.success(f"Session initialized for {user_name}!") st.rerun() except Exception as e: st.error(f"Error initializing session: {e}") # Display current session info if st.session_state.session_id: st.divider() st.info(f"**Active User:** {st.session_state.user_id}") st.caption(f"Session: {st.session_state.session_id}") if st.button("Restart Anam Session", type="secondary"): st.session_state.anam_session_token = None st.success("Anam session ended!") st.rerun() st.caption("End the session when done to save costs") # ------------------------------- # MAIN: ANAM AVATAR INTERFACE # ------------------------------- if st.session_state.session_id: if st.session_state.anam_session_token is None: loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) session_data = loop.run_until_complete( anam_service.create_session_token( persona_name="Zep Assistant", system_prompt="You are a helpful AI assistant with access to relevant knowledge to assist the user.", avatar_id=settings.anam_avatar_id, voice_id=settings.anam_voice_id, llm_id="CUSTOMER_CLIENT_V1" # Explicitly set custom LLM mode ) ) if not session_data or "sessionToken" not in session_data: st.error("Failed to create Anam session token.") st.stop() st.session_state.anam_session_token = session_data["sessionToken"] st.success("Anam session created with custom LLM!") session_token = st.session_state.anam_session_token # Center the avatar # Full HTML block for Anam avatar # NOTE: Calls FastAPI backend at http://localhost:8000 anam_html = f"""
Initializing…
""" # Render the avatar components.html(anam_html, height=650, scrolling=False) else: st.info("Please initialize a session from the sidebar to start.")