@n8n/n8n-nodes-langchain 1.116.0 → 1.116.2
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/nodes/vendors/OpenAi/helpers/interfaces.js.map +1 -1
- package/dist/nodes/vendors/OpenAi/v2/actions/node.type.js.map +1 -1
- package/dist/nodes/vendors/OpenAi/v2/actions/text/helpers/responses.js +0 -24
- package/dist/nodes/vendors/OpenAi/v2/actions/text/helpers/responses.js.map +1 -1
- package/dist/nodes/vendors/OpenAi/v2/actions/text/index.js +2 -13
- package/dist/nodes/vendors/OpenAi/v2/actions/text/index.js.map +1 -1
- package/dist/nodes/vendors/OpenAi/v2/actions/text/response.operation.js +3 -104
- package/dist/nodes/vendors/OpenAi/v2/actions/text/response.operation.js.map +1 -1
- package/dist/types/nodes.json +1 -1
- package/package.json +5 -5
- package/dist/nodes/vendors/OpenAi/v2/actions/text/message.operation.js +0 -345
- package/dist/nodes/vendors/OpenAi/v2/actions/text/message.operation.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@n8n/n8n-nodes-langchain",
|
|
3
|
-
"version": "1.116.
|
|
3
|
+
"version": "1.116.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"files": [
|
|
@@ -223,13 +223,13 @@
|
|
|
223
223
|
"zod": "3.25.67",
|
|
224
224
|
"zod-to-json-schema": "3.23.3",
|
|
225
225
|
"@n8n/client-oauth2": "0.30.0",
|
|
226
|
-
"@n8n/di": "0.9.0",
|
|
227
226
|
"@n8n/config": "1.59.0",
|
|
228
|
-
"@n8n/
|
|
227
|
+
"@n8n/di": "0.9.0",
|
|
229
228
|
"@n8n/errors": "^0.5.0",
|
|
229
|
+
"@n8n/json-schema-to-zod": "1.5.0",
|
|
230
230
|
"@n8n/typescript-config": "1.3.0",
|
|
231
|
-
"n8n-
|
|
232
|
-
"n8n-
|
|
231
|
+
"n8n-workflow": "1.114.0",
|
|
232
|
+
"n8n-nodes-base": "1.115.0"
|
|
233
233
|
},
|
|
234
234
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
235
235
|
"homepage": "https://n8n.io",
|
|
@@ -1,345 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __create = Object.create;
|
|
3
|
-
var __defProp = Object.defineProperty;
|
|
4
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __export = (target, all) => {
|
|
9
|
-
for (var name in all)
|
|
10
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
-
};
|
|
12
|
-
var __copyProps = (to, from, except, desc) => {
|
|
13
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
-
for (let key of __getOwnPropNames(from))
|
|
15
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
-
}
|
|
18
|
-
return to;
|
|
19
|
-
};
|
|
20
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
-
mod
|
|
27
|
-
));
|
|
28
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
-
var message_operation_exports = {};
|
|
30
|
-
__export(message_operation_exports, {
|
|
31
|
-
description: () => description,
|
|
32
|
-
execute: () => execute
|
|
33
|
-
});
|
|
34
|
-
module.exports = __toCommonJS(message_operation_exports);
|
|
35
|
-
var import_omit = __toESM(require("lodash/omit"));
|
|
36
|
-
var import_n8n_workflow = require("n8n-workflow");
|
|
37
|
-
var import_helpers = require("../../../../../../utils/helpers");
|
|
38
|
-
var import_constants = require("../../../helpers/constants");
|
|
39
|
-
var import_utils = require("../../../helpers/utils");
|
|
40
|
-
var import_transport = require("../../../transport");
|
|
41
|
-
var import_descriptions = require("../descriptions");
|
|
42
|
-
const properties = [
|
|
43
|
-
(0, import_descriptions.modelRLC)("modelSearch"),
|
|
44
|
-
{
|
|
45
|
-
displayName: "Messages",
|
|
46
|
-
name: "messages",
|
|
47
|
-
type: "fixedCollection",
|
|
48
|
-
typeOptions: {
|
|
49
|
-
sortable: true,
|
|
50
|
-
multipleValues: true
|
|
51
|
-
},
|
|
52
|
-
placeholder: "Add Message",
|
|
53
|
-
default: { values: [{ content: "" }] },
|
|
54
|
-
options: [
|
|
55
|
-
{
|
|
56
|
-
displayName: "Values",
|
|
57
|
-
name: "values",
|
|
58
|
-
values: [
|
|
59
|
-
{
|
|
60
|
-
displayName: "Prompt",
|
|
61
|
-
name: "content",
|
|
62
|
-
type: "string",
|
|
63
|
-
description: "The content of the message to be send",
|
|
64
|
-
default: "",
|
|
65
|
-
placeholder: "e.g. Hello, how can you help me?",
|
|
66
|
-
typeOptions: {
|
|
67
|
-
rows: 2
|
|
68
|
-
}
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
displayName: "Role",
|
|
72
|
-
name: "role",
|
|
73
|
-
type: "options",
|
|
74
|
-
description: "Role in shaping the model's response, it tells the model how it should behave and interact with the user",
|
|
75
|
-
options: [
|
|
76
|
-
{
|
|
77
|
-
name: "User",
|
|
78
|
-
value: "user",
|
|
79
|
-
description: "Send a message as a user and get a response from the model"
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
name: "Assistant",
|
|
83
|
-
value: "assistant",
|
|
84
|
-
description: "Tell the model to adopt a specific tone or personality"
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
name: "System",
|
|
88
|
-
value: "system",
|
|
89
|
-
description: "Usually used to set the model's behavior or context for the next user message"
|
|
90
|
-
}
|
|
91
|
-
],
|
|
92
|
-
default: "user"
|
|
93
|
-
}
|
|
94
|
-
]
|
|
95
|
-
}
|
|
96
|
-
]
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
displayName: "Simplify Output",
|
|
100
|
-
name: "simplify",
|
|
101
|
-
type: "boolean",
|
|
102
|
-
default: true,
|
|
103
|
-
description: "Whether to return a simplified version of the response instead of the raw data"
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
displayName: "Output Content as JSON",
|
|
107
|
-
name: "jsonOutput",
|
|
108
|
-
type: "boolean",
|
|
109
|
-
description: "Whether to attempt to return the response in JSON format. Compatible with GPT-4 Turbo and all GPT-3.5 Turbo models newer than gpt-3.5-turbo-1106.",
|
|
110
|
-
default: false
|
|
111
|
-
},
|
|
112
|
-
{
|
|
113
|
-
displayName: "Hide Tools",
|
|
114
|
-
name: "hideTools",
|
|
115
|
-
type: "hidden",
|
|
116
|
-
default: "hide",
|
|
117
|
-
displayOptions: {
|
|
118
|
-
show: {
|
|
119
|
-
modelId: import_constants.MODELS_NOT_SUPPORT_FUNCTION_CALLS
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
displayName: "Connect your own custom n8n tools to this node on the canvas",
|
|
125
|
-
name: "noticeTools",
|
|
126
|
-
type: "notice",
|
|
127
|
-
default: "",
|
|
128
|
-
displayOptions: {
|
|
129
|
-
hide: {
|
|
130
|
-
hideTools: ["hide"]
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
},
|
|
134
|
-
{
|
|
135
|
-
displayName: "Options",
|
|
136
|
-
name: "options",
|
|
137
|
-
placeholder: "Add Option",
|
|
138
|
-
type: "collection",
|
|
139
|
-
default: {},
|
|
140
|
-
options: [
|
|
141
|
-
{
|
|
142
|
-
displayName: "Frequency Penalty",
|
|
143
|
-
name: "frequency_penalty",
|
|
144
|
-
default: 0,
|
|
145
|
-
typeOptions: { maxValue: 2, minValue: -2, numberPrecision: 1 },
|
|
146
|
-
description: "Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim",
|
|
147
|
-
type: "number"
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
displayName: "Maximum Number of Tokens",
|
|
151
|
-
name: "maxTokens",
|
|
152
|
-
default: 16,
|
|
153
|
-
description: "The maximum number of tokens to generate in the completion. Most models have a context length of 2048 tokens (except for the newest models, which support 32,768).",
|
|
154
|
-
type: "number",
|
|
155
|
-
typeOptions: {
|
|
156
|
-
maxValue: 32768
|
|
157
|
-
}
|
|
158
|
-
},
|
|
159
|
-
{
|
|
160
|
-
displayName: "Number of Completions",
|
|
161
|
-
name: "n",
|
|
162
|
-
default: 1,
|
|
163
|
-
description: "How many completions to generate for each prompt. Note: Because this parameter generates many completions, it can quickly consume your token quota. Use carefully and ensure that you have reasonable settings for max_tokens and stop.",
|
|
164
|
-
type: "number"
|
|
165
|
-
},
|
|
166
|
-
{
|
|
167
|
-
displayName: "Presence Penalty",
|
|
168
|
-
name: "presence_penalty",
|
|
169
|
-
default: 0,
|
|
170
|
-
typeOptions: { maxValue: 2, minValue: -2, numberPrecision: 1 },
|
|
171
|
-
description: "Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics",
|
|
172
|
-
type: "number"
|
|
173
|
-
},
|
|
174
|
-
{
|
|
175
|
-
displayName: "Output Randomness (Temperature)",
|
|
176
|
-
name: "temperature",
|
|
177
|
-
default: 1,
|
|
178
|
-
typeOptions: { maxValue: 1, minValue: 0, numberPrecision: 1 },
|
|
179
|
-
description: "Controls randomness: Lowering results in less random completions. As the temperature approaches zero, the model will become deterministic and repetitive. We generally recommend altering this or temperature but not both.",
|
|
180
|
-
type: "number"
|
|
181
|
-
},
|
|
182
|
-
{
|
|
183
|
-
displayName: "Output Randomness (Top P)",
|
|
184
|
-
name: "topP",
|
|
185
|
-
default: 1,
|
|
186
|
-
typeOptions: { maxValue: 1, minValue: 0, numberPrecision: 1 },
|
|
187
|
-
description: "An alternative to sampling with temperature, controls diversity via nucleus sampling: 0.5 means half of all likelihood-weighted options are considered. We generally recommend altering this or temperature but not both.",
|
|
188
|
-
type: "number"
|
|
189
|
-
},
|
|
190
|
-
{
|
|
191
|
-
displayName: "Reasoning Effort",
|
|
192
|
-
name: "reasoning_effort",
|
|
193
|
-
default: "medium",
|
|
194
|
-
description: 'Controls the amount of reasoning tokens to use. A value of "low" will favor speed and economical token usage, "high" will favor more complete reasoning at the cost of more tokens generated and slower responses.',
|
|
195
|
-
type: "options",
|
|
196
|
-
options: [
|
|
197
|
-
{
|
|
198
|
-
name: "Low",
|
|
199
|
-
value: "low",
|
|
200
|
-
description: "Favors speed and economical token usage"
|
|
201
|
-
},
|
|
202
|
-
{
|
|
203
|
-
name: "Medium",
|
|
204
|
-
value: "medium",
|
|
205
|
-
description: "Balance between speed and reasoning accuracy"
|
|
206
|
-
},
|
|
207
|
-
{
|
|
208
|
-
name: "High",
|
|
209
|
-
value: "high",
|
|
210
|
-
description: "Favors more complete reasoning at the cost of more tokens generated and slower responses"
|
|
211
|
-
}
|
|
212
|
-
],
|
|
213
|
-
displayOptions: {
|
|
214
|
-
show: {
|
|
215
|
-
// reasoning_effort is only available on o1, o1-versioned, or on o3-mini and beyond, and gpt-5 models. Not on o1-mini or other GPT-models.
|
|
216
|
-
"/modelId": [{ _cnd: { regex: "(^o1([-\\d]+)?$)|(^o[3-9].*)|(^gpt-5.*)" } }]
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
},
|
|
220
|
-
{
|
|
221
|
-
displayName: "Max Tool Calls Iterations",
|
|
222
|
-
name: "maxToolsIterations",
|
|
223
|
-
type: "number",
|
|
224
|
-
default: 15,
|
|
225
|
-
description: "The maximum number of tool iteration cycles the LLM will run before stopping. A single iteration can contain multiple tool calls. Set to 0 for no limit."
|
|
226
|
-
}
|
|
227
|
-
]
|
|
228
|
-
}
|
|
229
|
-
];
|
|
230
|
-
const displayOptions = {
|
|
231
|
-
show: {
|
|
232
|
-
operation: ["message"],
|
|
233
|
-
resource: ["text"]
|
|
234
|
-
}
|
|
235
|
-
};
|
|
236
|
-
const description = (0, import_n8n_workflow.updateDisplayOptions)(displayOptions, properties);
|
|
237
|
-
async function execute(i) {
|
|
238
|
-
const model = this.getNodeParameter("modelId", i, "", { extractValue: true });
|
|
239
|
-
let messages = this.getNodeParameter("messages.values", i, []);
|
|
240
|
-
const options = this.getNodeParameter("options", i, {});
|
|
241
|
-
const jsonOutput = this.getNodeParameter("jsonOutput", i, false);
|
|
242
|
-
const maxToolsIterations = this.getNodeParameter("options.maxToolsIterations", i, 15);
|
|
243
|
-
const abortSignal = this.getExecutionCancelSignal();
|
|
244
|
-
if (options.maxTokens !== void 0) {
|
|
245
|
-
options.max_completion_tokens = options.maxTokens;
|
|
246
|
-
delete options.maxTokens;
|
|
247
|
-
}
|
|
248
|
-
if (options.topP !== void 0) {
|
|
249
|
-
options.top_p = options.topP;
|
|
250
|
-
delete options.topP;
|
|
251
|
-
}
|
|
252
|
-
let response_format;
|
|
253
|
-
if (jsonOutput) {
|
|
254
|
-
response_format = { type: "json_object" };
|
|
255
|
-
messages = [
|
|
256
|
-
{
|
|
257
|
-
role: "system",
|
|
258
|
-
content: "You are a helpful assistant designed to output JSON."
|
|
259
|
-
},
|
|
260
|
-
...messages
|
|
261
|
-
];
|
|
262
|
-
}
|
|
263
|
-
const hideTools = this.getNodeParameter("hideTools", i, "");
|
|
264
|
-
let tools;
|
|
265
|
-
let externalTools = [];
|
|
266
|
-
if (hideTools !== "hide") {
|
|
267
|
-
const enforceUniqueNames = true;
|
|
268
|
-
externalTools = await (0, import_helpers.getConnectedTools)(this, enforceUniqueNames, false);
|
|
269
|
-
}
|
|
270
|
-
if (externalTools.length) {
|
|
271
|
-
tools = externalTools.length ? externalTools?.map(import_utils.formatToOpenAIAssistantTool) : void 0;
|
|
272
|
-
}
|
|
273
|
-
const body = {
|
|
274
|
-
model,
|
|
275
|
-
messages,
|
|
276
|
-
tools,
|
|
277
|
-
response_format,
|
|
278
|
-
...(0, import_omit.default)(options, ["maxToolsIterations"])
|
|
279
|
-
};
|
|
280
|
-
let response = await import_transport.apiRequest.call(this, "POST", "/chat/completions", {
|
|
281
|
-
body
|
|
282
|
-
});
|
|
283
|
-
if (!response) return [];
|
|
284
|
-
let currentIteration = 1;
|
|
285
|
-
let toolCalls = response?.choices[0]?.message?.tool_calls;
|
|
286
|
-
while (toolCalls?.length) {
|
|
287
|
-
if (abortSignal?.aborted || maxToolsIterations > 0 && currentIteration >= maxToolsIterations) {
|
|
288
|
-
break;
|
|
289
|
-
}
|
|
290
|
-
messages.push(response.choices[0].message);
|
|
291
|
-
for (const toolCall of toolCalls) {
|
|
292
|
-
const functionName = toolCall.function.name;
|
|
293
|
-
const functionArgs = toolCall.function.arguments;
|
|
294
|
-
let functionResponse;
|
|
295
|
-
for (const tool of externalTools ?? []) {
|
|
296
|
-
if (tool.name === functionName) {
|
|
297
|
-
const parsedArgs = (0, import_n8n_workflow.jsonParse)(functionArgs);
|
|
298
|
-
const functionInput = parsedArgs.input ?? parsedArgs ?? functionArgs;
|
|
299
|
-
functionResponse = await tool.invoke(functionInput);
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
if (typeof functionResponse === "object") {
|
|
303
|
-
functionResponse = JSON.stringify(functionResponse);
|
|
304
|
-
}
|
|
305
|
-
messages.push({
|
|
306
|
-
tool_call_id: toolCall.id,
|
|
307
|
-
role: "tool",
|
|
308
|
-
content: functionResponse
|
|
309
|
-
});
|
|
310
|
-
}
|
|
311
|
-
response = await import_transport.apiRequest.call(this, "POST", "/chat/completions", {
|
|
312
|
-
body
|
|
313
|
-
});
|
|
314
|
-
toolCalls = response.choices[0].message.tool_calls;
|
|
315
|
-
currentIteration += 1;
|
|
316
|
-
}
|
|
317
|
-
if (response_format) {
|
|
318
|
-
response.choices = response.choices.map((choice) => {
|
|
319
|
-
try {
|
|
320
|
-
choice.message.content = JSON.parse(choice.message.content);
|
|
321
|
-
} catch (error) {
|
|
322
|
-
}
|
|
323
|
-
return choice;
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
const simplify = this.getNodeParameter("simplify", i);
|
|
327
|
-
const returnData = [];
|
|
328
|
-
if (simplify) {
|
|
329
|
-
for (const entry of response.choices) {
|
|
330
|
-
returnData.push({
|
|
331
|
-
json: entry,
|
|
332
|
-
pairedItem: { item: i }
|
|
333
|
-
});
|
|
334
|
-
}
|
|
335
|
-
} else {
|
|
336
|
-
returnData.push({ json: response, pairedItem: { item: i } });
|
|
337
|
-
}
|
|
338
|
-
return returnData;
|
|
339
|
-
}
|
|
340
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
341
|
-
0 && (module.exports = {
|
|
342
|
-
description,
|
|
343
|
-
execute
|
|
344
|
-
});
|
|
345
|
-
//# sourceMappingURL=message.operation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../nodes/vendors/OpenAi/v2/actions/text/message.operation.ts"],"sourcesContent":["import type { Tool } from '@langchain/core/tools';\nimport _omit from 'lodash/omit';\nimport type {\n\tINodeProperties,\n\tIExecuteFunctions,\n\tINodeExecutionData,\n\tIDataObject,\n} from 'n8n-workflow';\nimport { jsonParse, updateDisplayOptions } from 'n8n-workflow';\n\nimport { getConnectedTools } from '@utils/helpers';\n\nimport { MODELS_NOT_SUPPORT_FUNCTION_CALLS } from '../../../helpers/constants';\nimport type { ChatCompletion } from '../../../helpers/interfaces';\nimport { formatToOpenAIAssistantTool } from '../../../helpers/utils';\nimport { apiRequest } from '../../../transport';\nimport { modelRLC } from '../descriptions';\n\nconst properties: INodeProperties[] = [\n\tmodelRLC('modelSearch'),\n\t{\n\t\tdisplayName: 'Messages',\n\t\tname: 'messages',\n\t\ttype: 'fixedCollection',\n\t\ttypeOptions: {\n\t\t\tsortable: true,\n\t\t\tmultipleValues: true,\n\t\t},\n\t\tplaceholder: 'Add Message',\n\t\tdefault: { values: [{ content: '' }] },\n\t\toptions: [\n\t\t\t{\n\t\t\t\tdisplayName: 'Values',\n\t\t\t\tname: 'values',\n\t\t\t\tvalues: [\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Prompt',\n\t\t\t\t\t\tname: 'content',\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tdescription: 'The content of the message to be send',\n\t\t\t\t\t\tdefault: '',\n\t\t\t\t\t\tplaceholder: 'e.g. Hello, how can you help me?',\n\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\trows: 2,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Role',\n\t\t\t\t\t\tname: 'role',\n\t\t\t\t\t\ttype: 'options',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\"Role in shaping the model's response, it tells the model how it should behave and interact with the user\",\n\t\t\t\t\t\toptions: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tname: 'User',\n\t\t\t\t\t\t\t\tvalue: 'user',\n\t\t\t\t\t\t\t\tdescription: 'Send a message as a user and get a response from the model',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tname: 'Assistant',\n\t\t\t\t\t\t\t\tvalue: 'assistant',\n\t\t\t\t\t\t\t\tdescription: 'Tell the model to adopt a specific tone or personality',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tname: 'System',\n\t\t\t\t\t\t\t\tvalue: 'system',\n\t\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\t\"Usually used to set the model's behavior or context for the next user message\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdefault: 'user',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tdisplayName: 'Simplify Output',\n\t\tname: 'simplify',\n\t\ttype: 'boolean',\n\t\tdefault: true,\n\t\tdescription: 'Whether to return a simplified version of the response instead of the raw data',\n\t},\n\t{\n\t\tdisplayName: 'Output Content as JSON',\n\t\tname: 'jsonOutput',\n\t\ttype: 'boolean',\n\t\tdescription:\n\t\t\t'Whether to attempt to return the response in JSON format. Compatible with GPT-4 Turbo and all GPT-3.5 Turbo models newer than gpt-3.5-turbo-1106.',\n\t\tdefault: false,\n\t},\n\t{\n\t\tdisplayName: 'Hide Tools',\n\t\tname: 'hideTools',\n\t\ttype: 'hidden',\n\t\tdefault: 'hide',\n\t\tdisplayOptions: {\n\t\t\tshow: {\n\t\t\t\tmodelId: MODELS_NOT_SUPPORT_FUNCTION_CALLS,\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\tdisplayName: 'Connect your own custom n8n tools to this node on the canvas',\n\t\tname: 'noticeTools',\n\t\ttype: 'notice',\n\t\tdefault: '',\n\t\tdisplayOptions: {\n\t\t\thide: {\n\t\t\t\thideTools: ['hide'],\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\tdisplayName: 'Options',\n\t\tname: 'options',\n\t\tplaceholder: 'Add Option',\n\t\ttype: 'collection',\n\t\tdefault: {},\n\t\toptions: [\n\t\t\t{\n\t\t\t\tdisplayName: 'Frequency Penalty',\n\t\t\t\tname: 'frequency_penalty',\n\t\t\t\tdefault: 0,\n\t\t\t\ttypeOptions: { maxValue: 2, minValue: -2, numberPrecision: 1 },\n\t\t\t\tdescription:\n\t\t\t\t\t\"Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim\",\n\t\t\t\ttype: 'number',\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Maximum Number of Tokens',\n\t\t\t\tname: 'maxTokens',\n\t\t\t\tdefault: 16,\n\t\t\t\tdescription:\n\t\t\t\t\t'The maximum number of tokens to generate in the completion. Most models have a context length of 2048 tokens (except for the newest models, which support 32,768).',\n\t\t\t\ttype: 'number',\n\t\t\t\ttypeOptions: {\n\t\t\t\t\tmaxValue: 32768,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Number of Completions',\n\t\t\t\tname: 'n',\n\t\t\t\tdefault: 1,\n\t\t\t\tdescription:\n\t\t\t\t\t'How many completions to generate for each prompt. Note: Because this parameter generates many completions, it can quickly consume your token quota. Use carefully and ensure that you have reasonable settings for max_tokens and stop.',\n\t\t\t\ttype: 'number',\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Presence Penalty',\n\t\t\t\tname: 'presence_penalty',\n\t\t\t\tdefault: 0,\n\t\t\t\ttypeOptions: { maxValue: 2, minValue: -2, numberPrecision: 1 },\n\t\t\t\tdescription:\n\t\t\t\t\t\"Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics\",\n\t\t\t\ttype: 'number',\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Output Randomness (Temperature)',\n\t\t\t\tname: 'temperature',\n\t\t\t\tdefault: 1,\n\t\t\t\ttypeOptions: { maxValue: 1, minValue: 0, numberPrecision: 1 },\n\t\t\t\tdescription:\n\t\t\t\t\t'Controls randomness: Lowering results in less random completions. As the temperature approaches zero, the model will become deterministic and repetitive. We generally recommend altering this or temperature but not both.',\n\t\t\t\ttype: 'number',\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Output Randomness (Top P)',\n\t\t\t\tname: 'topP',\n\t\t\t\tdefault: 1,\n\t\t\t\ttypeOptions: { maxValue: 1, minValue: 0, numberPrecision: 1 },\n\t\t\t\tdescription:\n\t\t\t\t\t'An alternative to sampling with temperature, controls diversity via nucleus sampling: 0.5 means half of all likelihood-weighted options are considered. We generally recommend altering this or temperature but not both.',\n\t\t\t\ttype: 'number',\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Reasoning Effort',\n\t\t\t\tname: 'reasoning_effort',\n\t\t\t\tdefault: 'medium',\n\t\t\t\tdescription:\n\t\t\t\t\t'Controls the amount of reasoning tokens to use. A value of \"low\" will favor speed and economical token usage, \"high\" will favor more complete reasoning at the cost of more tokens generated and slower responses.',\n\t\t\t\ttype: 'options',\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Low',\n\t\t\t\t\t\tvalue: 'low',\n\t\t\t\t\t\tdescription: 'Favors speed and economical token usage',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Medium',\n\t\t\t\t\t\tvalue: 'medium',\n\t\t\t\t\t\tdescription: 'Balance between speed and reasoning accuracy',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'High',\n\t\t\t\t\t\tvalue: 'high',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'Favors more complete reasoning at the cost of more tokens generated and slower responses',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdisplayOptions: {\n\t\t\t\t\tshow: {\n\t\t\t\t\t\t// reasoning_effort is only available on o1, o1-versioned, or on o3-mini and beyond, and gpt-5 models. Not on o1-mini or other GPT-models.\n\t\t\t\t\t\t'/modelId': [{ _cnd: { regex: '(^o1([-\\\\d]+)?$)|(^o[3-9].*)|(^gpt-5.*)' } }],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Max Tool Calls Iterations',\n\t\t\t\tname: 'maxToolsIterations',\n\t\t\t\ttype: 'number',\n\t\t\t\tdefault: 15,\n\t\t\t\tdescription:\n\t\t\t\t\t'The maximum number of tool iteration cycles the LLM will run before stopping. A single iteration can contain multiple tool calls. Set to 0 for no limit.',\n\t\t\t},\n\t\t],\n\t},\n];\n\nconst displayOptions = {\n\tshow: {\n\t\toperation: ['message'],\n\t\tresource: ['text'],\n\t},\n};\n\nexport const description = updateDisplayOptions(displayOptions, properties);\n\nexport async function execute(this: IExecuteFunctions, i: number): Promise<INodeExecutionData[]> {\n\tconst model = this.getNodeParameter('modelId', i, '', { extractValue: true });\n\tlet messages = this.getNodeParameter('messages.values', i, []) as IDataObject[];\n\tconst options = this.getNodeParameter('options', i, {});\n\tconst jsonOutput = this.getNodeParameter('jsonOutput', i, false) as boolean;\n\tconst maxToolsIterations = this.getNodeParameter('options.maxToolsIterations', i, 15) as number;\n\n\tconst abortSignal = this.getExecutionCancelSignal();\n\n\tif (options.maxTokens !== undefined) {\n\t\toptions.max_completion_tokens = options.maxTokens;\n\t\tdelete options.maxTokens;\n\t}\n\n\tif (options.topP !== undefined) {\n\t\toptions.top_p = options.topP;\n\t\tdelete options.topP;\n\t}\n\n\tlet response_format;\n\tif (jsonOutput) {\n\t\tresponse_format = { type: 'json_object' };\n\t\tmessages = [\n\t\t\t{\n\t\t\t\trole: 'system',\n\t\t\t\tcontent: 'You are a helpful assistant designed to output JSON.',\n\t\t\t},\n\t\t\t...messages,\n\t\t];\n\t}\n\n\tconst hideTools = this.getNodeParameter('hideTools', i, '') as string;\n\n\tlet tools;\n\tlet externalTools: Tool[] = [];\n\n\tif (hideTools !== 'hide') {\n\t\tconst enforceUniqueNames = true;\n\t\texternalTools = await getConnectedTools(this, enforceUniqueNames, false);\n\t}\n\n\tif (externalTools.length) {\n\t\ttools = externalTools.length ? externalTools?.map(formatToOpenAIAssistantTool) : undefined;\n\t}\n\n\tconst body: IDataObject = {\n\t\tmodel,\n\t\tmessages,\n\t\ttools,\n\t\tresponse_format,\n\t\t..._omit(options, ['maxToolsIterations']),\n\t};\n\n\tlet response = (await apiRequest.call(this, 'POST', '/chat/completions', {\n\t\tbody,\n\t})) as ChatCompletion;\n\n\tif (!response) return [];\n\n\tlet currentIteration = 1;\n\tlet toolCalls = response?.choices[0]?.message?.tool_calls;\n\n\twhile (toolCalls?.length) {\n\t\t// Break the loop if the max iterations is reached or the execution is canceled\n\t\tif (\n\t\t\tabortSignal?.aborted ||\n\t\t\t(maxToolsIterations > 0 && currentIteration >= maxToolsIterations)\n\t\t) {\n\t\t\tbreak;\n\t\t}\n\t\tmessages.push(response.choices[0].message);\n\n\t\tfor (const toolCall of toolCalls) {\n\t\t\tconst functionName = toolCall.function.name;\n\t\t\tconst functionArgs = toolCall.function.arguments;\n\n\t\t\tlet functionResponse;\n\t\t\tfor (const tool of externalTools ?? []) {\n\t\t\t\tif (tool.name === functionName) {\n\t\t\t\t\tconst parsedArgs: { input: string } = jsonParse(functionArgs);\n\t\t\t\t\tconst functionInput = parsedArgs.input ?? parsedArgs ?? functionArgs;\n\t\t\t\t\tfunctionResponse = await tool.invoke(functionInput);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (typeof functionResponse === 'object') {\n\t\t\t\tfunctionResponse = JSON.stringify(functionResponse);\n\t\t\t}\n\n\t\t\tmessages.push({\n\t\t\t\ttool_call_id: toolCall.id,\n\t\t\t\trole: 'tool',\n\t\t\t\tcontent: functionResponse,\n\t\t\t});\n\t\t}\n\n\t\tresponse = (await apiRequest.call(this, 'POST', '/chat/completions', {\n\t\t\tbody,\n\t\t})) as ChatCompletion;\n\n\t\ttoolCalls = response.choices[0].message.tool_calls;\n\t\tcurrentIteration += 1;\n\t}\n\n\tif (response_format) {\n\t\tresponse.choices = response.choices.map((choice) => {\n\t\t\ttry {\n\t\t\t\tchoice.message.content = JSON.parse(choice.message.content);\n\t\t\t} catch (error) {}\n\t\t\treturn choice;\n\t\t});\n\t}\n\n\tconst simplify = this.getNodeParameter('simplify', i) as boolean;\n\n\tconst returnData: INodeExecutionData[] = [];\n\n\tif (simplify) {\n\t\tfor (const entry of response.choices) {\n\t\t\treturnData.push({\n\t\t\t\tjson: entry,\n\t\t\t\tpairedItem: { item: i },\n\t\t\t});\n\t\t}\n\t} else {\n\t\treturnData.push({ json: response, pairedItem: { item: i } });\n\t}\n\n\treturn returnData;\n}\n"],"mappings":"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","names":["_omit"]}
|