Frontend-Interaktion für ein Tool hinzufügen
Einige Tools müssen nur serverseitig ausgeführt werden und benötigen keine benutzerdefinierte Benutzeroberfläche. Andere Tools erfordern die Bestätigung, Auswahl oder Bearbeitung von Parametern durch den Benutzer; in diesen Fällen kann eine Frontend-Karte für das Tool mit demselben Namen registriert werden.
Frontend-Karten sind nur für die Darstellung und die Mensch-Maschine-Interaktion des ToolCall verantwortlich und bedeuten nicht zwangsläufig, dass die Geschäftslogik des Tools im Browser ausgeführt wird.
Wenn lediglich Optionen wie bei suggestions angezeigt werden sollen und nach der Auswahl des Benutzers invoke() serverseitig fortgesetzt wird, behalten Sie die Standardeinstellung execution: 'backend' bei. Nur wenn die eigentliche Logik des Tools auf die aktuelle Browserseite, das FlowModel oder den Editor-Status zugreifen muss, sollte execution: 'frontend' gesetzt und eine Frontend-invoke-Methode implementiert werden.
Zuerst Parameter und Ausführungslogik serverseitig definieren
Das integrierte suggestions-Tool befindet sich unter:
Sein Schema enthält sowohl die Auswahlmöglichkeiten als auch die endgültige Auswahl des Benutzers:
Gemäß der Tool-Beschreibung sollte das Modell beim ersten Aufruf nur options generieren. Da dieses Tool nicht auf defaultPermission: 'ALLOW' gesetzt ist, ist die Standardberechtigung ASK, und der ToolCall wird pausiert, bis der Benutzer eine Aktion ausführt.
Nach der Auswahl des Benutzers fügt das Frontend über decisions.edit() die option zu den ursprünglichen Parametern hinzu und setzt den ToolCall fort. Das serverseitige invoke() gibt schließlich den ausgewählten Inhalt zurück:
Die integrierte Implementierung schreibt das Auswahlergebnis zudem zurück in aiMessages.toolCalls, sodass bei einem erneuten Rendern der Nachrichtenverläufe weiterhin sichtbar ist, welche Option der Benutzer ausgewählt hat.
Karten-Komponenten schreiben
Frontend-Karten erhalten ToolsUIProperties:
Diese Komponente demonstriert die allgemeine Verwendung von decisions.edit() und behandelt Doppelklicks sowie JSON-String-Parameter. Für den produktiven Einsatz müssen zudem conversationspezifische Details wie schreibgeschützte Dialoge, die aktuell aktive Nachricht und historische Auswahlzustände entsprechend der Chat-Oberfläche berücksichtigt werden. Eine vollständige Implementierung finden Sie unter packages/plugins/@nocobase/plugin-ai/src/client-v2/ai-employees/tools/SuggestionsOptionsCard.tsx.
decisions bietet drei Operationen:
SuggestionsOptionsCard.tsx behandelt zusätzlich folgende Details:
- Kompatibel mit
optionssowohl als Array als auch als JSON-String - Zeigt ein Lade-Symbol (Loading), solange der
ToolCallgeneriert wird - Auswahl nur für
ToolCallim Statusinterruptedzulässig - Schaltflächen werden nach dem Klicken sofort deaktiviert, um mehrfache Übermittlungen zu vermeiden
- In historischen Nachrichten wird die ausgewählte Option beibehalten und hervorgehoben
- Operationen sind nur in derzeit bearbeitbaren Konversationen zulässig
Im Client-Plugin registrieren
Der Registrierungsname im Frontend muss exakt mit dem Namen des serverseitigen Tools übereinstimmen:
Wenn die serverseitige Datei src/ai/tools/developerChoice.ts ist, registrieren Sie hier developerChoice.
Der Registrierungsprozess für das integrierte suggestions-Tool erfolgt ebenfalls auf diese Weise:
Anschließend ruft PluginAIClientV2.load() die Methode registerPluginAIClientV2BuiltinTools(this.ai.toolsManager) auf, wodurch die Karten in die vom Server zurückgegebene Tool-Definition mit demselben Namen integriert werden.
Karte, Modal oder Frontend-Ausführung auswählen
Im Folgenden sind gängige Konfigurationen für ToolsOptions auf der Client-Seite aufgeführt. Die vollständigen Typen finden Sie unter packages/core/client-v2/src/ai/tools-manager/types.ts.
Karte verwenden
Verwenden Sie standardmäßig card. Eine Karte eignet sich für kurze Bestätigungen, Auswahlen und einfache Parameteränderungen.
Modal verwenden
Verwenden Sie modal nur bei umfangreicheren Inhalten, Bedarf an einer größeren Vorschau oder komplexer Parameterbearbeitung.
Tool im Browser ausführen
Wenn ein serverseitiges Tool auf execution: 'frontend' gesetzt ist, muss der Client zusätzlich eine invoke-Methode bereitstellen. Solche Tools eignen sich zum Auslesen des aktuellen Seitenkontexts, von Editor-Inhalten oder des Status der FlowEngine. Sie sind nicht für Datenschreibvorgänge geeignet, die einen serverseitigen Berechtigungsschutz erfordern.
Vollständiges Beispiel: Auswahlkarte für einen integrierten AI-Mitarbeiter hinzufügen
Nachdem Sie Vollständiges Beispiel: Integrierten AI-Mitarbeiter erstellen abgeschlossen haben, können Sie die Rückfrage von Dev Helper in anklickbare Optionen umwandeln. Definieren Sie dazu ein weiteres developerChoice-Tool und registrieren Sie eine Frontend-Karte. Die serverseitige Datei befindet sich unter:
Dieses Tool ist für die Definition der Optionen und den Empfang der Benutzerauswahl zuständig:
Da sich developerChoice.ts im tools/-Verzeichnis des welcome-developer-Skills befindet, wird es automatisch mit diesem Skill verknüpft. Eine Verknüpfung bedeutet jedoch nur, dass das Modell das Tool verwenden kann, nicht dass es dies zwangsläufig tun wird.
Zudem muss der Workflow in SKILLS.md entsprechend angepasst werden, indem die ursprünglichen Schritte 5–6 durch Folgendes ersetzt werden:
Die Frontend-Karte verwendet die zuvor definierte DeveloperChoiceCard und wird unter folgendem Pfad gespeichert:
Registrieren Sie diese abschließend in src/client-v2/plugin.tsx:
Nachdem die Karte registriert wurde, bauen Sie den Client neu. Wenn im Gespräch der Punkt developerChoice erreicht wird, pausiert der ToolCall und zeigt die anklickbaren Optionen an.
Verwandte Links
- Serverseitiges Tool definieren — Das serverseitige Tool für die entsprechende Frontend-Interaktion definieren
- Vollständiges Beispiel: Integrierten AI-Mitarbeiter erstellen — Zuerst das Basisbeispiel ohne Frontend-Code fertigstellen
- Internationalisierung von AI-Mitarbeiter-Plugins — Texte der Verwaltungsoberfläche von Tools und Skills übersetzen
- Client-Plugin — Client-Plugin-Einstiegspunkte und die Methode
load()kennenlernen

