Integrationen
Benutzerdefinierte Agent-Tools
Geben Sie der KI Live-Zugriff auf Ihre Systeme: Definieren Sie Tools, die das LLM während der Antworterstellung aufrufen kann, um Bestellstatus abzurufen, Konten nachzuschlagen, den Lagerbestand zu prüfen und vieles mehr.
Kurzüberblick#
| Tool-Typen | SERVER_SIDE (HTTP-Aufruf von HelpStack), CLIENT_SIDE (im Browser des Besuchers ausgeführt) oder CLIENT_ACTION (eine Schaltfläche „Zeig es mir“, auf die der Besucher tippt) |
| Verwaltung über | Dashboard + /api/agent-tools (Organisationsebene), /api/channels/[id]/agent-tools (Kanalebene) |
| Authentifizierung | Dashboard-Sitzung (werden von Ihrem Team konfiguriert) |
| Server-Tool-Timeout | ~10s, Antwort auf 128 KB begrenzt |
| Client-Tool-Timeout | ~5s (Socket-Roundtrip) |
| Protokollierung | Jeder Aufruf wird in ToolCallLog aufgezeichnet |
Die konzeptuelle Übersicht finden Sie im Agent-Tools-Leitfaden. Diese Seite ist die technische Referenz.
Tool-Anatomie#
Eine Tool-Definition enthält folgende Felder:
| Feld | Erforderlich | Hinweise |
|---|---|---|
| Name | ja | Der Funktionsname, den das LLM aufruft, z. B. get_order_status. Muss ein gültiger Funktionsbezeichner sein |
| Beschreibung | ja | Das LLM liest diese, um zu entscheiden, wann das Tool aufgerufen werden soll. Max. ~2000 Zeichen (validiert). Seien Sie präzise |
| URL | ja (serverseitig) | Muss HTTPS sein. SSRF-geschützt: eine Blockliste lehnt interne/private Netzwerkziele ab |
| Methode | nein | GET | POST | PUT | PATCH. Standard POST |
| Header | nein | Optionales JSON-Objekt. Kann verschlüsselt/maskiert werden (für API-Schlüssel/Token verwenden) |
| Parameter-Schema | ja | Ein JSON-Schema-Objekt, das die Argumente beschreibt, die das LLM ausfüllt (parametersSchema) |
| Typ | ja | SERVER_SIDE, CLIENT_SIDE oder CLIENT_ACTION |
| Aktiv | — | Umschalten, um das Tool zu aktivieren/deaktivieren, ohne es zu löschen |
Arbeitsbeispiel — get_order_status (SERVER_SIDE)#
Tool-Definition
| Feld | Wert |
|---|---|
| Name | get_order_status |
| Typ | SERVER_SIDE |
| Methode | POST |
| URL | https://api.YOURCOMPANY.com/orders/status |
| Header | { "Authorization": "Bearer YOUR_API_TOKEN" } (als verschlüsselten Header speichern) |
| Beschreibung | Look up the current status and tracking info for a customer order by its order number. Call this whenever the customer asks where their order is, when it will arrive, or to confirm an order was placed. |
Parameter-Schema (JSON Schema)
{
"type": "object",
"properties": {
"order_number": {
"type": "string",
"description": "The customer's order number, e.g. ORD-10432"
}
},
"required": ["order_number"]
}
Anfrage, die Ihr Endpunkt erhält
Bei einem Tool-Aufruf sendet HelpStack die vom LLM bereitgestellten Argumente als Request-Body (bei POST/PUT/PATCH), zusammen mit Ihren konfigurierten Headern und Content-Type: application/json:
POST /orders/status HTTP/1.1
Host: api.YOURCOMPANY.com
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
{ "order_number": "ORD-10432" }
Antwort-Vertrag, den Ihr Endpunkt einhalten muss
Geben Sie JSON zurück, das das Modell lesen kann. Der Aufruf läuft nach ~10s ab und die Antwort ist auf 128 KB begrenzt.
Eine Antwort über dem Limit wird abgelehnt, nicht gekürzt — ein halbes JSON-Dokument lässt sich entweder nicht parsen oder ergibt schlimmstenfalls eine andere Bedeutung —, der Aufruf schlägt also fehl und der KI wird mitgeteilt, dass das Tool nicht verfügbar ist. Dasselbe passiert, wenn der Körper gar kein JSON ist, meist eine HTML-Fehlerseite eines Proxys.
Das Limit ist eine Absicherung gegen einen außer Kontrolle geratenen Endpunkt (eine paginierte Liste ohne Seitengröße, ein Debug-Dump), kein Zielwert. Größe kostet Sie auch darunter: Was Sie zurückgeben, wird vollständig geparst, ins Aufrufprotokoll geschrieben und dem Modell vorgelegt und daher bei jeder Antwort, die es verwendet, in Tokens bezahlt. Geben Sie die wenigen Felder zurück, die die KI zum Antworten braucht, nicht Ihren gesamten Datensatz — Status, voraussichtliche Lieferzeit und Sendungsnummer einer Bestellung, nicht das ganze Bestellobjekt.
{
"status": "shipped",
"carrier": "DHL",
"tracking_number": "JD0140...",
"estimated_delivery": "2026-06-02"
}
Die KI erhält diesen Payload als Tool-Ergebnis und verarbeitet ihn in ihre Antwort. Es gibt keinen vorgeschriebenen Envelope — geben Sie beliebige nützliche Felder zurück, aber machen Sie sie selbstbeschreibend, damit das Modell sie korrekt verwendet.
Die verifizierte E-Mail-Adresse des Kunden (gebundene Parameter)#
Auf einem E-Mail-Kanal ist die Adresse, von der eine Nachricht kam, die Identität des Kunden. Ein SERVER_SIDE-Tool kann HelpStack bitten, einen seiner Parameter mit dieser Adresse zu füllen. Ein Tool „meine Bestellungen abrufen" braucht dann keine Bestellnummer, und niemand kann die KI dazu bringen, die Bestellungen einer anderen Person abzurufen, indem er deren Adresse eintippt.
Fügen Sie dem Parameter "x-helpstack-bind": "conversation.senderEmail" hinzu:
{
"type": "object",
"properties": {
"customer_email": {
"type": "string",
"x-helpstack-bind": "conversation.senderEmail"
},
"status": {
"type": "string",
"enum": ["open", "shipped", "delivered"],
"description": "Optional filter by order status"
}
},
"required": ["customer_email"]
}
Was passiert:
- Die KI sieht den Parameter nie. Er wird aus dem Schema und aus
requiredentfernt, bevor das Tool angeboten wird. - HelpStack füllt ihn bei jedem Aufruf mit der Absenderadresse der E-Mail-Unterhaltung, in Kleinbuchstaben: im Query-String bei
GET, im JSON-Body beiPOST/PUT/PATCHoder in einem Platzhalter{customer_email}in der URL. Sendet die KI trotzdem einen Wert dafür, wird er verworfen. - Das Tool wird nur in E-Mail-Unterhaltungen angeboten. Website-Chat, Messenger, Instagram, WhatsApp und die anderen Kanäle haben keine verifizierte Adresse, daher sieht die KI das Tool dort nicht und fragt den Kunden nach dem, was Ihre anderen Tools brauchen, etwa Bestellnummer und E-Mail-Adresse.
- Nur
SERVER_SIDE-Tools und Parameter der obersten Ebene können gebunden werden, undconversation.senderEmailist der einzige unterstützte Wert. Alles andere wird beim Speichern abgelehnt.
Begrenzen Sie die Abfrage auf Ihrer Seite: Geben Sie die Daten dieses Kunden zurück und nichts anderes. Jede Antwort geht an dieselbe Adresse, mit der das Tool aufgerufen wurde, daher erreicht das Ergebnis den Inhaber dieses Postfachs.
Gute Beschreibungen verfassen#
Die Beschreibung ist das bei weitem wichtigste Feld — sie ist das Einzige, was das LLM verwendet, um zu entscheiden, ob und wann das Tool aufgerufen werden soll.
- Geben Sie an, was das Tool zurückgibt und wann es aufgerufen werden soll („Rufen Sie dies auf, wenn der Kunde fragt …").
- Erwähnen Sie die Formulierungen, die Kunden tatsächlich verwenden.
- Beschreiben Sie jeden Parameter klar in der
descriptionseines Schemas. - Bleiben Sie unter dem ~2000-Zeichen-Limit (der Speicherdialog validiert dies und zeigt Fehler an).
Sicherheit & SSRF-Schutz#
- Nur HTTPS. Einfache HTTP-URLs werden abgelehnt.
- SSRF-Blockliste. Interne/private Netzwerkziele (Loopback, private RFC1918-Bereiche, Link-local, Metadaten-Endpunkte) sind blockiert, damit ein Tool nicht auf interne Infrastruktur gerichtet werden kann.
- Geheime Header. Legen Sie API-Schlüssel/Token in Header, die verschlüsselt/maskiert statt im Klartext gespeichert werden können.
- Behandeln Sie den Tool-Endpunkt als öffentlich zugänglich — authentifizieren Sie Anfragen (z. B. ein Bearer-Token in Headern) und validieren Sie Eingaben auf Ihrer Seite.
Timeouts & Limits#
| Serverseitig | Clientseitig | |
|---|---|---|
| Timeout | ~10s | ~5s |
| Antwort-Limit | 128 KB (abgelehnt, nicht gekürzt) | — |
| Bei Fehler/Timeout | Protokolliert; KI wird informiert, dass das Tool nicht verfügbar ist, und setzt mit der bestmöglichen Antwort fort |
Fehler werden graceful degradiert — ein defektes oder langsames Tool blockiert nie eine Antwort; die KI fährt einfach ohne diese Daten fort.
Organisations- vs. Kanal-Tools + semantische Filterung#
- Tools können auf Organisations-Ebene und auf Kanal-Ebene definiert werden.
- Für ein bestimmtes Gespräch werden Organisations- und Kanal-Tools zusammengeführt, wobei ein Kanal-Tool ein Organisations-Tool mit demselben Namen überschreibt.
- Der zusammengeführte Satz wird semantisch nach Relevanz für die Kundenanfrage gefiltert, sodass ein großer Tool-Katalog nicht jeden LLM-Aufruf aufbläht — nur relevante Tools werden angeboten.
- Ausgewählte Tools werden in OpenAI/Anthropic-Funktionsdefinitionen umgewandelt und bei der Antworterstellung angeboten.
OpenAPI-Import#
Sie können Tools aus einer vorhandenen API bootstrappen: Fügen Sie eine OpenAPI 3.0-Spezifikation ein oder laden Sie sie hoch, und HelpStack extrahiert deren Operationen in Tool-Definitionen, die Sie prüfen und speichern. Dies ist der schnellste Weg, eine vorhandene REST-API der KI zugänglich zu machen. Eine x-helpstack-bind-Erweiterung an einem Parameter oder an einem Property-Schema in der Spezifikation bleibt erhalten (siehe den Abschnitt zu gebundenen Parametern oben).
Protokollierung#
Jeder Tool-Aufruf wird in ToolCallLog aufgezeichnet. Den Aufrufverlauf eines Tools (Argumente, Ergebnis, Timing) können Sie über folgenden Endpunkt einsehen:
GET /api/agent-tools/[id]/logs
Verwenden Sie die Protokolle, um zu debuggen, warum ein Tool aufgerufen wurde oder nicht, und um Timeouts/Fehler zu erkennen.
Wiederholungen werden nicht protokolliert. Wenn HelpStack eine vergangene Konversation erneut abspielt, um die Antwortqualität zu messen, wird ein Tool mit GET (oder HEAD) genau wie bei einer echten Antwort aufgerufen, Ihr Endpunkt kann also eine Abfrage zu einer älteren Nachricht sehen. Ein Tool mit einer anderen Methode wird während einer Wiederholung nie aufgerufen, und Aufrufe aus einer Wiederholung erscheinen nicht in ToolCallLog.
Clientseitige Tools (fortgeschritten)#
CLIENT_SIDE-Tools werden auf dieselbe Weise deklariert (Name, Beschreibung, Parameter-Schema), werden aber im Browser des Website-Besuchers ausgeführt, vermittelt durch den Widget-Socket:
- Die KI gibt einen Tool-Aufruf für ein
CLIENT_SIDE-Tool aus. - Der Server sendet
tool:executean das Widget. - Das Widget führt es aus und antwortet mit
tool:result(odertool:error). - Es gibt einen ~5s-Timeout; bei Timeout wird der Aufruf graceful degradiert (Tool nicht verfügbar).
Einen Handler registrieren
Das Widget-Skript stellt window.HelpStack bereit. Registrieren Sie einen Handler
namentlich, und er wird aufgerufen, sobald die KI dieses Tool nutzt:
<script src="https://helpstack.eu/widget.js?id=CHANNEL_ID" async></script>
<script>
window.HelpStack = window.HelpStack || function () {
(window.HelpStack.q = window.HelpStack.q || []).push(arguments);
};
window.HelpStack('registerTool', 'highlight', async ({ section }) => {
document.querySelector(`#${section}`)?.scrollIntoView({ behavior: 'smooth' });
return { highlighted: section };
});
</script>
Der Queue-Shim in der Mitte bedeutet, dass Sie registrieren können, bevor widget.js
geladen ist; das Skript leert die Warteschlange beim Start. Was Ihr Handler zurückgibt, ist
das, was die KI liest, und wenn er eine Ausnahme wirft, wird der KI mitgeteilt, dass das Tool
fehlgeschlagen ist. Dieselbe Funktion liegt nach dem Laden des Skripts auch auf
ChatWidget.registerTool(name, fn).
Beispiel-Handler
Vier Muster, in der Reihenfolge, in der Teams sie üblicherweise bauen. Jedes zeigt die Tool-Definition, die Sie im Dashboard eintragen, und den Handler, den Sie auf Ihrer Seite registrieren. Sie sind bewusst klein gehalten: Ein clientseitiges Tool sollte eine Sache tun und ein kurzes, schlichtes Objekt zurückgeben.
1. Auslesen, wo der Besucher ist (ohne Parameter)
Das nützlichste erste Tool. Es kostet nichts und verhindert, dass die KI rät, was der Besucher gerade ansieht.
Definition
| Feld | Wert |
|---|---|
| Name | where_is_the_user |
| Typ | CLIENT_SIDE |
| Beschreibung | Check which page and section the customer is currently looking at. Call this before giving directions, so you can describe what is actually on their screen. |
{ "type": "object", "properties": {}, "required": [] }
Handler
window.HelpStack('registerTool', 'where_is_the_user', async () => ({
page: location.pathname,
title: document.title,
// Whatever "where they are" means in your UI: an open tab, a wizard step, a route.
section: document.querySelector('[data-active-section]')?.dataset.activeSection ?? null,
}));
2. Auf etwas auf der Seite zeigen
Definition
| Feld | Wert |
|---|---|
| Name | highlight |
| Typ | CLIENT_SIDE |
| Beschreibung | Scroll to and visually highlight a control or section on the customer's screen so they can see exactly what you mean. Use this instead of describing where something is. |
{
"type": "object",
"properties": {
"target": {
"type": "string",
"description": "What to highlight, in the customer's own words: a button label, a section name, or a menu item."
}
},
"required": ["target"]
}
Handler
window.HelpStack('registerTool', 'highlight', async ({ target }) => {
const el = document.querySelector(`[data-tour="${CSS.escape(target)}"]`);
if (!el) {
// Not found is a normal outcome, not a failure. Say so and let the AI recover.
return { found: false, target };
}
el.scrollIntoView({ behavior: 'smooth', block: 'center' });
el.classList.add('hs-highlight');
setTimeout(() => el.classList.remove('hs-highlight'), 3000);
return { found: true, target };
});
3. Inhalte an die KI zurücklesen
Definition
| Feld | Wert |
|---|---|
| Name | read_section |
| Typ | CLIENT_SIDE |
| Beschreibung | Read what is currently written in one section of the page, field by field, so you can answer about the customer's real content instead of guessing. |
{
"type": "object",
"properties": {
"section": { "type": "string", "description": "Section name as the customer would say it." }
},
"required": ["section"]
}
Handler
window.HelpStack('registerTool', 'read_section', async ({ section }) => {
const root = document.querySelector(`[data-section="${CSS.escape(section)}"]`);
if (!root) return { found: false, section };
const fields = {};
root.querySelectorAll('[data-field]').forEach((el) => {
// Keep it small — the result goes into the AI's context on every call.
fields[el.dataset.field] = (el.value ?? el.textContent ?? '').trim().slice(0, 500);
});
return { found: true, section, fields };
});
Geben Sie Feldschlüssel zurück, die die KI Ihnen zitieren kann. Genau das macht ein Schreib-Tool wie das nächste möglich.
4. Etwas für den Besucher schreiben
Das wertvollste Muster und dasjenige, bei dem die größte Vorsicht geboten ist: Die KI verändert jetzt den Bildschirm des Besuchers.
Definition
| Feld | Wert |
|---|---|
| Name | fill_field |
| Typ | CLIENT_SIDE |
| Beschreibung | Put suggested text into a specific field on the customer's page so they can review it and save it themselves. Only use a field key that read_section returned. Never save or submit on the customer's behalf. |
{
"type": "object",
"properties": {
"section": { "type": "string", "description": "Section name, as returned by read_section." },
"field": { "type": "string", "description": "Field key exactly as read_section returned it." },
"text": { "type": "string", "description": "The complete new contents of that field." }
},
"required": ["section", "field", "text"]
}
Handler
window.HelpStack('registerTool', 'fill_field', async ({ section, field, text }) => {
const el = document.querySelector(
`[data-section="${CSS.escape(section)}"] [data-field="${CSS.escape(field)}"]`
);
if (!el) return { written: false, reason: 'field not found', section, field };
el.value = text;
// Frameworks that track their own state need to be told.
el.dispatchEvent(new Event('input', { bubbles: true }));
el.scrollIntoView({ behavior: 'smooth', block: 'center' });
return { written: true, section, field };
});
⚠️ Ausfüllen, nicht absenden. Lassen Sie den Besucher die Änderung lesen und selbst speichern. Ein Tool, das an seiner Stelle veröffentlicht, macht aus einem hilfreichen Vorschlag eine nicht rückgängig zu machende Aktion, und die KI kann das Ergebnis nicht sehen.
Handler schreiben, die sich anständig verhalten
- Geben Sie kleine, schlichte Objekte zurück. Das Ergebnis fließt bei jedem Aufruf in den
Kontext der KI. Geben Sie
{ found: true, section, fields }zurück, niemals einen DOM-Knoten, eine Komponente oder einen 50-KB-Blob. - „Nicht gefunden" ist ein Ergebnis, kein Fehler. Geben Sie
{ found: false }zurück und lassen Sie die KI etwas Sinnvolles sagen. Eine Ausnahme erzeugt einen Tool-Fehlschlag, und die KI erfährt nur, dass etwas kaputt ist. - Bleiben Sie deutlich unter dem ~5-Sekunden-Timeout. Keine Netzwerkaufrufe, auf die der
Besucher warten muss. Wenn Sie Ihr Backend brauchen, machen Sie stattdessen ein
SERVER_SIDE-Tool daraus. - Legen Sie niemals etwas offen, das der Besucher nicht ohnehin sehen kann. Ein clientseitiges Tool läuft auf einer öffentlichen Seite ohne eigene Authentifizierung. Lesen Sie keine Auth-Tokens, keine Daten anderer Kunden und nichts hinter Ihren eigenen Berechtigungsprüfungen.
- Benennen Sie Parameter in der Sprache des Kunden, nicht in der Ihres Schemas. Die KI füllt
sie aus dem, was der Kunde geschrieben hat.
target: "der Speichern-Button"funktioniert;elementId: "btn-save-primary"nicht.
Das zugrunde liegende Protokoll
registerTool ist eine dünne Hülle um postMessage, und Sie können die Nachrichten auch
selbst beantworten — nützlich, wenn Sie bereits einen Message-Router haben oder ein Tool
bedienen möchten, das das Widget nicht kennt.
⚠️ Wenn Sie einen Handler über window.HelpStack registrieren, beantworten Sie dasselbe
Tool nicht zusätzlich mit einem eigenen Listener. Das iframe nimmt die erste Antwort pro
callId, zwei Antworten liefern sich also ein Rennen. Das Widget bleibt bei Tools ohne Handler
stumm, genau damit ein bestehender eigener Listener weiter funktioniert.
Das Widget-iframe sendet jeden clientseitigen Aufruf an sein übergeordnetes Fenster:
{ type: 'TOOL_EXECUTE', callId: '…', toolName: 'highlight', parameters: { … } }
Anschließend wartet es auf eine dieser Antworten, abgeglichen über callId:
{ type: 'TOOL_RESULT', callId: '…', result: { … } } // whatever the AI should read
{ type: 'TOOL_ERROR', callId: '…', error: 'why it failed' }
Ein Handler auf Ihrer eigenen Seite genügt also:
window.addEventListener('message', (event) => {
// Required. Without this check any page in an iframe could drive your tools.
if (event.origin !== 'https://helpstack.eu') return;
const { type, callId, toolName, parameters } = event.data ?? {};
if (type !== 'TOOL_EXECUTE') return;
const reply = (result) =>
event.source.postMessage({ type: 'TOOL_RESULT', callId, result }, event.origin);
const fail = (error) =>
event.source.postMessage({ type: 'TOOL_ERROR', callId, error }, event.origin);
if (toolName === 'highlight') {
const el = document.querySelector(parameters.selector);
if (!el) return fail('No element matches that selector.');
el.scrollIntoView({ behavior: 'smooth', block: 'center' });
el.classList.add('my-highlight');
reply({ ok: true, message: 'Highlighted it. Tell the customer to look at the ring.' });
}
});
Drei Dinge, die Sie wissen sollten, bevor Sie darauf aufbauen:
- Antworten Sie innerhalb des 5-Sekunden-Timeouts, und antworten Sie ehrlich. Bei einem
Timeout löst der Aufruf zu
{ success: false, error: 'timeout' }auf, und die KI macht ohne ihn weiter. Antworten Sie nicht, bevor Sie wissen, dass die Aktion funktioniert hat — eine KI, der „hervorgehoben" gesagt wird, obwohl nichts hervorgehoben wurde, schickt den Kunden auf die Suche nach etwas, das nicht auf seinem Bildschirm ist, und das ist schlimmer als gar kein Tool. - Was Sie in
resultschreiben, ist das, was die KI liest. Ein Satz, der erklärt, was passiert ist, bringt Ihnen eine bessere Antwort als{ ok: true }. - Der Besucher ist womöglich nicht auf einer Seite, die das leisten kann. Geben Sie ein Ergebnis zurück, das das sagt, statt still zu scheitern, damit die KI es erklären kann.
Kombinieren Sie das mit window.ChatWidget.identify(identity, metadata), damit die KI weiß,
welchem Konto sie hilft, bevor sie irgendetwas aufruft.
Aktionsschaltflächen (CLIENT_ACTION)#
Ein CLIENT_SIDE-Tool läuft in dem Moment, in dem die KI es aufruft. Das passt
zum Auslesen der Seite, aber nicht zu allem, was der Besucher sehen muss: Auf
einem Handy verdeckt der geöffnete Chat die ganze Seite, die Seite ändert sich
also dahinter, und der Besucher bekommt es nicht mit. Schlimmer noch, die Antwort
sagt dann „Ich habe Mein Team für Sie geöffnet“ über etwas, das er nie gesehen hat.
Ein CLIENT_ACTION-Tool wird auf dieselbe Weise deklariert (Name, Beschreibung,
Parameter-Schema), aber HelpStack führt es nie aus, wenn die KI es aufruft:
- Die KI ruft das Tool auf. HelpStack prüft die Argumente gegen Ihr Schema (nicht deklarierte Argumente werden verworfen) und hängt eine Schaltfläche an die Antwort. Der KI wird mitgeteilt, dass die Schaltfläche nur angeboten wurde, also schreibt sie „tippen Sie auf Zeig es mir“ und nie „ich habe geöffnet“.
- Der Besucher sieht die Antwort mit der Schaltfläche darunter.
- Tippt er darauf, weicht das Widget aus, falls es die Seite verdeckt (standardmäßig auf Handys), und lässt unten am Bildschirm eine kleine Schaltfläche Zurück zum Chat stehen.
- Der Handler Ihrer Seite läuft. Bei Erfolg bleibt Zurück zum Chat stehen, bis der Besucher darauf tippt. Bei einem Fehler kommt der Chat zurück, mit Ihrer Meldung unter der Antwort.
Eine Antwort trägt höchstens 2 Schaltflächen. Schaltflächen gibt es nur im Web-Chat: Bei E-Mail, WhatsApp und den anderen Kanälen werden der KI diese Tools gar nicht angeboten.
Einen Aktions-Handler registrieren
<script>
window.HelpStack = window.HelpStack || function () {
(window.HelpStack.q = window.HelpStack.q || []).push(arguments);
};
window.HelpStack('registerAction', 'show_element', async ({ element }) => {
const el = document.querySelector(`[data-help="${element}"]`);
if (!el) return { ok: false, message: 'That part of the page is not here.' };
el.scrollIntoView({ behavior: 'smooth', block: 'center' });
el.classList.add('help-highlight');
return { ok: true };
});
</script>
- Geben Sie
{ ok: false, message }zurück, um einen Fehler zu melden. Der Besucher siehtmessageim Chat, und die KI liest sie in ihrem nächsten Zug. Jeder andere Rückgabewert, oder gar keiner, zählt als Erfolg. Eine geworfene Ausnahme ist ein Fehler. - Ein Handler hat 10 Sekunden. Navigation plus Warten auf ein Element dauert meist weniger als 3.
- Ein bestehendes
CLIENT_SIDE-Tool lässt sich im Bearbeitungsformular oder mitupdate_agent_toolaufCLIENT_ACTIONumstellen (und zurück); Name, Parameter und Aufrufverlauf bleiben erhalten. Andere Typwechsel sind nicht möglich. - Derselbe Name kann mit
registerToolund mitregisterActionregistriert werden. Der Typ des Tools in HelpStack entscheidet, welchen die KI bekommt. - Hat die Seite den Handler nicht registriert (eine alte Seite, eine andere Website), wird die Schaltfläche deaktiviert angezeigt.
- Schaltflächen bleiben im Gespräch und funktionieren nach einem Neuladen wieder, solange die Seite den Handler erneut registriert.
Der Schaltflächentext
HelpStack fügt jedem CLIENT_ACTION-Tool, das die KI sieht, einen optionalen
Parameter label hinzu, damit sie die Schaltfläche in der Sprache der Antwort
beschriften kann (höchstens 24 Zeichen). Ihr Handler erhält label nie. Ohne
Label steht auf der Schaltfläche „Zeig es mir“ in der Sprache des Gesprächs
(„Show me“, „Pokaži mi“, „Ukáž mi“, ...).
Was das Widget beim Tippen tut
Pro Kanal einstellbar unter Kanäle → Erscheinungsbild → Wenn Besucher auf „Zeig es mir“ tippen:
| Einstellung | Handy (Chat im Vollbild) | Desktop (schwebendes Panel) |
|---|---|---|
| Ausweichen, solange der Chat den Bildschirm füllt (Handys) (Standard) | wird zu Zurück zum Chat | bleibt geöffnet |
| Immer ausweichen | wird zu Zurück zum Chat | wird zu Zurück zum Chat |
| Geöffnet bleiben | bleibt geöffnet | bleibt geöffnet |
„Vollbild“ meint das, was der Besucher gerade sieht, keine Vermutung anhand des Browsernamens.
Widget-API
Diese Aufrufe funktionieren auf jeder Seite mit widget.js, mit oder ohne
Schaltflächen:
ChatWidget.minimize(label?) | Schließt das Panel und zeigt die Schaltfläche Zurück zum Chat |
ChatWidget.restore() | Öffnet den Chat wieder dort, wo der Besucher aufgehört hat |
ChatWidget.isFullscreen() | true, solange der geöffnete Chat die Seite verdeckt |
ChatWidget.on('state', fn) | fn({ state: 'open' | 'minimized' | 'closed', fullscreen }); gibt eine Funktion zum Abmelden zurück |
ChatWidget.registerAction(name, fn) | Wie HelpStack('registerAction', ...), sobald das Skript geladen ist |
Protokolle
Jede Schaltfläche schreibt bis zu vier ToolCallLog-Zeilen: OFFERED, wenn die
KI sie angehängt hat, TAPPED, wenn der Besucher darauf getippt hat, danach
SUCCESS oder FAILED mit der Meldung Ihres Handlers. Ein Aufruf, den HelpStack
abgelehnt hat (ungültige Argumente, eine dritte Schaltfläche), wird mit dem Grund
als FAILED protokolliert.