diff --git a/packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts b/packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts index 6182757d55015..1db5ef7706fca 100644 --- a/packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts +++ b/packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts @@ -264,6 +264,38 @@ export class LmChatOpenAi implements INodeType { 'Controls randomness: Lowering results in less random completions. As the temperature approaches zero, the model will become deterministic and repetitive.', type: 'number', }, + { + displayName: 'Reasoning Effort', + name: 'reasoningEffort', + default: 'medium', + 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.', + type: 'options', + options: [ + { + name: 'Low', + value: 'low', + description: 'Favors speed and economical token usage', + }, + { + name: 'Medium', + value: 'medium', + description: 'Balance between speed and reasoning accuracy', + }, + { + name: 'High', + value: 'high', + description: + 'Favors more complete reasoning at the cost of more tokens generated and slower responses', + }, + ], + displayOptions: { + show: { + // reasoning_effort is only available on o1, o1-versioned, or on o3-mini and beyond. Not on o1-mini or other GPT-models. + '/model': [{ _cnd: { regex: '(^o1([-\\d]+)?$)|(^o[3-9].*)' } }], + }, + }, + }, { displayName: 'Timeout', name: 'timeout', @@ -311,6 +343,7 @@ export class LmChatOpenAi implements INodeType { temperature?: number; topP?: number; responseFormat?: 'text' | 'json_object'; + reasoningEffort?: 'low' | 'medium' | 'high'; }; const configuration: ClientOptions = {}; @@ -320,6 +353,15 @@ export class LmChatOpenAi implements INodeType { configuration.baseURL = credentials.url as string; } + // Extra options to send to OpenAI, that are not directly supported by LangChain + const modelKwargs: { + response_format?: object; + reasoning_effort?: 'low' | 'medium' | 'high'; + } = {}; + if (options.responseFormat) modelKwargs.response_format = { type: options.responseFormat }; + if (options.reasoningEffort && ['low', 'medium', 'high'].includes(options.reasoningEffort)) + modelKwargs.reasoning_effort = options.reasoningEffort; + const model = new ChatOpenAI({ openAIApiKey: credentials.apiKey as string, modelName, @@ -328,11 +370,7 @@ export class LmChatOpenAi implements INodeType { maxRetries: options.maxRetries ?? 2, configuration, callbacks: [new N8nLlmTracing(this)], - modelKwargs: options.responseFormat - ? { - response_format: { type: options.responseFormat }, - } - : undefined, + modelKwargs, onFailedAttempt: makeN8nLlmFailedAttemptHandler(this, openAiFailedAttemptHandler), });