feat(Google Gemini Node): Gemini default models update (#28853)

This commit is contained in:
Michael Kret
2026-04-23 06:33:51 +00:00
committed by GitHub
parent 7d6f777808
commit 46739a5bc4
7 changed files with 105 additions and 53 deletions
@@ -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. <a href="https://developers.generativeai.google/api/rest/generativelanguage/models/list">Learn more</a>.',
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. <a href="https://developers.generativeai.google/api/rest/generativelanguage/models/list">Learn more</a>.',
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
@@ -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: [
{
@@ -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',
@@ -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',
@@ -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: {
@@ -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',
},
],
});
});
@@ -66,6 +66,10 @@ export async function imageGenerationModelSearch(
): Promise<INodeListSearchResult> {
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 };
}