跳转到主要内容
⚠️ 本文档由 AI 自动翻译。如有任何不准确之处,请参考 英文原版
本指南将带你构建一个由 AI 驱动的 Slack Bot,它可以直接在 Slack 中回答用户问题。如果你之前没有开发过插件,请先阅读插件开发快速入门指南

项目背景

Slack Bot 插件让你的团队能够直接在 Slack 中与 LLM 聊天,将 AI 带到对话已经发生的地方。 Slack 是一个开放的实时通信平台,拥有强大的 API,包括一个易于构建的基于 webhook 的事件系统。本指南使用该系统创建 Slack Bot 插件,如下图所示:
Slack 机器人示意图
本指南中出现两个相似的术语:
  • Slack Bot:Slack 平台上的聊天机器人——一个可以实时交互的虚拟用户。
  • Slack Bot 插件:Dify 市场中的一个插件,用于连接 Dify 应用与 Slack。本指南将展示如何构建它。

工作原理

  1. 用户向 Slack Bot 发送消息 当 Slack 中的用户向 Bot 发送消息时,Slack Bot 会立即向 Dify 平台发出 webhook 请求。
  2. Slack 将消息转发给 Slack Bot 插件 Dify 平台触发 Slack Bot 插件,该插件将消息转发给 Dify 应用——类似于邮件系统将邮件投递到收件人地址。你通过 Slack 的 API 设置 Slack webhook 地址并在插件中输入来建立此连接。插件处理 Slack 请求并将其转发到 Dify 应用,LLM 分析输入并生成响应。
  3. 插件将响应返回给 Slack 一旦插件收到 Dify 应用的回复,它就会通过相同的路径将 LLM 的答案发送回 Slack Bot,用户就能在聊天的地方获得响应。

前提条件

要创建 Slack App,请前往 Slack API 平台,从头创建一个应用,并选择将其部署到的工作区。
创建 Slack App
  1. 启用 Webhooks
启用 Webhooks
  1. 在你的 Slack 工作区安装应用
在你的 Slack 工作区安装应用
  1. 获取 OAuth 令牌以供插件开发使用:
获取 OAuth 令牌以供后续插件开发使用

1. 开发插件

在开始编码之前,请确保你已阅读快速入门:开发扩展插件或已经构建过 Dify 插件。

1.1 初始化项目

运行以下命令来设置你的插件开发环境:
dify plugin init
按照提示提供基本项目信息。选择 extension 模板,并授予 AppsEndpoints 权限。 有关在插件中反向调用 Dify 服务的更多详细信息,请参阅反向调用:App
插件权限

1.2 编辑配置表单

插件需要两条信息:哪个 Dify 应用处理回复,以及用于验证机器人响应的 Slack App 令牌。将这两个字段添加到插件的表单中。 修改 group 目录中的 YAML 文件(例如 group/slack.yaml)。表单的文件名来自你创建插件时提供的信息,请相应调整路径。 示例代码 slack.yaml
settings:
  - name: bot_token
    type: secret-input
    required: true
    label:
      en_US: Bot Token
      zh_Hans: Bot Token
      pt_BR: Token do Bot
      ja_JP: Bot Token
    placeholder:
      en_US: Please input your Bot Token
      zh_Hans: 请输入你的 Bot Token
      pt_BR: Por favor, insira seu Token do Bot
      ja_JP: ボットトークンを入力してください
  - name: allow_retry
    type: boolean
    required: false
    label:
      en_US: Allow Retry
      zh_Hans: 允许重试
      pt_BR: Permitir Retentativas
      ja_JP: 再試行を許可
    default: false
  - name: app
    type: app-selector
    required: true
    label:
      en_US: App
      zh_Hans: 应用
      pt_BR: App
      ja_JP: アプリ
    placeholder:
      en_US: the app you want to use to answer Slack messages
      zh_Hans: 你想要用来回答 Slack 消息的应用
      pt_BR: o app que você deseja usar para responder mensagens do Slack
      ja_JP: あなたが Slack メッセージに回答するために使用するアプリ
endpoints:
  - endpoints/slack.yaml
有两个配置字段值得仔细了解:
  - name: app
    type: app-selector
    scope: chat
  • type:设置为 app-selector,允许用户在使用此插件时将消息转发到特定的 Dify 应用。
  • scope:设置为 chat,意味着该插件只能与 Agent、chatbot 或 chatflow 等应用类型交互。
最后,在 endpoints/slack.yaml 文件中,将请求方法更改为 POST,以便端点能够处理传入的 Slack 消息。 示例代码 endpoints/slack.yaml
path: "/"
method: "POST"
extra:
  python:
    source: "endpoints/slack.py"

2. 编辑功能代码

修改 endpoints/slack.py 文件并添加以下代码:
import json
import traceback
from typing import Mapping
from werkzeug import Request, Response
from dify_plugin import Endpoint
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError


class SlackEndpoint(Endpoint):
    def _invoke(self, r: Request, values: Mapping, settings: Mapping) -> Response:
        """
        Invokes the endpoint with the given request.
        """
        retry_num = r.headers.get("X-Slack-Retry-Num")
        if (not settings.get("allow_retry") and (r.headers.get("X-Slack-Retry-Reason") == "http_timeout" or ((retry_num is not None and int(retry_num) > 0)))):
            return Response(status=200, response="ok")
        data = r.get_json()

        # Handle Slack URL verification challenge
        if data.get("type") == "url_verification":
            return Response(
                response=json.dumps({"challenge": data.get("challenge")}),
                status=200,
                content_type="application/json"
            )

        if (data.get("type") == "event_callback"):
            event = data.get("event")
            if (event.get("type") == "app_mention"):
                message = event.get("text", "")
                if message.startswith("<@"):
                    message = message.split("> ", 1)[1] if "> " in message else message
                    channel = event.get("channel", "")
                    blocks = event.get("blocks", [])
                    blocks[0]["elements"][0]["elements"] = blocks[0].get("elements")[0].get("elements")[1:]
                    token = settings.get("bot_token")
                    client = WebClient(token=token)
                    try:
                        response = self.session.app.chat.invoke(
                            app_id=settings["app"]["app_id"],
                            query=message,
                            inputs={},
                            response_mode="blocking",
                        )
                        try:
                            blocks[0]["elements"][0]["elements"][0]["text"] = response.get("answer")
                            result = client.chat_postMessage(
                                channel=channel,
                                text=response.get("answer"),
                                blocks=blocks
                            )
                            return Response(
                                status=200,
                                response=json.dumps(result),
                                content_type="application/json"
                            )
                        except SlackApiError as e:
                            raise e
                    except Exception as e:
                        err = traceback.format_exc()
                        return Response(
                            status=200,
                            response="Sorry, I'm having trouble processing your request. Please try again later." + str(err),
                            content_type="text/plain",
                        )
                else:
                    return Response(status=200, response="ok")
            else:
                return Response(status=200, response="ok")
        else:
            return Response(status=200, response="ok")

3. 调试插件

前往 Dify 平台并获取插件的远程调试地址和密钥。
获取远程调试地址和密钥
回到你的插件项目,复制 .env.example 文件并将其重命名为 .env,然后填入调试详情:
INSTALL_METHOD=remote
REMOTE_INSTALL_URL=debug.dify.ai:5003
REMOTE_INSTALL_KEY=********-****-****-****-************
启动插件:
python -m main
你现在应该可以在 Dify 插件管理页面的工作区中看到你的插件已安装,其他团队成员也可以访问它。

配置插件端点

在 Dify 的插件管理页面,找到新安装的测试插件并创建一个新端点。输入名称和你的 Bot Token,然后选择你想要连接的应用。
测试插件
保存后,将生成一个 POST 请求 URL:
生成的 POST 请求 URL
接下来,完成 Slack App 设置:
  1. 启用事件订阅
    启用事件订阅
    粘贴你上面生成的 POST 请求 URL。
    粘贴你上面生成的 POST 请求 URL
  2. 授予所需权限
    授予所需权限

4. 验证插件

插件通过 self.session.app.chat.invoke 调用 Dify 应用,传入 app_idquery 等参数,并将响应返回给 Slack Bot。再次运行 python -m main 重启插件,然后检查 Slack 是否正确显示 Dify 应用的回复:
Slack 显示 Dify 应用回复

5. 打包插件(可选)

确认插件工作正常后,使用以下命令打包。该命令会在当前目录中生成一个 slack_bot.difypkg 文件——这就是你的最终插件包。有关详细的打包步骤,请参阅打包为本地文件并分享
# 将 ./slack_bot 替换为你实际的插件项目路径。

dify plugin package ./slack_bot
恭喜——你已成功开发、测试和打包了一个插件!

6. 发布插件(可选)

你现在可以将其上传到 Dify 市场仓库 进行公开发布。在发布之前,请确保你的插件符合发布到 Dify 市场指南。一旦获得批准,你的代码将合并到主分支,插件将在 Dify 市场 上线。

相关资源

延伸阅读

要获取完整的 Dify 插件项目示例,请访问 GitHub 仓库。你还可以找到包含完整源代码和实现细节的其他插件。 如果你想了解更多关于插件开发的内容,请查看以下资源: 快速入门 插件接口文档
Edit this page | Report an issue