From 8619e07ee13e6507a66a5c45ca1966207fa89c19 Mon Sep 17 00:00:00 2001 From: Jaakko Husso Date: Mon, 15 Dec 2025 15:07:24 +0200 Subject: [PATCH] feat(core): Add SerpApi Google search support to Chat hub (#23199) --- packages/@n8n/api-types/src/chat-hub.ts | 3 ++- .../chatHub/components/ToolsSelectorModal.vue | 11 +++++++++- .../ai/chatHub/composables/availableTools.ts | 22 ++++++++++++++++++- packages/workflow/src/constants.ts | 3 +++ 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/packages/@n8n/api-types/src/chat-hub.ts b/packages/@n8n/api-types/src/chat-hub.ts index 5d22a39f3ea..009727700d9 100644 --- a/packages/@n8n/api-types/src/chat-hub.ts +++ b/packages/@n8n/api-types/src/chat-hub.ts @@ -1,6 +1,7 @@ import { type StructuredChunk, type JINA_AI_TOOL_NODE_TYPE, + type SERP_API_TOOL_NODE_TYPE, type INode, INodeSchema, } from 'n8n-workflow'; @@ -59,7 +60,7 @@ export const PROVIDER_CREDENTIAL_TYPE_MAP: Record< mistralCloud: 'mistralCloudApi', }; -export type ChatHubAgentTool = typeof JINA_AI_TOOL_NODE_TYPE; +export type ChatHubAgentTool = typeof JINA_AI_TOOL_NODE_TYPE | typeof SERP_API_TOOL_NODE_TYPE; /** * Chat Hub conversation model configuration diff --git a/packages/frontend/editor-ui/src/features/ai/chatHub/components/ToolsSelectorModal.vue b/packages/frontend/editor-ui/src/features/ai/chatHub/components/ToolsSelectorModal.vue index 6ecee5b3506..2c38036c13e 100644 --- a/packages/frontend/editor-ui/src/features/ai/chatHub/components/ToolsSelectorModal.vue +++ b/packages/frontend/editor-ui/src/features/ai/chatHub/components/ToolsSelectorModal.vue @@ -15,7 +15,12 @@ import { useCredentialsStore } from '@/features/credentials/credentials.store'; import type { ICredentialsResponse } from '@/features/credentials/credentials.types'; import { createEventBus } from '@n8n/utils/event-bus'; import { type ChatHubAgentTool } from '@n8n/api-types'; -import { type INode, deepCopy, JINA_AI_TOOL_NODE_TYPE } from 'n8n-workflow'; +import { + type INode, + deepCopy, + JINA_AI_TOOL_NODE_TYPE, + SERP_API_TOOL_NODE_TYPE, +} from 'n8n-workflow'; import { AVAILABLE_TOOLS, type ChatHubToolProvider } from '../composables/availableTools'; import { ElSwitch } from 'element-plus'; import { useUIStore } from '@/app/stores/ui.store'; @@ -46,18 +51,22 @@ const canCreateCredentials = computed(() => { }); const selectedByProvider = ref>>({ + [SERP_API_TOOL_NODE_TYPE]: new Set(), [JINA_AI_TOOL_NODE_TYPE]: new Set(), }); const credentialIdByProvider = ref>({ + [SERP_API_TOOL_NODE_TYPE]: null, [JINA_AI_TOOL_NODE_TYPE]: null, }); function resetSelections() { selectedByProvider.value = { + [SERP_API_TOOL_NODE_TYPE]: new Set(), [JINA_AI_TOOL_NODE_TYPE]: new Set(), }; credentialIdByProvider.value = { + [SERP_API_TOOL_NODE_TYPE]: null, [JINA_AI_TOOL_NODE_TYPE]: null, }; } diff --git a/packages/frontend/editor-ui/src/features/ai/chatHub/composables/availableTools.ts b/packages/frontend/editor-ui/src/features/ai/chatHub/composables/availableTools.ts index e5180e3a9ce..9d451c55e74 100644 --- a/packages/frontend/editor-ui/src/features/ai/chatHub/composables/availableTools.ts +++ b/packages/frontend/editor-ui/src/features/ai/chatHub/composables/availableTools.ts @@ -1,5 +1,5 @@ import { type ChatHubAgentTool } from '@n8n/api-types'; -import { type INode, JINA_AI_TOOL_NODE_TYPE } from 'n8n-workflow'; +import { type INode, JINA_AI_TOOL_NODE_TYPE, SERP_API_TOOL_NODE_TYPE } from 'n8n-workflow'; import { v4 as uuidv4 } from 'uuid'; export interface ChatHubToolProvider { @@ -17,6 +17,26 @@ export interface ChatHubToolProvider { // to re-select it at their current sessions. This won't affecet custom builder agents, // the tools defined on them are always used as-is. export const AVAILABLE_TOOLS: Record = { + [SERP_API_TOOL_NODE_TYPE]: { + name: 'SerpApi', + description: 'Use SerpApi to search the web for relevant information.', + credentialType: 'serpApi', + tools: [ + { + title: 'Google Search', + node: { + parameters: { + options: {}, + }, + type: SERP_API_TOOL_NODE_TYPE, + typeVersion: 1, + position: [0, 0], + id: uuidv4(), + name: 'SerpApi Google Search', + }, + }, + ], + }, [JINA_AI_TOOL_NODE_TYPE]: { name: 'Jina AI', description: 'Use Jina AI to search the web for relevant information.', diff --git a/packages/workflow/src/constants.ts b/packages/workflow/src/constants.ts index e58d18f5e94..788d97f3613 100644 --- a/packages/workflow/src/constants.ts +++ b/packages/workflow/src/constants.ts @@ -47,7 +47,10 @@ export const MAILGUN_NODE_TYPE = 'n8n-nodes-base.mailgun'; export const POSTGRES_NODE_TYPE = 'n8n-nodes-base.postgres'; export const MYSQL_NODE_TYPE = 'n8n-nodes-base.mySql'; export const SCHEDULE_TRIGGER_NODE_TYPE = 'n8n-nodes-base.scheduleTrigger'; + +// Chat hub (search) tools export const JINA_AI_TOOL_NODE_TYPE = 'n8n-nodes-base.jinaAiTool'; +export const SERP_API_TOOL_NODE_TYPE = '@n8n/n8n-nodes-langchain.toolSerpApi'; export const STARTING_NODE_TYPES = [ MANUAL_TRIGGER_NODE_TYPE,