Tool Calls
エージェントの動作を、1ステップにつき1行で表示します。読み取りと検索は短い要約にまとめられ、編集、コマンド、承認、エラーは表示されたままになります。各ステップは、ファイル、差分、ターミナル、結果といった実際のビューに展開できます。AI SDKのすべてのツール状態に対応し、理由を添えて断る承認も含みます。
エージェントは、回答する前に何十もの小さなステップを踏むことがあります。すべてを表示すると回答が埋もれ、隠すとエージェントがブラックボックスのように感じられます。Tool Callsは、各ステップに、「Read components/search.tsx」や「Searched for useResults, 3 results」のように文章として読める控えめな1行を割り当てます。
連続して実行される読み取り、検索、参照は、「Explored 6 files」のような1つの要約にまとめられます。何かを変更するもの、判断が必要なもの、失敗したものは、実行中のライブタイマーとともに、それぞれ独立した行として残ります。任意のステップを開くと、ファイル、差分、ターミナル、結果といった実際の作業を確認できます。
AI SDKのすべてのツール状態には、承認を含め、それぞれ独自の見た目と文言があります。承認ではAllow、Deny、Always allow、そして入力した言葉を理由として送り返す「Tell it what to do instead」が提示され、キーボードでは⌘↵と⌘⌫が使えます。getToolPartStatusはツールパーツを自動で対応付け、検索結果、ファイル一覧、多肢選択式の質問、生のJSON用のビューが用意されています。
Proレジストリをcomponents.jsonに追加する
components.json トークンを追加する
アカウントページでトークンを作成し、
.env.localにHEXTAUI_PRO_TOKENとして設定してください。ブロックを追加する
pnpm dlx shadcn@latest add @hextaui-pro/tool-calls
AI SDKと使う
getToolPartStatus でツールの part をステップに変換し、ツールごとに kind と view を選びます。チャットのストリーミングが止まったら stopped を渡すと、途中で打ち切られた呼び出しがいつまでもスピナーを回さず「キャンセル済み」と表示されます。
コマンドを承認する
サーバー側でツールにneedsApprovalを設定し、addToolApprovalResponseで応答します。Always allowはプログラムを記憶し、拒否には代わりに行うことを理由として添えられます。ステップにフォーカスがある間は、⌘↵と⌘⌫が使えます。
ユーザーに尋ねる
execute関数を持たないクライアントツールは、回答を待ちます。AskUserで選択肢を表示し、選ばれたものをaddToolOutputで返します。
構造
外側から内側へ組み合わせるパーツ。
| パーツ | 説明 |
|---|---|
ToolCalls | リスト。目立たない実行をグループ化し、ステップ間で所要時間を共有します。 |
ToolCall | 1つのステップ。アイコン、文、メタ情報、タイマー、開いたときの内容。 |
ToolGroup | 要約行を持つ、目立たないステップの折りたたまれた連続。 |
ToolApproval | 承認待ちのステップ内に表示される、承認・拒否・リダイレクトのカード。 |
SearchResults, FileList, AskUser, ToolJson | ステップの content として渡す view。 |
ToolCalls
childrenを除くすべてのolプロップも受け付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
calls実行された順のステップ。 | ToolCallProps[] | – |
group目立たないステップの連続を折りたたみます。すべてのステップを表示するにはfalseにします。 | boolean | true |
| プロパティ | 型 | デフォルト |
|---|---|---|
id安定したid。通常はtoolCallIdです。時間はidごとに保持されます。 | string | – |
statusstreaming、running、waiting、approval、done、error、denied、cancelled のいずれか。 | ToolStatus | – |
kindread、search、list、edit、write、run、web、fetch、ask、other のいずれか。アイコンと動詞が決まります。 | ToolKind | "other" |
subject対象となったもの。パス、クエリ、URL、またはコマンド。 | string | – |
nameツール名。kind が other のときの文に使われます。 | string | – |
title生成された文を完全に置き換えます。 | string | – |
meta文の後に付く短い結果。「3 results」や「+12 −3」など。 | ReactNode | – |
contentステップを開いたときに表示されます。 | ReactNode | – |
exitCode実行ステップ用。0以外の場合、ステップは失敗としてマークされ、開かれます。 | number | – |
errorエラー状態で表示されるメッセージ。 | string | – |
duration履歴用に保存される所要時間(秒)。 | number | – |
approval承認のための理由、結果、Always allowのラベル。 | ToolCallApproval | – |
defaultOpenステップを開いた状態で始めるかどうかを上書きします。 | boolean | – |
onApproveAllowまたはAlways allowから呼ばれます。 | (options: { always: boolean }) => void | – |
onDenyDeny、または「Tell it what to do instead」のテキストとともに呼ばれます。 | (reason?: string) => void | – |
| プロパティ | 型 | デフォルト |
|---|---|---|
reasonボタンの上に表示される、承認が必要な理由。 | string | – |
approved回答済みの場合の回答。 | boolean | – |
automaticルールによって承認されたため、カードは表示されません。 | boolean | – |
denialReason拒否されたステップに表示される、代わりにユーザーが求めた内容。 | string | – |
alwaysLabelこのラベルで「Always allow …」を表示します。たとえばプログラム名です。 | string | – |
getToolPartStatus(part, options)
AI SDKのツールパーツをToolStatusに対応付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
partmessage.parts の part。 | ToolUIPart | DynamicToolUIPart | – |
options.stoppedチャットが停止したため、未完了の呼び出しはスピナーではなく「キャンセル済み」と表示されます。 | boolean | false |
options.waitingクライアントツールが、AskUserなど、ユーザーの応答を待っています。 | boolean | false |
| プロパティ | 型 | デフォルト |
|---|---|---|
question質問。 | string | – |
options選択肢。 | { value, label, description? }[] | – |
answer回答済みの場合の選択された値。 | string | – |
onAnsweraddToolOutputで送り返します。 | (value: string) => void | – |
| プロパティ | 型 | デフォルト |
|---|---|---|
query各一致箇所の内側でハイライトされます。 | string | – |
matches一致した項目。 | { path, line, text }[] | – |
limit「Show all」の前に表示されます。 | number | 6 |
| キー | アクション |
|---|---|
| EnterSpace | ステップまたは折りたたまれたグループを開閉します。 |
| ⌘↵ | フォーカスがステップ内にあるとき、承認待ちのステップを許可します。 |
| ⌘⌫ | フォーカスがステップ内にあるとき、承認待ちのステップを拒否します。 |
| Esc | 送信せずに「Tell it what to do instead」を閉じます。 |
- ステップは順序付きリストなので、スクリーンリーダーはステップの総数と現在の位置を読み上げます。
- ユーザーの対応が必要なステップは、質問やエラーとともに、「承認が必要: Run pnpm test」のように polite なライブリージョンで通知されます。通常のステップは通知されないため、スクリーンリーダーが読み上げで溢れることはありません。
- ステータスは色だけで示されることはありません。各状態には、独自のアイコンと文言があります。
- 承認のショートカットは、フィールドへの入力中は無視され、リダイレクトのフィールドは開くと自動でフォーカスし、閉じるとフォーカスを戻します。
使用技術
Tool Calls を構成する無料のHextaUIコンポーネントです。それぞれ単独でインストールできます。
コード
8 個のファイルを components/blocks/tool-calls に追加しました。