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 并点击“创建新应用”
  2. 选择“从头开始”并为您的应用程序命名
  3. 选择您想要开发应用程序的工作区
  4. 在“OAuth & 权限”下,滚动到“范围”并添加这些机器人令牌范围:
    • app_mentions:read
    • chat:write
    • files:read
    • files:write
  5. 在同一“OAuth & 权限”页面,向上滚动并点击按钮将应用程序安装到您的工作区。
  6. 注意“Bot User OAuth Token”(以xoxb-开头),我们稍后会需要它
  7. 点击菜单栏中的“Socket Mode”。页面加载后,点击切换按钮以“启用Socket Mode”
  8. 给你的令牌起一个名字,比如socket-token,并复制生成的令牌(以xapp-开头),因为我们稍后会需要它。
  9. 最后,转到菜单栏中的“事件订阅”选项。点击切换按钮以“启用事件”并订阅app_mention机器人事件。

2. 编写一个Slack机器人

让我们从一个非常简单的Slack机器人开始编写,以确保一切正常。将以下Python代码写入名为bot.py的文件中,并粘贴上一节中步骤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 Client来查询上面提到的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侧边栏中“频道”旁边的“+”按钮,并按照提示创建一个新频道。

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

  1. 在你的新频道中,输入 /invite @YourBotName
  2. 从下拉菜单中选择您的机器人
  3. 点击“邀请到频道”

4. 就是这样!

现在你可以在任何频道中提到你的机器人,可以选择附加一张图片,它会用生成的Gradio应用程序代码来回应!

机器人将:

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

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

如果你从Gradio应用程序构建了一个Slack机器人,请随时在X上分享并标记Gradio账户,我们很乐意帮助你扩大影响力!