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.")