Skip to main content
This is part 2 of the Your First Plugin tutorial. Make sure you’ve completed 1. Plugin Definition first.
Nodes are where your plugin’s logic lives. Let’s build a node that takes a city name and returns a formatted weather description.

V2 vs V1 nodes

There are two kinds of node, and you should almost always write V2:
  • V2 (recommended, connector-free). A V2 node mirrors the platform’s native nodes: it has no edge connectors. Instead it is two schemas — a config schema whose fields are the node’s settings (a field marked bindable=True becomes an input that accepts a literal or a :var[...] reference to an upstream output), and an output schema that declares every output. Everything arrives on self.config; call(ctx) returns a dict keyed by the output field names.
  • V1 (legacy — edge connectors). Inputs and outputs are Connector objects wired by edges, and inputs arrive as keyword arguments to call. Only use V1 when you specifically need a node for a V1 flow.
Both kinds can live in the same plugin — nodes() returns them together and the SDK splits them into the correct editor automatically.

Define the node

Register the node in your plugin

Add the node class to your plugin’s nodes() method:

Test it locally

Restart the plugin server:
Then execute the node. The /nodes/{node_name}/execute endpoint takes a body with ctx, inputs, and config:
Either way you get back an ExecutionResponse:

Key concepts

Available data types

V2 output fields and V1 connectors both use these types (V2 infers them from the Python annotation; V1 declares them via TypeDefinition): Image, Audio, and Chat are also available as file-like types.

Node metadata

Next: First Integration →

Define credentials and an integration for an external API.