16.2 项目十五:Gradio应用拓展为Slack Bot

Slack可以将人员、项目、应用和AI代理整合在一起,进行人员协作、项目管理、工具集成,并可使用人工智能Slack AI及智能代理Agentforce提供服务,Slack官网地址🖇️链接16-5。将Gradio应用拓展到Slack,创建Slack Bot,让Slack工作区中的成员直接与之互动,下面逐步讲述部署过程。
工作原理。该Slack Bot会监听频道中提及它的消息,当收到消息时(可包含文本或文件),后端运行程序会通过Gradio内置API将内容发送至已部署的Gradio应用,并将API返回的响应进行回显。得益于Gradio API的高度灵活性,用户可以轻松创建支持文本、图片、音频、实时视频流、聊天记录等丰富功能的Slack Bot。

开始之前,安装最新版gradio和slack-bolt库,安装命令如下所示:pip install --upgrade gradio slack-bolt~=1.0。确保已部署可运行的Gradio应用(可运行于本地或Spaces),本示例使用与16.1节相同的Gradio Playground Bot。

16.2.1 创建并配置Slack应用

创建并配置Slack应用的步骤包括创建Slack工作区、创建Slack App、授权并获取OAuth Tokens、生成socket-token及订阅app_mention事件,操作步骤较繁琐,容易出错,请读者按照教程一步步操作。

创建Slack工作区。访问Slack Apps🖇️链接16-6,在创建Slack账户或使用已有邮箱登录后,在没有创建自己的工作区之前,界面如图16-13所示:
在这里插入图片描述

图16-13

在创建App之前需先创建工作区,单击"Create a workspace",之后还需再点一遍确认。然后输入工作区名称gradio_union_slack(根据需要修改),设置名称和照片,可跳过邀请同事,需填写当前团队工作,最后点击使用免费版本完成创建。

创建Slack应用。还是访问Slack Apps,选择“Create New App -> From Scratch”,为应用命名GradioPlaygroundBot,选择或新建要开发应用的目标工作区,如之前创建的gradio_union_slack,然后点击“Create App”,可看到应用ID、客户端ID及验证令牌等信息,如图16-14所示:
在这里插入图片描述

图16-14

授权并获取OAuth Tokens。单击左侧导航栏"OAuth & Permissions",滚动至"Scopes",在Bot Token Scopes点击“Add an OAuth Scope”并添加:

  • app_mentions:read(读取提及消息):查看会话中的消息(需应用已加入该会话)。
  • chat:write(聊天消息写入):以GradioPlaygroundBot身份发送消息。
  • files:read(文件读取):查看已添加应用的频道和会话中的共享文件。
  • files:write(文件写入):以应用身份上传、编辑和删除频道和会话中的文件。

添加完成后,如图16-15所示:
在这里插入图片描述

图16-15

滚动到同一页面顶部,点击“Install to gradio_union_slack”,可看到应用在工作空间gradio_union_slack中可见以及可操作权限如图16-16所示:
在这里插入图片描述

图16-16

点击"Allow"后跳转回"OAuth & Permissions"页面,并在OAuth Tokens下得到Bot User OAuth Token:xoxb-X,保存为SLACK_BOT_TOKEN,如图16-17所示:
在这里插入图片描述

图16-17

生成socket-token。点击左侧菜单栏"Socket Mode",在Connect using Socket Mode,点击切换键“Enable Socket Mode”开启Socket模式,如图16-18所示:
在这里插入图片描述

图16-18

在弹出的对话框中,为Socket令牌命名(如gradio_socket_token),单击“Generate”生成令牌:xapp-X,保存为SLACK_APP_TOKEN。如图16-19所示:
在这里插入图片描述

图16-19

订阅事件app_mention。单击左侧导航栏的"Event Subscription",在"Enable Events"区域单击切换键toggle以启用该事件,使Slack应用可以订阅并接收Slack事件通知(例如当用户添加表情或创建文件时),通知将发送至用户指定的URL。

在“Subscribe to bot events”区域,应用可以订阅接收Bot User有权访问的事件(例如频道中的新消息)。在此单击“Add Bot User Event”,订阅机器人事件app_mention,仅订阅提及用户的应用程序或机器人的消息事件。若用户在此添加事件,系统将自动添加所需的OAuth权限范围。最终效果如图16-20所示:
在这里插入图片描述

图16-20

最后单击右下角的“Save changes”。Slack App创建及设置完成!

16.2.2 编写Slack Bot代码

本节编写Slack Bot基础及详细版代码,并对其代码进行详细解读。
首先,编写一个基础版Slack机器人来验证基础功能。如代码16-4所示:

代码16-4
# slack_bot.py
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
SLACK_BOT_TOKEN = "xoxb-XXX"
SLACK_APP_TOKEN = "xapp-XXX"
app = App(token=SLACK_BOT_TOKEN)

@app.event("app_mention")
def handle_app_mention_events(body, say):
    user_id = body["event"]["user"]
    say(f"Hi <@{user_id}>! You mentioned me and said: {body['event']['text']}")
if __name__ == "__main__":
    handler = SocketModeHandler(app, SLACK_APP_TOKEN)
    handler.start()

Socket Mode表示通过WebSocket接收事件,无需公网URL(适合开发/测试环境)。当有人@机器人时触发,say()在相同频道回复消息的便捷方法。通过命令python slack_bot.py运行。然后添加Gradio专用代码,使用Gradio的Python客户端调用Gradio Playground Bot,更新后的slack_bot.py文件内容如代码16-5所示:

代码16-5
from gradio_client import Client, handle_file
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
import os, re, httpx

SLACK_BOT_TOKEN = "xoxb-XXX"
SLACK_APP_TOKEN = "xapp-XXX"
slack_app = App(token=SLACK_BOT_TOKEN)
gradio_client = Client("abidlabs/gradio-playground-bot")

def download_image(url, filename):
    headers = {"Authorization": f"Bearer {SLACK_BOT_TOKEN}"}
    response = httpx.get(url, headers=headers)
    image_path = f"./images/{filename}"
    os.makedirs("./images", exist_ok=True)
    with open(image_path, "wb") as f:
        f.write(response.content)
    return image_path

def slackify_message(message):   
    pattern = r'\[(.*?)\]\((.*?)\)'
    cleaned = re.sub(pattern, r'<\2|\1>', message)
    cleaned = re.sub(r'```\w+\n', '```', cleaned)
    return cleaned.strip()

@slack_app.event("app_mention")
def handle_app_mention_events(body, say):
    text = body["event"]["text"]
    bot_user_id = body["authorizations"][0]["user_id"]
    clean_message = text.replace(f"<@{bot_user_id}>", "").strip()
    files = []
    if "files" in body["event"]:
        for file in body["event"]["files"]:
            if file["filetype"] in ["png", "jpg", "jpeg", "gif", "webp"]:
                image_path = download_image(file["url_private_download"], file["name"])
                files.append(handle_file(image_path))
                break
    for response in gradio_client.submit(
        message={"text": clean_message, "files": files},
    ):
        cleaned_response = slackify_message(response[-1])
        say(cleaned_response)

if __name__ == "__main__":
    handler = SocketModeHandler(slack_app, SLACK_APP_TOKEN)
    handler.start()

通过Socket Mode适配器启动,之后阻塞运行,开始监听事件,解读如下:
(1)首先,引入相关库和定义相关TOKEN,再分别通过SLACK_BOT_TOKEN和Space ID创建SLACK应用slack_app和Gradio客户端gradio_client。
(2)然后,定义图像下载函数download_image和将信息整理为Slack格式的函数slackify_message,其逻辑简单不再赘述。
(3)接着,看主程序中SocketModeHandler处理程序,使用SLACK_APP_TOKEN标识开启用户创建的slack_app的Soket模式,然后启动。
(4)当Slakc Bot被提及时,触发slack_app的事件app_mention,此时调用函数handle_app_mention_events。它首先清理信息,去掉机器人用户标识符;然后判断是否有枚举文件类型中的文件,当存在时下载文件;接着将信息和文件发给gradio_client获得回复response;最后将response中内容整理成slack格式,通过say发送到Slack Bot进行回显。运行后输出如下:

Loaded as API: https://abidlabs-gradio-playground-bot.hf.space ✔
⚡ Bolt slack_app is running!

通过代码解读可以看到,本例定义的slack_app通过SLACK_BOT_TOKEN与Slack中创建的App关联并获取授权,而SLACK_APP_TOKEN则开启了slack_app的Socket模式。当SocketModeHandler启动时,slack_app会通过SLACK_BOT_TOKEN关联到GradioPlaygroundBot及其授权,并通过SLACK_APP_TOKEN与Channel建立Socket通道;然后,当在Slack的频道中提及GradioPlaygroundBot时,会触发slack_app的事件app_mention,由此调用函数handle_app_mention_events进行处理;接着对Slack消息进行处理,比如净化消息并下载文件,并将消息发送到Gradio客户端;最后将Gradio应用的回复response进行Slack格式化处理,通过函数say发送到channel另一端的Slack Bot进行回显。

16.2.3 将机器人添加到Slack工作区

在Slack工作区中,除了定义App,还需要创建用于消息传输的频道Channels。现在,在想要使用机器人的Slack工作区中新建或进入现有频道channel,然后将聊天机器人加入频道。步骤如下:
新建频道channel。选择工作区,比如用户创建的gradio_union_slack,单击工作区侧边栏"Channels"下的标有Add channels的"+"按钮,如图16-21所示:
在这里插入图片描述

图16-21

选择“Create a new channel”,只需输入名称并邀请成员即可创建。当然也可以使用现有的channel,从图16-21可以看到之前已创建的channel。

将机器人加入频道。步骤如下:在新频道中输入/invite @机器人名称;或者直接@机器人名称,系统会提示"You mentioned @XXX, but they are not in this channel.",是否加入channel,选择添加即可。添加后效果如图16-22所示:
在这里插入图片描述

图16-22

16.2.4 操作机器人及功能扩展

使用Slack Bot。现在Slack用户可以在机器人的频道@GradioPlaygroundBot,并选择性地附加图片,发送后机器人就会用Gradio应用生成的代码进行回复!比如上传图片并配文:@GradioPlaygroundBot make this app。此时可将Gradio Playground Bot的程序部署到本地或自己的Hugging Face Spaces中,设置好ANTHROPIC_API_KEY并更改slack_bot.py中gradio_client的地址后,Slack窗口收到的正常回复类似图16-23所示:
在这里插入图片描述

图16-23

功能及扩展。该机器人将实现以下功能:①监听被提及的消息;②处理所有附加图片;③将文本和图片发送至Gradio应用;④将Gradio应用的响应内容实时传回Slack频道。这只是一个基础示例,可以扩展它来处理更多文件类型、添加错误处理机制或集成其他的Gradio应用!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐