From b3ace68178fb4490dd794b205eaba310fc18334a Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Mon, 8 Dec 2025 14:57:14 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20chore:=20Update=20@librechat/age?= =?UTF-8?q?nts=20to=20version=203.0.49=20and=20enhance=20tool=20calling=20?= =?UTF-8?q?logic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/package.json | 2 +- api/server/controllers/agents/callbacks.js | 7 +++++-- .../components/Chat/Messages/Content/Part.tsx | 6 +++++- .../Messages/Content/Parts/ExecuteCode.tsx | 2 +- client/src/locales/en/translation.json | 2 +- package-lock.json | 10 +++++----- packages/api/package.json | 2 +- packages/api/src/tools/classification.ts | 20 ++++++++++--------- packages/data-provider/src/config.ts | 2 ++ 9 files changed, 32 insertions(+), 21 deletions(-) diff --git a/api/package.json b/api/package.json index 2affb2af60..27a0ff4a05 100644 --- a/api/package.json +++ b/api/package.json @@ -43,7 +43,7 @@ "@googleapis/youtube": "^20.0.0", "@keyv/redis": "^4.3.3", "@langchain/core": "^0.3.79", - "@librechat/agents": "^3.0.44", + "@librechat/agents": "^3.0.49", "@librechat/api": "*", "@librechat/data-schemas": "*", "@microsoft/microsoft-graph-client": "^3.0.7", diff --git a/api/server/controllers/agents/callbacks.js b/api/server/controllers/agents/callbacks.js index 4742495fc7..de1f1ef831 100644 --- a/api/server/controllers/agents/callbacks.js +++ b/api/server/controllers/agents/callbacks.js @@ -1,5 +1,6 @@ const { nanoid } = require('nanoid'); const { sendEvent } = require('@librechat/api'); +const { Constants } = require('@librechat/agents'); const { logger } = require('@librechat/data-schemas'); const { Tools, StepTypes, FileContext, ErrorTypes } = require('librechat-data-provider'); const { @@ -406,9 +407,11 @@ function createToolEndCallback({ req, res, artifactPromises }) { } return; } - + // Constants.PROGRAMMATIC_TOOL_CALLING { - if (output.name !== Tools.execute_code) { + const isCodeTool = + output.name === Tools.execute_code || output.name === Constants.PROGRAMMATIC_TOOL_CALLING; + if (!isCodeTool) { return; } } diff --git a/client/src/components/Chat/Messages/Content/Part.tsx b/client/src/components/Chat/Messages/Content/Part.tsx index 16de45d476..5dfb1702a9 100644 --- a/client/src/components/Chat/Messages/Content/Part.tsx +++ b/client/src/components/Chat/Messages/Content/Part.tsx @@ -91,7 +91,11 @@ const Part = memo( const isToolCall = 'args' in toolCall && (!toolCall.type || toolCall.type === ToolCallTypes.TOOL_CALL); - if (isToolCall && toolCall.name === Tools.execute_code) { + if ( + isToolCall && + (toolCall.name === Tools.execute_code || + toolCall.name === Constants.PROGRAMMATIC_TOOL_CALLING) + ) { return ( (0); const prevShowCodeRef = useRef(showCode); - const { lang, code } = useParseArgs(args) ?? ({} as ParsedArgs); + const { lang = 'py', code } = useParseArgs(args) ?? ({} as ParsedArgs); const progress = useProgress(initialProgress); useEffect(() => { diff --git a/client/src/locales/en/translation.json b/client/src/locales/en/translation.json index d4e0756608..430069d508 100644 --- a/client/src/locales/en/translation.json +++ b/client/src/locales/en/translation.json @@ -698,7 +698,7 @@ "com_ui_mcp_servers_allow_use": "Allow users to use MCP servers", "com_ui_all": "all", "com_ui_all_proper": "All", - "com_ui_analyzing": "Analyzing", + "com_ui_analyzing": "Running tools with code", "com_ui_analyzing_finished": "Finished analyzing", "com_ui_api_key": "API Key", "com_ui_archive": "Archive", diff --git a/package-lock.json b/package-lock.json index 77672c497e..9f005444d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,7 +57,7 @@ "@googleapis/youtube": "^20.0.0", "@keyv/redis": "^4.3.3", "@langchain/core": "^0.3.79", - "@librechat/agents": "^3.0.44", + "@librechat/agents": "^3.0.49", "@librechat/api": "*", "@librechat/data-schemas": "*", "@microsoft/microsoft-graph-client": "^3.0.7", @@ -18226,9 +18226,9 @@ } }, "node_modules/@librechat/agents": { - "version": "3.0.44", - "resolved": "https://registry.npmjs.org/@librechat/agents/-/agents-3.0.44.tgz", - "integrity": "sha512-7H0JKUrut1KgSYNqis6Da3hcJsRvTop3yfWREbCwBkt9cpS7Bhh9baehkOeeO4G0ofR8DGcC+FzAVkSaSGodZQ==", + "version": "3.0.49", + "resolved": "https://registry.npmjs.org/@librechat/agents/-/agents-3.0.49.tgz", + "integrity": "sha512-hD6/C98AquOwajKuK99Fp7JIdvyzzJTUe8hjHExTVvFbSjHPdL+MJPV2U08u4zQi3e6vL0mP7cm7JaJ47mWNDA==", "license": "MIT", "dependencies": { "@langchain/anthropic": "^0.3.26", @@ -48137,7 +48137,7 @@ "@azure/storage-blob": "^12.27.0", "@keyv/redis": "^4.3.3", "@langchain/core": "^0.3.79", - "@librechat/agents": "^3.0.44", + "@librechat/agents": "^3.0.49", "@librechat/data-schemas": "*", "@modelcontextprotocol/sdk": "^1.24.3", "axios": "^1.12.1", diff --git a/packages/api/package.json b/packages/api/package.json index e8bf40bf5b..c38b5d03e8 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -84,7 +84,7 @@ "@azure/storage-blob": "^12.27.0", "@keyv/redis": "^4.3.3", "@langchain/core": "^0.3.79", - "@librechat/agents": "^3.0.44", + "@librechat/agents": "^3.0.49", "@librechat/data-schemas": "*", "@modelcontextprotocol/sdk": "^1.24.3", "axios": "^1.12.1", diff --git a/packages/api/src/tools/classification.ts b/packages/api/src/tools/classification.ts index 4dccb61a04..8044917381 100644 --- a/packages/api/src/tools/classification.ts +++ b/packages/api/src/tools/classification.ts @@ -282,8 +282,10 @@ export interface BuildToolClassificationResult { /** * Checks if an agent is allowed to have classification features based on TOOL_CLASSIFICATION_AGENT_IDS. + * If TOOL_CLASSIFICATION_AGENT_IDS is not set, all agents are allowed (including when no agentId). + * If set, requires agentId to be in the list. * @param agentId - The agent ID to check - * @returns Whether the agent is allowed (true if no restriction set, or agent is in the list) + * @returns Whether the agent is allowed */ export function isAgentAllowedForClassification(agentId?: string): boolean { const allowedAgentIds = parseToolList(process.env.TOOL_CLASSIFICATION_AGENT_IDS); @@ -344,6 +346,14 @@ export async function buildToolClassification( const { loadedTools, userId, agentId, loadAuthValues } = params; const additionalTools: GenericTool[] = []; + /** Check if this agent is allowed to have classification features (requires agentId) */ + if (!isAgentAllowedForClassification(agentId)) { + logger.debug( + `[buildToolClassification] Agent ${agentId ?? 'undefined'} not allowed for classification, skipping`, + ); + return { toolRegistry: undefined, additionalTools }; + } + const mcpTools = loadedTools.filter(isMCPTool); if (mcpTools.length === 0) { return { toolRegistry: undefined, additionalTools }; @@ -355,14 +365,6 @@ export async function buildToolClassification( /** Clean up temporary mcpJsonSchema property from tools now that registry is populated */ cleanupMCPToolSchemas(mcpTools); - /** Check if this agent is allowed to have classification features */ - if (!isAgentAllowedForClassification(agentId)) { - logger.debug( - `[buildToolClassification] Agent ${agentId} not in TOOL_CLASSIFICATION_AGENT_IDS, skipping PTC/ToolSearch`, - ); - return { toolRegistry, additionalTools }; - } - /** * Check if this agent actually has tools that match the patterns. * Only enable PTC if the agent has programmatic tools. diff --git a/packages/data-provider/src/config.ts b/packages/data-provider/src/config.ts index 1792843452..e33e16f7bc 100644 --- a/packages/data-provider/src/config.ts +++ b/packages/data-provider/src/config.ts @@ -1643,6 +1643,8 @@ export enum Constants { LC_TRANSFER_TO_ = 'lc_transfer_to_', /** Placeholder Agent ID for Ephemeral Agents */ EPHEMERAL_AGENT_ID = 'ephemeral', + /** Programmatic Tool Calling tool name */ + PROGRAMMATIC_TOOL_CALLING = 'run_tools_with_code', } export enum LocalStorageKeys {