From 02a67534989141f5391287341c113a49914e2bf2 Mon Sep 17 00:00:00 2001 From: Henry Heng Date: Sat, 7 Jun 2025 01:53:31 +0100 Subject: [PATCH] Bugfix/Overrideconfig Analytics in AgentflowV2 (#4599) * fix(utils/buildAgentflow): enhance analytic handler configuration to support overrides * fix(agentflow): integrate analytic handlers for tool execution tracking --- .../components/nodes/agentflow/Agent/Agent.ts | 26 +++++++++++++++++++ packages/server/src/utils/buildAgentflow.ts | 9 ++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/packages/components/nodes/agentflow/Agent/Agent.ts b/packages/components/nodes/agentflow/Agent/Agent.ts index 4c974cc3..fd227735 100644 --- a/packages/components/nodes/agentflow/Agent/Agent.ts +++ b/packages/components/nodes/agentflow/Agent/Agent.ts @@ -1401,10 +1401,19 @@ class Agent_Agentflow implements INode { return { response, usedTools, sourceDocuments, artifacts, totalTokens, isWaitingForHumanInput: true } } + let toolIds: ICommonObject | undefined + if (options.analyticHandlers) { + toolIds = await options.analyticHandlers.onToolStart(toolCall.name, toolCall.args, options.parentTraceIds) + } + try { //@ts-ignore let toolOutput = await selectedTool.call(toolCall.args, { signal: abortController?.signal }, undefined, flowConfig) + if (options.analyticHandlers && toolIds) { + await options.analyticHandlers.onToolEnd(toolIds, toolOutput) + } + // Extract source documents if present if (typeof toolOutput === 'string' && toolOutput.includes(SOURCE_DOCUMENTS_PREFIX)) { const [output, docs] = toolOutput.split(SOURCE_DOCUMENTS_PREFIX) @@ -1459,6 +1468,10 @@ class Agent_Agentflow implements INode { toolOutput }) } catch (e) { + if (options.analyticHandlers && toolIds) { + await options.analyticHandlers.onToolEnd(toolIds, e) + } + console.error('Error invoking tool:', e) usedTools.push({ tool: selectedTool.name, @@ -1650,10 +1663,19 @@ class Agent_Agentflow implements INode { toolsInstance = toolsInstance.filter((tool) => tool.name !== toolCall.name) } if (humanInput.type === 'proceed') { + let toolIds: ICommonObject | undefined + if (options.analyticHandlers) { + toolIds = await options.analyticHandlers.onToolStart(toolCall.name, toolCall.args, options.parentTraceIds) + } + try { //@ts-ignore let toolOutput = await selectedTool.call(toolCall.args, { signal: abortController?.signal }, undefined, flowConfig) + if (options.analyticHandlers && toolIds) { + await options.analyticHandlers.onToolEnd(toolIds, toolOutput) + } + // Extract source documents if present if (typeof toolOutput === 'string' && toolOutput.includes(SOURCE_DOCUMENTS_PREFIX)) { const [output, docs] = toolOutput.split(SOURCE_DOCUMENTS_PREFIX) @@ -1708,6 +1730,10 @@ class Agent_Agentflow implements INode { toolOutput }) } catch (e) { + if (options.analyticHandlers && toolIds) { + await options.analyticHandlers.onToolEnd(toolIds, e) + } + console.error('Error invoking tool:', e) usedTools.push({ tool: selectedTool.name, diff --git a/packages/server/src/utils/buildAgentflow.ts b/packages/server/src/utils/buildAgentflow.ts index 4ce91285..37805497 100644 --- a/packages/server/src/utils/buildAgentflow.ts +++ b/packages/server/src/utils/buildAgentflow.ts @@ -1503,7 +1503,14 @@ export const executeAgentFlow = async ({ try { if (chatflow.analytic) { - analyticHandlers = AnalyticHandler.getInstance({ inputs: {} } as any, { + // Override config analytics + let analyticInputs: ICommonObject = {} + if (overrideConfig?.analytics && Object.keys(overrideConfig.analytics).length > 0) { + analyticInputs = { + ...overrideConfig.analytics + } + } + analyticHandlers = AnalyticHandler.getInstance({ inputs: { analytics: analyticInputs } } as any, { orgId, workspaceId, appDataSource,