Tools
Ein Tool ist eine benannte Aktion, die die KI aufrufen kann, mit typisierten Eingaben — z. B.send_email(to, subject, body). Tools werden in der tools.ts einer Skill deklariert und, für Tools, die deine App bereitstellt, durch eine HTTP-Route in einer deiner Komponenten unterstützt. Diese Seite ist die Quelle der Wahrheit für den Tool-Vertrag; Skills behandelt, wo tools.ts lebt.
Ein Tool deklarieren
Jeder Eintrag intools.ts hat einen Provider-sicheren name, einen benutzerfreundlichen displayName, eine description, ein Zod-input-Schema und ein target, das angibt, was Kazzle aufruft.
Targets
target ist die wiederverwendbare Adresse für ein Tool oder eine erforderliche Aktionsschaltfläche. Ein direkter KI-Tool-Aufruf und ein Schaltflächenklick können dasselbe Target-Objekt verwenden, sodass beide denselben Code ausführen.
HTTP-Targets verwenden dieselben Request-Felder:
body: '${input}'.
Referenzen
Kazzle löst Referenzen in HTTP-Target-Feldernquery, headers, body und url vor dem Versand auf:
${input}— die gesamte Tool-Eingabe oder die gesamte Button-Eingabe.${input.path}— ein verschachtelter Wert aus der Eingabe.${env.NAME}— eine benannte Umgebungsvariable aus der deklariertenenv.collection+env.environmentder besitzenden App-Komponente.
$${input.name}, wenn du literalen ${input.name}-Text benötigst.
Handler-Request
Für einapp-Target füge die entsprechende Route in der Target-Komponente hinzu. Mit body: '${input}' sendet Kazzle die typisierte Eingabe als JSON-Body:
app-Targets erhalten auch:
App-Targets können
Authorization nicht über headers setzen; Kazzle besitzt diesen Header. Lese den Kontext mit toolContext(req) aus @kazzle/app/tools, wenn der Handler zwischen Thread und Tools API unterscheiden muss.
Ein Tool, das ohne entsprechende Route deklariert wird, ist nicht sonderlich nützlich — füge beide zusammen hinzu. tools.json wird nicht unterstützt; der App-Compiler schlägt fehl, wenn er eine findet.
Handler-Response
Gib Klartext oder JSON mit bis zu drei Kanälen zurück:content— das einfache Ergebnis, das die KI liest (an das Modell weitergeleitet). Erforderlich.markdown— optional. Eine kurze Rich-Text-Zusammenfassung, die in der Tool-Karte gerendert wird (react-markdown; rohes HTML wird escaped). Gut für einen Satz, eine kleine Liste, einen Inline-Link. Ein bloßer relativer Pfad wird als totes vorformatiertes Text gerendert — Links müssen absolut sein.embedUrl— optional. Eine absolute URL, die deine App bereitstellt; die Karte rendert sie in einem Sandbox-iframe. So zeigst du eine echte, vollständige UI — einen Connect-Bildschirm, ein Dashboard, ein Diagramm. Deine App hostet und besitzt die Seite, sodass sie vollständig interaktiv gegen dein eigenes Backend, Cookies und OAuth sein kann. Nichts wird auf das Drive geschrieben.
embedUrl gewinnt über markdown, wenn beide gesetzt sind. Behalte immer einen aussagekräftigen content — das ist das, was die KI liest.
Erforderliche Aktion
Ein App-Tool kann den Thread pausieren, wenn es eine Benutzer- (oder Geräte-)Aktion benötigt. Gibtype: 'action_required' mit einem Kartentitel und Schaltflächen zurück. Nur gültig, wenn toolContext(req).source === 'thread' — über die Tools API (source: 'api'), gib stattdessen einen normalen Domain-Fehler zurück.
/chat/resume, nachdem eine Schaltfläche gedrückt wurde. Übereinstimmende Clients sehen die Autor-Schaltflächen; nicht übereinstimmende Clients sehen immer noch Skip/Cancel plus „Auf fortsetzen”. Eine Schaltfläche ohne target sendet ihre input als Tool-Ergebnis. Eine Schaltfläche mit einem Target führt dieses Target zuerst aus, dann verwendet das Target-Ergebnis als Tool-Ergebnis.
Rich UI — eine App-gehostete Seite einbetten
Wenn das Ergebnis eines Tools visuell oder interaktiv ist (ein Connect-Bildschirm, ein Diagramm, ein Zusammenfassungs-Dashboard), stelle die Seite von einer deiner Komponenten bereit und gib ihre absolute URL alsembedUrl zurück. Erstelle die URL aus der eingespritzt Komponenten-URL — niemals ein relativer Pfad.
embedUrl gegenüber der Ausgabe von HTML-Strings: Deine App stellt bereits Seiten bereit, die UI bleibt interaktiv und versioniert mit deinem Code, und keine Pro-Aufruf-Artefakte werden irgendwo geschrieben.