Commands are a great way to capture user intent in a deterministic way.

Attributes

id
str
Identifier for the command, this will be used in the UI.
icon
str
The lucide icon name for the command. See https://lucide.dev/icons/.
description
str
The description of the command.
button
boolean
Whether to display the command as a button in the message composer.
persistent
boolean
Whether to keep the command active after the user sent the message.

Set available commands

You can set the available commands at any moment using the cl.context.emitter.set_commands method.
import chainlit as cl

commands = [
    {"id": "Picture", "icon": "image", "description": "Use DALL-E"},
    {"id": "Search", "icon": "globe", "description": "Find on the web"},
    {
        "id": "Canvas",
        "icon": "pen-line",
        "description": "Collaborate on writing and code",
    },
]

@cl.on_chat_start
async def start():
    await cl.context.emitter.set_commands(commands)

@cl.on_message
async def message(msg: cl.Message):
    if msg.command == "Picture":
        # User is using the Picture command
        pass
    pass

The user selecting a command