From 46739a5bc464af81ebf5145d2ae37fd3bfbb5fa8 Mon Sep 17 00:00:00 2001 From: Michael Kret <88898367+michael-radency@users.noreply.github.com> Date: Thu, 23 Apr 2026 09:33:51 +0300 Subject: [PATCH] feat(Google Gemini Node): Gemini default models update (#28853) --- .../LmChatGoogleGemini.node.ts | 117 ++++++++++-------- .../GoogleGemini/actions/descriptions.ts | 3 + .../actions/image/generate.operation.ts | 10 +- .../actions/text/message.operation.ts | 7 +- .../actions/versionDescription.ts | 4 +- .../GoogleGemini/methods/listSearch.test.ts | 13 ++ .../GoogleGemini/methods/listSearch.ts | 4 + 7 files changed, 105 insertions(+), 53 deletions(-) diff --git a/packages/@n8n/nodes-langchain/nodes/llms/LmChatGoogleGemini/LmChatGoogleGemini.node.ts b/packages/@n8n/nodes-langchain/nodes/llms/LmChatGoogleGemini/LmChatGoogleGemini.node.ts index ee162fe5541..223617c3dc4 100644 --- a/packages/@n8n/nodes-langchain/nodes/llms/LmChatGoogleGemini/LmChatGoogleGemini.node.ts +++ b/packages/@n8n/nodes-langchain/nodes/llms/LmChatGoogleGemini/LmChatGoogleGemini.node.ts @@ -7,6 +7,7 @@ import type { INodeTypeDescription, ISupplyDataFunctions, SupplyData, + INodeProperties, } from 'n8n-workflow'; import { getAdditionalOptions } from '../gemini-common/additional-options'; @@ -23,6 +24,61 @@ function errorDescriptionMapper(error: NodeError) { return error.description ?? 'Unknown error'; } + +const modelRLC: INodeProperties = { + displayName: 'Model', + name: 'modelName', + type: 'options', + description: + 'The model which will generate the completion. Learn more.', + typeOptions: { + loadOptions: { + routing: { + request: { + method: 'GET', + url: '/v1beta/models', + }, + output: { + postReceive: [ + { + type: 'rootProperty', + properties: { + property: 'models', + }, + }, + { + type: 'filter', + properties: { + pass: "={{ !$responseItem.name.includes('embedding') }}", + }, + }, + { + type: 'setKeyValue', + properties: { + name: '={{$responseItem.name}}', + value: '={{$responseItem.name}}', + description: '={{$responseItem.description}}', + }, + }, + { + type: 'sort', + properties: { + key: 'name', + }, + }, + ], + }, + }, + }, + }, + routing: { + send: { + type: 'body', + property: 'model', + }, + }, + default: 'models/gemini-2.5-flash', +}; export class LmChatGoogleGemini implements INodeType { description: INodeTypeDescription = { displayName: 'Google Gemini Chat Model', @@ -30,7 +86,7 @@ export class LmChatGoogleGemini implements INodeType { name: 'lmChatGoogleGemini', icon: 'file:google.svg', group: ['transform'], - version: 1, + version: [1, 1.1], description: 'Chat Model Google Gemini', defaults: { name: 'Google Gemini Chat Model', @@ -67,58 +123,21 @@ export class LmChatGoogleGemini implements INodeType { properties: [ getConnectionHintNoticeField([NodeConnectionTypes.AiChain, NodeConnectionTypes.AiAgent]), { - displayName: 'Model', - name: 'modelName', - type: 'options', - description: - 'The model which will generate the completion. Learn more.', - typeOptions: { - loadOptions: { - routing: { - request: { - method: 'GET', - url: '/v1beta/models', - }, - output: { - postReceive: [ - { - type: 'rootProperty', - properties: { - property: 'models', - }, - }, - { - type: 'filter', - properties: { - pass: "={{ !$responseItem.name.includes('embedding') }}", - }, - }, - { - type: 'setKeyValue', - properties: { - name: '={{$responseItem.name}}', - value: '={{$responseItem.name}}', - description: '={{$responseItem.description}}', - }, - }, - { - type: 'sort', - properties: { - key: 'name', - }, - }, - ], - }, - }, + ...modelRLC, + displayOptions: { + show: { + '@version': [{ _cnd: { eq: 1 } }], }, }, - routing: { - send: { - type: 'body', - property: 'model', + }, + { + ...modelRLC, + default: 'models/gemini-3-flash-preview', + displayOptions: { + show: { + '@version': [{ _cnd: { gte: 1.1 } }], }, }, - default: 'models/gemini-2.5-flash', }, // thinking budget not supported in @langchain/google-genai // as it utilises the old google generative ai SDK diff --git a/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/actions/descriptions.ts b/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/actions/descriptions.ts index 87c2c329eb9..3a7e8f0b71a 100644 --- a/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/actions/descriptions.ts +++ b/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/actions/descriptions.ts @@ -5,6 +5,9 @@ export const modelRLC = (searchListMethod: string): INodeProperties => ({ name: 'modelId', type: 'resourceLocator', default: { mode: 'list', value: '' }, + typeOptions: { + loadOptionsDependsOn: ['operation', 'resource'], + }, required: true, modes: [ { diff --git a/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/actions/image/generate.operation.ts b/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/actions/image/generate.operation.ts index e6248b6897d..6177786a074 100644 --- a/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/actions/image/generate.operation.ts +++ b/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/actions/image/generate.operation.ts @@ -12,7 +12,15 @@ import { apiRequest } from '../../transport'; import { modelRLC } from '../descriptions'; const properties: INodeProperties[] = [ - modelRLC('imageGenerationModelSearch'), + { + ...modelRLC('imageGenerationModelSearch'), + displayOptions: { show: { '@version': [{ _cnd: { lt: 1.2 } }] } }, + }, + { + ...modelRLC('imageGenerationModelSearch'), + default: { mode: 'list', value: 'models/gemini-3.1-flash-image-preview' }, + displayOptions: { show: { '@version': [{ _cnd: { gte: 1.2 } }] } }, + }, { displayName: 'Prompt', name: 'prompt', diff --git a/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/actions/text/message.operation.ts b/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/actions/text/message.operation.ts index 1e073f1f8e3..0d5ea801ee7 100644 --- a/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/actions/text/message.operation.ts +++ b/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/actions/text/message.operation.ts @@ -23,7 +23,12 @@ import { apiRequest } from '../../transport'; import { modelRLC } from '../descriptions'; const properties: INodeProperties[] = [ - modelRLC('modelSearch'), + { ...modelRLC('modelSearch'), displayOptions: { show: { '@version': [{ _cnd: { lt: 1.2 } }] } } }, + { + ...modelRLC('modelSearch'), + default: { mode: 'list', value: 'models/gemini-3-flash-preview' }, + displayOptions: { show: { '@version': [{ _cnd: { gte: 1.2 } }] } }, + }, { displayName: 'Messages', name: 'messages', diff --git a/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/actions/versionDescription.ts b/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/actions/versionDescription.ts index c99de4c58a0..6a5b353cbeb 100644 --- a/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/actions/versionDescription.ts +++ b/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/actions/versionDescription.ts @@ -14,8 +14,8 @@ export const versionDescription: INodeTypeDescription = { name: 'googleGemini', icon: 'file:gemini.svg', group: ['transform'], - version: [1, 1.1], - defaultVersion: 1.1, + version: [1, 1.1, 1.2], + defaultVersion: 1.2, subtitle: '={{ $parameter["operation"] + ": " + $parameter["resource"] }}', description: 'Interact with Google Gemini AI models', defaults: { diff --git a/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/methods/listSearch.test.ts b/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/methods/listSearch.test.ts index c22df9918cb..6ddcb565c18 100644 --- a/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/methods/listSearch.test.ts +++ b/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/methods/listSearch.test.ts @@ -45,6 +45,9 @@ const mockResponse = { { name: 'models/gemini-3-pro-image', }, + { + name: 'models/gemini-3.1-flash-image-preview', + }, ], }; @@ -143,6 +146,11 @@ describe('GoogleGemini -> listSearch', () => { name: 'models/gemini-3-pro-image (Nano Banana Pro)', value: 'models/gemini-3-pro-image', }, + { + // eslint-disable-next-line n8n-nodes-base/node-param-display-name-miscased + name: 'models/gemini-3.1-flash-image-preview (Nano Banana 2)', + value: 'models/gemini-3.1-flash-image-preview', + }, ], }); }); @@ -181,6 +189,11 @@ describe('GoogleGemini -> listSearch', () => { name: 'models/gemini-3-pro-image (Nano Banana Pro)', value: 'models/gemini-3-pro-image', }, + { + // eslint-disable-next-line n8n-nodes-base/node-param-display-name-miscased + name: 'models/gemini-3.1-flash-image-preview (Nano Banana 2)', + value: 'models/gemini-3.1-flash-image-preview', + }, ], }); }); diff --git a/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/methods/listSearch.ts b/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/methods/listSearch.ts index b037cc851fa..518fd5dc8bd 100644 --- a/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/methods/listSearch.ts +++ b/packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/methods/listSearch.ts @@ -66,6 +66,10 @@ export async function imageGenerationModelSearch( ): Promise { const rawResult = await baseModelSearch.call(this, (model) => model.includes('image')); let results = rawResult.results.map((r) => { + if (r.name.includes('gemini-3.1-flash-image')) { + return { name: `${r.name} (Nano Banana 2)`, value: r.value }; + } + if (r.name.includes('gemini-2.5-flash-image')) { return { name: `${r.name} (Nano Banana)`, value: r.value }; }