Dokumentation

Deterministische Operatoren

Aktionsknoten, die das LLM umgehen — HTTP, DB, Transformationen, Berechnungen.

Ein Operator ist ein Knoten, der eine deterministische Aktion ausführt: kein LLM, kein Zufall. Für eine gegebene Eingabe ist die Ausgabe vorhersehbar.

Warum sie verwenden

Jede Logik, die explizit geschrieben werden kann, sollte es auch. Ein LLM, das „eine Summe berechnet" oder „ein Datum formatiert", ist ein Anti-Muster: Es ist langsamer, teurer und kann Fehler machen.

Praktische Regel: Wenn Sie die Funktion in 5 Zeilen Python schreiben können, ist es ein Operator — kein Agent.

Verfügbare Typen

webhook_action (HTTP-Aufruf)

Führt einen ausgehenden HTTP-Aufruf aus. Konfiguration:

  • URL, Methode, Header und Query-Parameter (mit Platzhaltern aus dem Kontext)
  • Body: none, json, form, raw, multipart oder mapper (Body, der mit der Mapping-Sprache zusammengestellt wird, siehe unten)
  • Authentifizierung: bearer, basic, api_key_header (benutzerdefinierter Header) oder oauth2 (siehe unten)
  • Akzeptierte HTTP-Status, maximale Dauer und Anzahl der Wiederholungen (retry_count, standardmäßig 0, exponentielles Backoff)
  • Ausgabeschlüssel, unter dem die Antwort veröffentlicht wird

database_query / database_manage

database_query liest Zeilen aus einer No-Code-Datenbank von betool oder aus einer externen Datenbank (Postgres, MySQL, MongoDB), die unter Anwendungen → Datenbanken → Verbindungen registriert ist: where-Filter, Volltextsuche, Limit. database_manage schreibt darin (create oder update), wobei der Inhalt mit der Mapping-Sprache zusammengestellt wird.

file_transform

Transformiert eine Datei. Integrierte Transformatoren:

  • pdf_extract_text — auswählbarer Text eines PDF (kein OCR: ein gescanntes PDF liefert keinen Text)
  • pdf_split — Aufteilen eines PDF
  • pdf_to_images — Rendern der Seiten eines PDF als Bilder
  • xlsx_to_json / xls_to_json — Lesen einer Excel-Arbeitsmappe als JSON-Zeilen
  • unzip — Entpacken eines Archivs

Liefert Dateien per Link an Dritte, ohne ihren Inhalt in den Fluss zu legen: Für jede Datei einer Liste im Kontext (die Dateien eines Downloads, empfangene Anhänge, die Fotos einer Inspektion …) erzeugt der Knoten Download-Links einen signierten Download-Link mit begrenzter Gültigkeit. Ein nachfolgender Schritt stellt zusammen, was der Empfänger erhält: Antwort eines eingehenden Webhooks, E-Mail …

EinstellungRolle
Liste der zu verlinkenden Dateien (input_path)Wo die Liste im Fluss gelesen wird — jeder Eintrag trägt path (Schlüssel der Datei im Speicher der Organisation) und optional einen Dateinamen. Pflichtfeld.
Erlaubte Unterordner (path_scope)Optional: beschränkt die signierbaren Dateien auf bestimmte Unterordner des Speichers der Organisation.
Gültigkeit der LinksStandardmäßig 15 Minuten, von 1 Minute bis 24 Stunden.
Maximale Anzahl Dateien (max_files)Standardmäßig 20, höchstens 100.
Ausgabeschlüssel (output_key)Standard linked.files.

Die Ausgabe enthält files (jeden ursprünglichen Eintrag, ergänzt um url und expires_at), file_count, failed, requested und ttl_seconds.

  • Nie außerhalb Ihrer Organisation: Eine Datei außerhalb ihres Speichers wird abgelehnt.
  • Existenz vor dem Signieren geprüft: Eine fehlende Datei wird nie signiert.
  • Nichts ausgelassen: Eine nicht verlinkte Datei (außerhalb des Bereichs, nicht gefunden, über der Obergrenze, Signatur unmöglich) erscheint in failed mit ihrem Grund.
  • Die Links werden bei jeder Ausführung neu erstellt, und jeder ausgegebene Link wird protokolliert.

Der Link ist ein Inhaberlink: Wer ihn besitzt, lädt die Datei bis zu ihrem Ablauf herunter. Halten Sie die Gültigkeit kurz, und füllen Sie die erlaubten Unterordner aus, sobald die Liste aus einem änderbaren Datum stammt (einer Tabellenzeile) — sonst könnte jeder, der dieses Datum schreiben kann, einen Link zu einer beliebigen Datei der Organisation signieren lassen.

compute

Deterministische Berechnungen über die Daten des Kontexts. Integrierte Operationen:

  • column_stats — pro Spalte einer Zeilenliste, wie viele einen bestimmten Wert haben (count, total, pct)
  • compose_text — Zusammenstellung eines Texts aus einer Vorlage und Werten des Flusses
  • regex_extract — Extraktion von Werten per regulärem Ausdruck
  • select_by_substring — Aufteilung einer Liste in Gruppen nach Prädikaten „enthält / enthält nicht“
  • list_compare — Konsistenz mehrerer Listen über einen Pivotschlüssel
  • multi_source_compliance — Konformitätsaudit über mehrere Dimensionen und Quellen
  • contact_extract — in einem Text gefundene E-Mail-Adressen und Telefonnummern, mit ihrer Herkunft
  • free_slots — freie Zeitfenster, abgeleitet aus belegten Zeiträumen
  • url_expand — Zusammensetzen von URLs aus Basen und Pfaden

Mapping-Sprache

Das ist kein Knoten: Es ist die Sprache, die eine Ausgabe-Nutzlast aus den Daten des Kontexts zusammenstellt (Funktionen $now, $uuid, $concat …). Sie dient dem Body mapper von webhook_action, dem von database_manage geschriebenen Inhalt und den Variablen eines ausgehenden Anrufs phone_call.

data_to_file

Erzeugt eine Excel-Datei (.xlsx) aus Daten des Kontexts — einer Liste von Zeilen, einem Raster oder mehreren Listen (je ein Tabellenblatt). Optionen: Dateiname (mit Vorlagen nutzbar), Name des Tabellenblatts, Auswahl und Reihenfolge der Spalten, Kopfzeile. Die Datei wird im Speicher Ihrer Organisation abgelegt, bereit zum Versand per E-Mail oder zur Ablage in einem Drive.

Aus Sicherheitsgründen werden Zellen, die mit =, +, - oder @ beginnen, standardmäßig als Text geschrieben (keine eingeschleuste Formel). Wenn die Grenzen von Excel eine Kürzung erzwingen, wird die Datei als gekürzt markiert.

web_fetch

Liest eine oder mehrere Webseiten und veröffentlicht ihren lesbaren Text im Kontext (Standard web.pages). Einstellungen: Anzahl der Seiten, Parallelität, Timeout, maximale Größe. Das robots.txt-Ergebnis wird stets berechnet und gemeldet; angewendet wird es nur, wenn Sie es aktivieren (respect_robots).

Seiten, die ausschließlich per JavaScript gerendert werden, werden nicht ausgeführt: Nur das ausgelieferte HTML wird gelesen. Eine fehlgeschlagene Seite wird im Ergebnis gemeldet, ohne die Pipeline scheitern zu lassen.

Auf Agent-Seite gibt es zwei gleichwertige Werkzeuge:

  • web_scrape.fetch_page — liest eine Seite (Titel, Text, gefundene E-Mail- und Telefon-Links).
  • web_search.search — Websuche über eine von der Plattform selbst gehostete SearXNG-Suchmaschine: bis zu 5 Ergebnisse (Titel, URL, Auszug).

Alle Web-Lesezugriffe durchlaufen denselben Anti-SSRF-Schutz: interne, private und Cloud-Metadaten-Adressen werden nach der DNS-Auflösung abgelehnt, Weiterleitungen bei jedem Sprung erneut geprüft.

code_step

Wenn deterministische Logik über das hinausgeht, was compute bewältigen kann, führt ein Code-Step benutzerdefinierten Code in einer Starlark-Sandbox aus — direkt editierbar, ab dem Speichern ausgeführt und durch eine Werkzeug-Allowlist begrenzt. Siehe Code-Steps.

Authentifizierung & Secrets

Operatoren, die mit einem externen System kommunizieren (HTTP, DB), referenzieren ein in der Organisation registriertes Konto. Zugangsdaten sind innerhalb der Pipeline selbst niemals sichtbar — es wird nur ein Kontoname referenziert.

Dadurch erfordert die Rotation eines Passworts keine Änderungen an irgendeiner Pipeline.

Wird ein Secret direkt in einem Knoten eingegeben (bearer-Token, basic-Passwort oder api_key_header-Wert von webhook_action, Passwort einer verschlüsselten PDF-Datei oder eines verschlüsselten Archivs für file_transform), wird es ab dem Speichern maskiert: Editor, API und MCP-Tools zeigen davon nur eine Markierung. Siehe Der visuelle Editor, Abschnitt Secrets.

Ausgehendes OAuth2 (client_credentials)

Für APIs, die ein OAuth2-Token erfordern (Enterprise-Cloud, ERP, Drittanbieter), unterstützt der HTTP-Operator den oauth2-Modus. Sie registrieren in der Organisation ein OAuth2-Zugangsdatum — token_url, client_id, client_secret, scope — und der Knoten referenziert nur eine nicht sensible Kennung.

Zum Zeitpunkt des Aufrufs holt betool ein Token und verwendet es wieder, solange es gültig bleibt; es wird bei Ablauf lazy aktualisiert, ohne Hintergrundaufgabe. Das client_secret wird von der Administrations-API niemals zurückgegeben (nur ein has_secret-Indikator wird bereitgestellt), und das erhaltene Token wird als Authorization: Bearer … an die ausgehende Anfrage gesetzt.

Die Rotation des Secrets nach einer anbieterseitigen Rotation erfordert keine Pipeline-Änderungen: Der nächste Aufruf aktualisiert es automatisch.

Idempotenz

Jeder Operator, der einen Seiteneffekt erzeugt (HTTP POST, DB INSERT, E-Mail-Versand), muss auf der Zielseite auf Idempotenz ausgelegt sein. Empfohlene Praxis:

  • Fügen Sie einen idempotency_key in die Nutzlast ein (typischerweise exchange_id).
  • Prüfen Sie auf der Zielseite, ob der Schlüssel bereits verarbeitet wurde.

Abgesehen von den Wiederholungen, die Sie explizit für webhook_action konfigurieren (retry_count), wiederholt betool einen fehlgeschlagenen Operator nicht automatisch: Es ist die Verantwortung Ihrer Pipeline, die Wiederholungsstrategie zu orchestrieren. webhook_action ist zudem gegen doppelten Versand bei einem internen Re-Dispatch geschützt: Eine bereits mit akzeptiertem Status zugestellte Anfrage wird nicht erneut gesendet.