手軽なんだけど開発途上〜って感じ。
- 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を書き換えるしかない。- たぶん意図しない挙動ぽいので文句を書いておいた。 https://github.com/strands-agents/tools/issues/302
- 現状、全てのメッセージ(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とお話が可能になる。