この章の答え
ツールの説明・登録・振り分け・実行を分けると、呼び出しの道筋が見える。
モデルは Rust の関数を直接呼んでいるわけではありません。ツール名と引数を持った要求を、適切な実装へ渡す仕組みが必要です。ここではツールの「メニュー」と「実行係」を区別します。
01|図でつかむ
Registry は名前と実装の対応を持つ。Spec を定義しただけでは実行できない。
02|3つのポイントで理解する
1. ToolSpec は使い方を伝える
名前、説明、引数の構造など、モデルがツールを選ぶための情報を見ます。説明が実装とずれると、正しい処理があっても適切に呼ばれません。
2. Registry と Router を分ける
登録された処理の一覧と、届いた呼び出しを振り分ける役割を分けます。知らない名前や不正な引数が来た場合の返し方も、通常のルートと一緒に読みます。
3. Handler の先にも境界がある
Handler は呼び出しを具体的な操作へ変換します。実行条件の確認やランタイム処理を経たあと、結果が ToolOutput などの形で戻ります。ツール名から戻り値までを一本で追います。
03|ソースで確かめる
以下の検索は Codex リポジトリのルートで実行します。最初に対象 commit を記録し、検索結果から定義と呼び出し元を一つずつ開いてください。
git rev-parse --short HEAD
rg -n "ToolRouter|ToolInvocation|ToolOutput" codex-rs
読む入口: codex-rs/core/src/tools/router.rs 。リンク先は照合に使った固定 commit のファイルです。手元の版と異なる場合は、上の検索語から探し直します。
小さく試す
一つのツールを選び、定義、登録、Handler、出力の四箇所を探します。
04|30秒で復習
- Spec は説明、Registry は対応表。
- Router が呼び出し先を選ぶ。
- 成功と失敗を共通の出力経路へ戻す。