チュートリアル25:コード実行
チュートリアル25:コード実行 — 公式ドキュメントに基づくわかりやすいガイド
これは Hermes Agent 公式チュートリアルシリーズの一部です。すべてのチュートリアルを見る
ケーキを焼くとき、材料をひとつずつ取りに行く代わりに、レシピ全体を書き出してアシスタントに渡し、完成したケーキだけを受け取ることを想像してみてください。それがまさに、Code Execution が Hermes Agent に対して行うことです — エージェントが複数のツールを内部で呼び出す完全な Python スクリプトを実行し、最終結果だけを会話に返します。
Code Execution とは?
通常、Hermes がウェブ検索、ファイル読み込み、コマンド実行を行うとき、各ステップを1つずつ実行し、その都度中間結果が「メモリ」(コンテキストウィンドウ)に読み込まれます。これは遅く、トークンも無駄に消費します。
execute_code ツールを使うと、Hermes は web_search、read_file、patch などのツールをプログラム的に呼び出せる Python スクリプトを一気に作成します。スクリプトは別の子プロセスで実行され、print() の出力だけがエージェントに返ります。面倒な中間データはすべて内部に隠されたままです。
仕組み:ステップバイステップ
ステップ 1: エージェントが Python スクリプトを作成
まず、専用モジュールからツールをインポートします:
from hermes_tools import web_search, web_extract
ステップ 2: Hermes がヘルパーモジュールを作成
スクリプトをメインのエージェントに接続する hermes_tools.py スタブを自動生成します。
ステップ 3: 通信チャネルが開かれる
Hermes は Unix ドメインソケット(プロセス間の高速なローカル「電話回線」)を開き、リスナースレッドを起動します。
ステップ 4: スクリプトが子プロセスで実行される
スクリプト内のツール呼び出しはすべてソケット経由で Hermes に送信され、Hermes が実行して結果を返します。
ステップ 5: print 出力だけが返る
スクリプトの print() 文だけが LLM に表示されます。中間のツール結果は一切コンテキストウィンドウに入りません — 大量のトークンを節約できます。
Hermes はいつこれを使うのか?
エージェントは以下の状況を検知すると、自動的に execute_code を選択します:
- 3回以上のツール呼び出しがあり、その間にロジック(フィルタリングや比較など)が挟まる場合
- 大量データ処理 — 例:多数のファイルを検索してスニペットを抽出する場合
- ループ処理 — 多数のアイテムに対して同じ操作を繰り返す場合
最大のメリットは? トークン効率です。検索結果をすべて会話に戻す代わりに、最終サマリーだけが返ってきます。
実際に試せる実践例
1. データ処理パイプライン
from hermes_tools import search_files, read_file
import json
# すべての設定ファイルを検索し、データベース設定を抽出
matches = search_files("database", path=".", file_glob="*.yaml", limit=20)
configs = []
for match in matches.get("matches", []):
content = read_file(match["path"])
configs.append({"file": match["path"], "preview": content["content"][:200]})
print(json.dumps(configs, indent=2))
2. マルチステップのウェブ調査
from hermes_tools import web_search, web_extract
import json
results = web_search("Rust async runtime comparison 2025", limit=5)
summaries = []
for r in results["data"]["web"]:
page = web_extract([r["url"]])
for p in page.get("results", []):
if p.get("content"):
summaries.append({
"title": r["title"],
"url": r["url"],
"excerpt": p["content"][:500]
})
print(json.dumps(summaries, indent=2))
3. 一括ファイルリファクタリング
from hermes_tools import search_files, read_file, patch
matches = search_files("old_api_call", path="src/", file_glob="*.py")
fixed = 0
for match in matches.get("matches", []):
result = patch(
path=match["path"],
old_string="old_api_call(",
new_string="new_api_call(",
replace_all=True
)
if "error" not in str(result):
fixed += 1
print(f"Fixed {fixed} files out of {len(matches.get('matches', []))} matches")
4. ビルド&テストパイプライン
from hermes_tools import terminal
import json
result = terminal("cd /project && python -m pytest --tb=short -q 2>&1", timeout=120)
output = result.get("output", "")
passed = output.count(" passed")
failed = output.count(" failed")
print(json.dumps({"passed": passed, "failed": failed}, indent=2))
覚えておくべきポイント
- スクリプト内で利用可能なツール:
web_search、web_extract、read_file、write_file、search_files、patch、terminal(フォアグラウンドのみ)。 print()の出力だけが返る — それ以外はすべて非表示。- ループ、フィルタリング、マルチステップのワークフローに最適 — Hermes にミニプログラミング環境を与えるようなものです。
まとめ
Code Execution は、Hermes をステップバイステップのアシスタントからバッチプロセッサへと変身させます。スクリプトを作成し、実行し、最終的な答えだけを返す — 時間、トークン、そして頭の負担を節約できます。Hermes が大量の反復的なツール呼び出しをしているのを見かけたら、おそらくこの機能を内部で使っているでしょう。
次回: チュートリアル 26 — バッチ処理:数百のプロンプトを並列実行する。
📖 公式ドキュメント
この記事は Hermes Agent の公式ドキュメントに基づいています:公式ドキュメント › user-guide/features/code-execution