Kasimir Docs DEEN Zur App →

Workflow-Node-Referenz

Vollständige Referenz aller Knotentypen der Kasimir-Workflow-Engine mit Konfigurationsfeldern, Ein-/Ausgaben, Ports und Limits.

Diese Referenz dokumentiert jeden Knotentyp, den die Kasimir-Workflow-Engine (server/utils/workflowExecutor.ts) ausführt. Die Engine ist ein linearer Walker entlang der Kanten (workflow_edges): Ab dem trigger-Knoten wird einer Kanten-Queue gefolgt; mehrere Kanten aus einem Port laufen sequenziell in Einreihungs-Reihenfolge (Make.com-Semantik), jeder Knoten läuft pro Run höchstens einmal (Diamond-Join: erster Zweig gewinnt). Werte fließen über eine In-Memory-InterpolationState-Map und werden in nachgelagerten Knoten per Template-Referenz {{slug.feld[.pfad]}} aufgelöst. Alle *_template-Felder durchlaufen interpolate(); die Knoten-Typ-Literale (type) im config dienen als Diskriminator des NodeConfig-Union-Typs.

Grundkonzepte

Referenz-Syntax (Interpolation)

Templates referenzieren vorherige Knoten über {{slug.field[.path]}}. Das Regex erlaubt slug = [a-z][a-z0-9_]{0,39}, field = input oder output, plus optionalen punkt-getrennten Pfad.

Referenz

Bedeutung

{{trigger.input.kw}}

Wert des Trigger-/Formular-Inputs kw

{{step1.output}}

Voller Output des Knotens step1 (String oder JSON-stringifiziert)

{{step1.output.path}}

Pfad-Traversal in ein JSON-Output-Objekt

{{loop.output.item}} / {{loop.output.index}}

Aktuelles Element / Index innerhalb eines for_each

{{ask.input.answer}}

Antwort aus einem ask_user-Knoten

ℹ️

Fehlende Referenzen werden NICHT zum Fehler: nicht auflösbare Refs ergeben den Platzhalter-String [MISSING:slug] bzw. [MISSING:{{…}}]. null/undefined werden zu ''. Reservierte Slugs: trigger, now, output, error, headers, status, body.

Knoten-Querschnittsfelder

Diese Felder auf WorkflowNode gelten für JEDEN Knotentyp:

Feld

Typ

Wirkung

name

string | null

Anzeigename (Anzeige = name || slug); slug bleibt die technische ID für Refs

note

string | null

Notiz im Editor

disabled

boolean

Knoten wird übersprungen (Status skipped); Upstream-Output wird unverändert durchgereicht, ALLE ausgehenden Kanten werden verfolgt

on_error

'stop' | 'continue'

stop (Default): Fehler bricht den ganzen Run ab. continue: Knoten gilt als failed, Run läuft weiter, nachgelagerter Output = null

retry_count

number (0..5)

Bei Fehler wird der Knoten bis zu n-mal erneut ausgeführt, bevor on_error greift

requires_approval

boolean

Run pausiert mit Status waiting_approval VOR der Ausführung, bis jemand freigibt

ai_fields

Record<string,{mode:'auto'|'prompt';prompt?}>

KI-gefüllte Config-Felder; resolveAiFields ersetzt betroffene *_template-Strings vor Ausführung

ai_model_slug

string | null

Modell für die KI-Feld-Auflösung

⚠️

Eine Pause (ask_user, delay, requires_approval) hinter einem router oder parallelen Zweigen wird NICHT unterstützt — der Run schlägt mit entsprechender Meldung fehl, wenn die Kanten-Queue zum Pausenzeitpunkt nicht leer ist.

Workflow-Engine · Kanten-Warteschlange Sequenzielle Ausführung des Edge-Queue-Walkers Lauf #4812 aktiv TRIGGER Start output ROUTER Verzweigung 3 Ausgänge A B C BRANCH A LLM-Schritt prompt_llm success / error Rückfrage ask_user · PAUSE wartet auf Eingabe BRANCH B Dokument doc_render true / false BRANCH C · for_each Schleife for_each Body transform Sammeln aggregate loop-back Kanten-Queue FIFO · Walker-Reihenfolge 1 start → router 2 router → A 3 router → B 4 router → loop 5 A → ask_user ⏸ pausiert bei #5 aktiv erfolg wartend offen
Der Engine-Walker: Kanten-Queue, Router-Fan-out, for_each/aggregate-Schleife und Pause-Knoten.

Knotenübersicht

type

Kategorie

Output-Ports

trigger

Einstieg

output

llm

KI

output

check

KI / Guardrail

output

image_gen

KI

output

code

Logik

output

if_else

Verzweigung

true, false

router

Verzweigung

je Route eine Port-ID (+ Fallback)

for_each / aggregate

Schleife

output (am aggregate)

http_out

Aktion

success, error

ask_user

Pause

output

delay

Pause

output

load_table

Daten

output

doc_search

Daten / RAG

output

web_search

Daten

output

doc_render

Ausgabe

output

save_to_storage

Ausgabe

output

output

Ausgabe

output

send_email

Aktion

output

post_message

Aktion

output

notify

Aktion

output

outlook_draft / outlook_send / outlook_event

Integration (Microsoft)

output

onedrive_upload

Integration (Microsoft)

output

teams_card

Integration (Microsoft)

output

gdrive_upload / gcal_event / gsheets_append

Integration (Google)

output


Einstieg

trigger

Jeder Workflow hat genau einen Trigger; fehlt er, schlägt der Run sofort fehl (Kein Trigger-Knoten). Der Trigger definiert die Eingabevariablen, die als {{trigger.input.<key>}} verfügbar sind. Er führt selbst keine Logik aus — die Run-Inputs werden in den State geschrieben, der Knoten als completed markiert und die output-Kante verfolgt.

Config-Feld

Typ

Beschreibung

mode

'manual'|'webhook'|'schedule'|'form'|'integration'

Auslöseart

inputs

WorkflowInputDef[]

Eingabevariablen (gemeinsam für alle Modi)

integration_provider

string | null

Nur bei integration (z. B. jira, confluence)

integration_trigger

string | null

Trigger-Key aus INTEGRATION_TRIGGERS

integration_config

Record<string,string> | null

Provider-spezifische Felder

WorkflowInputDef: key ([a-z][a-z0-9_]{0,39}), label, type (text/longtext/select/boolean), placeholder?, required, options? (nur select), default_value?. Pflichtfelder werden bei Run-Start validiert; optionale leere Felder bleiben als '' bzw. false erhalten.

Outlook-Mail-Trigger liefert einen FESTEN Variablensatz: from, subject, to, cc, body, received_at, message_id, attachments.


KI-Knoten

llm

Der zentrale Textgenerierungs-Knoten. Free-Text wird gestreamt (Partial-Flush nach output_text_partial alle 300 ms, Stream-Deadline 120 s); strukturierter Output und der agentische Pfad laufen non-streaming.

Config-Feld

Typ

Beschreibung

model_slug

string | null

null ⇒ Reihenfolge: Assistent-Default ⇒ workflow.default_model_slug

system_prompt

string | null

System-Prompt (interpoliert); aktuelles Datum wird stets vorangestellt

user_prompt_template

string

Nutzer-Prompt (interpoliert)

attached_documents

string[]

Teilmenge des workflow_documents-Pools

web_search

boolean

Legacy; mappt ohne tools auf ['web_search','fetch_page']

tools

string[]

Agentische Tools; nicht-leer ⇒ Reasoning-Schleife (structured_output dann inaktiv)

memory_session_key

string

Interpoliert; nicht-leer ⇒ Konversations-Memory aktiv (außer bei structured_output)

memory_window

number

Anzahl geladener vergangener Interaktionen (Default 5)

structured_output

boolean

Erzwingt JSON-Schema-Antwort

output_schema

Record<string,unknown> | null

JSON-Schema bei structured_output

temperature

number | null

null ⇒ Provider-Default

max_steps

number

Max. Iterationen der Tool-Schleife (Clamp 1..25, Default 6)

ai_app_id

string | null

Vorhandenen Assistenten wiederverwenden (liefert Persona/Modell/Web-Tools; Knoten-Werte haben Vorrang)

Output: Free-Text-String, JSON-Objekt (structured) oder Agenten-Antwort. tokens_in/tokens_out werden erfasst. Bei structured_output mit unparsebarem JSON erfolgt ein Retry mit „Antworte ausschließlich als gültiges JSON."; scheitert auch das → Fehler. Verfügbare agentische Tools: web_search, fetch_page, doc_search. Die agentische Schleife hat eine Wall-Clock-Deadline von 150 s und droppt auf der letzten erlaubten Iteration die Tools, um eine finale Antwort zu erzwingen.

check (Guardrail / „Überprüfen")

LLM-basierte Inhaltsklassifikation; gibt ein Urteil zurück. DSGVO-relevant.

Config-Feld

Typ

Beschreibung

input_template

string

Zu prüfender Text (interpoliert)

checks

CheckKind[] (≥1)

moderation, pii, jailbreak

model_slug

string | null

null ⇒ Workflow-Default

Output (JSON): { passed: boolean, flags: string[], reason: string (deutsch), checks: string[] }. passed ist false, sobald irgendeine aktivierte Prüfung anschlägt. Nicht parsebare Modellantwort ⇒ passed=false, flags=['parse_error'].

image_gen („Bildgenerierung")

Text-Prompt → OpenAI-kompatibles /images/generations über den LiteLLM-Proxy; speichert ein PNG.

Config-Feld

Typ

Beschreibung

prompt_template

string

Bild-Prompt (interpoliert)

model_slug

string | null

null ⇒ Workflow-Default (sollte ein Bildmodell sein)

size

'1024x1024'|'1024x1792'|'1792x1024'

Bildgröße

n

number (1..4)

Anzahl Bilder

Output: { path } (Pfad in workflow-outputs, output_file_path). Antwort wird als b64_json angefordert; fehlen die Bilddaten → Fehler. Laufzeit benötigt ein konfiguriertes Bildmodell in LiteLLM (Ops-Abhängigkeit).


Logik

code

Führt LLM-/nutzergeschriebenes Python im kasimir-codebox-Sidecar aus (Timeout 30 s). Ist die Sandbox nicht konfiguriert (CODEBOX_BASE_URL/API_KEY), schlägt der Knoten fehl.

Config-Feld

Typ

Beschreibung

code

string

Python-Quelltext

Vorgänger-Outputs werden als inputs-Dict (Key = Node-Slug, jeweils {input} oder {output}) bereitgestellt — base64-kodiert eingebettet und in Python dekodiert. Eine Hilfsfunktion result(x) gibt JSON via print() aus.

Output: stdout getrimmt; gültiges JSON wird geparst (strukturierter Output), sonst Klartext. Code-Fehler/Timeout ⇒ Knoten-Fehler (stderr auf 500 Zeichen gekürzt).


Verzweigung

if_else

Wertet eine Bedingung aus und folgt dem Port true oder false.

Config-Feld

Typ

Beschreibung

condition

{left, op, right}

Legacy-Einzelbedingung

conditions

Array<{left, op, right}>

Multi-Bedingung; nicht-leer ⇒ ersetzt condition

match

'all'|'any'

all = UND (Default), any = ODER

Operatoren (op): ==, !=, contains, matches (RegExp), is_empty (leer oder [MISSING:…]), is_truthy, is_falsy, >, <, >=, <=. Beide Seiten werden interpoliert; numerische Vergleiche casten via Number(). Output-Port = true/false; output selbst ist null.

router (Make.com-Semantik)

ALLE Routen, deren Bedingungen passen, werden aktiviert und laufen sequenziell. Eine Route ohne Bedingungen läuft immer; die „Sonst"-Route (is_fallback) nur, wenn KEINE andere passte.

Config-Feld

Typ

Beschreibung

routes

RouterRoute[]

Liste der Routen

RouterRoute: id (= Port-ID / edge.from_port), label, conditions[], match (all/any), is_fallback?. Output: { matched_routes: string[] }; output_port = kommaseparierte Liste der gematchten Route-IDs; der Walker reiht die Kanten ALLER gematchten Ports ein.


Schleife

for_each + aggregate

for_each wertet over_expr zu einem Array aus und führt die LINEARE Body-Kette vom output-Port bis zum nächsten aggregate-Knoten einmal pro Element aus.

for_each-Feld

Typ

Beschreibung

over_expr

string

z. B. {{trigger.input.items}}; Array oder JSON-Array-String wie ["a","b"]

max_items

number | null

Optionaler Iterations-Deckel; null = alle

Pro Iteration: {{<loopSlug>.output.item}} und .index. Ist over_expr ein String, wird JSON.parse versucht; liefert es kein Array ⇒ Fehler.

aggregate-Feld

Typ

Beschreibung

collect_expr

string

Pro Iteration ausgewertet (typisch {{step.output}})

mode

'array'|'join_text'

array = JS-Array, join_text = verbundener String

separator

string

Nur bei join_text (Default \n\n)

dedupe

boolean

Duplikate (Werteglichheit) vor der Ausgabe entfernen

Output am aggregate-output-Port: gesammeltes Array bzw. verbundener String.

⚠️

v1-Beschränkungen: Body MUSS linear sein — verboten sind if_else, router, http_out, ask_user, delay und verschachtelte for_each im Body. Genau ein output-Port; Body muss in einem aggregate münden. Body-Knoten persistieren nur die LETZTE Iteration als Run-Node-Zeile. Ein aggregate ohne vorgelagertes for_each lässt den Run fehlschlagen.


Aktionen

http_out

Externer HTTP-Request mit SSRF-Schutz (httpsOnly, blockiert private/Loopback/Metadata-Hosts; jeder Redirect wird neu validiert, max. 5 Hops).

Config-Feld

Typ

Beschreibung

method

GET|POST|PUT|PATCH|DELETE

HTTP-Methode

url

string

Ziel-URL (interpoliert)

query_params

Record<string,string>

Angehängte Query-Parameter (interpoliert)

headers

Record<string,string>

Header (Werte interpoliert)

body_mode

none|json|form|raw

Body-Modus (setzt ggf. content-type)

body

string

Request-Body (interpoliert)

body_type

text|json

json ⇒ Response wird geparst

auth_mode

none|bearer|basic

Auth-Schema

secret_slot

string | null

Env-deklarierter Slot (NUXT_HTTP_SECRET_<SLOT>); unbekannte Slots ⇒ Fehler

timeout_seconds

number

Timeout (Default 30)

Output: { status, body, headers }; Port = success (Status < 400) oder error. Timeout/Exception ⇒ status:0, Port error. Redirects: 301/302/303 → GET + Body verworfen; 307/308 → Methode/Body bleiben.

send_email

E-Mail über SendGrid; body_markdown wird via marked zu HTML.

Config-Feld

Typ

Beschreibung

to_template

string

Muss eine gültige Adresse ergeben (sonst Fehler)

cc_template / bcc_template

string

Optional; Komma/Semikolon-getrennt, nur gültige Adressen

subject_template

string

Betreff

body_markdown_template

string

Markdown-Body

reply_to

string | null

Optionaler Reply-To

from_name_template

string?

Optionaler Absender-Anzeigename (Adresse bleibt verifizierter Sender)

Output: { to, cc, bcc, subject, body, sent }. Lehnt SendGrid ab (Key fehlt/ungültige Adresse) ⇒ Knoten-Fehler.

post_message

Postet in einen Chat-/Webhook-Endpoint; Payload-Shaping pro Ziel.

Config-Feld

Typ

Beschreibung

target

slack|teams|webhook

Zieltyp

webhook_url_template

string

Webhook-URL (interpoliert; muss http(s)://)

text_markdown_template

string

Nachrichtentext

username_template

string?

Slack: optionaler Name-Override

channel_template

string?

Slack: optionaler Channel-Override

Payload: Slack {text, username?, channel?}; Teams MessageCard-light; Webhook {text, source, workflow_id, node_slug}. Output: { target, status, ok }; nicht-OK-HTTP ⇒ Fehler.

notify („Benachrichtigung senden")

Schreibt eine In-App-Benachrichtigung in die Inbox des Run-Initiators. Kein Initiator (Zeitplan-/Webhook-Run) ⇒ No-Op.

Config-Feld

Typ

Beschreibung

message_template

string

Nachrichtentext (interpoliert)

Output: der gerenderte Text.


Pause

ask_user

Pausiert den Run und sammelt ein Formular voller Antworten; verhält sich wie ein zweiter Trigger mitten im Flow. Run-Status → waiting_input. /resume ruft den Executor mit {resume} erneut auf; Antworten sind als {{<slug>.input.<key>}} verfügbar.

Config-Feld

Typ

Beschreibung

title

string

Über dem Formular angezeigt

inputs

WorkflowInputDef[]

Formularfelder (gleiche Shape wie Trigger)

delay

Pausiert zeitgesteuert; Run-Status → waiting_timer, resume_at wird gesetzt.

Config-Feld

Typ

Beschreibung

duration_value

number (≥1)

Fester Wert

duration_unit

seconds|minutes|hours|days

Einheit

duration_template

string?

Interpoliert zu einer Zahl > 0; überschreibt duration_value


Daten

load_table

Lädt eine mit dem Workflow verknüpfte Tabelle (workflow_documents) aus dem documents-Bucket und parst sie.

Config-Feld

Typ

Beschreibung

document_id

string | null

Verknüpftes Dokument (null = nicht gewählt ⇒ Fehler)

sheet

string | null

null/leer = erstes Sheet (nur XLSX)

has_header

boolean

Zeile 1 = Spaltennamen

max_rows

number

Cap (Default 1000)

Unterstützt .xlsx und .csv; das Dokument muss mit DIESEM Workflow verknüpft sein (Defense-in-Depth). Output: { rows: Record<string,string>[], count, columns }. Ein nachgelagerter for_each iteriert über {{slug.output.rows}}, Felder via {{loop.output.item.<spalte>}}.

doc_search (RAG)

Semantische Suche über firmenweite Dokument-Chunks (Embedding-Modell → searchChunks).

Config-Feld

Typ

Beschreibung

query_template

string

Suchanfrage (interpoliert)

scope

company|project

siehe Hinweis

top_k

number

Default 5, Cap 20

Output: { chunks: [{document_name, snippet, score}], text }. Similarity-Schwelle 0.55.

⚠️

v1-Gap: Treffer werden hart auf scope_type='company'-Dokumente beschränkt (DSGVO-Schutz). scope='project' fällt auf firmenweite Suche zurück — projektgescopte RAG erfordert eine RPC-Änderung.

Web-Suche über den konfigurierten Provider (Timeout 20 s).

Config-Feld

Typ

Beschreibung

query_template

string

Suchanfrage (interpoliert)

max_results

number

Default 5, Cap 10

Output: { results: [{title, url, snippet}], text }. Kein Provider konfiguriert ⇒ Knoten-Fehler Keine Web-Suche konfiguriert.


Ausgabe

doc_render

Erzeugt eine echte Datei (DOCX/XLSX/PDF/PPTX) und legt sie im workflow-outputs-Bucket ab.

Config-Feld

Typ

Beschreibung

format

docx|xlsx|pdf|pptx

Zielformat

template_mode

with_template|from_markdown

Render-Pfad

template_path

string | null

Vorlage (nur with_template, aus workflow-outputs)

markdown_input

string | null

Markdown-Quelle (interpoliert)

output_filename_template

string

Dateiname (interpoliert)

Bei with_template werden alle Trigger-Inputs + Knoten-Outputs als Variablen bereitgestellt. Output: { path } (output_file_path). Pfad: {company_id}/{workflow_id}/{run_id}/{slug}.{ext}.

save_to_storage

Speichert Output dauerhaft als Datei (überlebt den Run).

Config-Feld

Typ

Beschreibung

mode

inline|forward

inline: content_template schreiben; forward: Datei eines Upstream-Knotens kopieren

content_template

string

Nur inline

source_node_slug

string | null

Nur forward (Slug eines datei-erzeugenden Knotens)

filename_template

string

Zieldateiname (interpoliert)

content_type

string

MIME bei inline (z. B. text/markdown)

Output: { path }. Pfad: {company_id}/{workflow_id}/outputs/{filename}. Fehlender Quellpfad / Upload-Fehler ⇒ Knoten-Fehler.

output

Schreibt einen benannten Wert in die Run-übergreifende outputs-Map (Read-Modify-Write).

Config-Feld

Typ

Beschreibung

name

string ([a-z][a-z0-9_]{0,39})

Output-Schlüssel

value_template

string

Wert (interpoliert)

Output: der gerenderte String; zusätzlich gemerged in workflow_runs.outputs.


Integrationen

Alle Integrations-Aktionen lösen den Run-Akteur auf: bei manuellen Runs der Initiator (user_id); bei Webhook-/Zeitplan-Runs (user_id NULL) der Workflow-Ersteller (Zapier/Make-Semantik). Fehlt eine gültige Verbindung oder Berechtigung (403 von der API), schlägt der Knoten mit einer Hinweis-Meldung auf /integrations fehl.

Microsoft (Graph)

type

Endpoint

Berechtigung

Wichtige Config-Felder

Output

outlook_draft

POST /me/messages (Entwurf, sendet nie)

Mail.ReadWrite

to_template, cc_template, subject_template, body_markdown_template

{ draft_id, web_link, subject }

outlook_send

POST /me/sendMail (sendet sofort, saveToSentItems)

Mail.Send

to_template (≥1 gültig), cc_template, subject_template, body_markdown_template

{ sent, subject, body, recipients }

outlook_event

POST /me/events

Calendars.ReadWrite

subject_template, start_template/end_template (ISO), timezone (IANA, Default Europe/Berlin), location_template?, attendees_template?, body_markdown_template?

{ event_id, web_link }

onedrive_upload

PUT /me/drive/root:/{path}:/content

Files.ReadWrite.All

mode (inline/forward), content_template, source_node_slug, filename_template, folder_template

{ item_id, web_url, name }

teams_card

Adaptive Card an Teams-Incoming-Webhook

— (Webhook-URL ist das Credential)

destination_id (teams_destinations), title_template, message_template, button_text?, button_url_template?

{ status, ok, title }

teams_card löst das verwaltete, company-gescopte Ziel auf und entschlüsselt dessen Webhook-URL; ein Button wird nur bei gültiger http(s)-URL hinzugefügt.

Google

type

Endpoint

Berechtigung

Wichtige Config-Felder

Output

gdrive_upload

Drive v3 Multipart-Upload

auth/drive

mode (inline/forward), content_template, source_node_slug, filename_template, folder_id_template

{ file_id, web_view_link, name }

gcal_event

Calendar v3 primary/events (sendUpdates=none)

auth/calendar.events

subject_template, start_template/end_template (ISO), timezone, location_template, attendees_template, description_template (Plaintext)

{ event_id, html_link }

gsheets_append

Sheets v4 values.append (USER_ENTERED, INSERT_ROWS)

auth/spreadsheets

spreadsheet_id_template, range_template (z. B. Tabelle1!A:C), values_template (Komma-getrennte Zellwerte)

{ updated_range }

💡

forward-Modus (OneDrive/Google Drive/save_to_storage) holt die Bytes über source_node_slug aus dem Output eines doc_render-Knotens — die typische Kette ist llm → doc_render → *_upload.

Run-Status-Werte

Status

Bedeutung

queued / running

In Warteschlange / läuft

completed / failed / cancelled

Abgeschlossen / fehlgeschlagen / abgebrochen

waiting_input

Pausiert in ask_user

waiting_timer

Pausiert in delay (resume_at)

waiting_approval

Pausiert vor einem requires_approval-Knoten

Run-Node-Status: pending, running, completed, failed, skipped. Nicht erreichte pending-Knoten werden am Run-Ende auf skipped gesetzt.