@atom8n/n8n-nodes-langchain 2.5.4 → 2.5.6

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.
@@ -0,0 +1,363 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var LmChatCursorAgent_node_exports = {};
20
+ __export(LmChatCursorAgent_node_exports, {
21
+ LmChatCursorAgent: () => LmChatCursorAgent
22
+ });
23
+ module.exports = __toCommonJS(LmChatCursorAgent_node_exports);
24
+ var import_chat_models = require("@langchain/core/language_models/chat_models");
25
+ var import_messages = require("@langchain/core/messages");
26
+ var import_n8n_workflow = require("n8n-workflow");
27
+ var import_sharedFields = require("../../../utils/sharedFields");
28
+ var import_N8nLlmTracing = require("../N8nLlmTracing");
29
+ var import_child_process = require("child_process");
30
+ const TOOL_CALL_SYSTEM_PROMPT = `You have access to the following tools. When you need to call a tool, respond ONLY with a JSON block in this exact format (no other text before or after):
31
+
32
+ \`\`\`tool_calls
33
+ [{"id": "call_1", "name": "tool_name", "args": {"param": "value"}}]
34
+ \`\`\`
35
+
36
+ When you do NOT need to call a tool, respond normally with text. Never mix tool calls and text in the same response.
37
+
38
+ Available tools:
39
+ `;
40
+ class ChatCursorAgentCLI extends import_chat_models.BaseChatModel {
41
+ constructor(fields) {
42
+ super({});
43
+ this.boundTools = [];
44
+ this.model = fields.model;
45
+ this.binaryPath = fields.binaryPath;
46
+ this.workingDirectory = fields.workingDirectory;
47
+ }
48
+ _llmType() {
49
+ return "cursor-agent-cli";
50
+ }
51
+ bindTools(tools, kwargs) {
52
+ const clone = new ChatCursorAgentCLI({
53
+ model: this.model,
54
+ binaryPath: this.binaryPath,
55
+ workingDirectory: this.workingDirectory
56
+ });
57
+ clone.boundTools = tools;
58
+ clone.callbacks = this.callbacks;
59
+ if (kwargs) {
60
+ return clone.bind(kwargs);
61
+ }
62
+ return clone;
63
+ }
64
+ async _generate(messages, _options, _runManager) {
65
+ const processedMessages = [...messages];
66
+ if (this.boundTools.length > 0) {
67
+ const toolDescriptions = this.boundTools.map((tool) => {
68
+ const t = tool;
69
+ const name = t.name ?? "";
70
+ const description = t.description ?? "";
71
+ const schema = t.parameters ?? t.schema ?? {};
72
+ return `- ${name}: ${description}
73
+ Parameters: ${JSON.stringify(schema)}`;
74
+ }).join("\n\n");
75
+ const systemPrompt = TOOL_CALL_SYSTEM_PROMPT + toolDescriptions;
76
+ processedMessages.unshift(new import_messages.SystemMessage(systemPrompt));
77
+ }
78
+ const prompt = processedMessages.map((m) => {
79
+ const content = typeof m.content === "string" ? m.content : JSON.stringify(m.content);
80
+ if (m instanceof import_messages.SystemMessage) return `[system]: ${content}`;
81
+ if (m instanceof import_messages.HumanMessage) return `[user]: ${content}`;
82
+ if (m instanceof import_messages.AIMessage) return `[assistant]: ${content}`;
83
+ return `[${m._getType()}]: ${content}`;
84
+ }).join("\n\n");
85
+ const rawResponse = await this.executeCursorAgent(prompt);
86
+ if (this.boundTools.length > 0) {
87
+ const toolCalls = this.extractToolCalls(rawResponse);
88
+ if (toolCalls.length > 0) {
89
+ const aiMessage2 = new import_messages.AIMessage({
90
+ content: "",
91
+ tool_calls: toolCalls.map((tc) => ({
92
+ id: tc.id,
93
+ name: tc.name,
94
+ args: tc.args,
95
+ type: "tool_call"
96
+ }))
97
+ });
98
+ return {
99
+ generations: [{ message: aiMessage2, text: "" }]
100
+ };
101
+ }
102
+ }
103
+ const aiMessage = new import_messages.AIMessage({ content: rawResponse });
104
+ return {
105
+ generations: [{ message: aiMessage, text: rawResponse }]
106
+ };
107
+ }
108
+ extractToolCalls(text) {
109
+ const toolCallRegex = /```tool_calls\s*\n([\s\S]*?)\n```/;
110
+ const match = toolCallRegex.exec(text);
111
+ if (!match) return [];
112
+ try {
113
+ const parsed = JSON.parse(match[1]);
114
+ if (!Array.isArray(parsed)) return [];
115
+ return parsed.map((tc, i) => ({
116
+ id: tc.id ?? `call_${i}`,
117
+ name: tc.name,
118
+ args: tc.args ?? {}
119
+ }));
120
+ } catch {
121
+ return [];
122
+ }
123
+ }
124
+ async executeCursorAgent(prompt) {
125
+ const args = ["-p", "--output-format=stream-json", "--trust"];
126
+ if (this.model && this.model !== "auto") {
127
+ args.push("--model", this.model);
128
+ }
129
+ return await new Promise((resolve, reject) => {
130
+ const child = (0, import_child_process.spawn)(this.binaryPath, args, {
131
+ cwd: this.workingDirectory || void 0,
132
+ stdio: ["pipe", "pipe", "pipe"],
133
+ env: { ...process.env }
134
+ });
135
+ let stdout = "";
136
+ let stderr = "";
137
+ child.stdout.on("data", (data) => {
138
+ stdout += data.toString();
139
+ });
140
+ child.stderr.on("data", (data) => {
141
+ stderr += data.toString();
142
+ });
143
+ child.on("error", (err) => {
144
+ reject(
145
+ new Error(
146
+ `Failed to spawn cursor-agent: ${err.message}. Make sure cursor-agent CLI is installed and accessible.`
147
+ )
148
+ );
149
+ });
150
+ child.on("close", (code) => {
151
+ if (code !== 0 && !stdout) {
152
+ const errorMsg = stderr.trim() || `cursor-agent exited with code ${code}`;
153
+ reject(new Error(errorMsg));
154
+ return;
155
+ }
156
+ const assistantContent = this.parseStreamJsonOutput(stdout);
157
+ if (!assistantContent) {
158
+ reject(new Error("No assistant response received from cursor-agent"));
159
+ return;
160
+ }
161
+ resolve(assistantContent);
162
+ });
163
+ if (child.stdin) {
164
+ child.stdin.write(prompt);
165
+ child.stdin.end();
166
+ }
167
+ });
168
+ }
169
+ parseStreamJsonOutput(output) {
170
+ const lines = output.split("\n").filter((line) => line.trim());
171
+ const assistantParts = [];
172
+ for (const line of lines) {
173
+ try {
174
+ const parsed = JSON.parse(line);
175
+ if (parsed.type === "assistant" && parsed.message?.content) {
176
+ for (const item of parsed.message.content) {
177
+ if (item.type === "text" && item.text) {
178
+ assistantParts.push(item.text);
179
+ }
180
+ }
181
+ }
182
+ } catch {
183
+ }
184
+ }
185
+ return assistantParts.join("");
186
+ }
187
+ }
188
+ class LmChatCursorAgent {
189
+ constructor() {
190
+ this.description = {
191
+ displayName: "Cursor Agent CLI Chat Model",
192
+ name: "lmChatCursorAgent",
193
+ icon: "file:cursorAgent.svg",
194
+ group: ["transform"],
195
+ version: [1],
196
+ description: "Chat model powered by the Cursor Agent CLI. Requires cursor-agent to be installed locally.",
197
+ defaults: {
198
+ name: "Cursor Agent CLI Chat Model"
199
+ },
200
+ codex: {
201
+ categories: ["AI"],
202
+ subcategories: {
203
+ AI: ["Language Models", "Root Nodes"],
204
+ "Language Models": ["Chat Models (Recommended)"]
205
+ },
206
+ resources: {}
207
+ },
208
+ inputs: [],
209
+ outputs: [import_n8n_workflow.NodeConnectionTypes.AiLanguageModel],
210
+ outputNames: ["Model"],
211
+ properties: [
212
+ (0, import_sharedFields.getConnectionHintNoticeField)([import_n8n_workflow.NodeConnectionTypes.AiChain, import_n8n_workflow.NodeConnectionTypes.AiAgent]),
213
+ {
214
+ displayName: "Model",
215
+ name: "model",
216
+ type: "options",
217
+ description: "The model to use via cursor-agent CLI.",
218
+ // eslint-disable-next-line n8n-nodes-base/node-param-options-type-unsorted-items
219
+ options: [
220
+ { name: "Auto", value: "auto" },
221
+ // Composer models
222
+ { name: "Composer 2 Fast", value: "composer-2-fast" },
223
+ { name: "Composer 2", value: "composer-2" },
224
+ { name: "Composer 1.5", value: "composer-1.5" },
225
+ // Claude 4.6 models
226
+ { name: "Claude 4.6 Opus High", value: "claude-4.6-opus-high" },
227
+ { name: "Claude 4.6 Opus High Thinking", value: "claude-4.6-opus-high-thinking" },
228
+ { name: "Claude 4.6 Opus Max", value: "claude-4.6-opus-max" },
229
+ { name: "Claude 4.6 Opus Max Thinking", value: "claude-4.6-opus-max-thinking" },
230
+ { name: "Claude 4.6 Sonnet Medium", value: "claude-4.6-sonnet-medium" },
231
+ { name: "Claude 4.6 Sonnet Medium Thinking", value: "claude-4.6-sonnet-medium-thinking" },
232
+ // Claude 4.5 models
233
+ { name: "Claude 4.5 Opus High", value: "claude-4.5-opus-high" },
234
+ { name: "Claude 4.5 Opus High Thinking", value: "claude-4.5-opus-high-thinking" },
235
+ { name: "Claude 4.5 Sonnet", value: "claude-4.5-sonnet" },
236
+ { name: "Claude 4.5 Sonnet Thinking", value: "claude-4.5-sonnet-thinking" },
237
+ // Claude 4 models
238
+ { name: "Claude 4 Sonnet", value: "claude-4-sonnet" },
239
+ { name: "Claude 4 Sonnet 1M", value: "claude-4-sonnet-1m" },
240
+ { name: "Claude 4 Sonnet Thinking", value: "claude-4-sonnet-thinking" },
241
+ { name: "Claude 4 Sonnet 1M Thinking", value: "claude-4-sonnet-1m-thinking" },
242
+ // Gemini models
243
+ { name: "Gemini 3.1 Pro", value: "gemini-3.1-pro" },
244
+ { name: "Gemini 3 Flash", value: "gemini-3-flash" },
245
+ // GPT-5.4 models
246
+ { name: "GPT-5.4 Low", value: "gpt-5.4-low" },
247
+ { name: "GPT-5.4 Medium", value: "gpt-5.4-medium" },
248
+ { name: "GPT-5.4 Medium Fast", value: "gpt-5.4-medium-fast" },
249
+ { name: "GPT-5.4 High", value: "gpt-5.4-high" },
250
+ { name: "GPT-5.4 High Fast", value: "gpt-5.4-high-fast" },
251
+ { name: "GPT-5.4 XHigh", value: "gpt-5.4-xhigh" },
252
+ { name: "GPT-5.4 XHigh Fast", value: "gpt-5.4-xhigh-fast" },
253
+ { name: "GPT-5.4 Mini None", value: "gpt-5.4-mini-none" },
254
+ { name: "GPT-5.4 Mini Low", value: "gpt-5.4-mini-low" },
255
+ { name: "GPT-5.4 Mini Medium", value: "gpt-5.4-mini-medium" },
256
+ { name: "GPT-5.4 Mini High", value: "gpt-5.4-mini-high" },
257
+ { name: "GPT-5.4 Mini XHigh", value: "gpt-5.4-mini-xhigh" },
258
+ { name: "GPT-5.4 Nano None", value: "gpt-5.4-nano-none" },
259
+ { name: "GPT-5.4 Nano Low", value: "gpt-5.4-nano-low" },
260
+ { name: "GPT-5.4 Nano Medium", value: "gpt-5.4-nano-medium" },
261
+ { name: "GPT-5.4 Nano High", value: "gpt-5.4-nano-high" },
262
+ { name: "GPT-5.4 Nano XHigh", value: "gpt-5.4-nano-xhigh" },
263
+ // GPT-5.3 Codex models
264
+ { name: "GPT-5.3 Codex Low", value: "gpt-5.3-codex-low" },
265
+ { name: "GPT-5.3 Codex Low Fast", value: "gpt-5.3-codex-low-fast" },
266
+ { name: "GPT-5.3 Codex", value: "gpt-5.3-codex" },
267
+ { name: "GPT-5.3 Codex Fast", value: "gpt-5.3-codex-fast" },
268
+ { name: "GPT-5.3 Codex High", value: "gpt-5.3-codex-high" },
269
+ { name: "GPT-5.3 Codex High Fast", value: "gpt-5.3-codex-high-fast" },
270
+ { name: "GPT-5.3 Codex XHigh", value: "gpt-5.3-codex-xhigh" },
271
+ { name: "GPT-5.3 Codex XHigh Fast", value: "gpt-5.3-codex-xhigh-fast" },
272
+ { name: "GPT-5.3 Codex Spark Preview Low", value: "gpt-5.3-codex-spark-preview-low" },
273
+ { name: "GPT-5.3 Codex Spark Preview", value: "gpt-5.3-codex-spark-preview" },
274
+ { name: "GPT-5.3 Codex Spark Preview High", value: "gpt-5.3-codex-spark-preview-high" },
275
+ { name: "GPT-5.3 Codex Spark Preview XHigh", value: "gpt-5.3-codex-spark-preview-xhigh" },
276
+ // GPT-5.2 models
277
+ { name: "GPT-5.2 Low", value: "gpt-5.2-low" },
278
+ { name: "GPT-5.2 Low Fast", value: "gpt-5.2-low-fast" },
279
+ { name: "GPT-5.2", value: "gpt-5.2" },
280
+ { name: "GPT-5.2 Fast", value: "gpt-5.2-fast" },
281
+ { name: "GPT-5.2 High", value: "gpt-5.2-high" },
282
+ { name: "GPT-5.2 High Fast", value: "gpt-5.2-high-fast" },
283
+ { name: "GPT-5.2 XHigh", value: "gpt-5.2-xhigh" },
284
+ { name: "GPT-5.2 XHigh Fast", value: "gpt-5.2-xhigh-fast" },
285
+ { name: "GPT-5.2 Codex Low", value: "gpt-5.2-codex-low" },
286
+ { name: "GPT-5.2 Codex Low Fast", value: "gpt-5.2-codex-low-fast" },
287
+ { name: "GPT-5.2 Codex", value: "gpt-5.2-codex" },
288
+ { name: "GPT-5.2 Codex Fast", value: "gpt-5.2-codex-fast" },
289
+ { name: "GPT-5.2 Codex High", value: "gpt-5.2-codex-high" },
290
+ { name: "GPT-5.2 Codex High Fast", value: "gpt-5.2-codex-high-fast" },
291
+ { name: "GPT-5.2 Codex XHigh", value: "gpt-5.2-codex-xhigh" },
292
+ { name: "GPT-5.2 Codex XHigh Fast", value: "gpt-5.2-codex-xhigh-fast" },
293
+ // GPT-5.1 models
294
+ { name: "GPT-5.1 Low", value: "gpt-5.1-low" },
295
+ { name: "GPT-5.1", value: "gpt-5.1" },
296
+ { name: "GPT-5.1 High", value: "gpt-5.1-high" },
297
+ { name: "GPT-5.1 Codex Max Low", value: "gpt-5.1-codex-max-low" },
298
+ { name: "GPT-5.1 Codex Max Low Fast", value: "gpt-5.1-codex-max-low-fast" },
299
+ { name: "GPT-5.1 Codex Max Medium", value: "gpt-5.1-codex-max-medium" },
300
+ { name: "GPT-5.1 Codex Max Medium Fast", value: "gpt-5.1-codex-max-medium-fast" },
301
+ { name: "GPT-5.1 Codex Max High", value: "gpt-5.1-codex-max-high" },
302
+ { name: "GPT-5.1 Codex Max High Fast", value: "gpt-5.1-codex-max-high-fast" },
303
+ { name: "GPT-5.1 Codex Max XHigh", value: "gpt-5.1-codex-max-xhigh" },
304
+ { name: "GPT-5.1 Codex Max XHigh Fast", value: "gpt-5.1-codex-max-xhigh-fast" },
305
+ { name: "GPT-5.1 Codex Mini Low", value: "gpt-5.1-codex-mini-low" },
306
+ { name: "GPT-5.1 Codex Mini", value: "gpt-5.1-codex-mini" },
307
+ { name: "GPT-5.1 Codex Mini High", value: "gpt-5.1-codex-mini-high" },
308
+ // GPT-5 models
309
+ { name: "GPT-5 Mini", value: "gpt-5-mini" },
310
+ // Grok models
311
+ { name: "Grok 4 20", value: "grok-4-20" },
312
+ { name: "Grok 4 20 Thinking", value: "grok-4-20-thinking" },
313
+ // Kimi models
314
+ { name: "Kimi K2.5", value: "kimi-k2.5" }
315
+ ],
316
+ default: "auto"
317
+ },
318
+ {
319
+ displayName: "Options",
320
+ name: "options",
321
+ placeholder: "Add Option",
322
+ description: "Additional options to configure",
323
+ type: "collection",
324
+ default: {},
325
+ options: [
326
+ {
327
+ displayName: "Binary Path",
328
+ name: "binaryPath",
329
+ default: "cursor-agent",
330
+ description: 'Path to the cursor-agent binary. Defaults to "cursor-agent" (must be in PATH).',
331
+ type: "string"
332
+ },
333
+ {
334
+ displayName: "Working Directory",
335
+ name: "workingDirectory",
336
+ default: "",
337
+ description: "Working directory for the cursor-agent process. Leave empty to use the default.",
338
+ type: "string"
339
+ }
340
+ ]
341
+ }
342
+ ]
343
+ };
344
+ }
345
+ async supplyData(itemIndex) {
346
+ const modelName = this.getNodeParameter("model", itemIndex);
347
+ const options = this.getNodeParameter("options", itemIndex, {});
348
+ const model = new ChatCursorAgentCLI({
349
+ model: modelName,
350
+ binaryPath: options.binaryPath ?? "cursor-agent",
351
+ workingDirectory: options.workingDirectory ?? ""
352
+ });
353
+ model.callbacks = [new import_N8nLlmTracing.N8nLlmTracing(this)];
354
+ return {
355
+ response: model
356
+ };
357
+ }
358
+ }
359
+ // Annotate the CommonJS export names for ESM import in node:
360
+ 0 && (module.exports = {
361
+ LmChatCursorAgent
362
+ });
363
+ //# sourceMappingURL=LmChatCursorAgent.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../nodes/llms/LmChatCursorAgent/LmChatCursorAgent.node.ts"],"sourcesContent":["import { BaseChatModel } from '@langchain/core/language_models/chat_models';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport { AIMessage, HumanMessage, SystemMessage } from '@langchain/core/messages';\nimport type { ChatResult } from '@langchain/core/outputs';\nimport type { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';\nimport type { BindToolsInput } from '@langchain/core/language_models/chat_models';\nimport {\n\tNodeConnectionTypes,\n\ttype INodeType,\n\ttype INodeTypeDescription,\n\ttype ISupplyDataFunctions,\n\ttype SupplyData,\n} from 'n8n-workflow';\n\nimport { getConnectionHintNoticeField } from '@utils/sharedFields';\n\nimport { N8nLlmTracing } from '../N8nLlmTracing';\nimport { spawn } from 'child_process';\n\ninterface CursorAgentFields {\n\tmodel: string;\n\tbinaryPath: string;\n\tworkingDirectory: string;\n}\n\ninterface ParsedToolCall {\n\tid: string;\n\tname: string;\n\targs: Record<string, unknown>;\n}\n\nconst TOOL_CALL_SYSTEM_PROMPT = `You have access to the following tools. When you need to call a tool, respond ONLY with a JSON block in this exact format (no other text before or after):\n\n\\`\\`\\`tool_calls\n[{\"id\": \"call_1\", \"name\": \"tool_name\", \"args\": {\"param\": \"value\"}}]\n\\`\\`\\`\n\nWhen you do NOT need to call a tool, respond normally with text. Never mix tool calls and text in the same response.\n\nAvailable tools:\n`;\n\n/**\n * Custom LangChain chat model that wraps the cursor-agent CLI binary.\n * Supports tool calling by injecting tool schemas into the prompt\n * and parsing structured JSON responses for tool calls.\n */\nclass ChatCursorAgentCLI extends BaseChatModel {\n\tmodel: string;\n\n\tbinaryPath: string;\n\n\tworkingDirectory: string;\n\n\tboundTools: BindToolsInput[] = [];\n\n\tconstructor(fields: CursorAgentFields) {\n\t\tsuper({});\n\t\tthis.model = fields.model;\n\t\tthis.binaryPath = fields.binaryPath;\n\t\tthis.workingDirectory = fields.workingDirectory;\n\t}\n\n\t_llmType(): string {\n\t\treturn 'cursor-agent-cli';\n\t}\n\n\toverride bindTools(tools: BindToolsInput[], kwargs?: Partial<this['ParsedCallOptions']>) {\n\t\tconst clone = new ChatCursorAgentCLI({\n\t\t\tmodel: this.model,\n\t\t\tbinaryPath: this.binaryPath,\n\t\t\tworkingDirectory: this.workingDirectory,\n\t\t});\n\t\tclone.boundTools = tools;\n\t\tclone.callbacks = this.callbacks;\n\t\tif (kwargs) {\n\t\t\treturn clone.bind(kwargs);\n\t\t}\n\t\treturn clone;\n\t}\n\n\tasync _generate(\n\t\tmessages: BaseMessage[],\n\t\t_options: this['ParsedCallOptions'],\n\t\t_runManager?: CallbackManagerForLLMRun,\n\t): Promise<ChatResult> {\n\t\t// If tools are bound, inject tool schemas into a system message\n\t\tconst processedMessages = [...messages];\n\t\tif (this.boundTools.length > 0) {\n\t\t\tconst toolDescriptions = this.boundTools\n\t\t\t\t.map((tool) => {\n\t\t\t\t\tconst t = tool as Record<string, unknown>;\n\t\t\t\t\tconst name = (t.name as string) ?? '';\n\t\t\t\t\tconst description = (t.description as string) ?? '';\n\t\t\t\t\tconst schema = t.parameters ?? t.schema ?? {};\n\t\t\t\t\treturn `- ${name}: ${description}\\n Parameters: ${JSON.stringify(schema)}`;\n\t\t\t\t})\n\t\t\t\t.join('\\n\\n');\n\n\t\t\tconst systemPrompt = TOOL_CALL_SYSTEM_PROMPT + toolDescriptions;\n\t\t\tprocessedMessages.unshift(new SystemMessage(systemPrompt));\n\t\t}\n\n\t\t// Build prompt from messages\n\t\tconst prompt = processedMessages\n\t\t\t.map((m) => {\n\t\t\t\tconst content = typeof m.content === 'string' ? m.content : JSON.stringify(m.content);\n\t\t\t\tif (m instanceof SystemMessage) return `[system]: ${content}`;\n\t\t\t\tif (m instanceof HumanMessage) return `[user]: ${content}`;\n\t\t\t\tif (m instanceof AIMessage) return `[assistant]: ${content}`;\n\t\t\t\treturn `[${m._getType()}]: ${content}`;\n\t\t\t})\n\t\t\t.join('\\n\\n');\n\n\t\t// Execute cursor-agent CLI\n\t\tconst rawResponse = await this.executeCursorAgent(prompt);\n\n\t\t// Check for tool calls in response\n\t\tif (this.boundTools.length > 0) {\n\t\t\tconst toolCalls = this.extractToolCalls(rawResponse);\n\t\t\tif (toolCalls.length > 0) {\n\t\t\t\tconst aiMessage = new AIMessage({\n\t\t\t\t\tcontent: '',\n\t\t\t\t\ttool_calls: toolCalls.map((tc) => ({\n\t\t\t\t\t\tid: tc.id,\n\t\t\t\t\t\tname: tc.name,\n\t\t\t\t\t\targs: tc.args,\n\t\t\t\t\t\ttype: 'tool_call' as const,\n\t\t\t\t\t})),\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\tgenerations: [{ message: aiMessage, text: '' }],\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// Normal text response\n\t\tconst aiMessage = new AIMessage({ content: rawResponse });\n\t\treturn {\n\t\t\tgenerations: [{ message: aiMessage, text: rawResponse }],\n\t\t};\n\t}\n\n\tprivate extractToolCalls(text: string): ParsedToolCall[] {\n\t\t// Look for tool_calls JSON block\n\t\tconst toolCallRegex = /```tool_calls\\s*\\n([\\s\\S]*?)\\n```/;\n\t\tconst match = toolCallRegex.exec(text);\n\t\tif (!match) return [];\n\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(match[1]) as Array<{\n\t\t\t\tid?: string;\n\t\t\t\tname: string;\n\t\t\t\targs: Record<string, unknown>;\n\t\t\t}>;\n\t\t\tif (!Array.isArray(parsed)) return [];\n\n\t\t\treturn parsed.map((tc, i) => ({\n\t\t\t\tid: tc.id ?? `call_${i}`,\n\t\t\t\tname: tc.name,\n\t\t\t\targs: tc.args ?? {},\n\t\t\t}));\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tprivate async executeCursorAgent(prompt: string): Promise<string> {\n\t\tconst args = ['-p', '--output-format=stream-json', '--trust'];\n\t\tif (this.model && this.model !== 'auto') {\n\t\t\targs.push('--model', this.model);\n\t\t}\n\n\t\treturn await new Promise<string>((resolve, reject) => {\n\t\t\tconst child = spawn(this.binaryPath, args, {\n\t\t\t\tcwd: this.workingDirectory || undefined,\n\t\t\t\tstdio: ['pipe', 'pipe', 'pipe'],\n\t\t\t\tenv: { ...process.env },\n\t\t\t});\n\n\t\t\tlet stdout = '';\n\t\t\tlet stderr = '';\n\n\t\t\tchild.stdout.on('data', (data: Buffer) => {\n\t\t\t\tstdout += data.toString();\n\t\t\t});\n\n\t\t\tchild.stderr.on('data', (data: Buffer) => {\n\t\t\t\tstderr += data.toString();\n\t\t\t});\n\n\t\t\tchild.on('error', (err: Error) => {\n\t\t\t\treject(\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\t`Failed to spawn cursor-agent: ${err.message}. Make sure cursor-agent CLI is installed and accessible.`,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tchild.on('close', (code: number | null) => {\n\t\t\t\tif (code !== 0 && !stdout) {\n\t\t\t\t\tconst errorMsg = stderr.trim() || `cursor-agent exited with code ${code}`;\n\t\t\t\t\treject(new Error(errorMsg));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst assistantContent = this.parseStreamJsonOutput(stdout);\n\n\t\t\t\tif (!assistantContent) {\n\t\t\t\t\treject(new Error('No assistant response received from cursor-agent'));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tresolve(assistantContent);\n\t\t\t});\n\n\t\t\tif (child.stdin) {\n\t\t\t\tchild.stdin.write(prompt);\n\t\t\t\tchild.stdin.end();\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate parseStreamJsonOutput(output: string): string {\n\t\tconst lines = output.split('\\n').filter((line) => line.trim());\n\t\tconst assistantParts: string[] = [];\n\n\t\tfor (const line of lines) {\n\t\t\ttry {\n\t\t\t\tconst parsed = JSON.parse(line) as {\n\t\t\t\t\ttype?: string;\n\t\t\t\t\tmessage?: {\n\t\t\t\t\t\tcontent?: Array<{ type?: string; text?: string }>;\n\t\t\t\t\t};\n\t\t\t\t\ttext?: string;\n\t\t\t\t};\n\n\t\t\t\tif (parsed.type === 'assistant' && parsed.message?.content) {\n\t\t\t\t\tfor (const item of parsed.message.content) {\n\t\t\t\t\t\tif (item.type === 'text' && item.text) {\n\t\t\t\t\t\t\tassistantParts.push(item.text);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Skip non-JSON lines\n\t\t\t}\n\t\t}\n\n\t\treturn assistantParts.join('');\n\t}\n}\n\nexport class LmChatCursorAgent implements INodeType {\n\tdescription: INodeTypeDescription = {\n\t\tdisplayName: 'Cursor Agent CLI Chat Model',\n\n\t\tname: 'lmChatCursorAgent',\n\t\ticon: 'file:cursorAgent.svg',\n\t\tgroup: ['transform'],\n\t\tversion: [1],\n\t\tdescription:\n\t\t\t'Chat model powered by the Cursor Agent CLI. Requires cursor-agent to be installed locally.',\n\t\tdefaults: {\n\t\t\tname: 'Cursor Agent CLI Chat Model',\n\t\t},\n\t\tcodex: {\n\t\t\tcategories: ['AI'],\n\t\t\tsubcategories: {\n\t\t\t\tAI: ['Language Models', 'Root Nodes'],\n\t\t\t\t'Language Models': ['Chat Models (Recommended)'],\n\t\t\t},\n\t\t\tresources: {},\n\t\t},\n\n\t\tinputs: [],\n\n\t\toutputs: [NodeConnectionTypes.AiLanguageModel],\n\t\toutputNames: ['Model'],\n\t\tproperties: [\n\t\t\tgetConnectionHintNoticeField([NodeConnectionTypes.AiChain, NodeConnectionTypes.AiAgent]),\n\t\t\t{\n\t\t\t\tdisplayName: 'Model',\n\t\t\t\tname: 'model',\n\t\t\t\ttype: 'options',\n\t\t\t\tdescription: 'The model to use via cursor-agent CLI.',\n\t\t\t\t// eslint-disable-next-line n8n-nodes-base/node-param-options-type-unsorted-items\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: 'Auto', value: 'auto' },\n\t\t\t\t\t// Composer models\n\t\t\t\t\t{ name: 'Composer 2 Fast', value: 'composer-2-fast' },\n\t\t\t\t\t{ name: 'Composer 2', value: 'composer-2' },\n\t\t\t\t\t{ name: 'Composer 1.5', value: 'composer-1.5' },\n\t\t\t\t\t// Claude 4.6 models\n\t\t\t\t\t{ name: 'Claude 4.6 Opus High', value: 'claude-4.6-opus-high' },\n\t\t\t\t\t{ name: 'Claude 4.6 Opus High Thinking', value: 'claude-4.6-opus-high-thinking' },\n\t\t\t\t\t{ name: 'Claude 4.6 Opus Max', value: 'claude-4.6-opus-max' },\n\t\t\t\t\t{ name: 'Claude 4.6 Opus Max Thinking', value: 'claude-4.6-opus-max-thinking' },\n\t\t\t\t\t{ name: 'Claude 4.6 Sonnet Medium', value: 'claude-4.6-sonnet-medium' },\n\t\t\t\t\t{ name: 'Claude 4.6 Sonnet Medium Thinking', value: 'claude-4.6-sonnet-medium-thinking' },\n\t\t\t\t\t// Claude 4.5 models\n\t\t\t\t\t{ name: 'Claude 4.5 Opus High', value: 'claude-4.5-opus-high' },\n\t\t\t\t\t{ name: 'Claude 4.5 Opus High Thinking', value: 'claude-4.5-opus-high-thinking' },\n\t\t\t\t\t{ name: 'Claude 4.5 Sonnet', value: 'claude-4.5-sonnet' },\n\t\t\t\t\t{ name: 'Claude 4.5 Sonnet Thinking', value: 'claude-4.5-sonnet-thinking' },\n\t\t\t\t\t// Claude 4 models\n\t\t\t\t\t{ name: 'Claude 4 Sonnet', value: 'claude-4-sonnet' },\n\t\t\t\t\t{ name: 'Claude 4 Sonnet 1M', value: 'claude-4-sonnet-1m' },\n\t\t\t\t\t{ name: 'Claude 4 Sonnet Thinking', value: 'claude-4-sonnet-thinking' },\n\t\t\t\t\t{ name: 'Claude 4 Sonnet 1M Thinking', value: 'claude-4-sonnet-1m-thinking' },\n\t\t\t\t\t// Gemini models\n\t\t\t\t\t{ name: 'Gemini 3.1 Pro', value: 'gemini-3.1-pro' },\n\t\t\t\t\t{ name: 'Gemini 3 Flash', value: 'gemini-3-flash' },\n\t\t\t\t\t// GPT-5.4 models\n\t\t\t\t\t{ name: 'GPT-5.4 Low', value: 'gpt-5.4-low' },\n\t\t\t\t\t{ name: 'GPT-5.4 Medium', value: 'gpt-5.4-medium' },\n\t\t\t\t\t{ name: 'GPT-5.4 Medium Fast', value: 'gpt-5.4-medium-fast' },\n\t\t\t\t\t{ name: 'GPT-5.4 High', value: 'gpt-5.4-high' },\n\t\t\t\t\t{ name: 'GPT-5.4 High Fast', value: 'gpt-5.4-high-fast' },\n\t\t\t\t\t{ name: 'GPT-5.4 XHigh', value: 'gpt-5.4-xhigh' },\n\t\t\t\t\t{ name: 'GPT-5.4 XHigh Fast', value: 'gpt-5.4-xhigh-fast' },\n\t\t\t\t\t{ name: 'GPT-5.4 Mini None', value: 'gpt-5.4-mini-none' },\n\t\t\t\t\t{ name: 'GPT-5.4 Mini Low', value: 'gpt-5.4-mini-low' },\n\t\t\t\t\t{ name: 'GPT-5.4 Mini Medium', value: 'gpt-5.4-mini-medium' },\n\t\t\t\t\t{ name: 'GPT-5.4 Mini High', value: 'gpt-5.4-mini-high' },\n\t\t\t\t\t{ name: 'GPT-5.4 Mini XHigh', value: 'gpt-5.4-mini-xhigh' },\n\t\t\t\t\t{ name: 'GPT-5.4 Nano None', value: 'gpt-5.4-nano-none' },\n\t\t\t\t\t{ name: 'GPT-5.4 Nano Low', value: 'gpt-5.4-nano-low' },\n\t\t\t\t\t{ name: 'GPT-5.4 Nano Medium', value: 'gpt-5.4-nano-medium' },\n\t\t\t\t\t{ name: 'GPT-5.4 Nano High', value: 'gpt-5.4-nano-high' },\n\t\t\t\t\t{ name: 'GPT-5.4 Nano XHigh', value: 'gpt-5.4-nano-xhigh' },\n\t\t\t\t\t// GPT-5.3 Codex models\n\t\t\t\t\t{ name: 'GPT-5.3 Codex Low', value: 'gpt-5.3-codex-low' },\n\t\t\t\t\t{ name: 'GPT-5.3 Codex Low Fast', value: 'gpt-5.3-codex-low-fast' },\n\t\t\t\t\t{ name: 'GPT-5.3 Codex', value: 'gpt-5.3-codex' },\n\t\t\t\t\t{ name: 'GPT-5.3 Codex Fast', value: 'gpt-5.3-codex-fast' },\n\t\t\t\t\t{ name: 'GPT-5.3 Codex High', value: 'gpt-5.3-codex-high' },\n\t\t\t\t\t{ name: 'GPT-5.3 Codex High Fast', value: 'gpt-5.3-codex-high-fast' },\n\t\t\t\t\t{ name: 'GPT-5.3 Codex XHigh', value: 'gpt-5.3-codex-xhigh' },\n\t\t\t\t\t{ name: 'GPT-5.3 Codex XHigh Fast', value: 'gpt-5.3-codex-xhigh-fast' },\n\t\t\t\t\t{ name: 'GPT-5.3 Codex Spark Preview Low', value: 'gpt-5.3-codex-spark-preview-low' },\n\t\t\t\t\t{ name: 'GPT-5.3 Codex Spark Preview', value: 'gpt-5.3-codex-spark-preview' },\n\t\t\t\t\t{ name: 'GPT-5.3 Codex Spark Preview High', value: 'gpt-5.3-codex-spark-preview-high' },\n\t\t\t\t\t{ name: 'GPT-5.3 Codex Spark Preview XHigh', value: 'gpt-5.3-codex-spark-preview-xhigh' },\n\t\t\t\t\t// GPT-5.2 models\n\t\t\t\t\t{ name: 'GPT-5.2 Low', value: 'gpt-5.2-low' },\n\t\t\t\t\t{ name: 'GPT-5.2 Low Fast', value: 'gpt-5.2-low-fast' },\n\t\t\t\t\t{ name: 'GPT-5.2', value: 'gpt-5.2' },\n\t\t\t\t\t{ name: 'GPT-5.2 Fast', value: 'gpt-5.2-fast' },\n\t\t\t\t\t{ name: 'GPT-5.2 High', value: 'gpt-5.2-high' },\n\t\t\t\t\t{ name: 'GPT-5.2 High Fast', value: 'gpt-5.2-high-fast' },\n\t\t\t\t\t{ name: 'GPT-5.2 XHigh', value: 'gpt-5.2-xhigh' },\n\t\t\t\t\t{ name: 'GPT-5.2 XHigh Fast', value: 'gpt-5.2-xhigh-fast' },\n\t\t\t\t\t{ name: 'GPT-5.2 Codex Low', value: 'gpt-5.2-codex-low' },\n\t\t\t\t\t{ name: 'GPT-5.2 Codex Low Fast', value: 'gpt-5.2-codex-low-fast' },\n\t\t\t\t\t{ name: 'GPT-5.2 Codex', value: 'gpt-5.2-codex' },\n\t\t\t\t\t{ name: 'GPT-5.2 Codex Fast', value: 'gpt-5.2-codex-fast' },\n\t\t\t\t\t{ name: 'GPT-5.2 Codex High', value: 'gpt-5.2-codex-high' },\n\t\t\t\t\t{ name: 'GPT-5.2 Codex High Fast', value: 'gpt-5.2-codex-high-fast' },\n\t\t\t\t\t{ name: 'GPT-5.2 Codex XHigh', value: 'gpt-5.2-codex-xhigh' },\n\t\t\t\t\t{ name: 'GPT-5.2 Codex XHigh Fast', value: 'gpt-5.2-codex-xhigh-fast' },\n\t\t\t\t\t// GPT-5.1 models\n\t\t\t\t\t{ name: 'GPT-5.1 Low', value: 'gpt-5.1-low' },\n\t\t\t\t\t{ name: 'GPT-5.1', value: 'gpt-5.1' },\n\t\t\t\t\t{ name: 'GPT-5.1 High', value: 'gpt-5.1-high' },\n\t\t\t\t\t{ name: 'GPT-5.1 Codex Max Low', value: 'gpt-5.1-codex-max-low' },\n\t\t\t\t\t{ name: 'GPT-5.1 Codex Max Low Fast', value: 'gpt-5.1-codex-max-low-fast' },\n\t\t\t\t\t{ name: 'GPT-5.1 Codex Max Medium', value: 'gpt-5.1-codex-max-medium' },\n\t\t\t\t\t{ name: 'GPT-5.1 Codex Max Medium Fast', value: 'gpt-5.1-codex-max-medium-fast' },\n\t\t\t\t\t{ name: 'GPT-5.1 Codex Max High', value: 'gpt-5.1-codex-max-high' },\n\t\t\t\t\t{ name: 'GPT-5.1 Codex Max High Fast', value: 'gpt-5.1-codex-max-high-fast' },\n\t\t\t\t\t{ name: 'GPT-5.1 Codex Max XHigh', value: 'gpt-5.1-codex-max-xhigh' },\n\t\t\t\t\t{ name: 'GPT-5.1 Codex Max XHigh Fast', value: 'gpt-5.1-codex-max-xhigh-fast' },\n\t\t\t\t\t{ name: 'GPT-5.1 Codex Mini Low', value: 'gpt-5.1-codex-mini-low' },\n\t\t\t\t\t{ name: 'GPT-5.1 Codex Mini', value: 'gpt-5.1-codex-mini' },\n\t\t\t\t\t{ name: 'GPT-5.1 Codex Mini High', value: 'gpt-5.1-codex-mini-high' },\n\t\t\t\t\t// GPT-5 models\n\t\t\t\t\t{ name: 'GPT-5 Mini', value: 'gpt-5-mini' },\n\t\t\t\t\t// Grok models\n\t\t\t\t\t{ name: 'Grok 4 20', value: 'grok-4-20' },\n\t\t\t\t\t{ name: 'Grok 4 20 Thinking', value: 'grok-4-20-thinking' },\n\t\t\t\t\t// Kimi models\n\t\t\t\t\t{ name: 'Kimi K2.5', value: 'kimi-k2.5' },\n\t\t\t\t],\n\t\t\t\tdefault: 'auto',\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Options',\n\t\t\t\tname: 'options',\n\t\t\t\tplaceholder: 'Add Option',\n\t\t\t\tdescription: 'Additional options to configure',\n\t\t\t\ttype: 'collection',\n\t\t\t\tdefault: {},\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Binary Path',\n\t\t\t\t\t\tname: 'binaryPath',\n\t\t\t\t\t\tdefault: 'cursor-agent',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'Path to the cursor-agent binary. Defaults to \"cursor-agent\" (must be in PATH).',\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Working Directory',\n\t\t\t\t\t\tname: 'workingDirectory',\n\t\t\t\t\t\tdefault: '',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'Working directory for the cursor-agent process. Leave empty to use the default.',\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t};\n\n\tasync supplyData(this: ISupplyDataFunctions, itemIndex: number): Promise<SupplyData> {\n\t\tconst modelName = this.getNodeParameter('model', itemIndex) as string;\n\n\t\tconst options = this.getNodeParameter('options', itemIndex, {}) as {\n\t\t\tbinaryPath?: string;\n\t\t\tworkingDirectory?: string;\n\t\t};\n\n\t\tconst model = new ChatCursorAgentCLI({\n\t\t\tmodel: modelName,\n\t\t\tbinaryPath: options.binaryPath ?? 'cursor-agent',\n\t\t\tworkingDirectory: options.workingDirectory ?? '',\n\t\t});\n\n\t\tmodel.callbacks = [new N8nLlmTracing(this)];\n\n\t\treturn {\n\t\t\tresponse: model,\n\t\t};\n\t}\n}\n"],"mappings":"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","names":["aiMessage"]}
@@ -0,0 +1 @@
1
+ <svg fill="none" height="512" viewBox="0 0 512 512" width="512" xmlns="http://www.w3.org/2000/svg"><path d="m512 325.5c0 7.124 0 14.24-.041 21.364-.034 5.999-.103 11.998-.268 17.99-.356 13.068-1.124 26.245-3.448 39.169-2.359 13.109-6.205 25.306-12.266 37.222-5.958 11.703-13.746 22.419-23.029 31.709-9.29 9.29-20 17.072-31.71 23.03-11.909 6.061-24.113 9.907-37.222 12.266-12.923 2.324-26.101 3.092-39.169 3.448-5.999.165-11.991.233-17.99.268-7.123.048-14.24.041-21.364.041h-139c-7.124 0-14.24 0-21.364-.041-5.999-.035-11.998-.103-17.99-.268-13.068-.356-26.245-1.124-39.169-3.448-13.109-2.359-25.306-6.205-37.2219-12.266-11.7033-5.958-22.4194-13.746-31.7095-23.03-9.29-9.29-17.0717-19.999-23.0296-31.709-6.0608-11.909-9.90707-24.113-12.26557-37.222-2.32422-12.924-3.0921-26.101-3.448618-39.169-.164546-5.999-.2331071-11.991-.2673876-17.99-.0274244-7.124-.0274244-14.24-.0274244-21.364v-139c0-7.124 0-14.24.0411366-21.364.0342805-5.999.1028414-11.998.2673884-17.99.356517-13.068 1.124405-26.245 3.448615-39.169 2.3585-13.1091 6.20478-25.3061 12.26556-37.222 5.958-11.7034 13.7465-22.4195 23.0297-31.7095 9.29-9.29 19.9992-17.0717 31.7094-23.0296 11.9091-6.06084 24.1129-9.90711 37.2222-12.26561 12.923-2.32422 26.101-3.092104 39.169-3.448622 5.999-.164546 11.991-.233107 17.99-.2673875 7.117-.0342805 14.233-.0342805 21.357-.0342805h139c7.124 0 14.24 0 21.364.0411366 5.999.0342805 11.998.1028414 17.99.2673884 13.068.356517 26.245 1.124405 39.169 3.448615 13.109 2.3585 25.306 6.20478 37.222 12.26556 11.703 5.958 22.419 13.7465 31.709 23.0297 9.29 9.29 17.072 19.9992 23.03 31.7094 6.061 11.9091 9.907 24.1129 12.266 37.2222 2.324 12.923 3.092 26.101 3.448 39.169.165 5.999.233 11.991.268 17.99.048 7.123.041 14.24.041 21.364v139z" fill="#14120b"/><path d="m186.5 4h139c7.125 0 14.231-.00004 21.341.04102 5.985.0342 11.952.10221 17.903.26562h.001c13.003.35475 25.943 1.11709 38.569 3.3877 12.775 2.29827 24.592 6.03146 36.118 11.89356v-.001c10.974 5.5867 21.052 12.8384 29.848 21.457l.847.8379c8.993 8.993 16.525 19.3594 22.292 30.6934v.001c5.678 11.1575 9.36 22.6023 11.674 34.9208l.219 1.195c2.129 11.837 2.932 23.95 3.316 36.132l.072 2.438c.164 5.958.232 11.919.266 17.904v.004c.048 7.107.041 14.207.041 21.337v129.344l-.007-.007v9.656c0 7.125 0 14.231-.041 21.341-.034 5.985-.102 11.952-.266 17.903v.001c-.354 13.003-1.117 25.943-3.387 38.569-2.227 12.376-5.8 23.853-11.351 35.037l-.543 1.08c-5.766 11.327-13.306 21.701-22.293 30.695-8.993 8.993-19.361 16.526-30.695 22.293-11.518 5.861-23.342 9.595-36.116 11.893-11.837 2.129-23.95 2.932-36.132 3.316l-2.438.072c-5.958.164-11.919.232-17.904.266h-.004c-7.107.048-14.207.041-21.337.041h-139c-7.125 0-14.231 0-21.341-.041-5.985-.034-11.952-.102-17.903-.266h-.001c-13.003-.355-25.944-1.117-38.57-3.388-12.7742-2.298-24.5914-6.031-36.1165-11.893h.001c-10.974-5.587-21.0534-12.837-29.8496-21.456l-.8467-.838c-8.7118-8.712-16.0531-18.713-21.7461-29.634l-.5459-1.06-.5439-1.081c-5.371-10.816-8.8905-21.919-11.12991-33.84l-.21973-1.196c-2.27061-12.626-3.03294-25.566-3.38769-38.569v-.001c-.16341-5.958-.23142-11.918-.26563-17.903-.02736-7.112-.02734-14.219-.02734-21.341v-139c0-7.125-.00004-14.231.04102-21.341.0342-5.985.10221-11.952.26562-17.903v-.001c.35476-13.003 1.117-25.944 3.3877-38.57 2.29828-12.7744 6.03156-24.5916 11.89356-36.1166l-.001-.001c5.7666-11.327 13.3073-21.6999 22.294-30.6934 8.9933-8.9933 19.3607-16.5261 30.6953-22.2929 11.5173-5.8615 23.3406-9.59619 36.1148-11.89458 11.837-2.12877 23.951-2.93016 36.133-3.31445l2.438-.07227c5.958-.16342 11.919-.23142 17.904-.26562l-.001-.00098c7.104-.03421 14.211-.0332 21.335-.0332z" stroke="#edecec" stroke-opacity=".2" stroke-width="8"/><path d="m415.035 156.35-151.503-87.4695c-4.865-2.8094-10.868-2.8094-15.733 0l-151.4969 87.4695c-4.0897 2.362-6.6146 6.729-6.6146 11.459v176.383c0 4.73 2.5249 9.097 6.6146 11.458l151.5039 87.47c4.865 2.809 10.868 2.809 15.733 0l151.504-87.47c4.089-2.361 6.614-6.728 6.614-11.458v-176.383c0-4.73-2.525-9.097-6.614-11.459zm-9.516 18.528-146.255 253.32c-.988 1.707-3.599 1.01-3.599-.967v-165.872c0-3.314-1.771-6.379-4.644-8.044l-143.645-82.932c-1.707-.988-1.01-3.599.968-3.599h292.509c4.154 0 6.75 4.503 4.673 8.101h-.007z" fill="#edecec"/></svg>
@@ -14,6 +14,7 @@
14
14
  {"name":"mistralCloudApi","displayName":"Mistral Cloud API","documentationUrl":"mistral","properties":[{"displayName":"API Key","name":"apiKey","type":"string","typeOptions":{"password":true},"required":true,"default":""}],"authenticate":{"type":"generic","properties":{"headers":{"Authorization":"=Bearer {{$credentials.apiKey}}"}}},"test":{"request":{"baseURL":"https://api.mistral.ai/v1","url":"/models","method":"GET"}},"supportedNodes":["embeddingsMistralCloud","lmChatMistralCloud"],"iconUrl":"icons/@n8n/n8n-nodes-langchain/dist/nodes/embeddings/EmbeddingsMistralCloud/mistral.svg"},
15
15
  {"name":"lemonadeApi","displayName":"Lemonade","documentationUrl":"lemonade","properties":[{"displayName":"Base URL","name":"baseUrl","required":true,"type":"string","default":"http://localhost:8000/api/v1"},{"displayName":"API Key","hint":"Optional API key for Lemonade server authentication. Not required for default Lemonade installation","name":"apiKey","type":"string","typeOptions":{"password":true},"default":"","required":false}],"test":{"request":{"baseURL":"={{ $credentials.baseUrl }}","url":"/models","method":"GET"}},"supportedNodes":["embeddingsLemonade","lmChatLemonade","lmLemonade"],"iconUrl":"icons/@n8n/n8n-nodes-langchain/dist/nodes/embeddings/EmbeddingsLemonade/lemonade.svg","authenticate":{}},
16
16
  {"name":"ollamaApi","displayName":"Ollama","documentationUrl":"ollama","properties":[{"displayName":"Base URL","name":"baseUrl","required":true,"type":"string","default":"http://localhost:11434"},{"displayName":"API Key","hint":"When using Ollama behind a proxy with authentication (such as Open WebUI), provide the Bearer token/API key here. This is not required for the default Ollama installation","name":"apiKey","type":"string","typeOptions":{"password":true},"default":"","required":false}],"authenticate":{"type":"generic","properties":{"headers":{"Authorization":"=Bearer {{$credentials.apiKey}}"}}},"test":{"request":{"baseURL":"={{ $credentials.baseUrl }}","url":"/api/tags","method":"GET"}},"supportedNodes":["ollama","embeddingsOllama","lmChatOllama","lmOllama"],"iconUrl":"icons/@n8n/n8n-nodes-langchain/dist/nodes/vendors/Ollama/ollama.svg"},
17
+ {"name":"nineRouterApi","displayName":"9Router","documentationUrl":"nineRouter","properties":[{"displayName":"API Key","name":"apiKey","type":"string","typeOptions":{"password":true},"required":false,"default":"","description":"Optional API key if REQUIRE_API_KEY is enabled on your 9Router instance"},{"displayName":"Base URL","name":"url","type":"string","default":"http://localhost:20128/api/v1","description":"Base URL of your 9Router instance"}],"authenticate":{"type":"generic","properties":{"headers":{"Authorization":"=Bearer {{$credentials.apiKey}}"}}},"test":{"request":{"baseURL":"={{ $credentials.url }}","url":"/models"}},"supportedNodes":["lmChat9Router"],"iconUrl":{"light":"icons/@n8n/n8n-nodes-langchain/dist/nodes/llms/LmChat9Router/9router.svg","dark":"icons/@n8n/n8n-nodes-langchain/dist/nodes/llms/LmChat9Router/9router.dark.svg"}},
17
18
  {"name":"openRouterApi","displayName":"OpenRouter","documentationUrl":"openrouter","properties":[{"displayName":"API Key","name":"apiKey","type":"string","typeOptions":{"password":true},"required":true,"default":""},{"displayName":"Base URL","name":"url","type":"hidden","default":"https://openrouter.ai/api/v1"}],"authenticate":{"type":"generic","properties":{"headers":{"Authorization":"=Bearer {{$credentials.apiKey}}"}}},"test":{"request":{"baseURL":"={{ $credentials.url }}","url":"/key"}},"supportedNodes":["lmChatOpenRouter"],"iconUrl":{"light":"icons/@n8n/n8n-nodes-langchain/dist/nodes/llms/LmChatOpenRouter/openrouter.svg","dark":"icons/@n8n/n8n-nodes-langchain/dist/nodes/llms/LmChatOpenRouter/openrouter.dark.svg"}},
18
19
  {"name":"pineconeApi","displayName":"PineconeApi","documentationUrl":"pinecone","properties":[{"displayName":"API Key","name":"apiKey","type":"string","typeOptions":{"password":true},"required":true,"default":""}],"authenticate":{"type":"generic","properties":{"headers":{"Api-Key":"={{$credentials.apiKey}}"}}},"test":{"request":{"baseURL":"https://api.pinecone.io/indexes","headers":{"accept":"application/json; charset=utf-8"}}},"supportedNodes":["vectorStorePinecone","vectorStorePineconeInsert","vectorStorePineconeLoad"],"iconUrl":{"light":"icons/@n8n/n8n-nodes-langchain/dist/nodes/vector_store/VectorStorePinecone/pinecone.svg","dark":"icons/@n8n/n8n-nodes-langchain/dist/nodes/vector_store/VectorStorePinecone/pinecone.dark.svg"}},
19
20
  {"name":"qdrantApi","displayName":"QdrantApi","documentationUrl":"https://docs.n8n.io/integrations/builtin/credentials/qdrant/","properties":[{"displayName":"API Key","name":"apiKey","type":"string","typeOptions":{"password":true},"required":false,"default":""},{"displayName":"Qdrant URL","name":"qdrantUrl","type":"string","required":true,"default":""}],"authenticate":{"type":"generic","properties":{"headers":{"api-key":"={{$credentials.apiKey}}"}}},"test":{"request":{"baseURL":"={{$credentials.qdrantUrl}}","url":"/collections"}},"supportedNodes":["vectorStoreQdrant"],"iconUrl":"icons/@n8n/n8n-nodes-langchain/dist/nodes/vector_store/VectorStoreQdrant/qdrant.svg"},