The WDF schema defines 12 node types. 11 are CLI-supported (validate, push, run). The twelfth — document_extraction — is documented below for schema completeness but is not deployable via the CLI.
Each type has a specific purpose, execution mode, and config schema. Several execution nodes also accept optional saveToMemory / memoryFilePath fields (additive run-memory copy). Those fields are forwarded at push time even when not listed on the strict Pydantic config model.
Pauses the workflow and asks the user for free-form text.
- Execution mode: INPUT
- When to use: The user provides a question, description, or any unstructured text.
user_input:
type: plain_txt_input
execution_mode: INPUT
label: Ask a Question
config:
placeholder: Type your question here...Config fields:
| Field | Type | Required | Description |
|---|---|---|---|
placeholder |
string | No | Hint text shown in the input field |
Pauses the workflow and presents a form with typed fields.
- Execution mode: INPUT
- When to use: You need specific, structured data from the user (names, selections, numbers).
form_input:
type: structured_input
execution_mode: INPUT
label: Customer Details
config:
schema:
type: object
properties:
name:
title: Full Name
type: string
priority:
title: Priority Level
type: string
enum: [low, medium, high]
required: [name]Config fields:
| Field | Type | Required | Description |
|---|---|---|---|
schema |
object | Yes | JSON Schema defining the form fields. Use properties for fields, required for mandatory ones, enum for dropdowns, title for display labels. |
Pauses the workflow and asks the user to upload one or more files.
- Execution mode: INPUT
- When to use: The workflow processes documents, images, or data files.
upload_doc:
type: file_upload
execution_mode: INPUT
label: Upload Document
config:
acceptedFormats: [pdf, docx, txt, csv]
maxFileSize: 10485760Config fields:
| Field | Type | Required | Description |
|---|---|---|---|
acceptedFormats |
list[string] | Yes | Allowed file extensions (e.g., pdf, docx, csv) |
maxFileSize |
integer | Yes | Maximum file size in bytes (10485760 = 10 MB) |
saveToMemory |
boolean | No | When true, uploaded files are stored in the RLM sandbox memory bucket (RLM_SANDBOX_MEMORY_BUCKET_NAME) instead of the default workflow inputs bucket. Defaults to false. |
Sends a prompt to an LLM and returns the generated text.
- Execution mode: MESSAGES
- When to use: You need AI-generated text — summaries, analysis, classification, reports.
summarize:
type: llm_call
execution_mode: MESSAGES
label: Summarize Content
config:
model: us.anthropic.claude-sonnet-4-20250514-v1:0
temperature: 0.3
maxTokens: 2048
system_prompt: You are a helpful assistant.
template: |
Summarize the following content:
{{user_input.output.text}}
Provide a concise summary in 3-5 bullet points.Config fields:
| Field | Type | Required | Description |
|---|---|---|---|
model |
string | Yes | LLM model identifier. Use us.anthropic.claude-sonnet-4-20250514-v1:0 for Claude Sonnet. |
template |
string | Yes | The prompt template. Use {{slug.output.field}} for variable references. |
system_prompt |
string | No | System-level instructions for the LLM. |
temperature |
float | No | 0.0 (deterministic) to 2.0 (creative). Default 0.7. Use 0.0-0.3 for extraction/classification, 0.3-0.5 for reports, 0.5-0.7 for creative content. |
maxTokens |
integer | No | Maximum tokens in the response. 1024 for short outputs, 2048-4096 for reports, 8192 for long-form. |
saveToMemory |
boolean | No | When true, on top of the normal output, also write a JSON copy of it to a file in the run's memory scope. Additive — unlike api_consumption's saveToMemory, the normal output is unaffected. Defaults to false. |
memoryFilePath |
string | No | Templated relative path under the run memory scope for the additive copy (e.g. analysis/{{node_id}}.json). Defaults to {node_id}/output.json when omitted. Only used when saveToMemory is true. |
Delegates processing to a registered platform agent. Agents have their own system prompts, tools, and capabilities.
- Execution mode: MESSAGES
- When to use: You want a pre-configured AI agent to handle the task flexibly, potentially using tools.
support_agent:
type: agent
execution_mode: MESSAGES
label: Customer Support Agent
config:
agent_name: Customer Support Agent
primaryInput: "{{user_input.output.text}}"Config fields:
| Field | Type | Required | Description |
|---|---|---|---|
agent_name |
string | Yes* | Name of the platform agent to invoke. Resolved to UUID during push. |
primaryInput |
string | No | Variable reference for the input to send to the agent. |
model |
string | No | Override the agent's default model. |
temperature |
float | No | Override the agent's default temperature. |
maxTokens |
integer | No | Override the agent's default max tokens. |
system_prompt |
string | No | Override the agent's default system prompt. |
use_rlm |
boolean | No | When true, route execution through the RLM (beta) sandbox runner instead of the standard agent loop. |
web_tools_enabled |
boolean | No | When true, attach web_search / web_fetch tools to the agent for this node. |
saveToMemory |
boolean | No | When true, on top of the normal output, also write a JSON copy of it to a file in the run's memory scope. Additive — the normal output is unaffected. Defaults to false. |
memoryFilePath |
string | No | Templated relative path under the run memory scope for the additive copy. Defaults to {node_id}/output.json when omitted. Only used when saveToMemory is true. |
*Either agent_name or agentId (UUID) is required.
A retrieval-augmented agent that searches knowledge bases before responding.
- Execution mode: MESSAGES
- When to use: You need an agent that draws on your documents/knowledge to answer questions.
qa_agent:
type: rag_agent
execution_mode: MESSAGES
label: Knowledge Base Agent
config:
agent_name: Research Agent
knowledge_base_names:
- Company Policies
- Industry Standards
primaryInput: "{{user_input.output.text}}"Config fields:
| Field | Type | Required | Description |
|---|---|---|---|
agent_name |
string | Yes* | Name of the platform agent. |
knowledge_base_names |
list[string] | Yes* | Knowledge base names to search. Resolved to UUIDs during push. |
primaryInput |
string | No | Variable reference for input routing. |
topK |
integer | No | Number of documents to retrieve per KB. |
system_prompt |
string | No | Override the agent's system prompt. |
saveToMemory |
boolean | No | When true, on top of the normal output, also write a JSON copy of it to a file in the run's memory scope. Additive — the normal output is unaffected. Defaults to false. |
memoryFilePath |
string | No | Templated relative path under the run memory scope for the additive copy. Defaults to {node_id}/output.json when omitted. Only used when saveToMemory is true. |
Performs vector/semantic search against a knowledge base. Returns matching documents.
- Execution mode: FLOW
- When to use: You need to fetch relevant documents from a knowledge base before processing them with an LLM.
search_kb:
type: retrieve
execution_mode: FLOW
label: Search Knowledge Base
config:
knowledge_base_name: Company Policies
topK: 5
scoreThreshold: 0.5Config fields:
| Field | Type | Required | Description |
|---|---|---|---|
knowledge_base_name |
string | Yes* | KB name. Resolved to UUID during push. |
topK |
integer | No | Number of results to return (default 5). |
searchQuery |
string | No | Custom search query. Can use variable references. |
scoreThreshold |
float | No | Minimum relevance score (0.0-1.0). |
enableReranking |
boolean | No | Enable result reranking (default false). |
includeMetadata |
boolean | No | Include document metadata (default true). |
saveToMemory |
boolean | No | When true, on top of the normal output, also write a JSON copy of it to a file in the run's memory scope. Additive — the normal output is unaffected. Defaults to false. |
memoryFilePath |
string | No | Templated relative path under the run memory scope for the additive copy. Defaults to {node_id}/output.json when omitted. Only used when saveToMemory is true. |
Sends a prompt to an LLM and validates the response against a JSON Schema.
- Execution mode: OUTPUT
- When to use: You need the AI to produce specific structured data (JSON with defined fields).
extract_fields:
type: structured_output
execution_mode: OUTPUT
label: Extract Invoice Fields
config:
model: us.anthropic.claude-sonnet-4-20250514-v1:0
schema:
type: object
properties:
vendor_name:
type: string
total_amount:
type: number
line_items:
type: array
items:
type: string
required: [vendor_name, total_amount]
primaryInput: "{{upload.output.text}}"
system_prompt: Extract the requested fields from the document.Config fields:
| Field | Type | Required | Description |
|---|---|---|---|
schema |
object | Yes | JSON Schema defining the expected output structure. |
model |
string | No | LLM model identifier. |
primaryInput |
string | No | Variable reference for input data. |
system_prompt |
string | No | Instructions for the extraction. |
saveToMemory |
boolean | No | When true, on top of the normal output, also write a JSON copy of it to a file in the run's memory scope. Additive — the normal output is unaffected. Defaults to false. |
memoryFilePath |
string | No | Templated relative path under the run memory scope for the additive copy. Defaults to {node_id}/output.json when omitted. Only used when saveToMemory is true. |
CLI unsupported. Valid in the WDF schema and recognized by
workflow validatestep 2, but check 10 (Unsupported Node Types) fails. Author these nodes in the Builder UI or via the API.
Extracts structured fields from documents using a field list and optional extraction settings.
- Execution mode: MESSAGES
- When to use: Legacy structured extraction pipelines (prefer
structured_outputorllm_callfor new workflows).
extract_invoice:
type: document_extraction
execution_mode: MESSAGES
label: Extract Invoice Fields
config:
fields:
- name: vendor_name
type: string
required: true
- name: total_amount
type: number
required: true
extractionMethod: llm
prompt: Extract the listed fields from the uploaded document.
extractTables: false
extractImages: falseConfig fields:
| Field | Type | Required | Description |
|---|---|---|---|
fields |
list[object] | No | Fields to extract. Each entry: name, type, required (boolean). |
extractionMethod |
string | No | Extraction backend hint. |
prompt |
string | No | Instructions for the extraction step. |
extractTables |
boolean | No | Include table extraction when supported. |
extractImages |
boolean | No | Include image extraction when supported. |
Pauses the workflow for a human to approve, reject, or request revision.
- Execution mode: FLOW
- When to use: A person needs to check the AI's work before proceeding.
manager_review:
type: human_review
execution_mode: FLOW
label: Manager Approval
config:
review_prompt: >
Review the generated report. Approve if accurate,
reject if fundamentally wrong.
timeoutMinutes: 1440
allowApprove: true
allowReject: true
allowEdit: falseConfig fields:
| Field | Type | Required | Description |
|---|---|---|---|
review_prompt |
string | No | Instructions shown to the reviewer. |
timeoutMinutes |
integer | No | How long to wait before timing out (1440 = 24 hours). |
allowApprove |
boolean | No | Enable approve action (default true). |
allowReject |
boolean | No | Enable reject action (default true). |
allowEdit |
boolean | No | Enable inline editing before approval (default false). |
Calls an external HTTP API through a configured org-scoped API Connector. The connector (referenced by connectorId) carries the OpenAPI schema, variable definitions, host allowlist, and secrets on the backend.
- Execution mode: MESSAGES
- When to use: The workflow needs live data from a third-party API, or needs to download a large response body (a transcript, export, or media file) into the run's memory for downstream nodes.
fetch_transcript:
type: api_consumption
execution_mode: MESSAGES
label: Download Zoom Transcript
config:
connectorId: zoom-api
primaryInput: "{{zoom_trigger.output.text}}"
operationHint: getMeetingTranscript
timeoutSeconds: 60
saveToMemory: true
memoryFilePath: "transcripts/{{zoom_trigger.output.meeting_uuid}}.vtt"Config fields:
| Field | Type | Required | Description |
|---|---|---|---|
connectorId |
string | Yes | UUID of the org-scoped API Connector to invoke. |
primaryInput |
string | No | Variable reference for the input routed to the connector. |
maxRecursionDepth |
integer | No | Max follow-up API calls the node may chain (default 1). |
operationHint |
string | No | Name of the connector operation to prefer. |
timeoutSeconds |
integer | No | Per-request timeout in seconds. |
saveToMemory |
boolean | No | When true, stream the HTTP response body to a file in the run's memory scope instead of parsing it inline. Defaults to false. |
memoryFilePath |
string | No | Templated, path-confined relative path under the run memory scope (e.g. transcripts/{{trigger.output.meeting_uuid}}.vtt). Only used when saveToMemory is true. Defaults to api/{node_id}/response.<ext> when omitted. Must be relative — absolute paths and .. segments are rejected. |
responseVariableMappings |
list of objects | No | Extract JSON paths from the response body and expose them as named output variables. Each entry is { variable: <name>, jsonPath: <glom path> }. jsonPath is a glom path into the parsed JSON response (e.g. types[0].type.name, data.results[0].id, name); variable is the output name, referenced downstream as {{node.output.<variable>}}. Defaults to an empty list. |
headers |
map of string to string | No | Templated per-request HTTP headers (e.g. authorization: 'Bearer {{get_token.output.access_token}}'). Merged by the executor with the connector's auth headers, where connector auth wins on collision. |
callParams |
map of string to string | No | Templated query/call parameters (e.g. a from/to date window) forwarded to the planner. |
When saveToMemory is true, the node exposes the response as a memory file rather than inline text. Feed the resulting path into a downstream memory_file_url node (see below) to produce a signed download URL.
See 03-variable-references.md for the output.memory_file_path, output.memory_file_url, output.content_type, output.size_bytes, and output.status_code paths exposed by this node.
Use responseVariableMappings to pull specific values out of a JSON response and expose them as named output variables, instead of parsing the whole body downstream:
fetch_pokemon:
type: api_consumption
execution_mode: MESSAGES
label: Fetch Pokemon
config:
connectorId: pokeapi
primaryInput: "{{user_q.output.text}}"
operationHint: getPokemon
responseVariableMappings:
- variable: primary_type
jsonPath: "types[0].type.name"
- variable: base_experience
jsonPath: "base_experience"Each mapped variable is then available downstream as {{fetch_pokemon.output.primary_type}} and {{fetch_pokemon.output.base_experience}}. The jsonPath uses glom syntax: dotted keys (data.results) and bracketed list indices (types[0]).
Produces a signed download URL for a file in the run's memory scope (RLM sandbox memory bucket).
- Execution mode: OUTPUT
- When to use: End users or downstream nodes need a clickable link for a file written by
api_consumption(saveToMemory),file_upload(saveToMemory), or an execution node with additivesaveToMemory.
transcript_url:
type: memory_file_url
execution_mode: OUTPUT
label: Transcript Download Link
config:
path: "{{fetch_transcript.output.memory_file_path}}"Config fields:
| Field | Type | Required | Description |
|---|---|---|---|
path |
string | Yes | Relative path under the org memory root (e.g. outputs/report.pdf). May use {{slug.output.field}} templates. Must be relative — absolute paths and .. segments are rejected. |
Output paths: output.url, output.filename. See 03-variable-references.md.