feat: add Gemini built-in tools URL Context and Google Search for enhanced functionality

This commit is contained in:
Henry 2025-09-15 18:14:47 +01:00
parent c4322ce70b
commit bdcaad34b6
1 changed files with 108 additions and 43 deletions

View File

@ -161,6 +161,27 @@ class Agent_Agentflow implements INode {
agentModel: 'chatOpenAI'
}
},
{
label: 'Gemini Built-in Tools',
name: 'agentToolsBuiltInGemini',
type: 'multiOptions',
optional: true,
options: [
{
label: 'URL Context',
name: 'urlContext',
description: 'Extract content from given URLs'
},
{
label: 'Google Search',
name: 'googleSearch',
description: 'Search real-time web content'
}
],
show: {
agentModel: 'chatGoogleGenerativeAI'
}
},
{
label: 'Tools',
name: 'agentTools',
@ -765,6 +786,23 @@ class Agent_Agentflow implements INode {
}
}
const agentToolsBuiltInGemini = convertMultiOptionsToStringArray(nodeData.inputs?.agentToolsBuiltInGemini)
if (agentToolsBuiltInGemini && agentToolsBuiltInGemini.length > 0) {
for (const tool of agentToolsBuiltInGemini) {
const builtInTool: ICommonObject = {
[tool]: {}
}
;(toolsInstance as any).push(builtInTool)
;(availableTools as any).push({
name: tool,
toolNode: {
label: tool,
name: tool
}
})
}
}
if (llmNodeInstance && toolsInstance.length > 0) {
if (llmNodeInstance.bindTools === undefined) {
throw new Error(`Agent needs to have a function calling capable models.`)
@ -1177,12 +1215,10 @@ class Agent_Agentflow implements INode {
return builtInUsedTools
}
const { output, tools } = response.response_metadata
if (!output || !Array.isArray(output) || output.length === 0 || !tools || !Array.isArray(tools) || tools.length === 0) {
return builtInUsedTools
}
const { output, tools, groundingMetadata, urlContextMetadata } = response.response_metadata
// Handle OpenAI built-in tools
if (output && Array.isArray(output) && output.length > 0 && tools && Array.isArray(tools) && tools.length > 0) {
for (const outputItem of output) {
if (outputItem.type && outputItem.type.endsWith('_call')) {
let toolInput = outputItem.action ?? outputItem.code
@ -1226,6 +1262,35 @@ class Agent_Agentflow implements INode {
}
}
}
}
// Handle Gemini googleSearch tool
if (groundingMetadata && groundingMetadata.webSearchQueries && Array.isArray(groundingMetadata.webSearchQueries)) {
// Check for duplicates
if (!builtInUsedTools.find((tool) => tool.tool === 'googleSearch')) {
builtInUsedTools.push({
tool: 'googleSearch',
toolInput: {
queries: groundingMetadata.webSearchQueries
},
toolOutput: `Searched for: ${groundingMetadata.webSearchQueries.join(', ')}`
})
}
}
// Handle Gemini urlContext tool
if (urlContextMetadata && urlContextMetadata.urlMetadata && Array.isArray(urlContextMetadata.urlMetadata)) {
// Check for duplicates
if (!builtInUsedTools.find((tool) => tool.tool === 'urlContext')) {
builtInUsedTools.push({
tool: 'urlContext',
toolInput: {
urlMetadata: urlContextMetadata.urlMetadata
},
toolOutput: `Processed ${urlContextMetadata.urlMetadata.length} URL(s)`
})
}
}
return builtInUsedTools
}