Streamlit
Streamlit is an open-source Python library that makes it easy to create and share beautiful, custom web apps for machine learning and data science.
This notebook goes over how to store and use chat message history in a
Streamlit
app. StreamlitChatMessageHistory
will store messages in
Streamlit session
state at
the specified key=
. The default key is "langchain_messages"
.
- Note,
StreamlitChatMessageHistory
only works when run in a Streamlit app. - You may also be interested in StreamlitCallbackHandler for LangChain.
- For more on Streamlit check out their getting started documentation.
You can see the full app example running here, and more examples in github.com/langchain-ai/streamlit-agent.
from langchain.memory import StreamlitChatMessageHistory
history = StreamlitChatMessageHistory(key="chat_messages")
history.add_user_message("hi!")
history.add_ai_message("whats up?")
history.messages
You can integrate StreamlitChatMessageHistory
into
ConversationBufferMemory
and chains or agents as usual. The history
will be persisted across re-runs of the Streamlit app within a given
user session. A given StreamlitChatMessageHistory
will NOT be
persisted or shared across user sessions.
from langchain.memory import ConversationBufferMemory
from langchain.memory.chat_message_histories import StreamlitChatMessageHistory
# Optionally, specify your own session_state key for storing messages
msgs = StreamlitChatMessageHistory(key="special_app_key")
memory = ConversationBufferMemory(memory_key="history", chat_memory=msgs)
if len(msgs.messages) == 0:
msgs.add_ai_message("How can I help you?")
from langchain.chains import LLMChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
template = """You are an AI chatbot having a conversation with a human.
{history}
Human: {human_input}
AI: """
prompt = PromptTemplate(input_variables=["history", "human_input"], template=template)
# Add the memory to an LLMChain as usual
llm_chain = LLMChain(llm=OpenAI(), prompt=prompt, memory=memory)
Conversational Streamlit apps will often re-draw each previous chat
message on every re-run. This is easy to do by iterating through
StreamlitChatMessageHistory.messages
:
import streamlit as st
for msg in msgs.messages:
st.chat_message(msg.type).write(msg.content)
if prompt := st.chat_input():
st.chat_message("human").write(prompt)
# As usual, new messages are added to StreamlitChatMessageHistory when the Chain is called.
response = llm_chain.run(prompt)
st.chat_message("ai").write(response)