Skip to main content
config.yaml is the settings form. canvas renders it, someone fills it in, and your calls read the saved values as {{ config.<field> }}. It is the file you touch most. Every new option a node grows lands here and nowhere else.
config.yaml
configSchema is a JSON Schema, so any keyword you already know works. The ui: keys are the platform’s, and they decide how a field is drawn.

Writing the labels

Three fields decide whether the form makes sense to the person filling it in. Say what the setting does, not what it is called. β€œMaximum number of tokens to generate” tells a reader nothing they could not get from the label. β€œThe model stops when it hits this, mid-sentence and without an error” tells them why they might change it. Keep it to a line or two. Detail belongs in your node’s own documentation, not under a form field.

Field types

Text

A choice

enum is the values, enumNames is what a person sees. They are positional, so they must be the same length.

A number

minimum and maximum are enforced, so a bad value is caught in the form rather than by the service.

A switch

Structured data

Making a field wirable

ui:field: template is what lets a field take data from an upstream node instead of a typed value. Without it, the field is whatever someone typed.
The syntax follows the field’s type, on every node: a string takes a {{ }} Handlebars string, while an object or array takes a return expression.
Handlebars and expressions covers the grammar, every root a field can reach, and what the sandbox allows. Workflow-level values such as workflow.variables resolve here, before the node runs, which is why they belong in a config field rather than in a call.

Showing a field only when it matters

ui:dependencies hides a field until another field has the right value. A scalar means it must match exactly, an array means it must be one of several, and multiple keys are all required at once.
Lint checks that every key names a real sibling field, so a rename cannot leave a field permanently hidden.

Two fields you never write

authRequired and authRole are reserved. The builder’s two access controls are platform chrome, injected into every runnable node’s form, and declaring either yourself is a lint error. Who can run it covers how your floor and the builder’s controls resolve together.

Other keys you will meet

The reference lists every ui: key.

When it goes wrong

Next steps

Handlebars and expressions

The grammar a wirable field resolves, and every root it can reach.

config.yaml

Every field the settings form takes, generated from the schema.