0xf

日記だよ

strands-agents の slack 連携 - 初手

手軽なんだけど開発途上〜って感じ。

  • tools/src/strands_tools/slack.py at main · strands-agents/tools · GitHub のコメントに書いてることがおおむね全て。
  • 下環境変数が設定されてれば動く。
    • SLACK_BOT_TOKEN: xoxb-...
    • SLACK_APP_TOKEN: xapp-...
  • 要求パーミッションは以下。
    • chat:write
    • reactions:write
    • channels:history
    • app_mentions:read
    • channels:read
    • reactions:read
    • groups:read
    • im:read
    • mpim:read
  • システムプロンプトで「Use slack send message tool to communicate back.」って書いているので、エージェントに slack_send_message をツール設定しないとうまく動かない。
    • STRANDS_SLACK_AUTO_REPLY 野設定による自動リプライとは別に動くので、挙動が読みづらかった。slack_send_message をツールとして登録した上で STRANDS_SLACK_AUTO_REPLY は false にしておくとよさそう。ただ、slack_send_message は Tool Calling なので、素朴には自動リプライでメッセージ送信できた方が効率的だとは思う。作りが悪い。
  • 内部でシステムプロンプトを書き換えているので、外から渡したエージェントのプロンプトは使われない。strands_tools.slack.SLACK_SYSTEM_PROMPT を書き換えるしかない。
  • 現状、全てのメッセージ(botを除外するとか自分の発言には反応しないなどの最低限のフィルタはある)がAgentに渡される。メッセージの内容によってフィルタする手段は STRANDS_SLACK_LISTEN_ONLY_TAG による単一キーワード指定しか用意されていない。
from strands import Agent
import strands_tools.slack
from strands_tools.slack import slack, slack_send_message
import time

strands_tools.slack.SLACK_SYSTEM_PROMPT = f"""あなたは日本語で会話する魔王です。
今はSlackを巡回してユーザーの支援をするエージェントをしています。語尾は「マオ」です。
{strands_tools.slack.SLACK_SYSTEM_PROMPT}"""

def main():
    agent = Agent(
        name="Slack Agent",
        description="AI Agent in Slack / The name is Mao",
        tools=[slack_send_message],
        callback_handler=None
    )

    print(slack(action="start_socket_mode", agent=agent))
    
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        slack(action="stop_socket_mode")

if __name__ == "__main__":
    main()

これでローカルでソケットモードで立ち上がり、Slackとお話が可能になる。