要让你的 Chainlit 应用在 Discord 上可用,你需要创建一个 Discord 应用并设置必要的环境变量。

工作原理

Discord 机器人会监听频道和私信中提及它的消息。它会根据上下文将回复发送到专门的讨论串或私信。

预览

支持的特性

消息流式处理元素音频询问用户聊天历史记录聊天配置反馈

安装 Discord 库

Discord 库不包含在 Chainlit 的依赖项中。你需要手动安装它。

pip install discord

创建 Discord 应用

首先,导航到Discord 应用开发者门户。在这里,你应该会找到一个写着“New Application”(新建应用)的按钮。点击此按钮后,选择从头开始创建应用的选项。

创建 Discord 应用

设置环境变量

导航到 Bot 选项卡,然后点击 Reset Token。这将使令牌可见。复制它,并将其设置为 Chainlit 应用中的一个环境变量。

复制 Bot 令牌

DISCORD_BOT_TOKEN=your_bot_token

设置 Intent

导航到 Bot 选项卡并启用 MESSAGE CONTENT INTENT,然后点击 Save Changes(保存更改)。

设置 Intent

本地工作

如果你在本地工作,你需要将本地 Chainlit 应用暴露到互联网上,以便接收来自 Discord 的消息。你可以使用 ngrok 来实现此目的。

ngrok http 8000

启动 Chainlit 应用

如果 Chainlit 应用未运行,Discord 机器人将无法与之通信。

对于本示例,我们将使用这个简单的应用

my_app.py
import chainlit as cl

@cl.on_message
async def on_message(msg: cl.Message):
    # Access the original discord message
    print(cl.user_session.get("discord_message"))
    # Access the discord user
    print(cl.user_session.get("user"))

    # Access potential attached files
    attached_files = msg.elements

    await cl.Message(content="Hello World").send()

启动 Chainlit 应用。

使用 -h 参数不打开默认的 Chainlit UI,因为我们正在使用 Discord。

chainlit run my_app.py -h

将 Discord 机器人安装到你的工作区

导航到 OAuth2 选项卡。在 OAuth2 URL 生成器中,选择 bot 范围。

配置安装

然后,在 Bot Permissions(机器人权限)部分,选择以下权限。

通过查看 URL 中权限参数的值,你可以检查是否选择了正确的权限。它应该为 377957238848

机器人权限

复制生成的 URL 并将其粘贴到浏览器中。系统会提示你将机器人添加到服务器。选择要添加机器人的服务器。

完成了!现在你应该可以通过 Discord 与你的 Chainlit 应用进行交互了。

聊天历史记录

聊天历史记录可以直接通过 Discord 查看。

from chainlit.discord.app import client as discord_client

import chainlit as cl
import discord

@cl.on_message
async def on_message(msg: cl.Message):
    # The user session resets on every Discord message.
    # So we add previous chat messages manually.
    messages = cl.user_session.get("messages", [])
    channel: discord.abc.MessageableChannel = cl.user_session.get("discord_channel")

    if channel:
        cl.user_session.get("messages")
        discord_messages = [message async for message in channel.history(limit=10)]

        # Go through last 10 messages and remove the current message.
        for x in discord_messages[::-1][:-1]:
            messages.append({
                "role": "assistant" if x.author.name == discord_client.user.name else "user",
                "content": x.clean_content if x.clean_content else x.channel.name # first message is empty
            })

    # Your code here