from appbase.functions import A3DFunctions
from appbase.sematicrouter import A3DSematicRouter
from appbase.teksten import A3DTeksten
from catviseur.viseurcontroler import A3DControler
import streamlit as st
from langchain_core.messages import AIMessage, HumanMessage
class CATviseur:
def __init__(self):
self.a3dfunc = A3DFunctions()
self.a3dteks = A3DTeksten()
self.a3dcont = A3DControler()
self.a3dsema = A3DSematicRouter()
def pageIni(self):
# INI data ==================================
# Initialize caht history
if "chat_history" not in st.session_state:
st.session_state['chat_history'] = []
# INI teller (om CATja eerste bericht te tonen)
if "teller" not in st.session_state:
st.session_state['teller'] = 0
# INI unieke ID om chat op te slaan (nodig voor eventuele logging)
if "chat_id" not in st.session_state:
st.session_state['chat_id'] = self.a3dfunc.maak_unieke_id(st.session_state['client_id'])
# Volgorde van de chatgeschiedenis (nodig voor eventuele logging)
if "volgorde" not in st.session_state:
st.session_state['volgorde'] = 0
# Pre vraag tekst
if "prevraagtekst" not in st.session_state:
st.session_state['prevraagtekst'] = self.a3dfunc.getPreVraagTekst()
# VIEW ======================================
self.buildView()
def buildView(self):
col1, col2 = st.columns([2, 2])
user_query = ''
response = ''
# Linker kolom ****************************************************
with col1:
# Gebruik een container om de chatgeschiedenis weer te geven
chat_container = st.container(border=True, height=600)
# Toon het eerste bericht van CATja
if len(st.session_state['chat_history']) == 0:
with chat_container:
with st.chat_message("AI", avatar='😺'):
st.markdown(self.a3dteks.get_intro_tekst_chat(st.session_state['naam']), unsafe_allow_html=True)
# Invoer van de gebruiker weer te geven
input_container = st.container()
with input_container:
# Gebruik een invoerveld om berichten van de gebruiker te ontvangen
user_query = st.chat_input(placeholder="Type hier je vraag aan CATja...")
if user_query is not None and user_query != "":
# Preloader
with st.spinner(f"🔍😺 {user_query[:400]}..."):
# VRAAG GEBRUIKER ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
response = self.a3dcont.get_rag_data(user_query)
st.session_state.chat_history.append(HumanMessage(content=user_query))
st.session_state.chat_history.append(AIMessage(content=response))
# Log AI dialog via API ########################
self.a3dcont.log_ai_dialog(user_query, response)
# reset chat knop +++++++++++++++++++++++++++++++++++++
if st.button("🔄 Nieuwe Chat 🪄 *Chat Geheugen Wissen*"):
self.a3dcont.reset_chat( self.a3dfunc.maak_unieke_id(st.session_state['client_id']) )
# plaats de chatgeschiedenis in de container
with chat_container:
for message in st.session_state.chat_history:
if isinstance(message, AIMessage):
with st.chat_message("AI", avatar='😺'):
st.write(message.content)
elif isinstance(message, HumanMessage):
with st.chat_message("Human", avatar='👤'):
st.write(message.content)
# Rechter kolom ****************************************************
with col2:
top_rechts_container = st.container()
if len(st.session_state['chat_history']) == 0:
with top_rechts_container:
st.success(self.a3dteks.get_uitleg_start() , icon="💡")
else:
with top_rechts_container:
st.subheader("⚓ Huidige Chat Onderwerp:")
# Eerste vraag van gebruiker = chatonderwerp
chatonderwerp = st.session_state['chat_history'][0].content
st.success(f"**{chatonderwerp}**", icon="🗨️")
uitleg = self.a3dteks.get_nieuwonderwerpuitleg()
st.info(f"{uitleg}", icon="💡")
# reset chat knop 2 +++++++++++++++++++++++++++++++
if st.button("🔄 Nieuw Chat Onderwerp"):
self.a3dcont.reset_chat( self.a3dfunc.maak_unieke_id(st.session_state['client_id']) )
st.markdown('---', unsafe_allow_html=True)
coll1, coll2, coll3 = st.columns([1, 2, 1])
with coll2:
semadata = self.a3dsema.route_catsistent(chatonderwerp)
centered_text = f"""
{self.a3dcont.get_sematic_links(semadata)}
"""
st.markdown(centered_text, unsafe_allow_html=True)
cat = CATviseur()
cat.pageIni()
In dit geval moet de chatcontainer een hoogte hebben anders werk het niet: