group
group is a pure structural container — it never executes. During graph building it dissolves in-place: the inner workflow's nodes are merged into the unified execution graph, incoming edges are stitched to the inner groupInput node, and outgoing edges originate from the inner groupOutput node. The group node itself is dropped from the final graph.
Use group to package a reusable sub-workflow as a single named step in a larger pipeline.
note
Calling process() on a group node raises NotImplementedError.
Parameters
Accepts any fields (extra="allow"). All configuration is handled by the inner workflow's nodes.
Inner Workflow
data.workflow must contain:
- One
groupInputnode — entry boundary - One
groupOutputnode — exit boundary - Any number of processing nodes in between
Output
No output of its own. The effective output is what the groupOutput node emits.
Example
{
"id": "summaryGroup",
"type": "group",
"data": {
"label": "Summarize Documents",
"isExecuted": false,
"handles": ["inputs", "outputs"],
"schema": {},
"params": {},
"inputs": [], "outputs": [], "errors": [],
"workflow": {
"nodes": [
{ "id": "in", "type": "groupInput", "data": { "isInput": true, "params": {}, "inputs": [], "outputs": [], "errors": [] } },
{ "id": "llm", "type": "chatCompletion", "data": { "params": { "query": { "value": "{{ @in.text }}", "isExpression": true, "isAttachedToInputNode": false } }, "inputs": [], "outputs": [], "errors": [] } },
{ "id": "out", "type": "groupOutput", "data": { "params": { "summary": { "value": "{{ @llm.response }}", "isExpression": true, "isAttachedToInputNode": false } }, "inputs": [], "outputs": [], "errors": [] } }
],
"edges": [
{ "id": "e1", "source": "in", "sourceHandle": "outputs", "target": "llm", "targetHandle": "inputs" },
{ "id": "e2", "source": "llm", "sourceHandle": "outputs", "target": "out", "targetHandle": "inputs" }
]
}
},
"position": { "x": 300, "y": 0 },
"isSelected": false,
"isDragging": false
}