Hermes Agent(NousResearch/hermes-agent)は、長時間のエージェント実行をモデルのコンテキストウィンドウ内に収めつつ、オペレーターが直前まで行った作業を丸ごと捨てないための専用ユーティリティ trajectory_compressor.py を同梱しています。ゲートウェイ、cron、数時間に及ぶ調査ループを常時稼働させる Mac mini M4 では、トークン圧力はツール出力の切り捨て、後続ターンの失敗、トランスクリプト全体の再送による想定外の課金として現れます。本 Type C 解説では、上流の既定値、保護ヘッド/要約ミドル/保護テールのモデル、対話型 /compress スラッシュコマンドとバッチ CLI の違い、そして macOS で本番投入前に実行できる 6 ステップの手順を順に説明します。
ハーネス選定がまだの場合は、先に macOS と Mac mini M4 における Hermes Agent と OpenClaw の比較 をお読みください。セッションの置き場所を決めてから圧縮を調整するのが筋です。主な上流参照:main ブランチの trajectory_compressor.py、Hermes Agent README、統合メモリ計画用の Apple Mac mini 仕様。
開示:以下では、常時稼働エージェント用ステージングとして言及する MacHTML のオプションのクラウド Mac mini レンタルについて簡潔に触れます。
Mac mini でトークン上限が効く理由
エージェントハーネスはチャット UI のように会話を「最後の一文だけ」保持しません。モデル呼び出しのたびに、構造化されたメッセージ列を再生します。Telegram ゲートウェイにローカルツールループを足すと、1 日で system プロンプト、human 指示、assistant 応答、tool JSON が合計数万トークンに達することも珍しくありません。プロバイダーがハードストップしたり、黙って切り捨てたりすると、オペレーターはモデルを責めがちですが、多くの場合は単に transcript が予算を超えただけです。
常時オンラインの Mac mini M4 は、ノート PC のスリープなしにゲートウェイを 24 時間動かせる点で有利です。ただしハードウェアがコンテキストを magically 拡張するわけではありません。圧縮は運用上の制御であり、チップの機能ではありません。Hermes は trajectory_compressor.py でトラジェクトリフォルダをより短い等価表現に書き換え、オペレーターがまだ必要とする意味論を残します。元の system 契約、最初の human 意図、初期 tool グラウンディング、忠実な中間要約、そして修正コストの高い直近ターンです。
既定の予算は、圧縮後 transcript の target_max_tokens=15250、中間要約自体に約 summary_target_tokens=750、末尾 protect_last_n_turns=4 ターンを原文のまま保持、という形です。チューニング可能ですが、実務的な既定値として「中間は大胆に圧縮し、今まさに操縦している会話の末尾は切らない」という方針が込められています。
トークン最適化はコストとも交差します。OpenRouter 経由で推論しても、小さな追質問のために 4 万トークンの trace を再送すると、料金とレイテンシの両方が膨らみます。毎ターンより大きなコンテキストモデルに切り替えるより、ステージング用 Mac mini で圧縮する方が安いことが多いです。来週置き換える予定のゲートウェイ上で transcript を最適化しないよう、上記の比較記事とセットで読んでください。
Apple シリコンのメモリは統合されています。16 GB の Mac mini でも Hermes ゲートウェイと軽量ツールは動きますが、並列サブエージェント、ローカル Ollama サイドカー、巨大な非圧縮ログが同じプールを奪い合います。圧縮の主目的はモデルコンテキストですが、ゲートウェイ fan-out 中の巨大 in-memory メッセージ配列による RAM 圧力も下げられます。非圧縮アーカイブとローカルモデルを同時に載せられると思い込む前に、Apple の Mac mini 仕様 を確認してください。
コア圧縮モデル
上流の trajectory_compressor.py は、事後監査しやすい 3 ゾーンポリシーを実装しています。
- 保護ヘッド:最初の system、human、gpt、tool メッセージを保持し、ペルソナ、安全境界、初期 tool スキーマが圧縮後も残ります。
- 要約ミドル:ヘッドとテールの間は OpenRouter 既定モデルで要約し、おおよそ summary_target_tokens=750 の叙述と重要事実に畳み込みます。
- 保護テール:末尾 protect_last_n_turns=4 ターンを原文保持し、直近のオペレーター修正と tool エラーを要約から再構成せず参照できます。
既定の target_max_tokens=15250 は圧縮後 transcript の上限です。スキルが追加 system テキストを注入した後でもプロバイダー制限内に収める、ゲートウェイセッション向けのガードレールと考えてください。特定モデル向けにチューニングする際は、料金ページのマーケティング上のコンテキスト長ではなく、tool と completion 用のヘッドルームを差し引いた実用ウィンドウに target_max_tokens を合わせます。
要約の既定は OpenRouter 経由の google/gemini-3-flash-preview です(環境で上書き可能)。古い run のバッチ再生では品質と速度・コストのトレードオフになります。コンプライアンスが厳しいワークロードでは、承認済みモデルに向け、どのトラジェクトリフォルダを圧縮したかログを残してください。要約は設計上ロッシーです。決定事項とブロッカーを残し、すべてのスタックトレース行を残す必要はありません。
圧縮は Hermes のキュレーション済みメモリファイルや FTS5 セッション検索の代替ではありません。単一スレッドがウィンドウを超えたときの緊急ブレーキです。週単位の事実は memory に、今夜のインシデントスレッドがすでに 3 万トークンに達したら trajectory 圧縮、という使い分けが現実的です。
2 つの入口:/compress とバッチ CLI
Hermes は意図的に 2 つの操作感で圧縮を公開しています。
| 入口 | 使うタイミング | 動作 |
|---|---|---|
/compress スラッシュコマンド | 稼働中の Hermes TUI またはゲートウェイ接続セッションで、途中でもコンテキストが逼迫していると感じたとき。 | 実行中トラジェクトリに紐づく対話型圧縮。「今まさに溺れている」瞬間向け。 |
python trajectory_compressor.py | data/ 配下の保存 run、CI フィクスチャ、移行前アーカイブのオフライン保守。 | サンプリング率、トークン上限、入力ディレクトリを明示するバッチユーティリティ。再現可能な運用向け。 |
混同しないでください。スラッシュコマンドはオペレーター向け制御面、Python エントリポイントはゲートウェイ更新後や巨大 trace をチケットに添付する前に、履歴フォルダを後から整える手段です。ゲートウェイがまだメッセージを追記している live ファイルに CLI を当てると競合します。セッションを静かにするか、トラジェクトリをスクラッチディレクトリにコピーしてから実行してください。
バッチモードはサンプリングもサポートします。例:--sample_percent=15 で数百 run の圧縮品質をプロファイルし、実験中はすべてを要約課金しない。本番既定を宣言する前に 100% に上げてください。
例と既定値テーブル
| パラメータ | 既定 | メモ |
|---|---|---|
target_max_tokens | 15250 | 圧縮後上限。モデルウィンドウが許す場合のみ慎重に引き上げ。 |
summary_target_tokens | 750 | 中間要約セグメントの予算。 |
protect_last_n_turns | 4 | 末尾に原文保持する直近ターン数。 |
| OpenRouter 要約モデル | google/gemini-3-flash-preview | ポリシー準拠のため env/プロバイダー設定で上書き。 |
上流の代表的 CLI 例:
python trajectory_compressor.py --input=data/my_run
python trajectory_compressor.py --input=data/my_run --sample_percent=15
python trajectory_compressor.py --input=data/my_run --target_max_tokens=16000
live セッションでは、tool チェーンが長くなったがタスクが未完了のとき—特に別サブエージェントを付ける前や、失敗 tool を新しいモデル呼び出しで再試行する前に /compress を実行します。チーム規範として、単一 tool 成功のたびではなく主要マイルストーン後に圧縮するよう文書化してください。さもないと要約がまだ必要なニュアンスを消します。
6 ステップ手順
- Hermes Agent を Mac mini に clone/更新し、リポジトリルートに
trajectory_compressor.pyがあることを確認(ソース)。 - OpenRouter(または選択)API キーをエクスポート。バッチ圧縮と同じ shell で。要約はキーなしでは即失敗します。
data/からステージング用トラジェクトリを選ぶ。トークン膨張が分かっているものを、JSON やメッセージ列の before/after diff 用にコピー。- 既定でドライバッチ:
python trajectory_compressor.py --input=data/my_runを実行し、ヘッド/テールが intact か確認。 - 本番モデルに余裕が必要なら上限を調整—例
--target_max_tokens=16000—設定を昇格する前に--sample_percent=100で再実行。 - live 挙動を検証:Mac mini で Hermes セッションを開始し、意図的にコンテキストを伸ばしたあと
/compressを発行し、保護テールの認識が残るか確認。
選んだ既定値は、ゲートウェイポートや LaunchAgent ラベルと並べて内部 runbook に記録し、次のオペレーターが本番障害で「再発見」しないようにしてください。
トラブルシューティング
要約が失敗する、または中間が空
OpenRouter 認証情報、モデル許可リスト、レート制限を確認してください。入力フォルダを小さくして再試行し、トラジェクトリパーサーが不正な tool ペイロードで詰まっていないか切り分けます。google/gemini-3-flash-preview がコンプライアンスで禁止なら、承認モデルに切り替え文書を更新—圧縮を黙って無効にしないでください。
圧縮後にエージェントが直近の修正を「忘れる」
一時的に protect_last_n_turns を増やすか、summary_target_tokens の攻撃性を下げます。メッセージ追記中の live フォルダにバッチ圧縮していないか確認。コピーしたトラジェクトリで再実行し、テールをソースと diff してください。
Mac を起きたままにせず Telegram を常時稼働させるには、低価格 VPS 上の Hermes Agent Docker + Telegram ボット を参照してください。
スコープ付きリポ読取・npm test・ガード付き自動修正が必要なら、2026 Hermes Agent MCP + Claude Opus 4.8:ローカルコードサンドボックス を参照してください。
FAQ
trajectory 圧縮は Hermes メモリファイルを置き換える?
いいえ。圧縮は単一トラジェクトリスレッドを短くするだけです。キュレーション memory とスキルは長期ストアのままです。memory は週単位、圧縮は今夜の暴走セッション、と併用してください。
OpenClaw 利用者もこのスクリプトを使うべき?
ユーティリティは Hermes Agent に同梱です。OpenClaw の transcript 形状は異なります—バッチ前に移行またはエクスポートし、比較ガイドどおりゲートウェイを分離してください。
要約コストはどの程度?
バッチコストは中間ターン数と OpenRouter 単価に比例します。実験では 15% サンプリングで支出を抑え、既定を信頼したら本番は 100% に。
圧縮+ゲートウェイに必要な Mac mini メモリは?
圧縮のみのバッチなら 16 GB で足りることが多いです。同一 Mac mini でゲートウェイ、ローカルモデル、並列サブエージェントも動かすなら 24 GB が安全です(Apple 仕様)。