NebulaFlow provides a variety of node types for building workflows. Each node type has specific functionality, configuration options, and execution behavior. All node types are defined in workflow/Core/models.ts and workflow/Web/components/nodes/Nodes.tsx.
enum NodeType {
CLI = 'cli',
LLM = 'llm',
PREVIEW = 'preview',
INPUT = 'text-format',
LOOP_START = 'loop-start',
LOOP_END = 'loop-end',
ACCUMULATOR = 'accumulator',
VARIABLE = 'variable',
IF_ELSE = 'if-else',
SUBFLOW = 'subflow',
SUBFLOW_INPUT = 'subflow-input',
SUBFLOW_OUTPUT = 'subflow-output',
}
These nodes perform actual work and produce outputs:
NodeType.LLM) - Interact with Large Language ModelsNodeType.CLI) - Execute shell commandsNodeType.PREVIEW) - Display data for debuggingThese nodes handle data storage and transformation:
NodeType.INPUT) - Input text dataNodeType.VARIABLE) - Store and reference variablesNodeType.ACCUMULATOR) - Accumulate text across multiple inputsThese nodes control the execution flow:
NodeType.IF_ELSE) - Branch workflow based on conditionsNodeType.LOOP_START) - Begin a loop iterationNodeType.LOOP_END) - End a loop iterationThese nodes handle reusable workflow components:
NodeType.SUBFLOW) - Embed a reusable subflowNodeType.SUBFLOW_INPUT) - Define input ports for subflowsNodeType.SUBFLOW_OUTPUT) - Define output ports for subflowsType: NodeType.LLM
Display Label: Agent Node
Category: Execution
Interacts with Large Language Models using Amp SDK or OpenRouter SDK. Supports streaming, tool calls, and conversation history.
interface LLMNode extends WorkflowNode {
type: NodeType.LLM
data: BaseNodeData & {
model?: Model
disabledTools?: string[]
timeoutSec?: number
dangerouslyAllowAll?: boolean
reasoningEffort?: 'minimal' | 'low' | 'medium' | 'high'
systemPromptTemplate?: string
attachments?: AttachmentRef[]
}
}
Fields:
model: Selected LLM model (e.g., { id: 'gpt-4', title: 'GPT-4' })disabledTools: Array of tool names to disabletimeoutSec: Timeout in seconds for the LLM calldangerouslyAllowAll: Bypass safety checks (use with caution)reasoningEffort: Reasoning effort level (affects token usage)systemPromptTemplate: Custom system prompt templateattachments: Array of attachment references (images)node_assistant_content events{
type: NodeType.LLM,
data: {
title: 'Generate Commit Message',
content: 'Generate a commit message for the following git diff: ${1}',
active: true,
model: { id: 'gpt-4', title: 'GPT-4' },
reasoningEffort: 'medium',
systemPromptTemplate: 'You are a helpful assistant.'
}
}
Type: NodeType.CLI
Display Label: Shell Node
Category: Execution
Executes shell commands via Node.js child_process. Requires approval by default for safety.
interface CLINode extends WorkflowNode {
type: NodeType.CLI
data: BaseNodeData & CLINodeConfig
}
interface CLINodeConfig {
mode?: 'command' | 'script'
shell?: 'bash' | 'sh' | 'zsh' | 'pwsh' | 'cmd'
safetyLevel?: 'safe' | 'advanced'
streamOutput?: boolean
stdin?: {
source?: 'none' | 'parents-all' | 'parent-index' | 'literal'
parentIndex?: number
literal?: string
stripCodeFences?: boolean
normalizeCRLF?: boolean
}
env?: {
exposeParents?: boolean
names?: string[]
static?: Record<string, string>
}
flags?: {
exitOnError?: boolean
unsetVars?: boolean
pipefail?: boolean
noProfile?: boolean
nonInteractive?: boolean
executionPolicyBypass?: boolean
}
}
Fields:
mode: Execution mode ('command' or 'script')shell: Shell to use for executionsafetyLevel: Safety level for command executionstreamOutput: Stream output in real-timestdin: Input configuration for stdinenv: Environment variable configurationflags: Execution flags and optionsnode_output_chunk eventsexecutionPolicyBypass){
type: NodeType.CLI,
data: {
title: 'Git Diff',
content: 'git diff',
active: true,
mode: 'command',
shell: 'bash',
streamOutput: true,
flags: { exitOnError: true }
}
}
Type: NodeType.PREVIEW
Display Label: Preview Node
Category: Execution
Displays data for debugging and inspection. Useful for viewing intermediate results.
interface PreviewNode extends WorkflowNode {
type: NodeType.PREVIEW
data: BaseNodeData
}
Fields:
BaseNodeData fields{
type: NodeType.PREVIEW,
data: {
title: 'Debug Output',
content: '',
active: true
}
}
Type: NodeType.INPUT
Display Label: Text Node
Category: Data
Provides text input data to the workflow. Can be used as a starting point or to inject data.
interface TextNode extends WorkflowNode {
type: NodeType.INPUT
data: BaseNodeData
}
Fields:
content: The text content to provideBaseNodeData fieldscontent field as the node result{
type: NodeType.INPUT,
data: {
title: 'User Query',
content: 'What is the weather in San Francisco?',
active: true
}
}
Type: NodeType.VARIABLE
Display Label: Variable Node
Category: Data
Stores and references variables. Variables can be accessed by other nodes using ${variableName} syntax.
interface VariableNode extends WorkflowNode {
type: NodeType.VARIABLE
data: BaseNodeData & {
variableName: string
initialValue?: string
}
}
Fields:
variableName: Name of the variable (used for reference)initialValue: Optional initial value for the variable${variableName} syntax{
type: NodeType.VARIABLE,
data: {
title: 'User Input',
content: '',
active: true,
variableName: 'userQuery',
initialValue: 'default query'
}
}
Type: NodeType.ACCUMULATOR
Display Label: Accumulator Node
Category: Data
Accumulates text from multiple inputs into a single output. Useful for collecting results from loops or parallel branches.
interface AccumulatorNode extends WorkflowNode {
type: NodeType.ACCUMULATOR
data: BaseNodeData & {
variableName: string
initialValue?: string
}
}
Fields:
variableName: Name of the variable to accumulate intoinitialValue: Optional initial value{
type: NodeType.ACCUMULATOR,
data: {
title: 'Collect Results',
content: '',
active: true,
variableName: 'allResults',
initialValue: ''
}
}
Type: NodeType.IF_ELSE
Display Label: If/Else Node
Category: Control Flow
Branches workflow execution based on a condition. Evaluates the input and routes to either true or false path.
interface IfElseNode extends WorkflowNode {
type: NodeType.IF_ELSE
data: BaseNodeData & {
truePathActive?: boolean
falsePathActive?: boolean
}
}
Fields:
truePathActive: Visual indicator for true branchfalsePathActive: Visual indicator for false branch{
type: NodeType.IF_ELSE,
data: {
title: 'Check Condition',
content: '',
active: true
}
}
Type: NodeType.LOOP_START
Display Label: Loop Start Node
Category: Control Flow
Begins a loop iteration. Defines loop parameters and controls iteration count.
interface LoopStartNode extends WorkflowNode {
type: NodeType.LOOP_START
data: BaseNodeData & {
iterations: number
loopVariable: string
overrideIterations?: boolean
loopMode?: 'fixed' | 'while-variable-not-empty'
collectionVariable?: string
maxSafeIterations?: number
}
}
Fields:
iterations: Number of iterations to runloopVariable: Variable name for the current iterationoverrideIterations: Allow overriding iteration count at runtimeloopMode: Loop execution modecollectionVariable: Variable containing collection to iterate overmaxSafeIterations: Maximum safe iterations (prevents infinite loops){
type: NodeType.LOOP_START,
data: {
title: 'For Each Item',
content: '',
active: true,
iterations: 5,
loopVariable: 'i',
loopMode: 'fixed'
}
}
Type: NodeType.LOOP_END
Display Label: Loop End Node
Category: Control Flow
Ends a loop iteration. Signals the completion of the current iteration.
interface LoopEndNode extends WorkflowNode {
type: NodeType.LOOP_END
}
Fields:
BaseNodeData fields{
type: NodeType.LOOP_END,
data: {
title: 'End Loop',
content: '',
active: true
}
}
Type: NodeType.SUBFLOW
Display Label: Subflow Node
Category: Subflow
Embeds a reusable subflow (workflow) as a single node. Allows for modular workflow design.
interface SubflowNode extends WorkflowNode {
type: NodeType.SUBFLOW
data: BaseNodeData & {
subflowId: string
inputPortCount?: number
outputPortCount?: number
}
}
Fields:
subflowId: ID of the subflow to embedinputPortCount: Number of input portsoutputPortCount: Number of output ports{
type: NodeType.SUBFLOW,
data: {
title: 'Process Data',
content: '',
active: true,
subflowId: 'data-processor-v1',
inputPortCount: 2,
outputPortCount: 1
}
}
Type: NodeType.SUBFLOW_INPUT
Display Label: Subflow Input
Category: Subflow
Defines an input port for a subflow. Used only within subflow definitions.
interface WorkflowNode {
type: NodeType.SUBFLOW_INPUT
data: BaseNodeData & {
portId?: string
portName?: string
}
}
Fields:
portId: Unique identifier for the input portportName: Human-readable name for the input portType: NodeType.SUBFLOW_OUTPUT
Display Label: Subflow Output
Category: Subflow
Defines an output port for a subflow. Used only within subflow definitions.
interface WorkflowNode {
type: NodeType.SUBFLOW_OUTPUT
data: BaseNodeData & {
portId?: string
portName?: string
}
}
Fields:
portId: Unique identifier for the output portportName: Human-readable name for the output portAll nodes share the following base data structure:
interface BaseNodeData {
title: string // Display name of the node
input?: string // Input data (from previous nodes)
output?: string // Output data (result of execution)
content: string // Node-specific content (command, prompt, etc.)
active: boolean // Whether the node is active/enabled
bypass?: boolean // Whether to bypass this node during execution
needsUserApproval?: boolean // Whether node requires approval
tokenCount?: number // Token count (for LLM nodes)
local_remote?: boolean // Local vs remote execution flag
moving?: boolean // Visual state for dragging
executing?: boolean // Visual state for execution
error?: boolean // Visual state for error
interrupted?: boolean // Visual state for interruption
result?: string // Final result of execution
shouldAbort?: boolean // Flag to abort execution
isEditing?: boolean // Visual state for editing
fanInEnabled?: boolean // Whether fan-in is supported
inputPortCount?: number // Number of input ports
inputEdgeIdByHandle?: Record<string, string> // Input handle to edge mapping
}
| Node Type | Display Label |
|---|---|
NodeType.LLM |
Agent Node |
NodeType.CLI |
Shell Node |
NodeType.PREVIEW |
Preview Node |
NodeType.INPUT |
Text Node |
NodeType.LOOP_START |
Loop Start Node |
NodeType.LOOP_END |
Loop End Node |
NodeType.ACCUMULATOR |
Accumulator Node |
NodeType.VARIABLE |
Variable Node |
NodeType.IF_ELSE |
If/Else Node |
NodeType.SUBFLOW |
Subflow Node |
NodeType.SUBFLOW_INPUT |
Subflow Input |
NodeType.SUBFLOW_OUTPUT |
Subflow Output |
The sidebar organizes nodes into categories:
Node types are validated at runtime: