ツール
ツールは、AI が呼び出せる名前付きアクション(型付き入力付き)です。例えばsend_email(to, subject, body) のようなものです。ツールはスキルの tools.ts で宣言され、アプリが提供するツールの場合、コンポーネントの HTTP ルートでサポートされます。このページはツール契約の信頼できる情報源です。tools.ts がどこにあるかについては、スキルを参照してください。
ツールの宣言
tools.ts の各エントリには、プロバイダー安全な name、フレンドリーな displayName、description、Zod の input スキーマ、および Kazzle が呼び出すものを指定する target があります。
ターゲット
target はツールまたは必須アクションボタンの再利用可能なアドレスです。直接的な AI ツール呼び出しとボタンクリックは同じターゲットオブジェクトを使用できるため、両方とも同じコードを実行します。
HTTP ターゲットは同じリクエストフィールドを使用します:
body: '${input}' と記述します。
リファレンス
Kazzle はディスパッチ前に HTTP ターゲットのquery、headers、body、url フィールド内のリファレンスを解決します:
${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 に対して完全にインタラクティブにできます。ドライブには何も書き込まれません。
embedUrl は markdown に優先します。常に意味のある content を保持してください。それが AI が読むものです。
必須アクション
アプリツールはユーザー(またはデバイス)アクションが必要な場合、スレッドを一時停止できます。カードタイトルとボタンを含むtype: 'action_required' を返します。toolContext(req).source === 'thread' の場合のみ有効です。ツール API(source: 'api')では、代わりに通常のドメインエラーを返します。
/chat/resume を通じて再開します。一致するクライアントは作成者ボタンを表示します。一致しないクライアントは、スキップ/キャンセルと「で続行」を表示します。target のないボタンはその input をツール結果として送信します。ターゲット付きボタンはそのターゲットを最初に実行し、ターゲット結果をツール結果として使用します。
リッチ UI — アプリホストページを埋め込む
ツールの結果がビジュアルまたはインタラクティブ(接続画面、チャート、概要ダッシュボード)の場合、コンポーネントの 1 つからページを提供し、その絶対 URL をembedUrl として返します。注入されたコンポーネント URL から URL を構築します。相対パスは使用しないでください。
embedUrl を優先します。アプリは既にページを提供しており、UI はインタラクティブでコードとバージョン管理されたままであり、呼び出しごとのアーティファクトはどこにも書き込まれません。