Bot モード
目次
Bot モードは、Hermes のプロファイル を、名前を持った Bot の一覧に変えるものです。Bot はそれぞれ独自の役割、モデル、記憶、スキル、アバターを持ちます。繰り返しの作業をこなし、グループチャットで一緒に検討し、互いに直接メッセージを送り合います。専門の Bot を一度作れば、あとはずっとそこにいて、クリック 1 つで呼び出せます。
Bot モードは デスクトップアプリ に組み込み済みで、既定で有効です。インストールの作業は要りません。左側のサイドバーで Sessions の隣に Bots タブとして現れ、Bots タブを開いている間は会話の横に Routines の枠が並びます。
Bots のペイン
一覧には、エージェントのプロファイルごとに 1 行ずつ、アバター、直近のメッセージの抜粋、時刻が表示されます。
- Bot をクリックすると、そのチャットに移ります。どの Bot にも、生まれた瞬間に作られて固定される、変わることのない Bot Chat の会話があります。
- Active now — 一覧の上に出る帯には、いま働いている Bot がすべて表示されます。ゲートウェイが処理中のプロファイルに加えて、直近 90 秒以内に発言した Bot が対象です。それぞれのチップをクリックすると、その Bot のチャットが開きます。この帯が一覧の並びを変えることはなく、全員が待機中になると消えます。
- Search は入力に応じて一覧を絞り込みます。
- Bot を隠す — 行を右クリックして Hide Bot を選ぶと、使っていない Bot を一覧と Active now の帯から外せます。隠すのは表示上のことだけです。@ での指名は変わらず届き、グループチャットへの参加もそのままで、定期タスクも動き続けます。1 つでも隠すと、ペインのヘッダーに目のアイコンが現れます。クリックすると、隠した Bot が薄く表示された状態で元の位置に出てくるので、右クリックして Unhide Bot を選べば戻せます。隠した Bot が通知を出すことはありませんが、未読は静かに溜まっていき、何かあれば目のアイコンに点が付きます。隠しているかどうかは Bot のプロファイル情報に保存されるため、同じバックエンドにつないだどのデスクトップでも同じ状態になります。
Bot を作る
一覧の New Agent を押します。手早く作るなら Name、Title、Description の 3 つを埋めるだけで、Bot は数秒で誕生し、新しい Bot Chat の最初のメッセージとして自己紹介します。
Advanced を開くと、設定できることのすべてが現れます。
- 既存のプロファイルから複製 — 別の Bot の設定、スキル、SOUL、記憶を引き継いで始められます。まっさらから始めたい場合は Fresh profile を選びます。
- Create empty — 同梱のスキルをすべて省いて、最小構成のプロファイルにします。
- モデルとプロバイダの指定 — その Bot だけのモデルを与えられます。Hermes が知っているプロバイダとモデルの組み合わせなら何でも使え、Bot ごとに違うモデルを並べて動かせます。指定しなければ、起動したプロファイルの設定を引き継ぎます。
- 独自の SOUL.md — その Bot の人格と、常に守らせたい指示です。
- スキル、ツールセット、MCP サーバーごとの有効化 — その専門家に必要な機能だけをチェックします。
- 鍵の共有 — 既定では、新しい Bot は主プロファイルと 1 つの OAuth・トークンの組を共有するため、認証情報を更新し合って互いに無効化してしまうことがありません。(古いゲートウェイでは代わりに認証情報が複製されます。動作はしますが、別々のものになります。)
どの端末に置くかを選ぶ(Create on)
Settings → Connections に複数の接続を登録していると、New Agent のダイアログに Create on の選択欄が増えます。端末を選ぶと、プロファイルはその端末のバックエンドに作られ、開いているウィンドウがゲートウェイを乗り換えることはありません。新しい Bot は接続先の Bot として一覧に現れ(同じ名前が複数の端末にある場合は @name-device の形の呼び名が付きます)、その Bot と話すと処理はその端末へ回されます。
接続が 1 つだけなら(多くの場合はこちらです)選択欄は出ず、Bot はいまつないでいる端末に作られます。従来どおりの動きです。
離れた端末に作るときの注意点は次のとおりです。
- 複製元は*対象の*端末にあるプロファイル(その
default)です。離れた端末には、手元のプロファイルはありません。 - Capabilities タブは対象の端末のバックエンドに固定されるため、作成中に設定したスキル、ツール、MCP サーバーは、その Bot が住むことになる端末に反映されます。(古いデスクトップでは、離れた端末が相手のときスキル・ツール・MCP を控えとして記録する形になりますが、どちらも対象の端末の一覧を読みます。)
- ダイアログを取り消すと、作りかけのプロファイルは、それが作られた端末の側で破棄されます。
Edit Profile(Bot を右クリック)を使うと、動作中のプロファイルに対して同じ画面をいつでも開けます。アバター、肩書き、説明、モデルの指定、スキル、ツールセット、MCP サーバー、SOUL.md の全文を変更できます。
Duplicate(右クリック)は、設定、スキル、SOUL.md、記憶、見た目まで含めて Bot を丸ごと複製します。Delete Profile はデスクトップのプロファイルメニューと同じ削除の確認をはさんだうえで、1 つを完全に消します。既定のプロファイルは削除できません。
アバター
どの Bot にも顔があります。
- Blob faces(既定) — Bot の名前から決まる、柔らかい輪郭の顔です。同じ名前なら同じ顔がずっと続きます。New Agent で名前を打っている間、顔もそれに合わせて変わります。Randomize で引き直し、Lock face で気に入った顔を名前が変わっても保てます。6 種類の輪郭(round、organic、boxy、nub、cloud、sun)のどれかだけを固定し、残りは名前から決めることもできます。
- Geometric faces — おなじみの 7 形状 × 10 色で、Bot が働いている間は目がまばたきしながら動きます。
- 画像のアップロード — 好きな絵を使えます。
- AI が生成した似顔絵 — 画像生成のバックエンドを設定していれば、その場で生成されます(標準の
image.generateRPC を使うので、手元のゲートウェイでも離れたゲートウェイでも動きます)。 - ドット絵のペット — petdex のギャラリー から選んだ相棒が、Bot が働いている間アバターの横で跳ねます。端末で
hermes petsを実行するとギャラリーを見られます。
Bot の見た目、肩書き、説明はバックエンド側のプロファイル情報として保存されるため、そのバックエンドにつないだどのデスクトップでも、同じ Bot は同じ姿で現れます。
Routines
Routines のペインは、繰り返しの作業をそれを担う Bot に結び付けます。「毎朝、受信箱をまとめて」という作業は、それを受け持つ Bot のすぐ隣に置かれます。このペインは Bots タブを開いている間だけチャットの横に並び、Sessions に戻ると引っ込みます(古いデスクトップでは常に表示されたままです)。予定は専用の選択画面で組み立てます(まず頻度を選び、そのあと必要な項目だけを指定します)。Advanced の欄では、Hermes の予定を表す文字列をそのまま書けます。
Routines の正体は、[bot:<name>] <routine> という名前を付けた Hermes の cron ジョブ です。そのため hermes cron list にも、本体側の Cron のページにも出てきます。実行結果はその Bot 自身のチャット履歴に残るので、ふだんその Bot と話す場所にそのまま結果が届きます。
グループとグループチャット
手元の Bot を右クリックして Manage groups を選ぶと、いくつでもグループチャットに追加したり外したりできます。既存のグループを個別に選ぶことも、その場で新しく作ることもできます。手元の参加状況は、バックエンドと同期される Bot のプロファイル情報に保存されるため、複数のデスクトップをまたいでそのプロファイルに付いて回ります。従来の 1 グループだけを持つ古いプロファイルもそのまま動きます。接続先の Bot は New Group Chat の選択画面から参加し、部屋の共有状態の中でもどこの端末のものかが分かる形で扱われます。
部屋は 1 台のデスクトップではなく、ゲートウェイに付いて回ります。 各部屋の直近のやり取り、メンバー、画像、名前は、デスクトップがつないでいるすべてのゲートウェイの共有プロファイル情報に写し取られます。ゲートウェイごとに版を持つので、2 台のデスクトップが同時に書き込んでも、上書きし合わずに統合されます。同じゲートウェイに対して別の端末(ローカルネットワーク、Tailscale、どこからでも)で Hermes Desktop を開けば、その部屋は履歴ごと現れます。ゲートウェイだけを使うクライアントからも見えます。部屋には内部的に変わらない識別子があるため、名前を変えても変わるのはどこでも表示名だけです。部屋を解散すればすべてのクライアントで恒久的に消え、そのとき接続していなかったクライアントでも同じです。同じ名前のグループを作り直せば、それは正真正銘の新しい部屋になります。ゲートウェイが止まったり取り除かれたりしても失われるものはありません。つないでいた各デスクトップが部屋の全体を手元に保持しており、つなぎ直したゲートウェイへあらためて配ります。(やり取りの完全な記録は各デスクトップの手元の保存領域に残り、共有される写しは直近の履歴に限った投影です。)
グループは、Bot との 1 対 1 のやり取りと同じ、動きの新しい順に並ぶ一覧の中で独立した行になります。Bot はいくつのグループに属していても 1 対 1 の行を 1 つだけ保ちます。一方、グループにはそれぞれ部屋の行があり、メンバー数、直近のメッセージの抜粋、時刻、あなたの判断待ちかどうかが表示されます。
グループの行(2〜6 体の Bot)で Open chat を押すと、全員で進める共有の部屋が開きます。
- あなたのメッセージをきっかけに、メンバーの発言が最大3 巡、順番に進みます。@ で指名された Bot が応じ(誰も指名しなければ全員が応じます)、各 Bot は短く答えるか見送ります。1 巡まるごと誰も発言しなければ、そこで収束します。
- Bot は
@nameで互いを引き入れ、本当に判断が要る場面では@userであなたに委ねます。そのときグループの行に needs you のしるしが付きます。 - 1 回の送信につき 10 メッセージ、3 巡という上限があるので、部屋が回り続けることはありません。
- 各メンバーはそれぞれ
Group: <name>という持続するセッションを保つため、部屋の文脈も他の会話と同じように残ります。 - すべての Bot が毎回応じるわけではありません。 発言するかどうかは各メンバーが自分で決めます。Bot は新しく付け加えることがあるときだけ答え、それ以外は見送ります。特定のメンバーを @ で指名すれば、その巡回はその相手に絞られます。指名した相手(あるいは言いたいことがある相手)が発言し、ほかは黙っている、と考えてください。
- 部屋は端末をまたげます。 New Group Chat の選択画面では、登録済みのどの接続からも Bot を座らせられます。各メンバーの発言はそれぞれの端末で、その端末の
Group: <name>セッションの中で処理されます。別の端末のメンバーには、部屋の中でも他のメンバーのやり取りの中でも端末名のしるし(dixie · Mac Mini)が付き、区別のための@name-deviceという呼び名も部屋での指名に使えます。2 つの端末に同じ名前のエージェントがいても、混ざり合うことはありません。
Bot 同士のメッセージ
Bot は誰からのものかが分かる形で互いにメッセージを送り、あなたはどのチャットからでも作業を引き渡せます。
- @ による指名 — どのチャットでも
@researcher have a look at thisのように打つと、入力欄の@補完が適切な Bot を選ぶ手助けをします。送信すると、その指名は現在の一覧と突き合わせて解決され、話している Bot に誰のことかが正確に伝わります(プロファイル、呼びやすい名前、別の接続にいる Bot なら端末名まで)。そのあと Bot は自分でメッセージを組み立て、message_agentで送ります。あなたの文章がそのまま転送されることはなく、返事はそのエージェントからのものとして戻ってきます。メールアドレスや、知らない@はそのまま素通りします。つないでいる別の端末の Bot にも同じやり方で届きます。デスクトップがその接続のソケット越しにメッセージを中継します(後述の *端末をまたぐ Bot* を参照)。 - 名前を変えた Bot も呼び名が追随します — Bot に呼びやすい名前を付けると(チャットのヘッダーにある鉛筆のアイコン、または
hermes profile rename)、その名前で指名できるようになります。*Research Buddy* という肩書きの Bot は、通常のチャットでもグループの部屋でも@research-buddy(および@researchbuddy)で応じます。入力欄の@補完は新しい呼び名を提示しますが、以前のプロファイル名を打っても一致し、そちらも変わらず使えます。 - 直接のメッセージ — どの Bot Chat にも
message_agentのツールが備わっています。Bot はmessage_agent(target="researcher", message="…")を呼んで仲間にメッセージを送ります。このツールは宛先を現在の一覧と照合し、送り主のMessage from 🤖 <sender> (@<sender>):という但し書きを自動で先頭に付けたうえで、相手の本来の Bot Chat へ届けます。配送は送りっぱなしです。送り主は受け付けられたことだけを受け取って自分の番を終え、返事はあとから完了の通知として届きます。メッセージは本物の引数として渡るため(シェルに解釈される余地はなく、引用符、$(...)、バッククォートもそのまま届きます)、Bot はあなたの言葉を転送するのではなく、自分でメッセージを組み立てます。仲間の一覧は、各プロファイルの肩書きと説明から得た名前と役割まで含めて、どの Bot Chat のシステムプロンプトにも入っています。そのため Bot は、宛先を選ぶ前に誰が何を担当しているかを把握しています。このツールが存在するのは、Bot モードで管理されたインストールにおける本来の Bot Chat のセッションだけです。通常のチャット、グループの部屋でのメンバーのセッション、CLI のセッションからは見えません。
バックエンドは、プロンプトを組み立てる時点で、各 Bot の本来の Bot Chat セッションにメッセージのやり取りの作法を自動で教えます。仲間が CLI から画面なしで開いた場合も同じです。この説明が入るのは本来の Bot Chat だけで、通常のセッションや SOUL.md には手を触れません。この動作は config.yaml の agent.bot_mode_protocol で制御します(既定は有効)。
agent:
bot_mode_protocol: true # inject the bot-to-bot messaging protocol into canonical Bot Chats失敗したターンは安全にやり直されます
配送に失敗したターンは、やり直して意味があるときにかぎり、最大 1 回だけ再実行されます。一時的な失敗(相手のランタイムが止まっている、配送がタイムアウトした、プロバイダーのレート制限やサーバーエラー)なら、同じ Bot Chat のセッションをそのまま流し直します。文脈があふれて失敗した場合も同じセッションを流し直しますが、やり直すターンではモデルを呼ぶ前に、しきい値を超えた会話を通常の文脈圧縮で縮めてから送るので、元のターンでは入らなかったものが収まります。認証、利用枠、設定の誤りによる失敗は自動でやり直しません。もう一度試しても直らず利用枠を無駄にするだけなので、その場ですぐ失敗として知らせます。やり直すターンが新しいセッションを始めることはないので、Bot Chat の履歴と文脈はそのまま残ります。
配送が失敗したとき: 分類された理由
Bot のターンや中継の配送が失敗すると、人が読むエラー文と一緒に、機械が読める reason コードが最後まで一貫して付いてきます。まず相手側のゲートウェイが失敗を分類し(provider_auth_or_access、provider_quota_limit、provider_rate_limit、provider_server_error、context_overflow、missing_config、model_unavailable、runtime_offline、queued_expired、delivery_timeout、target_busy、unknown)、デスクトップがそれを転送し、送った側のエージェントの完了通知にはエラー文の手前に [reason: <code>] という印が付きます。呼び出す側のエージェントは、プロバイダーの文章を読み解かなくても、このコードだけで「もう一度サインインする」のか「あとで試す」のかを分けられます。デスクトップの「対応が必要」バッジも同じコードを使っています。
つないだ端末をまたぐメッセージ(デスクトップの中継)
Settings → Connections に登録したゲートウェイは、手元のもの、URL で指定した離れたもの、SSH、Hermes Cloud、docker のいずれであっても、デスクトップが開いたまま保つ回線です。Bot モードはその回線をメッセージのやり取りに自動で使います。追加の設定は要りません。
- 一覧はひとりでに伝わります。 デスクトップが動いている間、つないでいる各ゲートウェイに対して、*ほかの*接続にどのエージェントがいるかを定期的に知らせます。すると、どの Bot Chat の仲間一覧にもそれらが載り(「Teammates on OTHER connected machines」)、名前、役割、どの端末にいるかが分かります。エージェントが増えたり消えたり名前が変わったりすると、一覧も更新されます(機能の世代管理)。
message_agentはそのまま届きます。 ノート PC 上の Bot は、手元の仲間に送るのとまったく同じようにmessage_agent(target="moxie", …)でクラウドのエージェントにメッセージを送れます。同じ呼び名が複数の端末にある場合は、target="moxie@<connection>"の形で区別します(正確な書き方はツールのエラーが Bot に教えます)。配送はデスクトップを経由します。送り側のゲートウェイがメッセージを預かり、デスクトップが宛先の接続のゲートウェイへ中継し、宛先の Bot が本来の Bot Chat で 1 回分の応答を行い、返事は手元でのやり取りと同じ完了の通知として送り主に戻ります。- 運び手はデスクトップです。 端末をまたぐ配送は、両方の接続を知っているデスクトップが動いている間だけ働きます(ソケットと認証情報を持っているのはデスクトップで、ゲートウェイ同士が互いの認証情報を見ることはありません)。配送の途中でデスクトップを閉じた場合、送り主の Bot は返事が届かなかったことを伝えられ、待ちっぱなしにはなりません。デスクトップを介さず、端末同士で常時メッセージをやり取りしたい場合は、後述の相手先を登録してください(
hermes peer)。2 つの経路は共存します。
Bot から端末をまたいで送る 1 対 1 のメッセージ(hermes peer)
ある端末の Bot は、デスクトップを一切介さずに別の端末のゲートウェイにいる Bot へメッセージを送れます。相手のゲートウェイを *peer* として登録します(API サーバーの URL と API_SERVER_KEY を指定します)。
hermes peer add spark --url http://spark.lan:8377 --key <API_SERVER_KEY>
hermes peer list
hermes peer dm spark < /tmp/dm.txt # message body from a file (nothing shell-interpreted)
hermes peer dm spark/researcher < /tmp/dm.txt # named profile on a multiplexed peerhermes peer dm は、相手側に既にある API サーバー越しに、そのエージェントの本来の Bot Chat へメッセージを届け、そこで 1 回分の応答を実行し、返事を標準出力に表示します。手元で使う hermes -p <bot> chat の、端末をまたぐ版そのものです。
相手先を登録すると、どの Bot Chat にも教えられるメッセージの作法(agent.bot_mode_protocol)に相手先の一覧が自動で含まれ、message_agent が相手先の宛先をそのまま受け付けるようになります。message_agent(target="spark/researcher", …) のように書き、相手先の主エージェントなら target="spark" です。つまりBot たちは自分で気づきます。ほかの端末に仲間がいることも、そこへ届ける方法も分かります。相手先を追加したり外したりすると、各 Bot Chat の作法は次のメッセージのときに更新されます(機能の世代管理)。
前提となる条件は次のとおりです。相手側の端末が api_server のゲートウェイ方式で動いていて、強い API_SERVER_KEY を設定していること。到達できるかどうかはご自身のネットワーク(LAN、Tailscale、VPN)次第です。この鍵は認証情報にあたるので、~/.hermes/.env に HERMES_PEER_<NAME>_KEY として保存されます。相手先の名前と URL は config.yaml の bot_peers の下に置かれます。
端末をまたぐ Bot
Settings → Connections に複数のバックエンド(手元の実行環境、離れたゲートウェイ、SSH の接続先、Hermes Cloud のインスタンス)を登録すると、一覧にはすべての接続元の Bot が持続的に表示されます。SSH の接続先は、相手側で何かを起動することなく把握され、一時的につながらなくなった端末も、消えてしまうのではなく最後に分かっていた行を保ちます。同じプロファイル名が複数の接続元にある場合、呼び名は @name-device の形で区別されます(たとえば @research-homelab)。Bot のチャット、セッション、記憶、定期タスクは、そのプロファイルを持っている端末の側にあります。
接続先の Bot をクリックしても、開いているウィンドウがその端末へ移ることはありません。自分のチャットにいたまま @mention で呼ぶ、グループチャットに座らせる、あるいは Create on の選択欄でその端末に新しいエージェントを直接作る、といったことができます。クラウドと手元のエージェントは、こうして 1 つの一覧を共有します。Hermes Cloud のインスタンスとデスクトップを(たとえば Tailscale や SSH 経由で)登録すれば、双方の Bot が互いにメッセージを送り、同じ部屋に同席できます。各エージェントの処理は、それぞれ自分の端末で動きます。それらの端末をまたぐ Bot 同士の 1 対 1 のやり取りは、デスクトップの中継を自動で通ります(前述の *つないだ端末をまたぐメッセージ* を参照)。
複数の接続についての詳しい説明は、Desktop を複数の Hermes インスタンスにつなぐ を参照してください。
無効にする
Bot モードは、デスクトップに同梱されたプラグインです。Settings → Plugins → Bots で切ると、一覧、Routines のペイン、入力欄の処理がその場で登録解除され、再起動は要りません。どちらの状態でも、プロファイル、セッション、cron ジョブには手が触れられません。Bot モードがデータを抱え込むことはなく、表示しているだけだからです。
本来の Bot Chat を通常のサイドバーのセッション一覧から隠し、Bots のペインの中にだけ出す設定もあります。(これは本体の「セッションを隠す」しるしを使っています。古いゲートウェイでは、チャットはそのまま表示されたままになります。)
CLI でも同じことができます
Bot はプロファイルなので、すべてに端末での同等の操作があります。
| Bot モードでの操作 | シェルから |
|---|---|
| Bot と話す | hermes -p <bot> chat |
| Bot のファイル、スキル、記憶 | ~/.hermes/profiles/<bot>/ |
| Routines | hermes cron list([bot:<name>] … という名前のジョブ) |
| プロファイルの作成・確認 | hermes profile create、hermes profile list |
土台となる仕組みについては プロファイル を、CLI の全コマンド一覧については プロファイルのコマンド を参照してください。