Panel Chat Interface

Another version inspired by Marc’s

import panel as pn
import param

pn.extension()


class PreferenceInput(pn.widgets.CompositeWidget):
    value = param.Parameter()

    def __init__(self, **params):
        super().__init__(**params)

        self._preference_widget = pn.widgets.RadioBoxGroup(
            options=["", "blue", "red", "green"], name="preference"
        )
        pn.bind(self._update_value, self._preference_widget, watch=True)
        self._composite[:] = [
            "What is your preference?",
            self._preference_widget,
        ]

    def _update_value(self, preference):
        self.value = f"My preference is {preference}."
        chat.stream(f"I like {preference} too")
        chat.widgets = [pn.chat.ChatAreaInput()]


def choose_a_color(contents, user, instance):
    if "color" in contents:
        instance.widgets = [preference_input]
        return "What is your preference?"
    return contents


preference_input = PreferenceInput()
chat = pn.chat.ChatInterface(callback=choose_a_color)
chat.show()