From 70fbff4a6db62b225460b433d9cbcda684e9ba8f Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Wed, 11 Mar 2026 22:50:25 -0400 Subject: [PATCH] refactor(agents): extract agent log handler for improved clarity and reusability Refactored the agent log handling logic by extracting it into a dedicated function, `agentLogHandler`, enhancing code clarity and reusability across different modules. Updated the event handlers in both the OpenAI and responses controllers to utilize the new handler, ensuring consistent logging behavior throughout the application. --- api/server/controllers/agents/callbacks.js | 23 +++++++++++----------- api/server/controllers/agents/openai.js | 2 ++ api/server/controllers/agents/responses.js | 18 +++++------------ 3 files changed, 19 insertions(+), 24 deletions(-) diff --git a/api/server/controllers/agents/callbacks.js b/api/server/controllers/agents/callbacks.js index 08166c1b3c..7baf13e4a5 100644 --- a/api/server/controllers/agents/callbacks.js +++ b/api/server/controllers/agents/callbacks.js @@ -283,16 +283,7 @@ function getDefaultHandlers({ }; } - handlers[GraphEvents.ON_AGENT_LOG] = { - handle: (_event, data) => { - const logFn = typeof logger[data.level] === 'function' ? logger[data.level] : logger.info; - logFn(`[agents:${data.scope}] ${data.message}`, { - ...data.data, - runId: data.runId, - agentId: data.agentId, - }); - }, - }; + handlers[GraphEvents.ON_AGENT_LOG] = { handle: agentLogHandler }; return handlers; } @@ -717,6 +708,15 @@ function createResponsesToolEndCallback({ req, res, tracker, artifactPromises }) }; } +function agentLogHandler(_event, data) { + const logFn = typeof logger[data.level] === 'function' ? logger[data.level] : logger.info; + logFn(`[agents:${data.scope}] ${data.message}`, { + ...data.data, + runId: data.runId, + agentId: data.agentId, + }); +} + function markSummarizationUsage(usage, metadata) { const node = metadata?.langgraph_node; if (typeof node === 'string' && node.startsWith(GraphNodeKeys.SUMMARIZE)) { @@ -725,8 +725,9 @@ function markSummarizationUsage(usage, metadata) { } module.exports = { + agentLogHandler, getDefaultHandlers, createToolEndCallback, - createResponsesToolEndCallback, markSummarizationUsage, + createResponsesToolEndCallback, }; diff --git a/api/server/controllers/agents/openai.js b/api/server/controllers/agents/openai.js index 781e70e849..f1f0bc9f3b 100644 --- a/api/server/controllers/agents/openai.js +++ b/api/server/controllers/agents/openai.js @@ -25,6 +25,7 @@ const { loadAgentTools, loadToolsForExecution } = require('~/server/services/Too const { createToolEndCallback, markSummarizationUsage, + agentLogHandler, } = require('~/server/controllers/agents/callbacks'); const { findAccessibleResources } = require('~/server/services/PermissionService'); const db = require('~/models'); @@ -440,6 +441,7 @@ const OpenAIChatCompletionController = async (req, res) => { on_chain_stream: createHandler(), on_chain_end: createHandler(), on_agent_update: createHandler(), + on_agent_log: { handle: agentLogHandler }, on_custom_event: createHandler(), // Event-driven tool execution handler on_tool_execute: createToolExecuteHandler(toolExecuteOptions), diff --git a/api/server/controllers/agents/responses.js b/api/server/controllers/agents/responses.js index a57bfdd35d..4b0142c441 100644 --- a/api/server/controllers/agents/responses.js +++ b/api/server/controllers/agents/responses.js @@ -32,8 +32,9 @@ const { } = require('@librechat/api'); const { createResponsesToolEndCallback, - createToolEndCallback, markSummarizationUsage, + createToolEndCallback, + agentLogHandler, } = require('~/server/controllers/agents/callbacks'); const { loadAgentTools, loadToolsForExecution } = require('~/server/services/ToolService'); const { findAccessibleResources } = require('~/server/services/PermissionService'); @@ -50,16 +51,7 @@ function setAppConfig(config) { appConfig = config; } -const agentLogHandler = { - handle: (_event, data) => { - const logFn = typeof logger[data.level] === 'function' ? logger[data.level] : logger.info; - logFn(`[agents:${data.scope}] ${data.message}`, { - ...data.data, - runId: data.runId, - agentId: data.agentId, - }); - }, -}; +const agentLogHandlerObj = { handle: agentLogHandler }; /** * Creates a tool loader function for the agent. @@ -471,7 +463,7 @@ const createResponse = async (req, res) => { on_agent_update: { handle: () => {} }, on_custom_event: { handle: () => {} }, on_tool_execute: createToolExecuteHandler(toolExecuteOptions), - on_agent_log: agentLogHandler, + on_agent_log: agentLogHandlerObj, ...(summarizationConfig?.enabled !== false ? { on_summarize_start: { @@ -657,7 +649,7 @@ const createResponse = async (req, res) => { on_agent_update: { handle: () => {} }, on_custom_event: { handle: () => {} }, on_tool_execute: createToolExecuteHandler(toolExecuteOptions), - on_agent_log: agentLogHandler, + on_agent_log: agentLogHandlerObj, ...(summarizationConfig?.enabled !== false ? { on_summarize_start: { handle: () => {} },