第16章(2)——项目十五:Gradio应用拓展为Slack Bot
- 16.2 项目十五:Gradio应用拓展为Slack Bot
- 16.2.1 创建并配置Slack应用
- 16.2.2 编写Slack Bot代码
- 16.2.3 将机器人添加到Slack工作区
- 16.2.4 操作机器人及功能扩展
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所示:
在创建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所示:
授权并获取OAuth Tokens。单击左侧导航栏"OAuth & Permissions",滚动至"Scopes",在Bot Token Scopes点击“Add an OAuth Scope”并添加:
- app_mentions:read(读取提及消息):查看会话中的消息(需应用已加入该会话)。
- chat:write(聊天消息写入):以GradioPlaygroundBot身份发送消息。
- files:read(文件读取):查看已添加应用的频道和会话中的共享文件。
- files:write(文件写入):以应用身份上传、编辑和删除频道和会话中的文件。
添加完成后,如图16-15所示:
滚动到同一页面顶部,点击“Install to gradio_union_slack”,可看到应用在工作空间gradio_union_slack中可见以及可操作权限如图16-16所示:
点击"Allow"后跳转回"OAuth & Permissions"页面,并在OAuth Tokens下得到Bot User OAuth Token:xoxb-X,保存为SLACK_BOT_TOKEN,如图16-17所示:
生成socket-token。点击左侧菜单栏"Socket Mode",在Connect using Socket Mode,点击切换键“Enable Socket Mode”开启Socket模式,如图16-18所示:
在弹出的对话框中,为Socket令牌命名(如gradio_socket_token),单击“Generate”生成令牌:xapp-X,保存为SLACK_APP_TOKEN。如图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所示:
最后单击右下角的“Save changes”。Slack App创建及设置完成!
16.2.2 编写Slack Bot代码
本节编写Slack Bot基础及详细版代码,并对其代码进行详细解读。
首先,编写一个基础版Slack机器人来验证基础功能。如代码16-4所示:
# slack_bot.pyfromslack_boltimportAppfromslack_bolt.adapter.socket_modeimportSocketModeHandler SLACK_BOT_TOKEN="xoxb-XXX"SLACK_APP_TOKEN="xapp-XXX"app=App(token=SLACK_BOT_TOKEN)@app.event("app_mention")defhandle_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所示:
fromgradio_clientimportClient,handle_filefromslack_boltimportAppfromslack_bolt.adapter.socket_modeimportSocketModeHandlerimportos,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")defdownload_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)withopen(image_path,"wb")asf:f.write(response.content)returnimage_pathdefslackify_message(message):pattern=r'\[(.*?)\]\((.*?)\)'cleaned=re.sub(pattern,r'<\2|\1>',message)cleaned=re.sub(r'```\w+\n','```',cleaned)returncleaned.strip()@slack_app.event("app_mention")defhandle_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"inbody["event"]:forfileinbody["event"]["files"]:iffile["filetype"]in["png","jpg","jpeg","gif","webp"]:image_path=download_image(file["url_private_download"],file["name"])files.append(handle_file(image_path))breakforresponseingradio_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所示:
选择“Create a new channel”,只需输入名称并邀请成员即可创建。当然也可以使用现有的channel,从图16-21可以看到之前已创建的channel。
将机器人加入频道。步骤如下:在新频道中输入/invite @机器人名称;或者直接@机器人名称,系统会提示"You mentioned @XXX, but they are not in this channel.",是否加入channel,选择添加即可。添加后效果如图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所示:
功能及扩展。该机器人将实现以下功能:①监听被提及的消息;②处理所有附加图片;③将文本和图片发送至Gradio应用;④将Gradio应用的响应内容实时传回Slack频道。这只是一个基础示例,可以扩展它来处理更多文件类型、添加错误处理机制或集成其他的Gradio应用!