Workflow Operator Nodes
Operator nodes are the workhorses of a workflow — they call APIs, transform data, run queries, send notifications, and execute custom code. You add them to the canvas from the Tools category of the node library in the task editor, configure their inputs in the right configuration panel, and connect them to other nodes with edges.
This page describes the operator categories the engine ships with, how data flows between nodes, and where to go for per-operator details.
Operator Node Basics
Each operator node has:
- Input ports — named inputs the node reads (for example a transform's
datainput). - Configuration / default inputs — values you set in the configuration panel that control the node's behavior.
- Output — the result the node produces, which downstream nodes can read.
You wire nodes together with edges on the canvas. See How Data Flows Between Nodes below for the exact edge format.
Built-in Operator Categories
The workflow engine includes the following built-in operator categories:
| Category | What it does |
|---|---|
| API | Call external HTTP/REST APIs (generic API and REST operators) |
| Custom | Run your own JavaScript in a sandbox (the js-executor operator) |
| Data Source | Connect to and inspect data sources (default data source, PostgreSQL/MySQL schema) |
| Dataset | Query and modify datasets (query, insert, update, delete, vector search, full-text search) |
| Document | Read and process documents |
| Embedding | Generate embeddings (multimodal embedding) |
| Global Variable | Read and write workflow-level global variables |
| Notification | Send notifications such as email |
| SQL | Run parameterized SQL via templates (sql-template) |
| Storage | Store and retrieve files |
| Transform | Reshape and convert data between nodes |
| Publish content to WeChat |
The exact set of operators available to you depends on what is enabled in your space and deployment. Browse the Tools category in the node library (open it with Ctrl + K in the task editor) to see what you can add, and use the search box to find an operator by name.
Custom Code with js-executor
For logic that no built-in operator covers, use the custom-code operator, whose identifier is js-executor. It runs your JavaScript inside a secure sandbox.
Your code receives:
parameters(also available asparams) — the parameters you pass into the node.context— a read-only snapshot of the workflow execution context (includingcontext.envfor environment variables, and the results of upstream nodes).console.log/console.error/console.warn/console.info— write to the run logs.utils— a set of helper functions (type checks, string and array helpers, hashing, formatting, and more).
Return a value to produce the node's output:
// parameters holds the inputs you wired into this node
const items = parameters.items || [];
const total = items.reduce((sum, it) => sum + it.price, 0);
return {
count: items.length,
total
};
The context available to your code is a read-only snapshot. Assigning to it (for example context.someValue = ...) does not persist anywhere — to pass data onward, return it from your code and wire the output to the next node. To share state across a loop, see ForEach Loop Node.
For full details — available utils helpers, the sandbox restrictions, and examples — see the JavaScript Executor reference.
How Data Flows Between Nodes
Data moves from one node to another along edges. An edge connects a source port on one node to a target port on another, using the string form nodeId:portName:
{
"source": "fetch-data:result",
"target": "transform-1:data"
}
This connects the result output of node fetch-data to the data input of node transform-1.
Selecting part of the source output with dataPath
To pass only part of the source node's output, add a dataPath. The path is resolved against the source node's output using dot and bracket notation:
{
"source": "fetch-user:result",
"target": "send-email:to",
"dataPath": "user.email"
}
Here dataPath: "user.email" reads user.email from the output of fetch-user and feeds it into the to input of send-email. Array indexing is supported too, e.g. items[0].id.
dataPath walks the source node's output object — it is not a JSONPath query language and does not use a $.input / $.context prefix. If you omit dataPath, the whole value at the source port is passed through.
Default input values
A node can also carry default input values that you set directly in the configuration panel (these are used when no edge supplies that input). Default inputs and edge values both support the {{VARIABLE_NAME}} environment-variable template syntax — see Environment Variables.
Building with Operators
- Open the task editor and open the node library (
Ctrl + K). - From the Tools category, drag an operator onto the canvas.
- Select the node and open the configuration panel (
Ctrl + I) to set its inputs and default values. - Draw edges from upstream node ports into this node's input ports.
- Use control nodes (If-Else, ForEach) to add branching and iteration.
- Save and run the task, then watch the per-node output in the bottom debug panel.
FAQ
Details
How do I run custom logic that no operator covers?
Use the custom-code operator (js-executor). It runs JavaScript in a sandbox with access to your parameters, a read-only context, console logging, and a utils helper library. Return a value to produce the node's output. See the JavaScript Executor reference.Details
How do I pass just one field from one node to another?
Add adataPath to the edge. It is resolved against the source node's output using dot/bracket notation (for example user.email or items[0].id). Without a dataPath, the entire value at the source port is passed.Details
Which operators are available to me?
Open the node library in the task editor and browse the Tools category. The available operators depend on what is enabled in your space and deployment. Use the search box to find an operator by name or description.Next Steps
- Learn how to configure Workflow Triggers
- Learn to visually design workflows with the Workflow Builder
- Explore advanced usage of Environment Variables
- See the Workflow Overview for real-world application inspiration
- Dive deeper into the Operator Overview and Custom Operator Development
- Learn how to Import Operators from OpenAPI Docs