はじめに
Hermes Agent を Slack から使えるようにすると、DM だけでなくチャンネル上でも AI エージェントに作業を依頼できます。
ただ、実際に複数の用途で使い始めると、すぐに次のような課題が出てきました。
- iOS 開発チャンネルでは、Swift / Xcode / iOS アプリの文脈で返してほしい
- 記事投稿チャンネルでは、Qiita 記事の作成や公開確認の文脈で返してほしい
- チャンネルごとに、最初に参照するローカルフォルダも変えたい
- 毎回「このチャンネルではこのスキルを使って」「このフォルダを見て」と言いたくない
そこで、Slack チャンネルごとに Hermes Agent の初期文脈を切り替える設定を入れました。
この記事では、その一連の取り組みをまとめます。
やりたかったこと
やりたかったのは、Slack のチャンネルを「作業コンテキスト」として扱うことです。
たとえば以下のようなイメージです。
| Slackチャンネル | 期待する文脈 | 主に参照するフォルダ | 自動で使いたいスキル |
|---|---|---|---|
| iOS開発チャンネル | Swift / Xcode / iOS開発 | ~/GitHub/make_ios_app |
ios-app-publishing |
| 記事投稿チャンネル | Qiita記事作成・編集・投稿 | ~/GitHub/qiita_article |
qiita-cli-publishing |
普通に Slack bot として Hermes を置くだけでも便利ですが、チャンネルごとの役割を覚えさせると、かなり実用的になります。
前提
この記事では、以下の状態を前提にしています。
- Hermes Agent の Gateway が動いている
- Slack 連携が済んでいる
- Slack App がチャンネル投稿を受け取れるようになっている
- Hermes の設定ファイル
~/.hermes/config.yamlを編集できる
Hermes の設定ファイルは、次のコマンドで場所を確認できます。
hermes config path
設定を編集したあとは、Gateway 側に反映するために再起動します。
hermes gateway restart
1. Slackチャンネルでbotを反応させる
まず、Slack の public channel で bot を反応させるには、Slack App 側で message.channels イベントを購読しておく必要があります。
DM だけで動いている状態だと、チャンネルに招待しても反応しないことがあります。
Slack App の Event Subscriptions で、Bot Events に以下を追加します。
app_mention
message.im
message.channels
private channel でも使う場合は、必要に応じて次も追加します。
message.groups
また、対象チャンネルには bot を招待しておきます。
/invite @your-bot-name
2. チャンネルごとのプロンプトを設定する
次に、Slack チャンネルごとのプロンプトを Hermes の設定に追加します。
今回使ったのは slack.channel_prompts です。
実際の設定イメージは以下です。
slack:
channel_prompts:
CXXXXXXXX01: This is the iOS development channel. Treat requests here as Swift, Xcode, iOS app development, build errors, App Store, and mobile app architecture work by default. Use /Users/yourname/GitHub/make_ios_app as the primary project folder when reading files or running commands for this channel, unless the user specifies a different path.
CXXXXXXXX02: This is the article publishing channel. Treat requests here as Qiita article drafting, editing, structure improvement, Qiita CLI publishing, updating, and publication checks by default. Use /Users/yourname/GitHub/engineer_article as the primary project folder when reading files or running commands for this channel, unless the user specifies a different path.
ポイントは、単に「このチャンネルは iOS 用です」と書くだけではなく、よく使う参照フォルダもプロンプトに含めたことです。
これにより、Hermes がファイルを読むときやコマンドを実行するときに、チャンネルに応じたプロジェクトフォルダを優先してくれるようになります。
もちろん、ユーザーが別のパスを明示した場合は、そちらを優先するように書いておきます。
3. チャンネルごとにスキルを自動ロードする
記事投稿チャンネルでは、Qiita CLI を使った記事作成・投稿の手順を毎回説明したくありません。
そこで、チャンネルにスキルを紐づけました。
slack:
channel_skill_bindings:
- id: CXXXXXXXX02
skills:
- qiita-cli-publishing
これで、記事投稿チャンネルでの会話では qiita-cli-publishing スキルが自動ロードされます。
このスキルには、たとえば以下のような運用ルールが入っています。
- Qiita CLI リポジトリの構成を先に確認する
- 新規記事は
npx qiita new <basename>を使う - 限定公開なら
private: trueにする - GitHub Actions で publish する場合は workflow の成功まで確認する
- publish 後に Qiita CLI bot が frontmatter を更新するので
git pull --ff-onlyする
つまり、Slack で「記事を書いて限定公開で投稿して」と依頼するだけで、Hermes 側が Qiita CLI の作業手順を思い出して動けるようになります。
4. hermes config set で入れる場合
手で config.yaml を編集してもよいですが、hermes config set でも設定できます。
たとえば、チャンネルプロンプトは以下のように設定できます。
hermes config set slack.channel_prompts.CXXXXXXXX01 'This is the iOS development channel. Treat requests here as Swift, Xcode, iOS app development, build errors, App Store, and mobile app architecture work by default. Use /Users/yourname/GitHub/make_ios_app as the primary project folder when reading files or running commands for this channel, unless the user specifies a different path.'
hermes config set slack.channel_prompts.CXXXXXXXX02 'This is the article publishing channel. Treat requests here as Qiita article drafting, editing, structure improvement, Qiita CLI publishing, updating, and publication checks by default. Use /Users/yourname/GitHub/engineer_article as the primary project folder when reading files or running commands for this channel, unless the user specifies a different path.'
スキル紐づけは配列になるので、最終的な YAML を確認しながら入れるのがおすすめです。
hermes config check
設定後は Gateway を再起動します。
hermes gateway restart
5. 実際に便利になったところ
この設定を入れる前は、Slack から Hermes に作業を頼むときに、毎回かなり前置きが必要でした。
たとえば記事投稿なら、次のように説明していました。
/Users/yourname/GitHub/engineer_article を見て、Qiita CLI のリポジトリとして扱って、public 配下に記事を作って、限定公開で投稿して...
チャンネル文脈を設定したあとは、記事投稿チャンネルで次のように言うだけでよくなります。
この内容、Qiita記事にできそう。書いて限定公開で投稿して
Hermes 側では、チャンネルから以下を判断できます。
- ここは記事投稿チャンネルである
- Qiita CLI リポジトリは
~/GitHub/engineer_articleである -
qiita-cli-publishingスキルを使うべきである - 限定公開なので frontmatter は
private: trueにする - publish 後は GitHub Actions と frontmatter 更新まで確認する
この「毎回の前置きを減らせる」効果がかなり大きいです。
6. 注意点
設定変更後は Gateway の再起動が必要
config.yaml を変更しただけでは、起動中の Gateway に反映されないことがあります。
変更後は次を実行します。
hermes gateway restart
チャンネルIDを使う
設定ではチャンネル名ではなく、Slack のチャンネルIDを使います。
チャンネル名は変更されることがありますが、チャンネルIDは安定しているためです。
プロンプトに書くパスは具体的にする
「プロジェクトフォルダを見て」ではなく、具体的な絶対パスを書いておくと安定します。
例:
Use /Users/yourname/GitHub/engineer_article as the primary project folder ...
スキルの自動ロードは用途が明確なチャンネルに向いている
すべてのチャンネルに大量のスキルを紐づけるよりも、用途がはっきりしたチャンネルにだけ設定するほうが扱いやすいです。
今回だと、記事投稿チャンネルに qiita-cli-publishing を紐づけるのは相性がよかったです。
まとめ
Slack チャンネルごとに Hermes Agent のプロンプト・スキル・参照フォルダを切り替えることで、チャンネル自体を作業コンテキストとして使えるようになりました。
今回やったことは次の3つです。
- Slack App でチャンネル投稿イベントを受け取れるようにする
-
slack.channel_promptsでチャンネルごとの初期文脈を設定する -
slack.channel_skill_bindingsで用途に応じたスキルを自動ロードする
これにより、Slack での依頼がかなり短くなりました。
「iOS 開発の話は iOS チャンネルで」「Qiita 記事投稿は記事投稿チャンネルで」という形にすると、Hermes Agent をチームの作業導線にかなり自然に組み込めます。