Skip to main content

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 groupInput node — entry boundary
  • One groupOutput node — 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
}