Here’s a demo (note this is using the main branch on GitHub; ChatBox has a few issues in v1.1.0)
from typing import List, Dict
import param
import panel as pn
from langchain.llms import OpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
pn.extension(template="bootstrap")
class OpenAIConversation(param.Parameterized):
openai_key = param.String(
default=None,
doc="""
OpenAI API key; if not set, will try using env var.""",
)
temperature = param.Number(
default=0.5,
bounds=(0, 1),
doc="""
The model temperature; higher values will result in more random outputs.""",
)
def __init__(self, **params):
llm = OpenAI(temperature=0.5, openai_api_key=self.openai_key)
self.chain = ConversationChain(llm=llm, memory=ConversationBufferMemory())
self.chat_box = pn.widgets.ChatBox()
self.chat_box.param.watch(self._chat, "value")
# decorator to disable the chat box while the AI is thinking
def _disable_inputs(func):
def inner(self, *args, **kwargs):
try:
self.chat_box.disabled = True
func(self, *args, **kwargs)
finally:
self.chat_box.disabled = False
return inner
@_disable_inputs
def _chat(self, event) -> None:
"""
Chat with the AI. This method is called whenever the user sends a message.
"""
# user_messages = [{"You": "Your input"}, {"AI": "A response"}, ...]
user_message = event.new[-1]
input = user_message.get("You")
if input is None:
return
self.chat_box.append({"AI": self.chain.predict(input=input)})
def view(self):
return self.chat_box.servable()
openai_conversation = OpenAIConversation()
openai_conversation.view()
Or a very stripped down version:
from typing import List, Dict
import panel as pn
from langchain.llms import OpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
pn.extension(template="bootstrap")
def chat(user_messages: List[Dict[str, str]]) -> None:
# user_messages = [{"You": "Your input"}, {"AI": "A response"}, ...]
user_message = user_messages[-1]
input = user_message.get("You")
if input is None:
return
chat_box.append({"AI": conversation.predict(input=input)})
llm = OpenAI(temperature=0.5)
conversation = ConversationChain(llm=llm, memory=ConversationBufferMemory())
chat_box = pn.widgets.ChatBox()
pn.bind(chat, user_messages=chat_box, watch=True)
chat_box.servable()