Skip to main content

ツール

ツールは、AI が呼び出せる名前付きアクション(型付き入力付き)です。例えば send_email(to, subject, body) のようなものです。ツールはスキルの tools.ts で宣言され、アプリが提供するツールの場合、コンポーネントの HTTP ルートでサポートされます。このページはツール契約の信頼できる情報源です。tools.ts がどこにあるかについては、スキルを参照してください。

ツールの宣言

tools.ts の各エントリには、プロバイダー安全な name、フレンドリーな displayNamedescription、Zod の input スキーマ、および Kazzle が呼び出すものを指定する target があります。

ターゲット

target はツールまたは必須アクションボタンの再利用可能なアドレスです。直接的な AI ツール呼び出しとボタンクリックは同じターゲットオブジェクトを使用できるため、両方とも同じコードを実行します。 HTTP ターゲットは同じリクエストフィールドを使用します:
暗黙的なリクエストデフォルトはありません。ハンドラーが生のツール入力を JSON として受け取る場合は、body: '${input}' と記述します。

リファレンス

Kazzle はディスパッチ前に HTTP ターゲットの queryheadersbodyurl フィールド内のリファレンスを解決します:
  • ${input} — ツール入力全体、またはボタン入力全体。
  • ${input.path} — 入力からのネストされた値。
  • ${env.NAME} — 所有するアプリコンポーネントの宣言された env.collection + env.environment からの名前付き環境変数。
解決は単一パスです。リファレンスが見つからないか不明な場合、ツールは空の値を代入する代わりに失敗します。リテラル ${input.name} テキストが必要な場合は、$${input.name} を使用します。

ハンドラーリクエスト

app ターゲットの場合、ターゲットコンポーネントに一致するルートを追加します。body: '${input}' を使用すると、Kazzle は型付き入力を JSON ボディとして送信します:
app ターゲットは以下も受け取ります: アプリターゲットは headers を通じて Authorization を設定できません。Kazzle がそのヘッダーを所有しています。ハンドラーがスレッド対ツール API を分岐する必要がある場合は、@kazzle/app/tools から toolContext(req) でコンテキストを読み取ります。 一致するルートなしで宣言されたツールは役に立ちません。両方を一緒に追加します。tools.json はサポートされていません。アプリコンパイラーが見つけた場合は失敗します。

ハンドラーレスポンス

プレーンテキスト、または最大 3 つのチャネルを持つ JSON を返します:
  • content — AI が読むプレーン結果(モデルに供給されます)。必須。
  • markdown — オプション。ツールカードにレンダリングされる短いリッチテキスト概要(react-markdown;生の HTML はエスケープされます)。文、小さなリスト、インラインリンクに適しています。ベアの相対パスはデッドプリフォーマットテキストとしてレンダリングされます。リンクは絶対である必要があります。
  • embedUrl — オプション。アプリが提供する絶対 URL。カードはそれをサンドボックス化された iframe でレンダリングします。これは実際のフルウィッドス UI(接続画面、ダッシュボード、チャート)を表示する方法です。アプリはページをホストして所有するため、独自のバックエンド、クッキー、OAuth に対して完全にインタラクティブにできます。ドライブには何も書き込まれません。
両方が設定されている場合、embedUrlmarkdown に優先します。常に意味のある content を保持してください。それが AI が読むものです。

必須アクション

アプリツールはユーザー(またはデバイス)アクションが必要な場合、スレッドを一時停止できます。カードタイトルとボタンを含む type: 'action_required' を返します。toolContext(req).source === 'thread' の場合のみ有効です。ツール API(source: 'api')では、代わりに通常のドメインエラーを返します。
Kazzle はツール呼び出しのカードを保存し、ボタンが押された後 /chat/resume を通じて再開します。一致するクライアントは作成者ボタンを表示します。一致しないクライアントは、スキップ/キャンセルと「で続行」を表示します。target のないボタンはその input をツール結果として送信します。ターゲット付きボタンはそのターゲットを最初に実行し、ターゲット結果をツール結果として使用します。

リッチ UI — アプリホストページを埋め込む

ツールの結果がビジュアルまたはインタラクティブ(接続画面、チャート、概要ダッシュボード)の場合、コンポーネントの 1 つからページを提供し、その絶対 URL を embedUrl として返します。注入されたコンポーネント URL から URL を構築します。相対パスは使用しないでください。
ページはクロスオリジン iframe(独自のオリジン、クッキー、スクリプト)で実行されます。カードのサイズを変更するには、その高さを親に投稿します。カードはこれをリッスンしてサイズを変更します(ビューポートの 70% でキャップされます):
HTML 文字列を出力する代わりに embedUrl を優先します。アプリは既にページを提供しており、UI はインタラクティブでコードとバージョン管理されたままであり、呼び出しごとのアーティファクトはどこにも書き込まれません。