@n8n/instance-ai 1.17.2 → 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/apply-agent-thinking.js +1 -1
- package/dist/agent/apply-agent-thinking.js.map +1 -1
- package/dist/agent/computer-use-prompt.js +2 -2
- package/dist/agent/instance-agent.d.ts +7 -1
- package/dist/agent/instance-agent.js +9 -2
- package/dist/agent/instance-agent.js.map +1 -1
- package/dist/agent/shared-prompts.js +6 -20
- package/dist/agent/shared-prompts.js.map +1 -1
- package/dist/agent/system-prompt.js +43 -105
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/build.tsbuildinfo +1 -1
- package/dist/index.d.ts +1 -3
- package/dist/index.js +1 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp/mcp-client-manager.d.ts +13 -1
- package/dist/mcp/mcp-client-manager.js +17 -2
- package/dist/mcp/mcp-client-manager.js.map +1 -1
- package/dist/runtime/run-state-registry.d.ts +2 -1
- package/dist/runtime/run-state-registry.js.map +1 -1
- package/dist/storage/workflow-loop-storage.d.ts +7 -0
- package/dist/tools/attachments/parse-file.tool.js +2 -0
- package/dist/tools/attachments/parse-file.tool.js.map +1 -1
- package/dist/tools/credentials.tool.js +3 -2
- package/dist/tools/credentials.tool.js.map +1 -1
- package/dist/tools/data-tables.tool.js +5 -1
- package/dist/tools/data-tables.tool.js.map +1 -1
- package/dist/tools/evals/eval-config.tool.js +42 -7
- package/dist/tools/evals/eval-config.tool.js.map +1 -1
- package/dist/tools/index.js +0 -3
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/orchestration/build-agent.tool.js +95 -26
- package/dist/tools/orchestration/build-agent.tool.js.map +1 -1
- package/dist/tools/orchestration/verification/analyze-result.d.ts +1 -0
- package/dist/tools/orchestration/verification/analyze-result.js +13 -3
- package/dist/tools/orchestration/verification/analyze-result.js.map +1 -1
- package/dist/tools/orchestration/verification/prepare-run.d.ts +1 -0
- package/dist/tools/orchestration/verification/prepare-run.js +31 -0
- package/dist/tools/orchestration/verification/prepare-run.js.map +1 -1
- package/dist/tools/orchestration/verify-built-workflow.tool.js +1 -0
- package/dist/tools/orchestration/verify-built-workflow.tool.js.map +1 -1
- package/dist/tools/research.tool.js +6 -1
- package/dist/tools/research.tool.js.map +1 -1
- package/dist/tools/task-control.tool.js +2 -2
- package/dist/tools/task-control.tool.js.map +1 -1
- package/dist/tools/tool-ids.d.ts +0 -1
- package/dist/tools/tool-ids.js +2 -2
- package/dist/tools/tool-ids.js.map +1 -1
- package/dist/tools/workflows/build-workflow.tool.js +2 -0
- package/dist/tools/workflows/build-workflow.tool.js.map +1 -1
- package/dist/tools/workflows/plan-verification-simulation.d.ts +2 -0
- package/dist/tools/workflows/plan-verification-simulation.js +22 -2
- package/dist/tools/workflows/plan-verification-simulation.js.map +1 -1
- package/dist/tools/workflows/reconcile-simulation-plan.js +2 -1
- package/dist/tools/workflows/reconcile-simulation-plan.js.map +1 -1
- package/dist/tools/workflows/workflow-json-utils.d.ts +2 -0
- package/dist/tools/workflows/workflow-json-utils.js +46 -0
- package/dist/tools/workflows/workflow-json-utils.js.map +1 -1
- package/dist/tools/workflows/workflow-source-compiler.js +6 -7
- package/dist/tools/workflows/workflow-source-compiler.js.map +1 -1
- package/dist/types.d.ts +5 -1
- package/dist/types.js.map +1 -1
- package/dist/workflow-loop/workflow-loop-state.d.ts +8 -0
- package/dist/workflow-loop/workflow-loop-state.js +1 -0
- package/dist/workflow-loop/workflow-loop-state.js.map +1 -1
- package/dist/workspace/lazy-runtime-workspace.js +2 -2
- package/dist/workspace/lazy-runtime-workspace.js.map +1 -1
- package/dist/workspace/pack-workspace-sdk.d.ts +9 -2
- package/dist/workspace/pack-workspace-sdk.js +36 -13
- package/dist/workspace/pack-workspace-sdk.js.map +1 -1
- package/dist/workspace/sandbox-setup.js +29 -19
- package/dist/workspace/sandbox-setup.js.map +1 -1
- package/dist/workspace/workspace-files.js +4 -4
- package/dist/workspace/workspace-files.js.map +1 -1
- package/package.json +10 -10
- package/skills/config-evals/SKILL.md +29 -5
- package/skills/config-evals/references/config-eval-playbook.md +20 -9
- package/skills/data-table-manager/SKILL.md +12 -5
- package/skills/intent-recognition/SKILL.md +10 -0
- package/skills/n8n-docs-assistant/SKILL.md +2 -1
- package/skills/planning/SKILL.md +14 -3
- package/skills/post-build-flow/SKILL.md +3 -0
- package/skills/workflow-builder/SKILL.md +105 -27
- package/dist/tools/templates.tool.d.ts +0 -2
- package/dist/tools/templates.tool.js +0 -20
- package/dist/tools/templates.tool.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-files.js","sourceRoot":"","sources":["../../src/workspace/workspace-files.ts"],"names":[],"mappings":";;;;;AAAA,0DAAwD;AAExD,6CAMsB;AA0BtB,SAAS,aAAa,CAAC,OAA8B;IACpD,OAAO,OAAO,EAAE,aAAa,IAAI,gBAAgB,CAAC;AACnD,CAAC;AAED,SAAS,0BAA0B,CAAC,OAAwB;IAC3D,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACvE,CAAC;AAMM,KAAK,4BACX,SAA8B,EAC9B,QAAgB,EAChB,OAA8B;IAE9B,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;IACxC,MAAM,QAAQ,GAAG,UAAU,EAAE,QAAQ,CAAC;IACtC,IAAI,UAAU,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC;YACJ,OAAO,0BAA0B,CAChC,MAAM,IAAA,oCAAuB,EAE5B,KAAK,IAAI,EAAE,CACV,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE;gBACzC,QAAQ,EAAE,OAAO;gBACjB,WAAW,EAAE,OAAO,EAAE,WAAW;aACjC,CAAC,EACH,QAAQ,EACR,OAAO,CACP,CACD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAEhB,IAAI,IAAA,sCAAyB,EAAC,KAAK,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CACd,kBAAkB,aAAa,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,QAAQ,MAAM,IAAA,oCAAiB,EAAC,KAAK,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"workspace-files.js","sourceRoot":"","sources":["../../src/workspace/workspace-files.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@n8n/instance-ai",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.18.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"module": "src/index.ts",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
"dist/**/*",
|
|
9
9
|
"knowledge-base/**/*",
|
|
10
10
|
"skills/**/*",
|
|
11
|
-
"
|
|
12
|
-
"
|
|
11
|
+
"LICENSE.md",
|
|
12
|
+
"LICENSE_EE.md"
|
|
13
13
|
],
|
|
14
14
|
"exports": {
|
|
15
15
|
".": {
|
|
@@ -56,13 +56,13 @@
|
|
|
56
56
|
"@e965/xlsx": "0.20.3",
|
|
57
57
|
"zod": "3.25.67",
|
|
58
58
|
"zod-from-json-schema-v3": "npm:zod-from-json-schema@^0.0.5",
|
|
59
|
-
"@n8n/agents": "0.
|
|
60
|
-
"@n8n/ai-utilities": "0.
|
|
61
|
-
"@n8n/
|
|
59
|
+
"@n8n/agents": "0.18.0",
|
|
60
|
+
"@n8n/ai-utilities": "0.26.0",
|
|
61
|
+
"@n8n/utils": "1.41.0",
|
|
62
|
+
"@n8n/api-types": "1.33.0",
|
|
62
63
|
"@n8n/mcp-browser": "0.15.0",
|
|
63
|
-
"@n8n/
|
|
64
|
-
"
|
|
65
|
-
"n8n-workflow": "2.32.1"
|
|
64
|
+
"@n8n/workflow-sdk": "0.26.0",
|
|
65
|
+
"n8n-workflow": "2.33.0"
|
|
66
66
|
},
|
|
67
67
|
"devDependencies": {
|
|
68
68
|
"@ai-sdk/anthropic": "^3.0.81",
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
},
|
|
92
92
|
"scripts": {
|
|
93
93
|
"clean": "rimraf dist .turbo",
|
|
94
|
-
"typecheck": "tsc --noEmit",
|
|
94
|
+
"typecheck": "tsc --noEmit && tsc -p evaluations/tsconfig.json",
|
|
95
95
|
"build": "tsc -p ./tsconfig.build.json && tsc-alias -p tsconfig.build.json",
|
|
96
96
|
"build:unchecked": "tsc -p ./tsconfig.build.json --noCheck && tsc-alias -p tsconfig.build.json",
|
|
97
97
|
"format": "biome format --write src",
|
|
@@ -29,6 +29,7 @@ build a config eval instead and briefly say that is how you set up evaluations.
|
|
|
29
29
|
|
|
30
30
|
- `name` — a human-readable evaluation name.
|
|
31
31
|
- `startNodeName` — the node where a run begins; it is fed one test-input row.
|
|
32
|
+
Must be a node with an incoming connection — **never a trigger** (see step 2).
|
|
32
33
|
- `endNodeName` — the node whose output is judged.
|
|
33
34
|
- `dataTableId` — a Data Table holding the test dataset. Create and populate it
|
|
34
35
|
with the `data-tables` tool first, then link it here by id.
|
|
@@ -39,8 +40,11 @@ build a config eval instead and briefly say that is how you set up evaluations.
|
|
|
39
40
|
1. Identify the target workflow and read it. Trace the main path from trigger to
|
|
40
41
|
the node that produces the answer.
|
|
41
42
|
2. Pick the nodes:
|
|
42
|
-
- `startNodeName` is
|
|
43
|
-
|
|
43
|
+
- `startNodeName` is the first node **after** the trigger — the node that
|
|
44
|
+
receives the input the dataset varies. Never use the trigger itself: an
|
|
45
|
+
eval run swaps the trigger for a dataset-driven one, so the start node must
|
|
46
|
+
have an incoming connection or the run fails to compile. For a chat/agent
|
|
47
|
+
workflow this is usually the agent node (often the same as `endNodeName`).
|
|
44
48
|
- `endNodeName` is the node whose output you want scored (usually the AI agent
|
|
45
49
|
or the final response node).
|
|
46
50
|
3. Resolve the dataset. Call `data-tables(action="list")` to find an existing
|
|
@@ -68,13 +72,33 @@ Two presets are available:
|
|
|
68
72
|
|
|
69
73
|
- **`correctness`** — compares the produced answer to a ground-truth answer.
|
|
70
74
|
Requires `expectedAnswer` (an n8n expression resolving to the ground-truth
|
|
71
|
-
value, typically a dataset column, e.g.
|
|
75
|
+
value, typically a dataset column, e.g. `={{ $json.expected_output }}`).
|
|
72
76
|
- **`helpfulness`** — judges the produced answer against the user's query.
|
|
73
77
|
Requires `userQuery` (an n8n expression for the input the user asked, e.g.
|
|
74
|
-
|
|
78
|
+
`={{ $json.input }}`).
|
|
75
79
|
|
|
76
80
|
Every metric also needs `actualAnswer`: an n8n expression resolving to the
|
|
77
|
-
workflow's produced answer at the end node, e.g.
|
|
81
|
+
workflow's produced answer at the end node, e.g. `={{ $json.output }}`.
|
|
82
|
+
|
|
83
|
+
`userQuery` and `expectedAnswer` name **dataset columns** (the input the user
|
|
84
|
+
asked; the ground-truth answer). `actualAnswer` names a field of the workflow's
|
|
85
|
+
**produced output**. Write all of them as `={{ $json.<name> }}` — the evaluation
|
|
86
|
+
reads dataset columns from the dataset row and `actualAnswer` from the end node
|
|
87
|
+
automatically. Do not reference the trigger or any node by name.
|
|
88
|
+
|
|
89
|
+
### Expression fields must begin with `=`
|
|
90
|
+
|
|
91
|
+
`actualAnswer`, `userQuery`, and `expectedAnswer` are n8n **expressions** — they
|
|
92
|
+
read a value out of each test row at runtime. The leading `=` is what tells n8n
|
|
93
|
+
to evaluate the `{{ … }}` template. **Without it the string is stored as literal
|
|
94
|
+
text**: the field shows `{{ $json.output }}` verbatim and the judge scores that
|
|
95
|
+
raw string instead of the resolved value.
|
|
96
|
+
|
|
97
|
+
- Correct: `={{ $json.output }}`, `={{ $json.expected_output }}`
|
|
98
|
+
- Wrong: `{{ $json.output }}` (no `=` → treated as fixed text)
|
|
99
|
+
|
|
100
|
+
Only add `=` when the value references workflow data via `{{ … }}`. A genuinely
|
|
101
|
+
fixed constant (rare for these fields) is written as plain text without `=`.
|
|
78
102
|
|
|
79
103
|
Pick `correctness` when the dataset has a known right answer to compare against;
|
|
80
104
|
pick `helpfulness` when there is no single ground truth and quality is judged
|
|
@@ -16,6 +16,12 @@ discriminated by `action` and always take a `workflowId`.
|
|
|
16
16
|
Config fields (create/update): `name`, `startNodeName`, `endNodeName`,
|
|
17
17
|
`dataTableId`, `metrics`.
|
|
18
18
|
|
|
19
|
+
`startNodeName` must be a node **with an incoming connection** — the first node
|
|
20
|
+
the trigger feeds into, never the trigger itself. An eval run replaces the
|
|
21
|
+
trigger with a dataset-driven one, so naming the trigger as the start node fails
|
|
22
|
+
to compile. For a single-agent workflow, `startNodeName` and `endNodeName` are
|
|
23
|
+
usually the same agent node.
|
|
24
|
+
|
|
19
25
|
`create`, `update`, and `delete` show an approval card automatically. Call the
|
|
20
26
|
tool and act on the result; do not ask for chat approval beforehand.
|
|
21
27
|
|
|
@@ -28,12 +34,17 @@ tool and act on the result; do not ask for chat approval beforehand.
|
|
|
28
34
|
| `credentialId` | always | credential id for the judge model; also determines the provider |
|
|
29
35
|
| `model` | always | e.g. `gpt-4o` |
|
|
30
36
|
| `outputType` | defaults to `numeric` | `numeric` or `boolean` |
|
|
31
|
-
| `actualAnswer` | always | expression for the produced answer, e.g.
|
|
32
|
-
| `expectedAnswer` | `correctness` preset | expression for ground truth, e.g.
|
|
33
|
-
| `userQuery` | `helpfulness` preset | expression for the user's query, e.g.
|
|
37
|
+
| `actualAnswer` | always | expression for the produced answer, e.g. `={{ $json.output }}` |
|
|
38
|
+
| `expectedAnswer` | `correctness` preset | expression for ground truth, e.g. `={{ $json.expected_output }}` |
|
|
39
|
+
| `userQuery` | `helpfulness` preset | expression for the user's query, e.g. `={{ $json.input }}` |
|
|
34
40
|
| `prompt` | optional | overrides the default judge prompt |
|
|
35
41
|
| `provider` | omit | chat-model node type; leave unset — derived from `credentialId`. Set only if you know it (e.g. `@n8n/n8n-nodes-langchain.lmChatOpenAi`) |
|
|
36
42
|
|
|
43
|
+
`actualAnswer`, `expectedAnswer`, and `userQuery` are expressions and **must
|
|
44
|
+
begin with `=`** (e.g. `={{ $json.output }}`). Without the `=` the value is stored
|
|
45
|
+
as literal text and the judge scores `{{ $json.output }}` verbatim instead of the
|
|
46
|
+
resolved output. Only omit `=` for a genuinely fixed constant string.
|
|
47
|
+
|
|
37
48
|
## Worked Example — correctness eval on an agent workflow
|
|
38
49
|
|
|
39
50
|
1. Ensure a dataset exists with an input column and a ground-truth column:
|
|
@@ -54,7 +65,7 @@ tool and act on the result; do not ask for chat approval beforehand.
|
|
|
54
65
|
action="create",
|
|
55
66
|
workflowId="<wf_id>",
|
|
56
67
|
name="Support agent correctness",
|
|
57
|
-
startNodeName="
|
|
68
|
+
startNodeName="AI Agent", // first node after the trigger — not the trigger itself
|
|
58
69
|
endNodeName="AI Agent",
|
|
59
70
|
dataTableId="<dt_id>",
|
|
60
71
|
metrics=[{
|
|
@@ -62,8 +73,8 @@ tool and act on the result; do not ask for chat approval beforehand.
|
|
|
62
73
|
preset: "correctness",
|
|
63
74
|
credentialId: "<cred_id>", // provider is derived from this credential
|
|
64
75
|
model: "gpt-4o",
|
|
65
|
-
actualAnswer: "{{ $json.output }}",
|
|
66
|
-
expectedAnswer: "{{ $json.expected_output }}"
|
|
76
|
+
actualAnswer: "={{ $json.output }}",
|
|
77
|
+
expectedAnswer: "={{ $json.expected_output }}"
|
|
67
78
|
}]
|
|
68
79
|
)
|
|
69
80
|
```
|
|
@@ -80,7 +91,7 @@ eval-config(
|
|
|
80
91
|
action="create",
|
|
81
92
|
workflowId="<wf_id>",
|
|
82
93
|
name="Assistant helpfulness",
|
|
83
|
-
startNodeName="
|
|
94
|
+
startNodeName="AI Agent", // first node after the trigger — not the trigger itself
|
|
84
95
|
endNodeName="AI Agent",
|
|
85
96
|
dataTableId="<dt_id>",
|
|
86
97
|
metrics=[{
|
|
@@ -88,8 +99,8 @@ eval-config(
|
|
|
88
99
|
preset: "helpfulness",
|
|
89
100
|
credentialId: "<cred_id>", // provider is derived from this credential
|
|
90
101
|
model: "claude-sonnet-4-5",
|
|
91
|
-
userQuery: "{{ $json.input }}",
|
|
92
|
-
actualAnswer: "{{ $json.output }}"
|
|
102
|
+
userQuery: "={{ $json.input }}",
|
|
103
|
+
actualAnswer: "={{ $json.output }}"
|
|
93
104
|
}]
|
|
94
105
|
)
|
|
95
106
|
```
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: data-table-manager
|
|
3
3
|
description: >-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
Load before calling data-tables or parse-file. Use for natural standalone
|
|
5
|
+
requests like "what data tables do I have?", "show/list my tables", or "what
|
|
6
|
+
columns are in this table?", and whenever the user asks to list, show,
|
|
7
|
+
create, inspect, import, seed, query, update, clean up, rename columns in, or
|
|
8
|
+
delete data tables and rows, especially from CSV/XLSX/JSON attachments. Also
|
|
9
|
+
load before building or planning workflows that create or write to Data
|
|
10
|
+
Tables (then load workflow-builder before build-workflow).
|
|
9
11
|
recommended_tools:
|
|
10
12
|
- data-tables
|
|
11
13
|
- parse-file
|
|
@@ -15,6 +17,11 @@ platforms:
|
|
|
15
17
|
|
|
16
18
|
# Data Table Manager
|
|
17
19
|
|
|
20
|
+
## Routing
|
|
21
|
+
|
|
22
|
+
For workflow builds that create or write Data Tables, load this skill, then
|
|
23
|
+
`workflow-builder`, before `build-workflow`.
|
|
24
|
+
|
|
18
25
|
Use this skill to build and maintain n8n Data Tables in the current turn with
|
|
19
26
|
`data-tables` and, for attachments, `parse-file`. Do not spawn another agent or
|
|
20
27
|
create a background plan for data-table-only work.
|
|
@@ -102,6 +102,16 @@ be a direct agent tool or a workflow tool:
|
|
|
102
102
|
reusable, manually callable, or usable outside the agent. Build the workflow
|
|
103
103
|
first, pass it to `build-agent` via `workflowContext`, and set
|
|
104
104
|
`embeds_other: true`.
|
|
105
|
+
- Create required **data tables** via `data-table-manager` → `data-tables`
|
|
106
|
+
before `build-agent` when the agent will store or query tabular data — the
|
|
107
|
+
builder cannot create tables.
|
|
108
|
+
- Before the first `build-agent` call, create every prerequisite the builder
|
|
109
|
+
cannot: required data tables and any workflow tools the agent will invoke.
|
|
110
|
+
Pass built workflows in `workflowContext` and list every prerequisite
|
|
111
|
+
name/schema in `message`. Then let the builder gather remaining agent-specific
|
|
112
|
+
requirements (model, credentials, integrations).
|
|
113
|
+
- If a `builderReply` lists missing workflows or tables, create them and call
|
|
114
|
+
`build-agent` again — never ask the user to create them manually.
|
|
105
115
|
|
|
106
116
|
Count the nodes required inside one tool invocation, not the total number of
|
|
107
117
|
tools on the agent. For example, looking up and inserting Data Table rows are
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
name: n8n-docs-assistant
|
|
3
3
|
description: >-
|
|
4
4
|
Answers n8n product, setup, credential, node, hosting, API, and usage
|
|
5
|
-
questions from current n8n docs.
|
|
5
|
+
questions from current n8n docs. Load n8n-docs via load_tool before calling it
|
|
6
|
+
(search "n8n docs" if not visible). Use when the user asks how to configure,
|
|
6
7
|
set up, troubleshoot, or understand n8n behavior, especially credential setup
|
|
7
8
|
questions opened from the credential modal.
|
|
8
9
|
recommended_tools:
|
package/skills/planning/SKILL.md
CHANGED
|
@@ -3,9 +3,10 @@ name: planning
|
|
|
3
3
|
description: >-
|
|
4
4
|
ONLY for coordinated multi-artifact work: multiple workflows with dependencies,
|
|
5
5
|
shared data-table schema/migration across tasks, or the user explicitly asked
|
|
6
|
-
to review a plan first.
|
|
7
|
-
|
|
8
|
-
workflow-
|
|
6
|
+
to review a plan first. Load create-tasks via load_tool before calling it
|
|
7
|
+
(search "create tasks" if not visible). Do NOT use for new one-off workflows,
|
|
8
|
+
single-workflow edits, verification-only requests, or standalone data-table
|
|
9
|
+
ops — use workflow-builder or data-table-manager instead.
|
|
9
10
|
recommended_tools:
|
|
10
11
|
- create-tasks
|
|
11
12
|
- workflows
|
|
@@ -55,6 +56,15 @@ single-workflow builds and existing-workflow edits use `workflow-builder` with
|
|
|
55
56
|
`build-workflow` directly. Standalone data-table work uses `data-table-manager`
|
|
56
57
|
with direct `data-tables` and `parse-file` calls.
|
|
57
58
|
|
|
59
|
+
## Knowledge Base
|
|
60
|
+
|
|
61
|
+
**Consult the knowledge base before planning.** Read the relevant `.md` guides
|
|
62
|
+
and templates for each technique the request involves (`knowledge-base/index.json`,
|
|
63
|
+
`knowledge-base/best-practices/index.json`, and linked files). Use
|
|
64
|
+
`workspace_execute_command` with `rg` or `find` under `knowledge-base/templates/`
|
|
65
|
+
to locate matching SDK examples — never load `templates/index.json` wholesale.
|
|
66
|
+
Skip only for trivial mechanical edits you have already reviewed in this thread.
|
|
67
|
+
|
|
58
68
|
## Method
|
|
59
69
|
|
|
60
70
|
1. Decide whether the request is plan-worthy by coordination need, not by
|
|
@@ -63,6 +73,7 @@ with direct `data-tables` and `parse-file` calls.
|
|
|
63
73
|
`nodes(action="suggested")`, `credentials(action="list")`,
|
|
64
74
|
`data-tables(action="list")`, `parse-file`, `workflows`, and `research`
|
|
65
75
|
when relevant.
|
|
76
|
+
|
|
66
77
|
3. Prefer reasonable assumptions over questions. Ask the user only when the
|
|
67
78
|
answer would materially change the plan and cannot be discovered.
|
|
68
79
|
4. Build a dependency-aware graph. Producers must come before consumers.
|
|
@@ -20,6 +20,9 @@ especially when the build result contains `postBuildFlow.required: true`, or whe
|
|
|
20
20
|
the current message contains `<workflow-verification-follow-up>` or
|
|
21
21
|
`<workflow-setup-required>`.
|
|
22
22
|
|
|
23
|
+
These instructions are in English, but user-visible text you write while
|
|
24
|
+
following them stays in the user's conversation language.
|
|
25
|
+
|
|
23
26
|
For trigger `inputData` shapes, read
|
|
24
27
|
`knowledge-base/reference/trigger-input-data-shapes.md` in the sandbox workspace
|
|
25
28
|
when available, or load this skill's `references/trigger-input-data-shapes.md`
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: workflow-builder
|
|
3
3
|
description: >-
|
|
4
|
-
Default path for all single-workflow
|
|
5
|
-
workflow edits, verification repairs,
|
|
6
|
-
or edit a workspace source file, then
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
Load before calling build-workflow. Default path for all single-workflow
|
|
5
|
+
work: new one-off workflows, existing-workflow edits, verification repairs,
|
|
6
|
+
and workflow-local data tables. Write or edit a workspace source file, then
|
|
7
|
+
call build-workflow with filePath. When the workflow creates or writes Data
|
|
8
|
+
Tables, load data-table-manager first, then this skill. Do not load planning
|
|
9
|
+
or create-tasks first. Load planning only when multiple coordinated workflows
|
|
10
|
+
or shared cross-task data tables require a dependency-aware task graph.
|
|
10
11
|
recommended_tools:
|
|
11
12
|
- read_file
|
|
12
13
|
- write_file
|
|
@@ -22,15 +23,15 @@ recommended_tools:
|
|
|
22
23
|
|
|
23
24
|
# Workflow Builder
|
|
24
25
|
|
|
26
|
+
## Routing
|
|
27
|
+
|
|
28
|
+
When the workflow creates or writes Data Tables, load `data-table-manager`
|
|
29
|
+
first (if not already loaded this turn), then this skill.
|
|
30
|
+
|
|
25
31
|
You are an expert n8n workflow builder. You generate complete, valid
|
|
26
32
|
TypeScript code using `@n8n/workflow-sdk` for new workflows and for existing
|
|
27
33
|
saved workflow changes.
|
|
28
34
|
|
|
29
|
-
This skill runs inside the orchestrator — no separate builder agent, handoff,
|
|
30
|
-
or tool allowlist; use the orchestrator and workspace file tools already
|
|
31
|
-
available this turn (plus any relevant tool-search/MCP tool). Workflow building
|
|
32
|
-
runs in the orchestrator with this skill and `build-workflow`.
|
|
33
|
-
|
|
34
35
|
For new single-workflow requests, build directly with
|
|
35
36
|
`build-workflow({ filePath, sourceCode })` — the complete TypeScript SDK
|
|
36
37
|
source in `sourceCode`; the tool writes the file and builds in one call. For
|
|
@@ -39,12 +40,23 @@ workflowId)`, apply the edit to the returned code, then call
|
|
|
39
40
|
`build-workflow({ filePath, workflowId, sourceCode })` the first time — all
|
|
40
41
|
edits go through a workspace source file and `build-workflow`. Do not load
|
|
41
42
|
`planning` or call `create-tasks` first; `planning` is only for coordinated
|
|
42
|
-
multi-artifact work per the orchestrator routing rules.
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
multi-artifact work per the orchestrator routing rules. Do not create a plan
|
|
44
|
+
just for verification.
|
|
45
|
+
|
|
46
|
+
When the needed node types are already obvious from the request, batch
|
|
47
|
+
`nodes(action="type-definition")` — object form with resource/operation or mode
|
|
48
|
+
discriminators — together with the `load_skill` call for this skill in your
|
|
49
|
+
first action turn (each extra sequential turn resends the whole context). When
|
|
50
|
+
unsure which nodes to use, load this skill first and follow its research
|
|
51
|
+
process below.
|
|
45
52
|
|
|
46
53
|
## Repair Strategy
|
|
47
54
|
|
|
55
|
+
When the edit is to fix a node the user reports as erroring or showing a red
|
|
56
|
+
expression error, inspect it first via `debugging-executions` (run the
|
|
57
|
+
workflow, read the failing node's real error and resolved parameters) before
|
|
58
|
+
editing anything — never guess at the cause or change the node on a hunch.
|
|
59
|
+
|
|
48
60
|
When called with failure details for an existing workflow, start from the
|
|
49
61
|
workspace source file if one is available in the conversation or tool output. If
|
|
50
62
|
you only have a saved n8n workflow ID, use `workflows(action="get-as-code")`,
|
|
@@ -61,13 +73,16 @@ be the complete source when used; never send string patches or fragments.
|
|
|
61
73
|
|
|
62
74
|
## Escalation
|
|
63
75
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
`
|
|
69
|
-
|
|
70
|
-
|
|
76
|
+
If the service or workflow shape is clear, never stop before the first
|
|
77
|
+
`build-workflow` call to ask for setup values like recipients, accounts,
|
|
78
|
+
resources, credentials, channel IDs, or timezone; use placeholders or unresolved
|
|
79
|
+
`newCredential()` calls. Before the first successful `build-workflow` call, use
|
|
80
|
+
`ask-user` only when a missing choice changes the workflow's intent or topology
|
|
81
|
+
(e.g. which destination service). Setup details — recipients, accounts,
|
|
82
|
+
resources, channels, credentials, timezone — belong in placeholders or
|
|
83
|
+
unresolved `newCredential()` calls until post-build setup. After the first
|
|
84
|
+
build, use `ask-user` when stuck or genuinely ambiguous; do not retry the same
|
|
85
|
+
failing approach more than twice. Never re-ask an answered, deferred, or skipped
|
|
71
86
|
question — treat a skip as permission to assume a default and move on. Never
|
|
72
87
|
solicit secrets through `ask-user`; route credential collection through
|
|
73
88
|
workflow/credential setup surfaces.
|
|
@@ -87,7 +102,33 @@ Do not replace concrete user-provided or discoverable values with
|
|
|
87
102
|
placeholders: if the prompt gives a real URL, channel name, table name, label,
|
|
88
103
|
folder, or database, preserve it and placeholder only the unknown part.
|
|
89
104
|
|
|
90
|
-
## Knowledge Base
|
|
105
|
+
## Knowledge Base
|
|
106
|
+
|
|
107
|
+
**Prefer n8n sources over guessing.** For n8n product behavior, node setup,
|
|
108
|
+
credentials, hosting, or feature docs, consult — in this order — the sandbox
|
|
109
|
+
knowledge base, a matching runtime skill, or official n8n docs. Do not invent
|
|
110
|
+
setup steps or node semantics from memory when those sources can answer.
|
|
111
|
+
|
|
112
|
+
1. **Knowledge base** — consult before
|
|
113
|
+
building. Read the relevant `.md` guides and templates for each technique
|
|
114
|
+
the request involves. Skip only for trivial mechanical edits you have
|
|
115
|
+
already reviewed in this thread.
|
|
116
|
+
- `knowledge-base/index.json` — catalog of technique guides
|
|
117
|
+
(`knowledge-base/best-practices/index.json`; read the linked `.md` files)
|
|
118
|
+
and orchestration reference docs (`knowledge-base/reference/index.json`)
|
|
119
|
+
- `knowledge-base/templates/` — curated SDK workflow examples: use
|
|
120
|
+
`workspace_execute_command` with `rg` or `find` to locate matches, then
|
|
121
|
+
read only the relevant `.ts` files — never load `templates/index.json`
|
|
122
|
+
wholesale
|
|
123
|
+
- `node-types/index.txt` — searchable catalog of available n8n nodes
|
|
124
|
+
2. **Runtime skills** — when another skill matches (e.g. `data-table-manager`,
|
|
125
|
+
`debugging-executions`, `post-build-flow`), `load_skill` and follow it
|
|
126
|
+
instead of improvising.
|
|
127
|
+
3. **Official n8n docs** — for credential setup, product features, hosting, or
|
|
128
|
+
node docs that the knowledge base does not cover, load `n8n-docs-assistant`
|
|
129
|
+
then load `n8n-docs` via `load_tool` (search "n8n docs" if it is not
|
|
130
|
+
visible) and call `n8n-docs`. Prefer docs over web search for n8n-specific
|
|
131
|
+
questions.
|
|
91
132
|
|
|
92
133
|
For workflows with multiple external systems, multiple requested effects,
|
|
93
134
|
digests or reports, non-trivial branching, or Code nodes, read
|
|
@@ -362,10 +403,10 @@ n8n normalizes Data Table column names to snake_case, for example `dayName`
|
|
|
362
403
|
becomes `day_name`. Always call `data-tables(action="schema")` before using a
|
|
363
404
|
Data Table in workflow code so you use real column names.
|
|
364
405
|
|
|
365
|
-
When building workflows that create or use tables,
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
column names.
|
|
406
|
+
When building workflows that create or use tables, load `data-table-manager`
|
|
407
|
+
via `load_skill` first (if not already loaded this turn), then follow that
|
|
408
|
+
skill for schema/row guidance. Create or inspect tables directly with
|
|
409
|
+
`data-tables`; do not invent table IDs, table names, or column names.
|
|
369
410
|
|
|
370
411
|
When the ask is a summary, digest, or report over a period ("weekly summary of
|
|
371
412
|
what was recorded", "digest of this week's rows"), the summary branch must
|
|
@@ -701,9 +742,46 @@ For AI Agent workflows:
|
|
|
701
742
|
`memory()`, `outputParser()`, `embeddings()`, `vectorStore()`, `retriever()`,
|
|
702
743
|
`documentLoader()`, and `textSplitter()`.
|
|
703
744
|
|
|
745
|
+
## Trigger URL Sharing
|
|
746
|
+
|
|
747
|
+
After building a workflow that uses a trigger with an HTTP endpoint, share the
|
|
748
|
+
full production URL with the user. Use the Webhook base URL and Form base URL
|
|
749
|
+
from Instance Info in the system prompt. Each trigger type has a distinct
|
|
750
|
+
pattern:
|
|
751
|
+
|
|
752
|
+
- **Webhook Trigger**: `{webhookBaseUrl}/{path}` (where `{path}` is the node's
|
|
753
|
+
webhook path parameter).
|
|
754
|
+
- **Form Trigger**: `{formBaseUrl}/{path}` (or `{formBaseUrl}/{webhookId}` if
|
|
755
|
+
no custom path is set). Form Trigger lives under `/form/`, NOT `/webhook/` —
|
|
756
|
+
they are separate URL prefixes. Do NOT use the Webhook base URL for Form
|
|
757
|
+
Triggers.
|
|
758
|
+
- **Chat Trigger**: how the end user reaches this workflow depends on the
|
|
759
|
+
node's `public` parameter — pick the right guidance for the current value,
|
|
760
|
+
do not default to sharing a URL.
|
|
761
|
+
- **`public: false` (the default)**: there is NO end-user HTTP URL. Tell the
|
|
762
|
+
user to open the workflow in the editor and click the **Open chat** button
|
|
763
|
+
on the workflow canvas — that opens the built-in test chat. Do NOT share a
|
|
764
|
+
webhook URL, and do NOT suggest flipping `public: true` just to enable
|
|
765
|
+
testing — the in-editor chat is the intended testing path for private chat
|
|
766
|
+
workflows.
|
|
767
|
+
- **`public: true`**: the public chat URL is
|
|
768
|
+
`{webhookBaseUrl}/{webhookId}/chat` — share it after the workflow is
|
|
769
|
+
published. `{webhookId}` is the node's unique webhook ID; read it from the
|
|
770
|
+
workflow JSON, never guess. End users can open this URL in a browser.
|
|
771
|
+
The `/chat` suffix is unique to Chat Trigger — do NOT append it to Form
|
|
772
|
+
Trigger or Webhook URLs. (Your own testing via `executions(action="run")` and
|
|
773
|
+
`verify-built-workflow` works regardless of `public` or publish state.)
|
|
774
|
+
|
|
775
|
+
**These URLs are for sharing with the user only.** Do NOT hardcode them into
|
|
776
|
+
workflow code or build specs unless the workflow actually needs to send or
|
|
777
|
+
store its own public endpoint.
|
|
778
|
+
|
|
704
779
|
## Completion
|
|
705
780
|
|
|
706
781
|
For a successful build, finish with one concise sentence naming the workflow and
|
|
707
782
|
what changed. Include the workflow ID when it is available. If setup is
|
|
708
783
|
required, say plainly that setup is needed; do not tell the user to open a setup
|
|
709
|
-
wizard or navigate away from the AI Assistant panel.
|
|
784
|
+
wizard or navigate away from the AI Assistant panel. When the workflow exposes
|
|
785
|
+
a Webhook, Form, or Chat Trigger, follow [Trigger URL Sharing](#trigger-url-sharing)
|
|
786
|
+
and include the correct end-user URL (or in-editor chat guidance) in that
|
|
787
|
+
summary.
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createTemplatesTool = createTemplatesTool;
|
|
4
|
-
const agents_1 = require("@n8n/agents");
|
|
5
|
-
const zod_1 = require("zod");
|
|
6
|
-
const sanitize_mcp_schemas_1 = require("../agent/sanitize-mcp-schemas");
|
|
7
|
-
const inputSchema = (0, sanitize_mcp_schemas_1.sanitizeInputSchema)(zod_1.z.object({
|
|
8
|
-
templateId: zod_1.z.string().describe('The numeric id of the workflow template to load'),
|
|
9
|
-
}));
|
|
10
|
-
function createTemplatesTool(context) {
|
|
11
|
-
return new agents_1.Tool('templates')
|
|
12
|
-
.description('Load an n8n workflow template by its id. Returns the template workflow ' +
|
|
13
|
-
'(nodes and connections) to use as a starting point for building.')
|
|
14
|
-
.input(inputSchema)
|
|
15
|
-
.handler(async (input) => {
|
|
16
|
-
return await context.workflowTemplateService.getTemplate(input.templateId);
|
|
17
|
-
})
|
|
18
|
-
.build();
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=templates.tool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"templates.tool.js","sourceRoot":"","sources":["../../src/tools/templates.tool.ts"],"names":[],"mappings":";;;AAAA,wCAAmC;AACnC,6BAAwB;AAExB,wEAAoE;AAKpE,MAAM,WAAW,GAAG,IAAA,0CAAmB,EACtC,OAAC,CAAC,MAAM,CAAC;IACR,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;CAClF,CAAC,CACF,CAAC;AAMF,6BAAoC,OAA0B;IAC7D,OAAO,IAAI,aAAI,CAAC,WAAW,CAAC;SAC1B,WAAW,CACX,yEAAyE;QACxE,kEAAkE,CACnE;SACA,KAAK,CAAC,WAAW,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,KAAY,EAAE,EAAE;QAC/B,OAAO,MAAM,OAAO,CAAC,uBAAuB,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5E,CAAC,CAAC;SACD,KAAK,EAAE,CAAC;AACX,CAAC"}
|