> ## Documentation Index
> Fetch the complete documentation index at: https://docs.telli.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Eigene Code-Ausführung

> Führe eigenen JavaScript-Code während eines Anrufs mit einem Code-Tool oder als Workflow-Schritt mit einem Code-Block aus

Ein **Code-Tool** führt deinen JavaScript-Code aus, während der Agent telefoniert, und der Agent verwendet, was der Code zurückgibt. Ein **Code-Block** führt deinen JavaScript-Code als Schritt eines [Workflows](/de/platform/workflows.md) aus, und spätere Blöcke verwenden, was er zurückgibt. Nutze Code, wenn ein [Custom HTTP Tool](/de/custom-tools.md) oder ein Block **HTTP-Anfrage** nicht ausreicht, zum Beispiel um mehrere Anfragen nacheinander zu senden, eine Anfrage zu signieren oder eine große Antwort auf die wenigen Werte zu kürzen, die der Agent braucht.

> [!NOTE]
>
> Code-Tools und Code-Blöcke sind in den Plänen Scale und Enterprise verfügbar.

## Mit Charlie erstellen

Am schnellsten geht es mit [Charlie](/de/platform/charlie.md). Beschreibe, was der Code tun soll, welche API er aufruft und welche Zugangsdaten er verwenden soll. Charlie schreibt den Code, richtet die Eingaben ein und verbindet die Zugangsdaten sowie die Salesforce- oder HubSpot-Verbindungen, die in deinem Konto bereits bestehen.

Bei einem Code-Tool führt Charlie den Code anschließend mit Testwerten aus und zeigt dir, was der Agent erhalten würde. Die Testanfragen sind echt. Anfragen, die nur Daten lesen, führt Charlie ohne Rückfrage aus. Vor allem, was Daten anlegt, ändert oder löscht, eine Nachricht sendet oder einen Webhook aufruft, fragt Charlie dich zuerst.

![Charlie-Chat, in dem auf die Bitte um ein Code-Tool zur Bestellabfrage ein erfolgreicher Testlauf und eine Zusammenfassung der Änderungen folgen](https://mintcdn.com/telli/6vlT00d9OvFrkRmN/images/custom-code/charlie-code-tool-light.png?fit=max\&auto=format\&n=6vlT00d9OvFrkRmN\&q=85\&s=481a314438cbbbe08ba3ae9eff5d8725)

Charlie fügt ein Tool zur Bestellabfrage hinzu und testet es einmal

Einen Code-Block kann Charlie nicht ausführen. Nach einer Änderung bittet Charlie dich, den Workflow zu veröffentlichen und manuell auszuführen, und liest dann das Ergebnis dieser Ausführung.

Charlie fragt im Chat nie nach einem API-Schlüssel oder Token. Füge diese selbst als [geheime Eingabe oder Zugangsdaten](#geheimnisse-und-zugangsdaten) hinzu.

## Code schreiben

Der Code ist ein JavaScript-Modul, das eine asynchrone Funktion `run` exportiert. telli ruft sie mit einem Objekt auf:

| Feld | Inhalt |
| :- | :- |
| `inputs` | Die konfigurierten Eingaben nach Name, zum Beispiel `inputs.orderId` |
| `credentials` | Die hinzugefügten Zugangsdaten nach Name, zum Beispiel `credentials.orders` |
| `timeoutMs` | Wie viele Millisekunden der Ausführung beim Start noch bleiben |

Ein Code-Tool kann jeden JSON-Wert zurückgeben; der Agent erhält ihn als Ergebnis des Tools. Ein Code-Block muss ein JSON-Objekt zurückgeben; spätere Blöcke lesen es als `result`. Wenn etwas fehlschlägt, wirf einen `Error` mit einer kurzen Nachricht, die sagt, was schiefgelaufen ist.

```js wrap theme={null}
export async function run({
  inputs,
  credentials,
  timeoutMs,
}) {
  const { token } = credentials.orders;
  const id = encodeURIComponent(inputs.orderId);
  const url = `https://api.example.com/orders/${id}`;
  const response = await fetch(url, {
    headers: { Authorization: `Bearer ${token}` },
    signal: AbortSignal.timeout(timeoutMs - 500),
  });
  if (response.status === 404) {
    return { found: false };
  }
  if (!response.ok) {
    throw new Error(
      `Order lookup failed (${response.status}). ` +
        "Tell the caller to try later.",
    );
  }
  const order = await response.json();
  return { found: true, status: order.status };
}
```

Der Code läuft auf dem Code-Runner von telli, nicht in einem Browser und nicht in Node.js:

* Er kann Standard-Web-APIs nutzen, zum Beispiel `fetch`, `URL`, `URLSearchParams`, `Headers`, `AbortSignal`, `TextEncoder`, `TextDecoder`, `crypto.subtle`, `crypto.randomUUID`, `atob` und `btoa`. Anfragen erreichen jede öffentliche Adresse.
* Er kann keine npm-Pakete oder anderen Module importieren.
* Die Uhr läuft in UTC. Übergib beim Formatieren von Datumswerten `timeZone` an `Intl.DateTimeFormat`.
* Variablen auf oberster Ebene können aus einer früheren Ausführung desselben Codes erhalten bleiben, aber auch jederzeit neu beginnen. Halte Werte, die sich ändern, innerhalb von `run`.
* Ausgaben von `console.log` werden nirgends angezeigt. Gib zurück oder wirf, was du sehen musst.

## Limits

| Limit | Wert |
| :- | :- |
| CPU-Zeit | 100 ms pro Ausführung. Das Warten auf eine Antwort zählt nicht |
| Laufzeit | Das Antwort-Timeout des Tools oder 28 Sekunden für einen Code-Block |
| Ausgehende Anfragen | 50 pro Ausführung |
| Ergebnis | 1 MiB |
| Code und Eingaben zusammen | 1 MiB |
| Code-Länge | 50.000 Zeichen |
| Geheime Eingaben | 20 pro Code-Tool oder Code-Block |

## Code-Tool hinzufügen

1. Öffne den Agenten und gehe zu **Tools → Code-Tools**. Wähle **Code-Tool hinzufügen...**.

2. Schreibe den Code links im Editor **Code**.

3. Lege im Tab **Konfigurieren** fest:

   | Feld | Beschreibung |
   | :- | :- |
   | **Name des Tools** | Bezeichner, den der Agent aufruft, zum Beispiel `check_order_status`. Beginnt mit einem Buchstaben, danach Buchstaben, Zahlen und Unterstriche, bis zu 64 Zeichen |
   | **Beschreibung** | Was das Tool tut und wann der Agent es verwenden soll |
   | **Eingaben** | Werte, die der Code aus `inputs` liest. Sie nutzen dieselben Werttypen wie [Custom HTTP Tools](/de/custom-tools.md#werttypen). Nur Eingaben vom Typ **LLM-Parameter** füllt der Agent aus dem Gespräch |
   | **Zugangsdaten** | Zugangsdaten, die der Code aus `credentials` liest. Siehe [Geheimnisse und Zugangsdaten](#geheimnisse-und-zugangsdaten) |
   | **Antwort-Timeout (Sekunden)** | Wie lange der Code laufen darf. Standard sind 5 Sekunden, höchstens 10, mit einer **Tool-Nachricht** bis zu 30 |
   | **Tool-Nachricht** | Was der Agent sagt, während der Code läuft |

4. Wähle **Fertig** und veröffentliche den Agenten. Erwähne das Tool im Prompt, wenn der Agent es nur unter bestimmten Bedingungen verwenden soll.

Ein Agent kann bis zu 5 Code-Tools haben.

![Dialog eines Code-Tools mit JavaScript links und dem Tab Konfigurieren rechts mit Name, Beschreibung, einem LLM-Parameter orderId, den Zugangsdaten Shop API vom Typ Bearer token und einem Antwort-Timeout von 8 Sekunden](https://mintcdn.com/telli/6vlT00d9OvFrkRmN/images/custom-code/code-tool-configure-light.png?fit=max\&auto=format\&n=6vlT00d9OvFrkRmN\&q=85\&s=2f31086161011ad0fbcc9b81acead871)

Ein Code-Tool mit einer Eingabe, Zugangsdaten und einem Antwort-Timeout von 8 Sekunden

### Code-Tool testen

Öffne den Tab **Test** des Tools, fülle die **Testeingaben** aus und wähle **Ausführen**. telli speichert den Entwurf und führt dessen Code so aus wie ein Anruf. Geheime Eingaben und Zugangsdaten verwenden ihre gespeicherten Werte. Ein Testlauf sendet echte Anfragen: Was der Code in deinen Systemen anlegt, ändert oder löscht, passiert tatsächlich.

**Was der Agent erhält** zeigt das Ergebnis oder die Nachricht, die der Agent bei einem Fehler bekäme. Nennt der Fehler eine Zeile deines Codes, springst du mit **Gehe zu Zeile** dorthin.

![Tab Test eines Code-Tools nach einem fehlgeschlagenen Lauf mit der Fehlermeldung der Bestellabfrage, die der Agent erhalten würde](https://mintcdn.com/telli/6vlT00d9OvFrkRmN/images/custom-code/code-tool-test-failed-light.png?fit=max\&auto=format\&n=6vlT00d9OvFrkRmN\&q=85\&s=fabc803d299c4ea918cbfe88787a7158)

Ein fehlgeschlagener Testlauf zeigt die Nachricht, die der Agent erhalten würde

### Wenn ein Code-Tool im Anruf fehlschlägt

Der Agent erhält statt eines Ergebnisses eine Nachricht. Der Anruf geht weiter.

Wirft dein Code einen Fehler, erhält der Agent `The code failed while running:` gefolgt vom Fehler, seiner Zeile und seinem Stack, gekürzt auf 1.000 Zeichen. Der Agent formuliert deine Nachricht für den Anrufer. Schreibe sie deshalb für den Agenten, zum Beispiel `The order system returned 503. Tell the caller you cannot check the order right now.` Für erwartete Ergebnisse, etwa wenn kein passender Datensatz existiert, gib ein Ergebnis mit einer Nachricht zurück, statt einen Fehler zu werfen.

Hat eine Pflichteingabe keinen Wert, läuft der Code nicht und der Agent erhält `Missing required value "<name>"`. Das passiert, wenn der Agent einen erforderlichen LLM-Parameter auslässt oder der Kontakt für eine erforderliche Kontakteigenschaft oder Systemvariable keinen Wert hat. Einen Wert, der beim Kontakt fehlt, kann der Anrufer nicht liefern. Fehlt der Wert bei manchen Kontakten, entferne bei der Eingabe das Häkchen **Erforderlich** und behandle den fehlenden Wert im Code.

Erreicht der Code ein Limit oder lassen sich Zugangsdaten nicht laden, erfährt der Anrufer keine technischen Details. Der Agent sagt dem Anrufer, dass es gerade nicht möglich ist, und bietet andere Hilfe an. Der Grund bleibt im Testergebnis und im Anrufverlauf sichtbar:

| Fehler | Angezeigter Grund |
| :- | :- |
| Das Antwort-Timeout läuft ab | `The code timed out after 5 seconds.`, mit dem Antwort-Timeout des Tools |
| Der Code braucht mehr als seine CPU-Zeit | `The code used more CPU time than allowed.` |
| `run` gibt ein Promise zurück, das nie abschließt | `run() returned a promise that never settles.` |
| Der Code hat keinen Speicher mehr | `The code ran out of memory.` |
| Das Ergebnis ist größer als 1 MiB | `The code's result was too large. The limit is 1 MiB.` |
| Code und Eingaben sind zusammen größer als 1 MiB | `The code's inputs were too large. The code and its inputs may be up to 1 MiB together.` |
| Zugangsdaten lassen sich nicht laden | Die Ursache, zum Beispiel `Credential "orders" no longer exists.` |

Der Agent liest höchstens etwa 100 KB eines Ergebnisses. Gib deshalb nur die Werte zurück, die er braucht.

In [Simulationen](/de/platform/simulations.md) laufen Code-Tools nicht. Sie antworten mit der Antwort, die unter **Tools** in der Simulation festgelegt ist, oder mit einer generierten Antwort.

## Code-Block hinzufügen

1. Nutze im Workflow-Editor **+** auf der Zeichenfläche und wähle **Dienstprogramme → Code**.
2. Wähle unter **Eingaben** **Eingabe hinzufügen**. Gib jeder Eingabe einen Namen und ordne ihr Workflow-Daten, einen festen Wert oder ein Geheimnis zu.
3. Füge unter **Zugangsdaten** die Zugangsdaten hinzu, die der Code braucht.
4. Schreibe den Code im Editor **JavaScript**. Gib ein JSON-Objekt zurück.
5. Wähle in der Feldauswahl eines späteren Blocks `result` des Code-Blocks oder eines seiner Felder.

![Workflow-Editor mit einem Trigger Kontakt erstellt und einem Code-Block; das Code-Panel zeigt eine Eingabe phone mit der Telefonnummer des Kontakts, die Zugangsdaten Shop API und JavaScript](https://mintcdn.com/telli/6vlT00d9OvFrkRmN/images/custom-code/code-node-light.png?fit=max\&auto=format\&n=6vlT00d9OvFrkRmN\&q=85\&s=1ffe1ca7d6d962b6e8cc974cb5a1cb36)

Ein Code-Block, der einen neuen Kontakt an ein externes System sendet

Jede Ausführung eines Code-Blocks hat 28 Sekunden, abzüglich der Zeit, die das Laden seiner Zugangsdaten braucht. Ein Workflow kann bis zu 5 Code-Blöcke enthalten, jeder Code-Block bis zu 50 Eingaben.

### Code-Block testen

Veröffentliche den Workflow, öffne **Durchläufe → Manuell ausführen** und starte ihn. Manuelle Ausführungen führen echte Aktionen aus, auch die Anfragen des Codes. In den Ausführungsdetails zeigt der Code-Schritt sein **JavaScript**, bei einem geworfenen Fehler den **Fehler** und sein Ergebnis unter **Ausgaben → Ausgaben laden**.

### Wenn ein Code-Block fehlschlägt

Der Code-Schritt wird als fehlgeschlagen markiert, die Blöcke danach auf diesem Pfad laufen nicht, und die Ausführung endet als fehlgeschlagen. telli wiederholt den Schritt nicht. Die Ausführungsdetails nennen den Grund: Der Code hat einen Fehler geworfen, das Zeitlimit überschritten, zu viel CPU-Zeit gebraucht, keinen Speicher mehr gehabt, kein JSON-Objekt zurückgegeben, mehr als 1 MiB zurückgegeben, Code und Eingaben waren zusammen größer als 1 MiB, oder Zugangsdaten ließen sich nicht laden.

## Geheimnisse und Zugangsdaten

Schreibe nie einen API-Schlüssel, Token oder ein Passwort in den Code oder in eine Eingabe vom Typ **Konstante**. Beide werden als Klartext gespeichert. Verwende stattdessen eine geheime Eingabe oder Zugangsdaten.

* **Geheime Eingabe:** Füge eine Eingabe vom Typ **Geheim** hinzu. Der Wert wird beim Speichern verschlüsselt, und der Code liest ihn wie jede andere Eingabe.
* **Zugangsdaten:** Wähle unter **Zugangsdaten** **+ Hinzufügen** und wähle Zugangsdaten aus **Einstellungen → Entwickler** oder deine Salesforce- oder HubSpot-Verbindung aus **Einstellungen → Integrationen**. Gib ihnen einen Namen; der Code liest sie als `credentials.<name>`.

Zugangsdaten kommen in einer dieser Formen an:

| Zugangsdaten | `credentials.<name>` |
| :- | :- |
| [Bearer token](/de/credentials/bearer-token.md) | `{ type: "bearer_token", token }` |
| [HMAC-SHA256](/de/credentials/hmac-sha256.md) | `{ type: "hmac_sha256", secret }` |
| [Salesforce](/de/integrations/salesforce.md)-Verbindung oder Salesforce-Zugangsdaten | `{ type: "salesforce", accessToken, instanceUrl }` |
| [HubSpot](/de/integrations/hubspot.md)-Verbindung | `{ type: "hubspot", accessToken, apiBaseUrl }` |

telli holt vor der Ausführung für jede Salesforce- oder HubSpot-Verbindung einen Token. Er bleibt die ganze Ausführung über gültig, der Code muss ihn also nie erneuern. Ein Code-Tool oder Code-Block kann bis zu 10 Zugangsdaten verwenden. Wenn deine Salesforce-Org Anmeldungen auf IP-Bereiche beschränkt oder Sitzungen an eine IP-Adresse bindet, lehnt Salesforce den Token ab, sobald der Code ihn verwendet.

telli ersetzt im Ergebnis und in Fehlermeldungen jeden Wert einer geheimen Eingabe und jeden Token oder jedes Geheimnis von Zugangsdaten durch `[redacted]`. Dabei findet telli nur den exakten Wert: Ein Geheimnis, das der Code kürzt, kodiert oder verändert, bleibt lesbar. Gib nie ein Geheimnis zurück und wirf es nie in einem Fehler.


## Related topics

- [Bearer token](/de/credentials/bearer-token.md)
- [HMAC-SHA256](/de/credentials/hmac-sha256.md)
- [Workflows](/de/platform/workflows.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.