Language-model steps on a Dataset › AI key: prompts, JSON, picking, writing, guarding.
Every AI call stops with the step: pausing, stopping or turning off a campaign aborts the request in flight (the provider may still bill what it already generated).
Generated from the node definitions in
src/lib/flow/node/ai/and the English labels (component.flow.node.ai). Every node also has the common settings.
Every AI node
Prompt, Extract JSON, Write, Summarize, Classify, Choose and Guardrail share three options:
- May decline (Write, Extract JSON): the model may answer
SKIPinstead (nothing worth writing, it would repeat itself, it would break a rule), and the item leaves throughdeclined. The posting and reply templates turn it on, so the AI never has to post. - Fallback AI key: used when the first key fails (its error is logged). Like AI key, it's one of the flow's AI key options (
{{ option.ai }}), so a campaign picks the key. - Send the item's images: the item's image files (5 MB each) go with the question, for models that see images.
- Memory key: the conversation under that key goes in before the question, and this turn is saved (Turns to remember, 10 by default). Use
{{ item.sessionId }}in a chat.
Contents
- AI agent —
ai/agent - Choose —
ai/choose - Embed —
ai/embed - Knowledge —
ai/knowledge - Classify —
ai/classify - Guardrail —
ai/guard - Extract JSON —
ai/json - Prompt —
ai/prompt - Summarize —
ai/summarize - Write —
ai/write - Answer —
ai/answer - Memory —
ai/memory - AI browse —
ai/browse
AI agent
ai/agent · icon bot · plan feature ai.agent
An AI that can use tools before it answers. The engine runs its loop itself: the model answers, or calls tools, then reads their answers, up to Steps at most rounds. Answer as: text, JSON (shaped like Shape when set; one fix-up round when it isn't valid), or a list (one item per entry). Stream the answer sends its words as they come to the chat (or the streaming webhook) the run answers.
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
ai | AI key | dataset.ai | ||
fallback | Fallback AI key | dataset.ai | ||
system | System message | prompt | ||
prompt | Prompt | prompt | "{{ item.message }}" | |
output | Answer as | select: text, json, list (A list (one item each)) | "text" | |
schema | Shape (JSON example) | json | output: json, list | |
isStream | Stream the answer (to the chat) | boolean | false | output: text |
tool | Tools | list of { kind: select, name: text, description: textarea, flowId: flow, type: text, field: json, method: select, url: text, header: json, body: json, code: code, base: dataset.knowledge, topK: number } | ||
mcp | MCP server | credential (mcp/server) | ||
mcpFilter | Its tools | select: all, only (Only these), except (All but these) | "all" | |
mcpTool | Tool names (comma separated) | text | mcpFilter: only, except | |
maxSteps | Steps at most | number | 10 | |
returnSteps | Return the steps | boolean | false | |
memory | Memory key (empty: none) | text | "{{ item.sessionId }}" | |
window | Messages remembered (pairs) | number | 10 | |
image | Look at the item's images | boolean | false |
A tool is one row of Tools:
| Kind | What the model calls | How it runs |
|---|---|---|
flow | A callable flow (its Flow input sample's keys are the arguments) | Walked inside the run like Run flow; what its Return sends back answers the model |
node | Any node type (type, e.g. data/http), its field values as JSON | A step of that node in the run's browser or worker. {{ ai.<name> }} in its values are what the model fills, each a string argument. An effect node in a test run is simulated |
http | method, url, header, body with {{ ai.<name> }} placeholders | From the engine, public addresses only; the answer is the status and up to 20,000 characters of the body |
code | Your code, given the model's arguments as input | A step in the worker; what it returns answers the model |
knowledge | query | A search of a (base, topK passages); the passages and their scores answer the model |
calculator | expression | In the engine: numbers, + - * / % ** and parentheses |
think | thought | Nothing happens: it gives the model room to plan |
Plus every tool of the MCP server, when one is set (Streamable HTTP; its auth comes from the credential).
When the main AI key fails, the fallback key answers instead. Memory keeps the conversation under its key for the workspace, the last window pairs (test runs keep their own, test:<key>), so a later run with the same key picks up where it left off; it's kept 30 days after its last use. Each model call is logged (type ai, its tokens and cost count toward the run's AI totals) and each tool call is a log line with its input and output.
Output dots: next.
{ "text": "It's sunny and 31°C in Paris.", "steps": [{ "tool": "get_weather", "input": { "city": "Paris" }, "output": "[{\"weather\":\"sunny and 31C in Paris\"}]" }] }
json instead of text with Answer as JSON; steps only with Return the steps. Default timeout: 15 minutes.
Knowledge
ai/knowledge · icon library · plan feature ai.knowledge
Searches, adds to, updates or removes from a . Rerank fetches three times Results at most, then Cohere's reranker (a Cohere credential) or an AI key puts them in order and keeps the best. Update a document replaces the document of that id. Include metadata off drops each passage's metadata.
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
base | Knowledge base | dataset.knowledge | ||
operation | Operation | select: search, insert (Add a document), update (Update a document), delete (Remove) | "search" | |
query | Search for | text | operation: search | |
topK | Results at most | number | 4 | operation: search |
minScore | Score at least (0–1) | number | 0 | operation: search |
isMetadata | Include metadata | boolean | true | operation: search |
rerank | Rerank | select: none (No), cohere (With Cohere), ai (With an AI key) | "none" | operation: search |
cohere | Cohere credential | credential (cohere/key) | operation: search; rerank: cohere | |
ai | AI key to rerank with | dataset.ai | operation: search; rerank: ai | |
source | Add from | select: text, file (A file) | "text" | operation: insert, update |
text | Text | textarea | operation: insert, update; source: text | |
file | The item's file (key) | text | "data" | operation: insert, update; source: file |
name | Document name | text | operation: insert, update | |
isClear | Empty the base first | boolean | false | operation: insert |
documentId | Document id (replace or remove it) | text | operation: insert, update, delete | |
metadata | Metadata (JSON) | json | operation: insert, update | |
filter | Metadata filter (JSON) | json |
Search sends one item per passage, { text, score, documentId, metadata }, best first; nothing found takes the empty dot. Insert sends { documentId, count } (its chunks); a file up to 10 MB in any of the supported formats. Delete sends { count } (documents removed): by documentId, or every document whose metadata matches filter.
Output dots: next, empty.
Embed
ai/embed · icon scan-text · plan feature ai.knowledge
Turns text into a vector with an OpenAI key's embedding model: { vector: [ … ], dimensions }. Fields: ai (OpenAI key), model (default text-embedding-3-small), dimensions (0: the model's own), text.
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
ai | OpenAI key | dataset.ai | ||
model | Embedding model | text | "text-embedding-3-small" | |
dimensions | Dimensions (0: the model's) | number | 0 | |
text | Text | textarea |
Choose
ai/choose · icon list-checks
Picks the best items by your criteria
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
ai | AI key | dataset.ai | ||
fallback | Fallback AI key (when the first fails) | dataset.ai | ||
image | Send the item's images | boolean | false | |
memory | Memory key (keeps the conversation) | text | ||
window | Turns to remember | number | 10 | |
list | List | text | ||
criteria | Criteria | prompt | ||
pick | Pick | number | 5 | |
extra | Extra per pick | prompt |
Output dots
next— Nextnone— None
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"picks": [
{
"reason": "string"
}
]
}
Default settings
timeout 2 minutes; the rest are the .
Example node
{
"id": "choose",
"type": "ai/choose",
"name": "Choose",
"field": {
"pick": 5
},
"setting": {
"retry": {
"count": 0,
"waitMs": 1000,
"backoff": "fixed"
},
"error": { "mode": "stop", "fallback": null, "break": { "count": 3, "waitMs": 600000 } },
"timeoutMs": 120000,
"disabled": false
},
"pin": null
}
Classify
ai/classify · icon tags
Puts text into one of your categories
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
ai | AI key | dataset.ai | ||
fallback | Fallback AI key (when the first fails) | dataset.ai | ||
image | Send the item's images | boolean | false | |
memory | Memory key (keeps the conversation) | text | ||
window | Turns to remember | number | 10 | |
input | Input | textarea | ||
category | Categories | list of { name: text, description: text } | [{"name": "", "description": ""}] |
Output dots
next— Next
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"category": "string",
"confidence": "number",
"reason": "string"
}
Default settings
timeout 2 minutes; the rest are the .
Example node
{
"id": "classify",
"type": "ai/classify",
"name": "Classify",
"field": {
"category": [
{
"name": "",
"description": ""
}
]
},
"setting": {
"retry": {
"count": 0,
"waitMs": 1000,
"backoff": "fixed"
},
"error": { "mode": "stop", "fallback": null, "break": { "count": 3, "waitMs": 600000 } },
"timeoutMs": 120000,
"disabled": false
},
"pin": null
}
Guardrail
ai/guard · icon shield-check
Checks text against your rules
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
ai | AI key | dataset.ai | ||
fallback | Fallback AI key (when the first fails) | dataset.ai | ||
image | Send the item's images | boolean | false | |
memory | Memory key (keeps the conversation) | text | ||
window | Turns to remember | number | 10 | |
input | Text to check | textarea | ||
rule | Rules | prompt | "No insults, hate, spam, links, personal data or false claims. Must make sense i |
Output dots
pass— Passfail— Fail
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"pass": "boolean",
"violations": [
"string"
],
"input": "string"
}
Default settings
timeout 2 minutes; the rest are the .
Example node
{
"id": "guard",
"type": "ai/guard",
"name": "Guardrail",
"field": {
"rule": "No insults, hate, spam, links, personal data or false claims. Must make sense in context."
},
"setting": {
"retry": {
"count": 0,
"waitMs": 1000,
"backoff": "fixed"
},
"error": { "mode": "stop", "fallback": null, "break": { "count": 3, "waitMs": 600000 } },
"timeoutMs": 120000,
"disabled": false
},
"pin": null
}
Extract JSON
ai/json · icon braces
Gets structured JSON from the AI
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
ai | AI key | dataset.ai | ||
fallback | Fallback AI key (when the first fails) | dataset.ai | ||
image | Send the item's images | boolean | false | |
memory | Memory key (keeps the conversation) | text | ||
window | Turns to remember | number | 10 | |
input | Input | textarea | ||
schema | Schema | json | {"title": "string"} | |
instructions | Instructions | prompt |
Output dots
next— Nextinvalid— Invalid
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
"the item it got (unchanged), or what its code returns"
Default settings
timeout 2 minutes; the rest are the .
Example node
{
"id": "json",
"type": "ai/json",
"name": "Extract JSON",
"field": {
"schema": {
"title": "string"
}
},
"setting": {
"retry": {
"count": 0,
"waitMs": 1000,
"backoff": "fixed"
},
"error": { "mode": "stop", "fallback": null, "break": { "count": 3, "waitMs": 600000 } },
"timeoutMs": 120000,
"disabled": false
},
"pin": null
}
Prompt
ai/prompt · icon sparkles
Asks the AI
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
ai | AI key | dataset.ai | ||
fallback | Fallback AI key (when the first fails) | dataset.ai | ||
image | Send the item's images | boolean | false | |
memory | Memory key (keeps the conversation) | text | ||
window | Turns to remember | number | 10 | |
system | System prompt | prompt | ||
prompt | Prompt | prompt |
Output dots
next— Nexterror— Error
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"text": "string",
"usage": {
"input": "number",
"output": "number",
"cached": "number"
}
}
Default settings
timeout 2 minutes; the rest are the .
Example node
{
"id": "prompt",
"type": "ai/prompt",
"name": "Prompt",
"field": {},
"setting": {
"retry": {
"count": 0,
"waitMs": 1000,
"backoff": "fixed"
},
"error": { "mode": "stop", "fallback": null, "break": { "count": 3, "waitMs": 600000 } },
"timeoutMs": 120000,
"disabled": false
},
"pin": null
}
Summarize
ai/summarize · icon text-quote
Shortens text to what matters
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
ai | AI key | dataset.ai | ||
fallback | Fallback AI key (when the first fails) | dataset.ai | ||
image | Send the item's images | boolean | false | |
memory | Memory key (keeps the conversation) | text | ||
window | Turns to remember | number | 10 | |
input | Input | textarea | ||
length | Length | select: sentence (One sentence), short (Short paragraph), bullets (Bullet points) | "short" |
Output dots
next— Next
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"text": "string"
}
Default settings
timeout 2 minutes; the rest are the .
Example node
{
"id": "summarize",
"type": "ai/summarize",
"name": "Summarize",
"field": {
"length": "short"
},
"setting": {
"retry": {
"count": 0,
"waitMs": 1000,
"backoff": "fixed"
},
"error": { "mode": "stop", "fallback": null, "break": { "count": 3, "waitMs": 600000 } },
"timeoutMs": 120000,
"disabled": false
},
"pin": null
}
Write
ai/write · icon pen-line
Writes a reply, post or message. The run log shows what it wrote (Reply: …), or Declined when the model answered SKIP.
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
ai | AI key | dataset.ai | ||
fallback | Fallback AI key (when the first fails) | dataset.ai | ||
image | Send the item's images | boolean | false | |
memory | Memory key (keeps the conversation) | text | ||
window | Turns to remember | number | 10 | |
instructions | What to write | prompt | ||
context | Context | textarea | ||
tone | Tone | select: natural, casual, friendly, formal, witty | "natural" | |
length | Length | select: short, medium, long | "short" | |
language | Language (optional) | text |
Output dots
next— Next
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"text": "string"
}
Default settings
timeout 2 minutes; the rest are the .
Example node
{
"id": "write",
"type": "ai/write",
"name": "Write",
"field": {
"tone": "natural",
"length": "short"
},
"setting": {
"retry": {
"count": 0,
"waitMs": 1000,
"backoff": "fixed"
},
"error": { "mode": "stop", "fallback": null, "break": { "count": 3, "waitMs": 600000 } },
"timeoutMs": 120000,
"disabled": false
},
"pin": null
}
Answer
ai/answer · icon book-open-check · plan feature ai.knowledge
Answers a question from a : the nearest passages (Passages, 4) go to the model with the question and the instructions, and it answers with { text, source: [{ text, score, name }] }. Memory key (default {{ item.sessionId }}) keeps the conversation, its last window pairs (5).
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
ai | AI key | dataset.ai | ||
base | Knowledge base | dataset.knowledge | ||
question | Question | prompt | "{{ item.message }}" | |
system | Instructions | prompt | "Answer from the passages only. When they don't say, say you don't know." | |
topK | Passages | number | 4 | |
memory | Memory key (empty: none) | text | "{{ item.sessionId }}" | |
window | Messages remembered (pairs) | number | 5 |
Memory
ai/memory · icon brain
An AI conversation under a key, the same memory the AI agent and Answer use: Get its messages, Add a message (as the person or the assistant; the last window pairs kept), or Clear it. Output: the item with message: [{ role, content }].
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
operation | Operation | select: get, insert (Add a message), delete (Clear) | "get" | |
key | Memory key | text | "{{ item.sessionId }}" | |
role | As | select: user (The person), assistant (The assistant) | "assistant" | operation: insert |
text | Message | textarea | operation: insert | |
window | Messages kept (pairs) | number | 10 |
AI browse
ai/browse · icon mouse-pointer-click · plan feature ai.browse · effect
An AI that works the page toward a goal. Each step it reads the page (address, title, text, up to 80 numbered elements) and picks one action: click, type (not when Read only), go to a URL, scroll, done or fail; the browser does it. Allowed domains (comma separated) keep it on your sites: going anywhere else fails. Up to Steps at most (15). It ends through done ({ result, url, steps }) or failed (why). Each step is logged, its model call counted as AI.
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
ai | AI key | dataset.ai | ||
goal | Goal | prompt | ||
url | Start at (URL) | text | ||
maxSteps | Steps at most | number | 15 | |
domain | Allowed domains (comma separated; empty: any) | text | ||
isReadOnly | Read only (never types) | boolean | true |