How to add a reset_button that reset the conversation and chat history in streamlit webapp

Summary

How to add a reset_button that reset the st.session_state.conversation and chat history from the handle_userinput? Right now I have the reset_button created in β€œmain” function but this simply does not work (it just continue with the conversation). Any thoughts?

Sorry for the basic question but I’m completely new to coding.

Steps to reproduce

Code snippet:

reset_button_key = "reset_button"
reset_button = st.button("Reset Chat",key=reset_button_key)
if reset_button:
    st.session_state.conversation = None
    st.session_state.chat_history = None
import streamlit as st 
from dotenv import load_dotenv
from PyPDF2 import PdfReader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings, HuggingFaceInstructEmbeddings
from langchain.vectorstores import FAISS
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain
from langchain.chains import LLMChain
from langchain.chains.conversational_retrieval.prompts import CONDENSE_QUESTION_PROMPT
from htmlTemplates import css, bot_template, user_template

def get_pdf_text(pdf_docs):
    text = ""
    for pdf in pdf_docs:
        pdf_reader = PdfReader(pdf)
        for page in pdf_reader.pages:
            text += page.extract_text()
    return text


def get_text_chunks(text):
    text_splitter = CharacterTextSplitter(
        separator="\n",
        chunk_size=1000,
        chunk_overlap=20,
        length_function=len
    )
    chunks = text_splitter.split_text(text)
    return chunks


def get_vectorstore(text_chunks):
    embeddings = OpenAIEmbeddings()
    #embeddings = HuggingFaceInstructEmbeddings(model_name="hkunlp/instructor-xl")
    vectorstore = FAISS.from_texts(texts=text_chunks, embedding=embeddings)
    return vectorstore


def get_conversation_chain(vectorstore):
    llm = ChatOpenAI(temperature=0)
    memory = ConversationBufferMemory(memory_key='chat_history', return_messages=True)
    conversation_chain = ConversationalRetrievalChain.from_llm(
        llm=llm,
        retriever=vectorstore.as_retriever(),
        chain_type="stuff",
        memory=memory
    )
    return conversation_chain
    
    

def handle_userinput(user_question):
    if st.session_state.conversation is None:
        return
    response = st.session_state.conversation({'question': user_question})
    st.session_state.chat_history = response['chat_history']
    chat_history_reversed = reversed(st.session_state.chat_history)

    for i, message in enumerate(chat_history_reversed):
        if i % 2 == 0:
            st.write(bot_template.replace(
                "{{MSG}}", message.content), unsafe_allow_html=True)
        else:
            st.write(user_template.replace(
                "{{MSG}}", message.content), unsafe_allow_html=True)
            

    
            
        

def main():
    load_dotenv()
    st.set_page_config(page_title="Chat with multiple PDFs", page_icon=":books:")
    st.write(css, unsafe_allow_html=True)
    
    if "conversation" not in st.session_state:
            st.session_state.conversation = None
    if "chat_history" not in st.session_state:
            st.session_state.chat_history = None


    st.header("Chat with multiple PDFs :books:")
    user_question = st.text_input("Ask a question about your documents:")
    if user_question:
        handle_userinput(user_question)
    
    reset_button_key = "reset_button"
    reset_button = st.button("Reset Chat",key=reset_button_key)
    if reset_button:
        st.session_state.conversation = None
        st.session_state.chat_history = None
        

    with st.sidebar:
        st.subheader("Your documents")
        pdf_docs = st.file_uploader("Upload your PDFs here and click on 'Process'", accept_multiple_files=True)
        if st.button("Process"):
            with st.spinner("Processing"):
                #get pdf text
                raw_text = get_pdf_text(pdf_docs)

                #get the text chunks
                text_chunks = get_text_chunks(raw_text)

                #create vector store 
                vectorstore = get_vectorstore(text_chunks)

                #create conversation chain 
                st.session_state.conversation = get_conversation_chain(vectorstore)

    

if __name__== '__main__':
    main()

I’m using Python on VScode

Hi @quantuan125, and welcome to our forums! :raised_hands:

It seems like you need to rely on on_click for your button.

You could set up something like this:

def reset_conversation():
  st.session_state.conversation = None
  st.session_state.chat_history = None
st.button('Reset Chat', on_click=reset_conversation)

This would replace this snippet in your code:

reset_button_key = "reset_button"
reset_button = st.button("Reset Chat",key=reset_button_key)
if reset_button:
    st.session_state.conversation = None
    st.session_state.chat_history = None

Let me know if that does the trick.

Best,
Charly

3 Likes

This topic was automatically closed 2 days after the last reply. New replies are no longer allowed.