Gradio 月活用户达到 100 万!

阅读更多
Gradio logo
  1. 聊天机器人
  2. 从 Gradio 应用创建 Slack 机器人

🚀 从 Gradio 应用创建 Slack 机器人 🚀

你可以使你的 Gradio 应用作为 Slack 机器人提供,以便你的 Slack 工作区中的用户可以直接与之互动。

它是如何工作的?

Slack 机器人将监听频道中提及它的消息。当它收到消息(可以包含文本和文件)时,它将通过 Gradio 的内置 API 将其发送到你的 Gradio 应用。你的机器人将回复从 API 收到的响应。

由于 Gradio 的 API 非常灵活,你可以非常轻松地创建支持文本、图像、音频、流媒体、聊天记录和各种其他功能的 Slack 机器人。

先决条件

  • 安装最新版本的 gradioslack-bolt
pip install --upgrade gradio slack-bolt~=1.0
  • 拥有一个正在运行的 Gradio 应用。此应用可以本地运行或在 Hugging Face Spaces 上运行。在本示例中,我们将使用 Gradio Playground Space,它接收图像和/或文本,并生成用于生成相应 Gradio 应用的代码。

现在,我们准备开始!

1. 创建一个 Slack 应用

  1. 前往 api.slack.com/apps 并点击 “Create New App”(创建新应用)
  2. 选择 “From scratch”(从头开始),并为你的应用命名
  3. 选择你要在其中开发应用的工作区
  4. 在 “OAuth & Permissions”(OAuth 和权限)下,滚动到 “Scopes”(范围)并添加以下 Bot Token Scopes(机器人令牌范围)
    • app_mentions:read
    • chat:write
    • files:read
    • files:write
  5. 在同一个 “OAuth & Permissions”(OAuth 和权限)页面中,向上滚动并点击按钮以将应用安装到你的工作区。
  6. 记下出现的 “Bot User OAuth Token”(机器人用户 OAuth 令牌)(以 xoxb- 开头),稍后我们需要它
  7. 点击菜单栏中的 “Socket Mode”(Socket 模式)。页面加载后,点击切换按钮以 “Enable Socket Mode”(启用 Socket 模式)
  8. 为你的令牌命名,例如 socket-token,并复制生成的令牌(以 xapp- 开头),稍后我们需要它。
  9. 最后,转到菜单栏中的 “Event Subscription”(事件订阅)选项。点击切换按钮以 “Enable Events”(启用事件),并订阅 app_mention 机器人事件。

2. 编写一个 Slack 机器人

让我们从编写一个非常简单的 Slack 机器人开始,以确保一切正常运行。在名为 bot.py 的文件中编写以下 Python 代码,粘贴上一步骤 6 和步骤 8 中的两个令牌。

from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler

SLACK_BOT_TOKEN = # PASTE YOUR SLACK BOT TOKEN HERE
SLACK_APP_TOKEN = # PASTE YOUR SLACK APP TOKEN HERE

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()

如果一切正常,我们就可以添加 Gradio 特定的代码了。我们将使用 Gradio Python 客户端 查询上面提到的 Gradio Playground Space。这是更新后的 bot.py 文件

from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler

SLACK_BOT_TOKEN = # PASTE YOUR SLACK BOT TOKEN HERE
SLACK_APP_TOKEN = # PASTE YOUR SLACK APP TOKEN HERE

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):   
    # Replace markdown links with slack format and remove code language specifier after triple backticks
    pattern = r'\[(.*?)\]\((.*?)\)'
    cleaned = re.sub(pattern, r'<\2|\1>', message)
    cleaned = re.sub(r'```\w+\n', '```', cleaned)
    return cleaned.strip()

@app.event("app_mention")
def handle_app_mention_events(body, say):
    # Extract the message content without the bot mention
    text = body["event"]["text"]
    bot_user_id = body["authorizations"][0]["user_id"]
    clean_message = text.replace(f"<@{bot_user_id}>", "").strip()
    
    # Handle images if present
    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
    
    # Submit to Gradio and send responses back to Slack
    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(app, SLACK_APP_TOKEN)
    handler.start()

3. 将机器人添加到你的 Slack 工作区

现在,在你想要使用机器人的 Slack 工作区中创建一个新频道或导航到现有频道。点击 Slack 侧边栏中 “Channels”(频道)旁边的 “+” 按钮,并按照提示创建新频道。

最后,邀请你的机器人加入频道

  1. 在你的新频道中,输入 /invite @YourBotName
  2. 从下拉列表中选择你的机器人
  3. 点击 “Invite to Channel”(邀请到频道)

4. 完成!

现在,你可以在它所在的任何频道中提及你的机器人,可以选择附加图像,它将回复生成的 Gradio 应用代码!

机器人将

  1. 监听提及
  2. 处理任何附加的图像
  3. 将文本和图像发送到你的 Gradio 应用
  4. 将响应流式传输回 Slack 频道

这只是一个基本示例 - 你可以扩展它以处理更多类型的文件,添加错误处理,或与不同的 Gradio 应用集成!

如果你用 Gradio 应用构建了一个 Slack 机器人,欢迎在 X (Twitter) 上分享并标记 Gradio 官方账号,我们很乐意帮助你推广!