diff --git a/api/server/controllers/agents/callbacks.js b/api/server/controllers/agents/callbacks.js index 6138964ba..db9ce5921 100644 --- a/api/server/controllers/agents/callbacks.js +++ b/api/server/controllers/agents/callbacks.js @@ -95,6 +95,19 @@ class ModelEndHandler { } } +/** + * @deprecated Agent Chain helper + * @param {string | undefined} [last_agent_id] + * @param {string | undefined} [langgraph_node] + * @returns {boolean} + */ +function checkIfLastAgent(last_agent_id, langgraph_node) { + if (!last_agent_id || !langgraph_node) { + return false; + } + return langgraph_node?.endsWith(last_agent_id); +} + /** * Get default handlers for stream events. * @param {Object} options - The options object. @@ -125,7 +138,7 @@ function getDefaultHandlers({ res, aggregateContent, toolEndCallback, collectedU handle: (event, data, metadata) => { if (data?.stepDetails.type === StepTypes.TOOL_CALLS) { sendEvent(res, { event, data }); - } else if (metadata?.last_agent_index === metadata?.agent_index) { + } else if (checkIfLastAgent(metadata?.last_agent_id, metadata?.langgraph_node)) { sendEvent(res, { event, data }); } else if (!metadata?.hide_sequential_outputs) { sendEvent(res, { event, data }); @@ -154,7 +167,7 @@ function getDefaultHandlers({ res, aggregateContent, toolEndCallback, collectedU handle: (event, data, metadata) => { if (data?.delta.type === StepTypes.TOOL_CALLS) { sendEvent(res, { event, data }); - } else if (metadata?.last_agent_index === metadata?.agent_index) { + } else if (checkIfLastAgent(metadata?.last_agent_id, metadata?.langgraph_node)) { sendEvent(res, { event, data }); } else if (!metadata?.hide_sequential_outputs) { sendEvent(res, { event, data }); @@ -172,7 +185,7 @@ function getDefaultHandlers({ res, aggregateContent, toolEndCallback, collectedU handle: (event, data, metadata) => { if (data?.result != null) { sendEvent(res, { event, data }); - } else if (metadata?.last_agent_index === metadata?.agent_index) { + } else if (checkIfLastAgent(metadata?.last_agent_id, metadata?.langgraph_node)) { sendEvent(res, { event, data }); } else if (!metadata?.hide_sequential_outputs) { sendEvent(res, { event, data }); @@ -188,7 +201,7 @@ function getDefaultHandlers({ res, aggregateContent, toolEndCallback, collectedU * @param {GraphRunnableConfig['configurable']} [metadata] The runnable metadata. */ handle: (event, data, metadata) => { - if (metadata?.last_agent_index === metadata?.agent_index) { + if (checkIfLastAgent(metadata?.last_agent_id, metadata?.langgraph_node)) { sendEvent(res, { event, data }); } else if (!metadata?.hide_sequential_outputs) { sendEvent(res, { event, data }); @@ -204,7 +217,7 @@ function getDefaultHandlers({ res, aggregateContent, toolEndCallback, collectedU * @param {GraphRunnableConfig['configurable']} [metadata] The runnable metadata. */ handle: (event, data, metadata) => { - if (metadata?.last_agent_index === metadata?.agent_index) { + if (checkIfLastAgent(metadata?.last_agent_id, metadata?.langgraph_node)) { sendEvent(res, { event, data }); } else if (!metadata?.hide_sequential_outputs) { sendEvent(res, { event, data }); diff --git a/api/server/controllers/agents/client.js b/api/server/controllers/agents/client.js index 8139e83b4..f12dcacca 100644 --- a/api/server/controllers/agents/client.js +++ b/api/server/controllers/agents/client.js @@ -867,6 +867,9 @@ class AgentClient extends BaseClient { if (userMCPAuthMap != null) { config.configurable.userMCPAuthMap = userMCPAuthMap; } + + /** @deprecated Agent Chain */ + config.configurable.last_agent_id = agents[agents.length - 1].id; await run.processStream({ messages }, config, { callbacks: { [Callback.TOOL_ERROR]: logToolError, @@ -877,6 +880,20 @@ class AgentClient extends BaseClient { }; await runAgents(initialMessages); + /** @deprecated Agent Chain */ + if (config.configurable.hide_sequential_outputs) { + this.contentParts = this.contentParts.filter((part, index) => { + // Include parts that are either: + // 1. At or after the finalContentStart index + // 2. Of type tool_call + // 3. Have tool_call_ids property + return ( + index >= this.contentParts.length - 1 || + part.type === ContentTypes.TOOL_CALL || + part.tool_call_ids + ); + }); + } try { const attachments = await this.awaitMemoryWithTimeout(memoryPromise); diff --git a/api/server/services/Endpoints/agents/initialize.js b/api/server/services/Endpoints/agents/initialize.js index 305328aeb..3064a0366 100644 --- a/api/server/services/Endpoints/agents/initialize.js +++ b/api/server/services/Endpoints/agents/initialize.js @@ -192,6 +192,7 @@ const initializeClient = async ({ req, res, signal, endpointOption }) => { } } + /** @deprecated Agent Chain */ if (agent_ids?.length) { for (const agentId of agent_ids) { if (checkAgentInit(agentId)) { diff --git a/packages/api/src/agents/chain.ts b/packages/api/src/agents/chain.ts index fe8377ade..8326dbe6f 100644 --- a/packages/api/src/agents/chain.ts +++ b/packages/api/src/agents/chain.ts @@ -7,6 +7,7 @@ const DEFAULT_PROMPT_TEMPLATE = `Based on the following conversation and analysi /** * Helper function to create sequential chain edges with buffer string prompts * + * @deprecated Agent Chain helper * @param agentIds - Array of agent IDs in order of execution * @param promptTemplate - Optional prompt template string; defaults to a predefined template if not provided * @returns Array of edges configured for sequential chain with buffer prompts