From 9393ee7f9887f8a4be53e4a66b0c68214fe7479e 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 c01e585244..525d102034 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'); @@ -439,6 +440,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 de8834f468..c002403592 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. @@ -470,7 +462,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: { @@ -655,7 +647,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: () => {} },