mirror of
https://github.com/Mintplex-Labs/langchain-python.git
synced 2026-07-21 00:35:23 -04:00
c28990d871
A new implementation of `StreamlitCallbackHandler`. It formats Agent thoughts into Streamlit expanders. You can see the handler in action here: https://langchain-mrkl.streamlit.app/ Per a discussion with Harrison, we'll be adding a `StreamlitCallbackHandler` implementation to an upcoming [Streamlit](https://github.com/streamlit/streamlit) release as well, and will be updating it as we add new LLM- and LangChain-specific features to Streamlit. The idea with this PR is that the LangChain `StreamlitCallbackHandler` will "auto-update" in a way that keeps it forward- (and backward-) compatible with Streamlit. If the user has an older Streamlit version installed, the LangChain `StreamlitCallbackHandler` will be used; if they have a newer Streamlit version that has an updated `StreamlitCallbackHandler`, that implementation will be used instead. (I'm opening this as a draft to get the conversation going and make sure we're on the same page. We're really excited to land this into LangChain!) #### Who can review? @agola11, @hwchase17
80 lines
3.1 KiB
Python
80 lines
3.1 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING, Optional
|
|
|
|
from langchain.callbacks.base import BaseCallbackHandler
|
|
from langchain.callbacks.streamlit.streamlit_callback_handler import (
|
|
LLMThoughtLabeler as LLMThoughtLabeler,
|
|
)
|
|
from langchain.callbacks.streamlit.streamlit_callback_handler import (
|
|
StreamlitCallbackHandler as _InternalStreamlitCallbackHandler,
|
|
)
|
|
|
|
if TYPE_CHECKING:
|
|
from streamlit.delta_generator import DeltaGenerator
|
|
|
|
|
|
def StreamlitCallbackHandler(
|
|
parent_container: DeltaGenerator,
|
|
*,
|
|
max_thought_containers: int = 4,
|
|
expand_new_thoughts: bool = True,
|
|
collapse_completed_thoughts: bool = True,
|
|
thought_labeler: Optional[LLMThoughtLabeler] = None,
|
|
) -> BaseCallbackHandler:
|
|
"""Construct a new StreamlitCallbackHandler. This CallbackHandler is geared towards
|
|
use with a LangChain Agent; it displays the Agent's LLM and tool-usage "thoughts"
|
|
inside a series of Streamlit expanders.
|
|
|
|
Parameters
|
|
----------
|
|
parent_container
|
|
The `st.container` that will contain all the Streamlit elements that the
|
|
Handler creates.
|
|
max_thought_containers
|
|
The max number of completed LLM thought containers to show at once. When this
|
|
threshold is reached, a new thought will cause the oldest thoughts to be
|
|
collapsed into a "History" expander. Defaults to 4.
|
|
expand_new_thoughts
|
|
Each LLM "thought" gets its own `st.expander`. This param controls whether that
|
|
expander is expanded by default. Defaults to True.
|
|
collapse_completed_thoughts
|
|
If True, LLM thought expanders will be collapsed when completed.
|
|
Defaults to True.
|
|
thought_labeler
|
|
An optional custom LLMThoughtLabeler instance. If unspecified, the handler
|
|
will use the default thought labeling logic. Defaults to None.
|
|
|
|
Returns
|
|
-------
|
|
A new StreamlitCallbackHandler instance.
|
|
|
|
Note that this is an "auto-updating" API: if the installed version of Streamlit
|
|
has a more recent StreamlitCallbackHandler implementation, an instance of that class
|
|
will be used.
|
|
|
|
"""
|
|
# If we're using a version of Streamlit that implements StreamlitCallbackHandler,
|
|
# delegate to it instead of using our built-in handler. The official handler is
|
|
# guaranteed to support the same set of kwargs.
|
|
try:
|
|
from streamlit.external.langchain import (
|
|
StreamlitCallbackHandler as OfficialStreamlitCallbackHandler, # type: ignore # noqa: 501
|
|
)
|
|
|
|
return OfficialStreamlitCallbackHandler(
|
|
parent_container,
|
|
max_thought_containers=max_thought_containers,
|
|
expand_new_thoughts=expand_new_thoughts,
|
|
collapse_completed_thoughts=collapse_completed_thoughts,
|
|
thought_labeler=thought_labeler,
|
|
)
|
|
except ImportError:
|
|
return _InternalStreamlitCallbackHandler(
|
|
parent_container,
|
|
max_thought_containers=max_thought_containers,
|
|
expand_new_thoughts=expand_new_thoughts,
|
|
collapse_completed_thoughts=collapse_completed_thoughts,
|
|
thought_labeler=thought_labeler,
|
|
)
|