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 };
}