Nodes & data flow
How a node reads its input, the interpolation scope, and the output shapes you pipe between nodes.
How data flows
Each node reads a scope built from its upstream node's output. Reference values with ${...}. A bare ${path} returns the raw value (arrays/objects flow intact); a mixed template coerces to a string.
Per-node output shapes
| Node | Output | Read as |
|---|---|---|
| agent | { agent_output, status, error } | ${agent_output} |
| plugin.action / skill | { plugin_output / skill_output, upstream } | ${plugin_output.field} |
| condition | { condition_result } | (routing is automatic) |
| set_variable | writes ${vars.name} | ${vars.name} |
Always-available roots: ${input} (the whole upstream payload), ${vars.*}, ${trigger.*} (the trigger payload), ${error} (on an error branch), ${upstream.*}.
Prefer the reader pattern over parsing agent text: when an agent scores/stores items via its tools, read them back with a query node (e.g.
content.list) rather than reading ${agent_output} as JSON.