@n8n/ai-workflow-builder 0.12.1 → 0.14.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.
Files changed (191) hide show
  1. package/dist/ai-workflow-builder-agent.service.d.ts +28 -0
  2. package/dist/ai-workflow-builder-agent.service.js +160 -0
  3. package/dist/ai-workflow-builder-agent.service.js.map +1 -0
  4. package/dist/build.tsbuildinfo +1 -1
  5. package/dist/chains/conversation-compact.d.ts +8 -0
  6. package/dist/chains/conversation-compact.js +56 -0
  7. package/dist/chains/conversation-compact.js.map +1 -0
  8. package/dist/chains/parameter-updater.d.ts +16 -0
  9. package/dist/chains/parameter-updater.js +94 -0
  10. package/dist/chains/parameter-updater.js.map +1 -0
  11. package/dist/chains/planner.js +2 -2
  12. package/dist/chains/planner.js.map +1 -1
  13. package/dist/chains/prompts/base/common-patterns.d.ts +1 -0
  14. package/dist/chains/prompts/base/common-patterns.js +13 -0
  15. package/dist/chains/prompts/base/common-patterns.js.map +1 -0
  16. package/dist/chains/prompts/base/core-instructions.d.ts +1 -0
  17. package/dist/chains/prompts/base/core-instructions.js +28 -0
  18. package/dist/chains/prompts/base/core-instructions.js.map +1 -0
  19. package/dist/chains/prompts/base/expression-rules.d.ts +1 -0
  20. package/dist/chains/prompts/base/expression-rules.js +15 -0
  21. package/dist/chains/prompts/base/expression-rules.js.map +1 -0
  22. package/dist/chains/prompts/base/output-format.d.ts +1 -0
  23. package/dist/chains/prompts/base/output-format.js +7 -0
  24. package/dist/chains/prompts/base/output-format.js.map +1 -0
  25. package/dist/chains/prompts/examples/advanced/resource-locator-examples.d.ts +1 -0
  26. package/dist/chains/prompts/examples/advanced/resource-locator-examples.js +79 -0
  27. package/dist/chains/prompts/examples/advanced/resource-locator-examples.js.map +1 -0
  28. package/dist/chains/prompts/examples/advanced/tool-node-examples.d.ts +1 -0
  29. package/dist/chains/prompts/examples/advanced/tool-node-examples.js +71 -0
  30. package/dist/chains/prompts/examples/advanced/tool-node-examples.js.map +1 -0
  31. package/dist/chains/prompts/examples/basic/if-node-examples.d.ts +1 -0
  32. package/dist/chains/prompts/examples/basic/if-node-examples.js +138 -0
  33. package/dist/chains/prompts/examples/basic/if-node-examples.js.map +1 -0
  34. package/dist/chains/prompts/examples/basic/set-node-examples.d.ts +1 -0
  35. package/dist/chains/prompts/examples/basic/set-node-examples.js +148 -0
  36. package/dist/chains/prompts/examples/basic/set-node-examples.js.map +1 -0
  37. package/dist/chains/prompts/examples/basic/simple-updates.d.ts +1 -0
  38. package/dist/chains/prompts/examples/basic/simple-updates.js +51 -0
  39. package/dist/chains/prompts/examples/basic/simple-updates.js.map +1 -0
  40. package/dist/chains/prompts/node-types/http-request.d.ts +1 -0
  41. package/dist/chains/prompts/node-types/http-request.js +113 -0
  42. package/dist/chains/prompts/node-types/http-request.js.map +1 -0
  43. package/dist/chains/prompts/node-types/if-node.d.ts +1 -0
  44. package/dist/chains/prompts/node-types/if-node.js +158 -0
  45. package/dist/chains/prompts/node-types/if-node.js.map +1 -0
  46. package/dist/chains/prompts/node-types/set-node.d.ts +1 -0
  47. package/dist/chains/prompts/node-types/set-node.js +91 -0
  48. package/dist/chains/prompts/node-types/set-node.js.map +1 -0
  49. package/dist/chains/prompts/node-types/tool-nodes.d.ts +1 -0
  50. package/dist/chains/prompts/node-types/tool-nodes.js +73 -0
  51. package/dist/chains/prompts/node-types/tool-nodes.js.map +1 -0
  52. package/dist/chains/prompts/parameter-types/resource-locator.d.ts +1 -0
  53. package/dist/chains/prompts/parameter-types/resource-locator.js +95 -0
  54. package/dist/chains/prompts/parameter-types/resource-locator.js.map +1 -0
  55. package/dist/chains/prompts/parameter-types/text-fields.d.ts +1 -0
  56. package/dist/chains/prompts/parameter-types/text-fields.js +22 -0
  57. package/dist/chains/prompts/parameter-types/text-fields.js.map +1 -0
  58. package/dist/chains/prompts/prompt-builder.d.ts +14 -0
  59. package/dist/chains/prompts/prompt-builder.js +118 -0
  60. package/dist/chains/prompts/prompt-builder.js.map +1 -0
  61. package/dist/chains/prompts/prompt-config.d.ts +5 -0
  62. package/dist/chains/prompts/prompt-config.js +52 -0
  63. package/dist/chains/prompts/prompt-config.js.map +1 -0
  64. package/dist/errors/index.d.ts +45 -0
  65. package/dist/errors/index.js +122 -0
  66. package/dist/errors/index.js.map +1 -0
  67. package/dist/index.d.ts +1 -2
  68. package/dist/index.js +1 -2
  69. package/dist/index.js.map +1 -1
  70. package/dist/llm-config.d.ts +6 -5
  71. package/dist/llm-config.js +19 -4
  72. package/dist/llm-config.js.map +1 -1
  73. package/dist/tools/add-node.tool.d.ts +56 -0
  74. package/dist/tools/add-node.tool.js +136 -0
  75. package/dist/tools/add-node.tool.js.map +1 -0
  76. package/dist/tools/connect-nodes.tool.d.ts +45 -0
  77. package/dist/tools/connect-nodes.tool.js +223 -0
  78. package/dist/tools/connect-nodes.tool.js.map +1 -0
  79. package/dist/tools/engines/node-search-engine.d.ts +25 -0
  80. package/dist/tools/engines/node-search-engine.js +121 -0
  81. package/dist/tools/engines/node-search-engine.js.map +1 -0
  82. package/dist/tools/helpers/index.d.ts +4 -0
  83. package/dist/tools/helpers/index.js +21 -0
  84. package/dist/tools/helpers/index.js.map +1 -0
  85. package/dist/tools/helpers/progress.d.ts +9 -0
  86. package/dist/tools/helpers/progress.js +114 -0
  87. package/dist/tools/helpers/progress.js.map +1 -0
  88. package/dist/tools/helpers/response.d.ts +7 -0
  89. package/dist/tools/helpers/response.js +31 -0
  90. package/dist/tools/helpers/response.js.map +1 -0
  91. package/dist/tools/helpers/state.d.ts +13 -0
  92. package/dist/tools/helpers/state.js +70 -0
  93. package/dist/tools/helpers/state.js.map +1 -0
  94. package/dist/tools/helpers/validation.d.ts +12 -0
  95. package/dist/tools/helpers/validation.js +69 -0
  96. package/dist/tools/helpers/validation.js.map +1 -0
  97. package/dist/tools/node-details.tool.d.ts +19 -0
  98. package/dist/tools/node-details.tool.js +133 -0
  99. package/dist/tools/node-details.tool.js.map +1 -0
  100. package/dist/tools/node-search.tool.d.ts +49 -0
  101. package/dist/tools/node-search.tool.js +146 -0
  102. package/dist/tools/node-search.tool.js.map +1 -0
  103. package/dist/tools/prompts/main-agent.prompt.d.ts +2 -0
  104. package/dist/tools/prompts/main-agent.prompt.js +390 -0
  105. package/dist/tools/prompts/main-agent.prompt.js.map +1 -0
  106. package/dist/tools/remove-node.tool.d.ts +13 -0
  107. package/dist/tools/remove-node.tool.js +97 -0
  108. package/dist/tools/remove-node.tool.js.map +1 -0
  109. package/dist/tools/update-node-parameters.tool.d.ts +19 -0
  110. package/dist/tools/update-node-parameters.tool.js +131 -0
  111. package/dist/tools/update-node-parameters.tool.js.map +1 -0
  112. package/dist/tools/utils/connection-parameters.utils.d.ts +8 -0
  113. package/dist/tools/utils/connection-parameters.utils.js +47 -0
  114. package/dist/tools/utils/connection-parameters.utils.js.map +1 -0
  115. package/dist/tools/utils/connection.utils.d.ts +15 -0
  116. package/dist/tools/utils/connection.utils.js +321 -0
  117. package/dist/tools/utils/connection.utils.js.map +1 -0
  118. package/dist/tools/utils/node-creation.utils.d.ts +8 -0
  119. package/dist/tools/utils/node-creation.utils.js +52 -0
  120. package/dist/tools/utils/node-creation.utils.js.map +1 -0
  121. package/dist/tools/utils/node-positioning.utils.d.ts +17 -0
  122. package/dist/tools/utils/node-positioning.utils.js +87 -0
  123. package/dist/tools/utils/node-positioning.utils.js.map +1 -0
  124. package/dist/tools/utils/parameter-update.utils.d.ts +6 -0
  125. package/dist/tools/utils/parameter-update.utils.js +75 -0
  126. package/dist/tools/utils/parameter-update.utils.js.map +1 -0
  127. package/dist/types/config.d.ts +53 -0
  128. package/dist/{interfaces.js → types/config.js} +1 -1
  129. package/dist/types/config.js.map +1 -0
  130. package/dist/types/connections.d.ts +30 -0
  131. package/dist/types/connections.js +3 -0
  132. package/dist/types/connections.js.map +1 -0
  133. package/dist/types/index.d.ts +8 -0
  134. package/dist/types/index.js +25 -0
  135. package/dist/types/index.js.map +1 -0
  136. package/dist/types/messages.d.ts +38 -0
  137. package/dist/types/messages.js +3 -0
  138. package/dist/types/messages.js.map +1 -0
  139. package/dist/types/nodes.d.ts +26 -0
  140. package/dist/{types.js → types/nodes.js} +1 -1
  141. package/dist/types/nodes.js.map +1 -0
  142. package/dist/types/streaming.d.ts +33 -0
  143. package/dist/types/streaming.js +3 -0
  144. package/dist/types/streaming.js.map +1 -0
  145. package/dist/types/tools.d.ts +76 -0
  146. package/dist/types/tools.js +3 -0
  147. package/dist/types/tools.js.map +1 -0
  148. package/dist/types/utils.d.ts +2 -0
  149. package/dist/types/utils.js +3 -0
  150. package/dist/types/utils.js.map +1 -0
  151. package/dist/types/workflow.d.ts +21 -0
  152. package/dist/types/workflow.js +3 -0
  153. package/dist/types/workflow.js.map +1 -0
  154. package/dist/utils/node-helpers.d.ts +2 -0
  155. package/dist/utils/node-helpers.js +54 -0
  156. package/dist/utils/node-helpers.js.map +1 -0
  157. package/dist/utils/operations-processor.d.ts +10 -0
  158. package/dist/utils/operations-processor.js +114 -0
  159. package/dist/utils/operations-processor.js.map +1 -0
  160. package/dist/utils/stream-processor.d.ts +6 -0
  161. package/dist/utils/stream-processor.js +153 -0
  162. package/dist/utils/stream-processor.js.map +1 -0
  163. package/dist/utils/tool-executor.d.ts +3 -0
  164. package/dist/utils/tool-executor.js +86 -0
  165. package/dist/utils/tool-executor.js.map +1 -0
  166. package/dist/workflow-builder-agent.d.ts +41 -0
  167. package/dist/workflow-builder-agent.js +205 -0
  168. package/dist/workflow-builder-agent.js.map +1 -0
  169. package/dist/workflow-state.d.ts +12 -7
  170. package/dist/workflow-state.js +26 -7
  171. package/dist/workflow-state.js.map +1 -1
  172. package/package.json +26 -7
  173. package/dist/ai-workflow-builder.service.d.ts +0 -25
  174. package/dist/ai-workflow-builder.service.js +0 -308
  175. package/dist/ai-workflow-builder.service.js.map +0 -1
  176. package/dist/chains/connection-composer.d.ts +0 -10
  177. package/dist/chains/connection-composer.js +0 -135
  178. package/dist/chains/connection-composer.js.map +0 -1
  179. package/dist/chains/node-selector.d.ts +0 -8
  180. package/dist/chains/node-selector.js +0 -90
  181. package/dist/chains/node-selector.js.map +0 -1
  182. package/dist/chains/nodes-composer.d.ts +0 -8
  183. package/dist/chains/nodes-composer.js +0 -451
  184. package/dist/chains/nodes-composer.js.map +0 -1
  185. package/dist/chains/validator.d.ts +0 -2
  186. package/dist/chains/validator.js +0 -67
  187. package/dist/chains/validator.js.map +0 -1
  188. package/dist/interfaces.d.ts +0 -4
  189. package/dist/interfaces.js.map +0 -1
  190. package/dist/types.d.ts +0 -87
  191. package/dist/types.js.map +0 -1
@@ -1,11 +1,16 @@
1
1
  import type { BaseMessage } from '@langchain/core/messages';
2
- import type { SimpleWorkflow } from './types';
3
- export declare const WorkflowState: import("@langchain/langgraph")._INTERNAL_ANNOTATION_ROOT<{
2
+ import type { SimpleWorkflow, WorkflowOperation } from './types/workflow';
3
+ export declare const WorkflowState: import("@langchain/langgraph").AnnotationRoot<{
4
4
  messages: import("@langchain/langgraph").BinaryOperatorAggregate<BaseMessage[], BaseMessage[]>;
5
- prompt: import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
6
- steps: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
7
- nodes: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
8
5
  workflowJSON: import("@langchain/langgraph").BinaryOperatorAggregate<SimpleWorkflow, SimpleWorkflow>;
9
- isWorkflowPrompt: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
10
- next: import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
6
+ workflowOperations: import("@langchain/langgraph").BinaryOperatorAggregate<WorkflowOperation[] | null, WorkflowOperation[] | null>;
7
+ workflowContext: import("@langchain/langgraph").BinaryOperatorAggregate<{
8
+ executionSchema?: import("n8n-workflow").NodeExecutionSchema[];
9
+ currentWorkflow?: Partial<import("n8n-workflow").IWorkflowBase>;
10
+ executionData?: import("n8n-workflow").IRunExecutionData["resultData"];
11
+ } | undefined, {
12
+ executionSchema?: import("n8n-workflow").NodeExecutionSchema[];
13
+ currentWorkflow?: Partial<import("n8n-workflow").IWorkflowBase>;
14
+ executionData?: import("n8n-workflow").IRunExecutionData["resultData"];
15
+ } | undefined>;
11
16
  }>;
@@ -2,17 +2,36 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WorkflowState = void 0;
4
4
  const langgraph_1 = require("@langchain/langgraph");
5
+ function operationsReducer(current, update) {
6
+ if (update === null) {
7
+ return [];
8
+ }
9
+ if (!update || update.length === 0) {
10
+ return current ?? [];
11
+ }
12
+ if (update.some((op) => op.type === 'clear')) {
13
+ return update.filter((op) => op.type === 'clear').slice(-1);
14
+ }
15
+ if (!current && !update) {
16
+ return [];
17
+ }
18
+ return [...(current ?? []), ...update];
19
+ }
5
20
  exports.WorkflowState = langgraph_1.Annotation.Root({
6
21
  messages: (0, langgraph_1.Annotation)({
7
- reducer: (x, y) => x.concat(y),
22
+ reducer: langgraph_1.messagesStateReducer,
23
+ default: () => [],
8
24
  }),
9
- prompt: (0, langgraph_1.Annotation)({ reducer: (x, y) => y ?? x ?? '' }),
10
- steps: (0, langgraph_1.Annotation)({ reducer: (x, y) => y ?? x ?? [] }),
11
- nodes: (0, langgraph_1.Annotation)({ reducer: (x, y) => y ?? x ?? [] }),
12
25
  workflowJSON: (0, langgraph_1.Annotation)({
13
- reducer: (x, y) => y ?? x ?? { nodes: [], connections: {} },
26
+ reducer: (x, y) => y ?? x,
27
+ default: () => ({ nodes: [], connections: {} }),
28
+ }),
29
+ workflowOperations: (0, langgraph_1.Annotation)({
30
+ reducer: operationsReducer,
31
+ default: () => [],
32
+ }),
33
+ workflowContext: (0, langgraph_1.Annotation)({
34
+ reducer: (x, y) => y ?? x,
14
35
  }),
15
- isWorkflowPrompt: (0, langgraph_1.Annotation)({ reducer: (x, y) => y ?? x ?? false }),
16
- next: (0, langgraph_1.Annotation)({ reducer: (x, y) => y ?? x ?? langgraph_1.END, default: () => langgraph_1.END }),
17
36
  });
18
37
  //# sourceMappingURL=workflow-state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-state.js","sourceRoot":"","sources":["../src/workflow-state.ts"],"names":[],"mappings":";;;AACA,oDAAuD;AAI1C,QAAA,aAAa,GAAG,sBAAU,CAAC,IAAI,CAAC;IAC5C,QAAQ,EAAE,IAAA,sBAAU,EAAgB;QACnC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;KAC9B,CAAC;IAEF,MAAM,EAAE,IAAA,sBAAU,EAAS,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;IAE/D,KAAK,EAAE,IAAA,sBAAU,EAAW,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;IAEhE,KAAK,EAAE,IAAA,sBAAU,EAAW,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;IAEhE,YAAY,EAAE,IAAA,sBAAU,EAAiB;QACxC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;KAC3D,CAAC;IAEF,gBAAgB,EAAE,IAAA,sBAAU,EAAU,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;IAE7E,IAAI,EAAE,IAAA,sBAAU,EAAS,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,eAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,eAAG,EAAE,CAAC;CAClF,CAAC,CAAC"}
1
+ {"version":3,"file":"workflow-state.js","sourceRoot":"","sources":["../src/workflow-state.ts"],"names":[],"mappings":";;;AACA,oDAAwE;AASxE,SAAS,iBAAiB,CACzB,OAAmC,EACnC,MAA8C;IAE9C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACX,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,OAAO,IAAI,EAAE,CAAC;IACtB,CAAC;IAGD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC;QAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACX,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;AACxC,CAAC;AAEY,QAAA,aAAa,GAAG,sBAAU,CAAC,IAAI,CAAC;IAC5C,QAAQ,EAAE,IAAA,sBAAU,EAAgB;QACnC,OAAO,EAAE,gCAAoB;QAC7B,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;KACjB,CAAC;IAIF,YAAY,EAAE,IAAA,sBAAU,EAAiB;QACxC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC;QACzB,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;KAC/C,CAAC;IAEF,kBAAkB,EAAE,IAAA,sBAAU,EAA6B;QAC1D,OAAO,EAAE,iBAAiB;QAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;KACjB,CAAC;IAGF,eAAe,EAAE,IAAA,sBAAU,EAA6C;QACvE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC;KACzB,CAAC;CACF,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@n8n/ai-workflow-builder",
3
- "version": "0.12.1",
3
+ "version": "0.14.0",
4
4
  "main": "dist/index.js",
5
5
  "module": "src/index.ts",
6
6
  "types": "dist/index.d.ts",
@@ -19,15 +19,24 @@
19
19
  "dependencies": {
20
20
  "@langchain/anthropic": "0.3.23",
21
21
  "@langchain/core": "0.3.61",
22
- "@langchain/langgraph": "0.2.45",
22
+ "@langchain/langgraph": "0.2.74",
23
23
  "@langchain/openai": "0.5.16",
24
- "@n8n_io/ai-assistant-sdk": "1.14.1",
24
+ "@n8n_io/ai-assistant-sdk": "1.15.0",
25
+ "langsmith": "^0.3.45",
26
+ "picocolors": "1.0.1",
25
27
  "zod": "3.25.67",
26
- "@n8n/di": "0.8.0",
27
- "@n8n/config": "1.45.0",
28
- "n8n-workflow": "1.99.1"
28
+ "@n8n/backend-common": "^0.14.0",
29
+ "@n8n/config": "1.47.0",
30
+ "n8n-workflow": "1.101.0",
31
+ "@n8n/di": "0.8.0"
29
32
  },
30
33
  "devDependencies": {
34
+ "@types/cli-progress": "^3.11.5",
35
+ "p-limit": "^3.1.0",
36
+ "cli-progress": "^3.12.0",
37
+ "cli-table3": "^0.6.3",
38
+ "jest-mock-extended": "^3.0.4",
39
+ "madge": "^8.0.0",
31
40
  "@n8n/typescript-config": "1.3.0"
32
41
  },
33
42
  "license": "SEE LICENSE IN LICENSE.md",
@@ -47,9 +56,19 @@
47
56
  "format": "biome format --write src",
48
57
  "format:check": "biome ci src",
49
58
  "test": "jest",
59
+ "test:coverage": "jest --coverage",
50
60
  "test:watch": "jest --watch",
51
61
  "lint": "eslint . --quiet",
52
62
  "lintfix": "eslint . --fix",
53
- "watch": "tsc-watch -p tsconfig.build.json --onCompilationComplete \"tsc-alias -p tsconfig.build.json\""
63
+ "watch": "tsc-watch -p tsconfig.build.json --onCompilationComplete \"tsc-alias -p tsconfig.build.json\"",
64
+ "deps:graph": "madge src/index.ts --image deps-graph.svg",
65
+ "deps:graph:service": "madge src/ai-workflow-builder-agent.service.ts --image deps-service.svg",
66
+ "deps:graph:tools": "madge src/tools/index.ts --image deps-tools.svg",
67
+ "deps:circular": "madge src/index.ts --circular",
68
+ "deps:report": "madge src/index.ts --json > deps-report.json && echo 'Dependency report saved to deps-report.json'",
69
+ "deps:orphans": "madge src/index.ts --orphans",
70
+ "deps:all": "pnpm run deps:graph && pnpm run deps:graph:service && pnpm run deps:graph:tools && pnpm run deps:circular && pnpm run deps:report",
71
+ "eval": "tsx evaluations/run-evaluation.ts",
72
+ "eval:generate": "GENERATE_TEST_CASES=true tsx evaluations/run-evaluation.ts"
54
73
  }
55
74
  }
@@ -1,25 +0,0 @@
1
- import { GlobalConfig } from '@n8n/config';
2
- import { INodeTypes } from 'n8n-workflow';
3
- import type { IUser } from 'n8n-workflow';
4
- import { ILicenseService } from './interfaces';
5
- import type { MessageResponse } from './types';
6
- export declare class AiWorkflowBuilderService {
7
- private readonly licenseService;
8
- private readonly nodeTypes;
9
- private readonly globalConfig;
10
- private readonly n8nVersion;
11
- private parsedNodeTypes;
12
- private llmSimpleTask;
13
- private llmComplexTask;
14
- private client;
15
- constructor(licenseService: ILicenseService, nodeTypes: INodeTypes, globalConfig: GlobalConfig, n8nVersion: string);
16
- private setupModels;
17
- private getNodeTypes;
18
- private isWorkflowEvent;
19
- private getAgent;
20
- chat(payload: {
21
- question: string;
22
- }, user: IUser): AsyncGenerator<{
23
- messages: MessageResponse[];
24
- }, void, unknown>;
25
- }
@@ -1,308 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.AiWorkflowBuilderService = void 0;
13
- const dispatch_1 = require("@langchain/core/callbacks/dispatch");
14
- const langgraph_1 = require("@langchain/langgraph");
15
- const config_1 = require("@n8n/config");
16
- const di_1 = require("@n8n/di");
17
- const ai_assistant_sdk_1 = require("@n8n_io/ai-assistant-sdk");
18
- const n8n_workflow_1 = require("n8n-workflow");
19
- const connection_composer_1 = require("./chains/connection-composer");
20
- const node_selector_1 = require("./chains/node-selector");
21
- const nodes_composer_1 = require("./chains/nodes-composer");
22
- const planner_1 = require("./chains/planner");
23
- const validator_1 = require("./chains/validator");
24
- const llm_config_1 = require("./llm-config");
25
- const workflow_state_1 = require("./workflow-state");
26
- let AiWorkflowBuilderService = class AiWorkflowBuilderService {
27
- constructor(licenseService, nodeTypes, globalConfig, n8nVersion) {
28
- this.licenseService = licenseService;
29
- this.nodeTypes = nodeTypes;
30
- this.globalConfig = globalConfig;
31
- this.n8nVersion = n8nVersion;
32
- this.parsedNodeTypes = [];
33
- this.parsedNodeTypes = this.getNodeTypes();
34
- }
35
- async setupModels(user) {
36
- if (this.llmSimpleTask && this.llmComplexTask) {
37
- return;
38
- }
39
- const baseUrl = this.globalConfig.aiAssistant.baseUrl;
40
- if (baseUrl) {
41
- if (!this.client) {
42
- const licenseCert = await this.licenseService.loadCertStr();
43
- const consumerId = this.licenseService.getConsumerId();
44
- this.client = new ai_assistant_sdk_1.AiAssistantClient({
45
- licenseCert,
46
- consumerId,
47
- baseUrl,
48
- n8nVersion: this.n8nVersion,
49
- });
50
- }
51
- (0, n8n_workflow_1.assert)(this.client, 'Client not setup');
52
- const authHeaders = await this.client.generateApiProxyCredentials(user);
53
- this.llmSimpleTask = await (0, llm_config_1.gpt41mini)({
54
- baseUrl: baseUrl + '/v1/api-proxy/openai',
55
- apiKey: '-',
56
- headers: {
57
- Authorization: authHeaders.apiKey,
58
- },
59
- });
60
- this.llmComplexTask = await (0, llm_config_1.anthropicClaude37Sonnet)({
61
- baseUrl: baseUrl + '/v1/api-proxy/anthropic',
62
- apiKey: '-',
63
- headers: {
64
- Authorization: authHeaders.apiKey,
65
- },
66
- });
67
- return;
68
- }
69
- this.llmSimpleTask = await (0, llm_config_1.gpt41mini)({
70
- apiKey: process.env.N8N_AI_OPENAI_API_KEY ?? '',
71
- });
72
- this.llmComplexTask = await (0, llm_config_1.anthropicClaude37Sonnet)({
73
- apiKey: process.env.N8N_AI_ANTHROPIC_KEY ?? '',
74
- });
75
- }
76
- getNodeTypes() {
77
- const nodeTypesKeys = Object.keys(this.nodeTypes.getKnownTypes());
78
- const nodeTypes = nodeTypesKeys
79
- .map((nodeName) => {
80
- return { ...this.nodeTypes.getByNameAndVersion(nodeName).description, name: nodeName };
81
- })
82
- .filter((nodeType) => nodeType.hidden !== true);
83
- return nodeTypes;
84
- }
85
- isWorkflowEvent(eventName) {
86
- return [
87
- 'prompt_validation',
88
- 'generated_steps',
89
- 'generated_nodes',
90
- 'composed_nodes',
91
- 'composed_connections',
92
- 'generated_workflow_json',
93
- ].includes(eventName);
94
- }
95
- getAgent() {
96
- const validatorChainNode = async (state, config) => {
97
- (0, n8n_workflow_1.assert)(this.llmSimpleTask, 'LLM not setup');
98
- const isWorkflowPrompt = await (0, validator_1.validatorChain)(this.llmSimpleTask).invoke({
99
- prompt: state.prompt,
100
- }, config);
101
- if (!isWorkflowPrompt) {
102
- await (0, dispatch_1.dispatchCustomEvent)('prompt_validation', {
103
- role: 'assistant',
104
- type: 'prompt-validation',
105
- isWorkflowPrompt,
106
- id: Date.now().toString(),
107
- });
108
- }
109
- return {
110
- isWorkflowPrompt,
111
- };
112
- };
113
- const plannerChainNode = async (state, config) => {
114
- (0, n8n_workflow_1.assert)(this.llmComplexTask, 'LLM not setup');
115
- const steps = await (0, planner_1.plannerChain)(this.llmComplexTask).invoke({
116
- prompt: state.prompt,
117
- }, config);
118
- await (0, dispatch_1.dispatchCustomEvent)('generated_steps', {
119
- role: 'assistant',
120
- type: 'workflow-step',
121
- steps,
122
- id: Date.now().toString(),
123
- read: false,
124
- });
125
- return {
126
- steps,
127
- };
128
- };
129
- const nodeSelectionChainNode = async (state, config) => {
130
- (0, n8n_workflow_1.assert)(this.llmSimpleTask, 'LLM not setup');
131
- const getNodeMessage = (node) => {
132
- return `
133
- <node_name>${node.name}</node_name>
134
- <node_description>${node.description}</node_description>
135
- `;
136
- };
137
- const allowedNodes = this.parsedNodeTypes.map(getNodeMessage).join('');
138
- const result = await (0, node_selector_1.nodesSelectionChain)(this.llmSimpleTask).invoke({
139
- allowedNodes,
140
- prompt: state.prompt,
141
- steps: state.steps.join('\n'),
142
- }, config);
143
- const nodes = [...new Set(result.map((r) => r.node))];
144
- await (0, dispatch_1.dispatchCustomEvent)('generated_nodes', {
145
- role: 'assistant',
146
- type: 'workflow-node',
147
- nodes,
148
- id: Date.now().toString(),
149
- read: false,
150
- });
151
- return {
152
- nodes,
153
- };
154
- };
155
- const nodesComposerChainNode = async (state, config) => {
156
- (0, n8n_workflow_1.assert)(this.llmComplexTask, 'LLM not setup');
157
- const getLatestVersion = (nodeType) => {
158
- const node = this.parsedNodeTypes.find((n) => n.name === nodeType);
159
- if (!node) {
160
- throw new n8n_workflow_1.OperationalError(`Node type not found: ${nodeType}`);
161
- }
162
- if (node.defaultVersion) {
163
- return node.defaultVersion;
164
- }
165
- return typeof node.version === 'number'
166
- ? node.version
167
- : node.version[node.version.length - 1];
168
- };
169
- const getNodeMessage = (nodeName) => {
170
- const node = this.parsedNodeTypes.find((n) => n.name === nodeName);
171
- if (!node) {
172
- throw new n8n_workflow_1.OperationalError(`Node type not found: ${nodeName}`);
173
- }
174
- return `
175
- <node_name>
176
- ${node.name}
177
- </node_name>
178
- <node_description>
179
- ${node.description}
180
- </node_description>
181
- <node_parameters>
182
- ${JSON.stringify(node.properties)}
183
- </node_parameters>
184
- `;
185
- };
186
- const result = await (0, nodes_composer_1.nodesComposerChain)(this.llmComplexTask).invoke({
187
- user_workflow_prompt: state.prompt,
188
- nodes: state.nodes.map(getNodeMessage).join('\n\n'),
189
- }, config);
190
- const composedNodes = result.map((node, index) => {
191
- const version = getLatestVersion(node.type);
192
- return {
193
- ...node,
194
- position: [index * 150, 0],
195
- typeVersion: version,
196
- };
197
- });
198
- await (0, dispatch_1.dispatchCustomEvent)('composed_nodes', {
199
- role: 'assistant',
200
- type: 'workflow-composed',
201
- nodes: composedNodes,
202
- id: Date.now().toString(),
203
- read: false,
204
- });
205
- return {
206
- workflowJSON: {
207
- nodes: composedNodes,
208
- connections: {},
209
- },
210
- };
211
- };
212
- const connectionComposerChainNode = async (state, config) => {
213
- (0, n8n_workflow_1.assert)(this.llmComplexTask, 'LLM not setup');
214
- const getNodeMessage = (node) => {
215
- return `
216
- <node>
217
- ${JSON.stringify(node)}
218
- </node>
219
- `;
220
- };
221
- const connections = await (0, connection_composer_1.connectionComposerChain)(this.llmComplexTask).invoke({
222
- workflowJSON: state.workflowJSON.nodes.map(getNodeMessage).join('\n\n'),
223
- }, config);
224
- const workflowJSON = {
225
- ...state.workflowJSON,
226
- connections,
227
- };
228
- await (0, dispatch_1.dispatchCustomEvent)('composed_connections', {
229
- role: 'assistant',
230
- type: 'workflow-connections',
231
- workflowJSON,
232
- id: Date.now().toString(),
233
- read: false,
234
- });
235
- return {
236
- workflowJSON,
237
- };
238
- };
239
- async function generateWorkflowJSON(state) {
240
- await (0, dispatch_1.dispatchCustomEvent)('generated_workflow_json', {
241
- role: 'assistant',
242
- type: 'workflow-generated',
243
- codeSnippet: JSON.stringify(state.workflowJSON, null, 4),
244
- });
245
- return { workflowJSON: JSON.stringify(state.workflowJSON, null, 2) };
246
- }
247
- const workflowGraph = new langgraph_1.StateGraph(workflow_state_1.WorkflowState)
248
- .addNode('validator', validatorChainNode)
249
- .addNode('planner', plannerChainNode)
250
- .addNode('node_selector', nodeSelectionChainNode)
251
- .addNode('nodes_composer', nodesComposerChainNode)
252
- .addNode('connection_composer', connectionComposerChainNode)
253
- .addNode('finalize', generateWorkflowJSON);
254
- workflowGraph.addEdge(langgraph_1.START, 'validator');
255
- workflowGraph.addConditionalEdges('validator', (state) => {
256
- return state.isWorkflowPrompt ? 'planner' : langgraph_1.END;
257
- });
258
- workflowGraph.addEdge('planner', 'node_selector');
259
- workflowGraph.addEdge('node_selector', 'nodes_composer');
260
- workflowGraph.addEdge('nodes_composer', 'connection_composer');
261
- workflowGraph.addEdge('connection_composer', 'finalize');
262
- workflowGraph.addEdge('finalize', langgraph_1.END);
263
- return workflowGraph;
264
- }
265
- async *chat(payload, user) {
266
- if (!this.llmComplexTask || !this.llmSimpleTask) {
267
- await this.setupModels(user);
268
- }
269
- const agent = this.getAgent().compile();
270
- const initialState = {
271
- messages: [],
272
- prompt: payload.question,
273
- steps: [],
274
- nodes: [],
275
- workflowJSON: { nodes: [], connections: {} },
276
- isWorkflowPrompt: false,
277
- next: 'PLAN',
278
- };
279
- const stream = agent.streamEvents(initialState, {
280
- streamMode: 'custom',
281
- recursionLimit: 10,
282
- version: 'v2',
283
- });
284
- for await (const chunk of stream) {
285
- let messageChunk;
286
- if (chunk.event === 'on_custom_event') {
287
- if (this.isWorkflowEvent(chunk.name)) {
288
- messageChunk = chunk.data;
289
- }
290
- else {
291
- messageChunk = {
292
- role: 'assistant',
293
- type: 'intermediate-step',
294
- text: chunk.data,
295
- step: chunk.name,
296
- };
297
- }
298
- yield { messages: [messageChunk] };
299
- }
300
- }
301
- }
302
- };
303
- exports.AiWorkflowBuilderService = AiWorkflowBuilderService;
304
- exports.AiWorkflowBuilderService = AiWorkflowBuilderService = __decorate([
305
- (0, di_1.Service)(),
306
- __metadata("design:paramtypes", [Object, Object, config_1.GlobalConfig, String])
307
- ], AiWorkflowBuilderService);
308
- //# sourceMappingURL=ai-workflow-builder.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ai-workflow-builder.service.js","sourceRoot":"","sources":["../src/ai-workflow-builder.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iEAAyE;AAGzE,oDAA8D;AAC9D,wCAA2C;AAC3C,gCAAkC;AAClC,+DAA6D;AAC7D,+CAAoE;AAGpE,sEAAuE;AACvE,0DAA6D;AAC7D,4DAA6D;AAC7D,8CAAgD;AAChD,kDAAoD;AAEpD,6CAAkE;AAElE,qDAAiD;AAG1C,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IASpC,YACkB,cAA+B,EAC/B,SAAqB,EACrB,YAA0B,EAC1B,UAAkB;QAHlB,mBAAc,GAAd,cAAc,CAAiB;QAC/B,cAAS,GAAT,SAAS,CAAY;QACrB,iBAAY,GAAZ,YAAY,CAAc;QAC1B,eAAU,GAAV,UAAU,CAAQ;QAZ5B,oBAAe,GAA2B,EAAE,CAAC;QAcpD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;IAC5C,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,IAAW;QACpC,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/C,OAAO;QACR,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC;QAEtD,IAAI,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAClB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;gBAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC;gBAEvD,IAAI,CAAC,MAAM,GAAG,IAAI,oCAAiB,CAAC;oBACnC,WAAW;oBACX,UAAU;oBACV,OAAO;oBACP,UAAU,EAAE,IAAI,CAAC,UAAU;iBAC3B,CAAC,CAAC;YACJ,CAAC;YAED,IAAA,qBAAM,EAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;YAExC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;YACxE,IAAI,CAAC,aAAa,GAAG,MAAM,IAAA,sBAAS,EAAC;gBACpC,OAAO,EAAE,OAAO,GAAG,sBAAsB;gBAEzC,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE;oBACR,aAAa,EAAE,WAAW,CAAC,MAAM;iBACjC;aACD,CAAC,CAAC;YACH,IAAI,CAAC,cAAc,GAAG,MAAM,IAAA,oCAAuB,EAAC;gBACnD,OAAO,EAAE,OAAO,GAAG,yBAAyB;gBAC5C,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE;oBACR,aAAa,EAAE,WAAW,CAAC,MAAM;iBACjC;aACD,CAAC,CAAC;YACH,OAAO;QACR,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,MAAM,IAAA,sBAAS,EAAC;YACpC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;SAC/C,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,MAAM,IAAA,oCAAuB,EAAC;YACnD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE;SAC9C,CAAC,CAAC;IACJ,CAAC;IAEO,YAAY;QACnB,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;QAElE,MAAM,SAAS,GAAG,aAAa;aAC7B,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YACjB,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACxF,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;QAEjD,OAAO,SAAS,CAAC;IAClB,CAAC;IAEO,eAAe,CAAC,SAAiB;QACxC,OAAO;YACN,mBAAmB;YACnB,iBAAiB;YACjB,iBAAiB;YACjB,gBAAgB;YAChB,sBAAsB;YACtB,yBAAyB;SACzB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAEO,QAAQ;QACf,MAAM,kBAAkB,GAAG,KAAK,EAC/B,KAAiC,EACjC,MAAsB,EACyB,EAAE;YACjD,IAAA,qBAAM,EAAC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;YAE5C,MAAM,gBAAgB,GAAG,MAAM,IAAA,0BAAc,EAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CACvE;gBACC,MAAM,EAAE,KAAK,CAAC,MAAM;aACpB,EACD,MAAM,CACN,CAAC;YAEF,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACvB,MAAM,IAAA,8BAAmB,EAAC,mBAAmB,EAAE;oBAC9C,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,mBAAmB;oBACzB,gBAAgB;oBAChB,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;iBACzB,CAAC,CAAC;YACJ,CAAC;YAED,OAAO;gBACN,gBAAgB;aAChB,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,gBAAgB,GAAG,KAAK,EAC7B,KAAiC,EACjC,MAAsB,EACyB,EAAE;YACjD,IAAA,qBAAM,EAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;YAE7C,MAAM,KAAK,GAAG,MAAM,IAAA,sBAAY,EAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAC3D;gBACC,MAAM,EAAE,KAAK,CAAC,MAAM;aACpB,EACD,MAAM,CACN,CAAC;YAEF,MAAM,IAAA,8BAAmB,EAAC,iBAAiB,EAAE;gBAC5C,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,eAAe;gBACrB,KAAK;gBACL,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACzB,IAAI,EAAE,KAAK;aACX,CAAC,CAAC;YAEH,OAAO;gBACN,KAAK;aACL,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,sBAAsB,GAAG,KAAK,EACnC,KAAiC,EACjC,MAAsB,EACrB,EAAE;YACH,IAAA,qBAAM,EAAC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;YAE5C,MAAM,cAAc,GAAG,CAAC,IAA0B,EAAE,EAAE;gBACrD,OAAO;kBACO,IAAI,CAAC,IAAI;yBACF,IAAI,CAAC,WAAW;KACpC,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvE,MAAM,MAAM,GAAG,MAAM,IAAA,mCAAmB,EAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CAClE;gBACC,YAAY;gBACZ,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;aAC7B,EACD,MAAM,CACN,CAAC;YAEF,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEtD,MAAM,IAAA,8BAAmB,EAAC,iBAAiB,EAAE;gBAC5C,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,eAAe;gBACrB,KAAK;gBACL,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACzB,IAAI,EAAE,KAAK;aACX,CAAC,CAAC;YAEH,OAAO;gBACN,KAAK;aACL,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,sBAAsB,GAAG,KAAK,EACnC,KAAiC,EACjC,MAAsB,EACrB,EAAE;YACH,IAAA,qBAAM,EAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;YAC7C,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAE,EAAE;gBAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;gBACnE,IAAI,CAAC,IAAI,EAAE,CAAC;oBACX,MAAM,IAAI,+BAAgB,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;gBAChE,CAAC;gBAED,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBACzB,OAAO,IAAI,CAAC,cAAc,CAAC;gBAC5B,CAAC;gBAED,OAAO,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;oBACtC,CAAC,CAAC,IAAI,CAAC,OAAO;oBACd,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC1C,CAAC,CAAC;YACF,MAAM,cAAc,GAAG,CAAC,QAAgB,EAAE,EAAE;gBAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;gBACnE,IAAI,CAAC,IAAI,EAAE,CAAC;oBACX,MAAM,IAAI,+BAAgB,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;gBAChE,CAAC;gBACD,OAAO;;QAEH,IAAI,CAAC,IAAI;;;QAGT,IAAI,CAAC,WAAW;;;QAGhB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;;KAElC,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,IAAA,mCAAkB,EAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAClE;gBACC,oBAAoB,EAAE,KAAK,CAAC,MAAM;gBAClC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;aACnD,EACD,MAAM,CACN,CAAC;YAEF,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAChD,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5C,OAAO;oBACN,GAAG,IAAI;oBACP,QAAQ,EAAE,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC,CAAC;oBAC1B,WAAW,EAAE,OAAO;iBACpB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,IAAA,8BAAmB,EAAC,gBAAgB,EAAE;gBAC3C,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,mBAAmB;gBACzB,KAAK,EAAE,aAAa;gBACpB,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACzB,IAAI,EAAE,KAAK;aACX,CAAC,CAAC;YAEH,OAAO;gBACN,YAAY,EAAE;oBACb,KAAK,EAAE,aAAa;oBACpB,WAAW,EAAE,EAAE;iBACf;aACD,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,2BAA2B,GAAG,KAAK,EACxC,KAAiC,EACjC,MAAsB,EACrB,EAAE;YACH,IAAA,qBAAM,EAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;YAE7C,MAAM,cAAc,GAAG,CAAC,IAAW,EAAE,EAAE;gBACtC,OAAO;;QAEH,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;;KAEvB,CAAC;YACH,CAAC,CAAC;YACF,MAAM,WAAW,GAAG,MAAM,IAAA,6CAAuB,EAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAC5E;gBACC,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;aACvE,EACD,MAAM,CACN,CAAC;YACF,MAAM,YAAY,GAAG;gBACpB,GAAG,KAAK,CAAC,YAAY;gBACrB,WAAW;aACX,CAAC;YAEF,MAAM,IAAA,8BAAmB,EAAC,sBAAsB,EAAE;gBACjD,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,sBAAsB;gBAC5B,YAAY;gBACZ,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACzB,IAAI,EAAE,KAAK;aACX,CAAC,CAAC;YAEH,OAAO;gBACN,YAAY;aACZ,CAAC;QACH,CAAC,CAAC;QAIF,KAAK,UAAU,oBAAoB,CAAC,KAAiC;YACpE,MAAM,IAAA,8BAAmB,EAAC,yBAAyB,EAAE;gBACpD,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,oBAAoB;gBAC1B,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;aACxD,CAAC,CAAC;YACH,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QACtE,CAAC;QAGD,MAAM,aAAa,GAAG,IAAI,sBAAU,CAAC,8BAAa,CAAC;aACjD,OAAO,CAAC,WAAW,EAAE,kBAAkB,CAAC;aACxC,OAAO,CAAC,SAAS,EAAE,gBAAgB,CAAC;aACpC,OAAO,CAAC,eAAe,EAAE,sBAAsB,CAAC;aAChD,OAAO,CAAC,gBAAgB,EAAE,sBAAsB,CAAC;aACjD,OAAO,CAAC,qBAAqB,EAAE,2BAA2B,CAAC;aAC3D,OAAO,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;QAI5C,aAAa,CAAC,OAAO,CAAC,iBAAK,EAAE,WAAW,CAAC,CAAC;QAE1C,aAAa,CAAC,mBAAmB,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;YACxD,OAAO,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAG,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QAElD,aAAa,CAAC,OAAO,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;QAEzD,aAAa,CAAC,OAAO,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,CAAC;QAE/D,aAAa,CAAC,OAAO,CAAC,qBAAqB,EAAE,UAAU,CAAC,CAAC;QAEzD,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,eAAG,CAAC,CAAC;QAEvC,OAAO,aAAa,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,CAAC,IAAI,CAAC,OAA6B,EAAE,IAAW;QACrD,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACjD,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC;QAExC,MAAM,YAAY,GAA+B;YAChD,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,OAAO,CAAC,QAAQ;YACxB,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;YACT,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;YAC5C,gBAAgB,EAAE,KAAK;YACvB,IAAI,EAAE,MAAM;SACZ,CAAC;QAEF,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE;YAC/C,UAAU,EAAE,QAAQ;YACpB,cAAc,EAAE,EAAE;YAClB,OAAO,EAAE,IAAI;SACb,CAAC,CAAC;QAEH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAClC,IAAI,YAA6B,CAAC;YAClC,IAAI,KAAK,CAAC,KAAK,KAAK,iBAAiB,EAAE,CAAC;gBACvC,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACtC,YAAY,GAAG,KAAK,CAAC,IAAuB,CAAC;gBAC9C,CAAC;qBAAM,CAAC;oBACP,YAAY,GAAG;wBACd,IAAI,EAAE,WAAW;wBACjB,IAAI,EAAE,mBAAmB;wBACzB,IAAI,EAAE,KAAK,CAAC,IAAc;wBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;qBAChB,CAAC;gBACH,CAAC;gBACD,MAAM,EAAE,QAAQ,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;YACpC,CAAC;QACF,CAAC;IACF,CAAC;CACD,CAAA;AAlXY,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,YAAO,GAAE;qDAauB,qBAAY;GAZhC,wBAAwB,CAkXpC"}
@@ -1,10 +0,0 @@
1
- import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
2
- import { SystemMessage } from '@langchain/core/messages';
3
- export declare const connectionComposerPrompt: SystemMessage;
4
- export declare const connectionComposerChain: (llm: BaseChatModel) => import("@langchain/core/runnables").Runnable<any, Record<string, {
5
- main: {
6
- type: "main";
7
- node: string;
8
- index: number;
9
- }[][];
10
- }>, import("@langchain/core/runnables").RunnableConfig<Record<string, any>>>;
@@ -1,135 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.connectionComposerChain = exports.connectionComposerPrompt = void 0;
4
- const messages_1 = require("@langchain/core/messages");
5
- const prompts_1 = require("@langchain/core/prompts");
6
- const tools_1 = require("@langchain/core/tools");
7
- const n8n_workflow_1 = require("n8n-workflow");
8
- const zod_1 = require("zod");
9
- exports.connectionComposerPrompt = new messages_1.SystemMessage(`You are an expert in creating n8n workflow connections. Your job is to create a valid n8n workflow by connecting nodes in a logical sequence.
10
-
11
- ## Your Task
12
- Create connections between nodes that form a coherent, executable workflow based on the user's request.
13
-
14
- ## Input Format
15
- You will receive a list of n8n nodes with their details in <node> tags:
16
- \`\`\`
17
- <node>
18
- {
19
- "name": "Node display name",
20
- "type": "n8n-nodes-base.nodeType",
21
- "parameters": { ... },
22
- "position": [x, y]
23
- }
24
- </node>
25
- \`\`\`
26
-
27
- ## n8n Connection Structure
28
- In n8n workflows:
29
- 1. Data flows from one node to the next through connections
30
- 2. Connections are defined in the "connections" object
31
- 3. Each node's output can connect to one or more nodes' inputs
32
- 4. Each connection has a source node, target node, and IO indices
33
-
34
- ## Connection Format
35
- \`\`\`json
36
- {
37
- "connections": {
38
- "Source Node Display Name": {
39
- "main": [
40
- [
41
- {
42
- "node": "Target Node Display Name",
43
- "type": "main",
44
- "index": 0
45
- }
46
- ]
47
- ]
48
- }
49
- }
50
- }
51
- \`\`\`
52
-
53
- ## Rules for Creating Connections
54
- 1. ALWAYS use the node "name" field (display name) for the connection references
55
- 2. Create a logical flow from trigger/input nodes to output/action nodes
56
- 3. Each node MUST connect to at least one other node (except terminal nodes)
57
- 4. Don't create loops or cycles in the workflow
58
- 5. Ensure the output data from one node is compatible with the input expected by the next node
59
- 6. For nodes with multiple outputs (like IF nodes), connect each output appropriately:
60
- - For IF nodes, first output (index 0) is the TRUE branch, second output (index 1) is the FALSE branch
61
- - For Switch nodes, each output (starting at index 0) corresponds to a different case
62
-
63
- ## Common Workflow Patterns
64
- 1. Trigger → Process → Action
65
- 2. Data Source → Filter/Transform → Destination
66
- 3. Scheduled Trigger → HTTP Request → Process Response → Send Notification
67
- 4. Conditional Branch: Previous Node → IF Node → [True Branch, False Branch]
68
-
69
- ## Output
70
- Return ONLY a valid JSON object with the "connections" property following the structure above:
71
- \`\`\`json
72
- {
73
- "connections": {
74
- "NodeName1": {
75
- "main": [[{ "node": "NodeName2", "type": "main", "index": 0 }]]
76
- },
77
- "NodeName2": {
78
- "main": [
79
- [{ "node": "TrueBranchNode", "type": "main", "index": 0 }],
80
- [{ "node": "FalseBranchNode", "type": "main", "index": 0 }]
81
- ]
82
- },
83
- ...
84
- }
85
- }
86
- \`\`\``);
87
- const connectionsSchema = zod_1.z.object({
88
- connections: zod_1.z
89
- .record(zod_1.z
90
- .string()
91
- .describe('The source node\'s display name exactly as specified in the node\'s "name" field'), zod_1.z
92
- .object({
93
- main: zod_1.z.array(zod_1.z.array(zod_1.z.object({
94
- node: zod_1.z
95
- .string()
96
- .describe('The target node\'s display name exactly as specified in the node\'s "name" field'),
97
- type: zod_1.z
98
- .literal('main')
99
- .describe('The connection type, always use "main" for standard n8n connections'),
100
- index: zod_1.z
101
- .number()
102
- .describe('Output index from the source node, typically 0 for single-output nodes, 0=true/1=false for IF nodes'),
103
- }))),
104
- })
105
- .describe('The connection configuration for a single source node'))
106
- .describe('A mapping of all connections in the workflow, where each key is a source node name'),
107
- });
108
- const connectionComposerTool = new tools_1.DynamicStructuredTool({
109
- name: 'compose_connections',
110
- description: "Create valid connections between n8n nodes to form a coherent, executable workflow that implements the user's request.",
111
- schema: connectionsSchema,
112
- func: async (input) => {
113
- return { connections: input.connections };
114
- },
115
- });
116
- const humanTemplate = '{workflowJSON}';
117
- const chatPrompt = prompts_1.ChatPromptTemplate.fromMessages([
118
- exports.connectionComposerPrompt,
119
- prompts_1.HumanMessagePromptTemplate.fromTemplate(humanTemplate),
120
- ]);
121
- const connectionComposerChain = (llm) => {
122
- if (!llm.bindTools) {
123
- throw new n8n_workflow_1.OperationalError("LLM doesn't support binding tools");
124
- }
125
- return chatPrompt
126
- .pipe(llm.bindTools([connectionComposerTool], {
127
- tool_choice: connectionComposerTool.name,
128
- }))
129
- .pipe((x) => {
130
- const toolCall = x.tool_calls?.[0];
131
- return (toolCall?.args).connections;
132
- });
133
- };
134
- exports.connectionComposerChain = connectionComposerChain;
135
- //# sourceMappingURL=connection-composer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"connection-composer.js","sourceRoot":"","sources":["../../src/chains/connection-composer.ts"],"names":[],"mappings":";;;AAEA,uDAAyD;AACzD,qDAAyF;AACzF,iDAA8D;AAC9D,+CAAgD;AAChD,6BAAwB;AAEX,QAAA,wBAAwB,GAAG,IAAI,wBAAa,CACxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6EM,CACN,CAAC;AAEF,MAAM,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;IAClC,WAAW,EAAE,OAAC;SACZ,MAAM,CACN,OAAC;SACC,MAAM,EAAE;SACR,QAAQ,CACR,kFAAkF,CAClF,EACF,OAAC;SACC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,KAAK,CACZ,OAAC,CAAC,KAAK,CACN,OAAC,CAAC,MAAM,CAAC;YACR,IAAI,EAAE,OAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,CACR,kFAAkF,CAClF;YACF,IAAI,EAAE,OAAC;iBACL,OAAO,CAAC,MAAM,CAAC;iBACf,QAAQ,CAAC,qEAAqE,CAAC;YACjF,KAAK,EAAE,OAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,CACR,qGAAqG,CACrG;SACF,CAAC,CACF,CACD;KACD,CAAC;SACD,QAAQ,CAAC,uDAAuD,CAAC,CACnE;SACA,QAAQ,CAAC,oFAAoF,CAAC;CAChG,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG,IAAI,6BAAqB,CAAC;IACxD,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EACV,wHAAwH;IACzH,MAAM,EAAE,iBAAiB;IACzB,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACrB,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;IAC3C,CAAC;CACD,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,gBAAgB,CAAC;AACvC,MAAM,UAAU,GAAG,4BAAkB,CAAC,YAAY,CAAC;IAClD,gCAAwB;IACxB,oCAA0B,CAAC,YAAY,CAAC,aAAa,CAAC;CACtD,CAAC,CAAC;AAEI,MAAM,uBAAuB,GAAG,CAAC,GAAkB,EAAE,EAAE;IAC7D,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACpB,MAAM,IAAI,+BAAgB,CAAC,mCAAmC,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,UAAU;SACf,IAAI,CACJ,GAAG,CAAC,SAAS,CAAC,CAAC,sBAAsB,CAAC,EAAE;QACvC,WAAW,EAAE,sBAAsB,CAAC,IAAI;KACxC,CAAC,CACF;SACA,IAAI,CAAC,CAAC,CAAiB,EAAE,EAAE;QAC3B,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,QAAQ,EAAE,IAA0C,CAAA,CAAC,WAAW,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAfW,QAAA,uBAAuB,2BAelC"}
@@ -1,8 +0,0 @@
1
- import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
2
- import { SystemMessage } from '@langchain/core/messages';
3
- export declare const nodeSelectorPrompt: SystemMessage;
4
- export declare const nodesSelectionChain: (llm: BaseChatModel) => import("@langchain/core/runnables").Runnable<any, {
5
- node: string;
6
- score: number;
7
- reasoning: string;
8
- }[], import("@langchain/core/runnables").RunnableConfig<Record<string, any>>>;