mirror of
https://github.com/n8n-io/n8n.git
synced 2026-10-31 11:54:02 +08:00
feat(Google Gemini Node): Gemini default models update (#28853)
This commit is contained in:
+68
-49
@@ -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
|
||||
|
||||
+3
@@ -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: [
|
||||
{
|
||||
|
||||
Vendored
+9
-1
@@ -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',
|
||||
|
||||
+6
-1
@@ -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',
|
||||
|
||||
+2
-2
@@ -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: {
|
||||
|
||||
+13
@@ -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',
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
+4
@@ -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 };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user