Streamlit Kolommen

🗂️ Terug naar start
🚀 🗂️ Steamlit Start

Streamlit kolommen documentatie

Ik wilde een pagina maken in een Streamlit GUI die bestond uit 2 kolommen. In de linker kolom een een chat gedeelte en in de rechterkolom ruimte om aanvullende data te laatste. Het plaatsen van een chat in een kolom is in streamlit nog niet zo simpel. Hieronder de oplossing die ik er voor bedacht heb:

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"""
                        <div style="text-align: center;">
                            {self.a3dcont.get_sematic_links(semadata)}</div>
                        """
                        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:

chat_container = st.container(border=True, height=600)