From 4e84e4c60729bdd63d03538ed6143e84a2bffe32 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Tue, 24 Feb 2026 18:16:04 -0800 Subject: [PATCH] fix(ui): show real tool names in logs for Anthropic format tools (#22048) --- .../view_logs/ToolsSection/utils.ts | 42 ++++++++++++++----- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/ui/litellm-dashboard/src/components/view_logs/ToolsSection/utils.ts b/ui/litellm-dashboard/src/components/view_logs/ToolsSection/utils.ts index 33b21297c4..351bbf5116 100644 --- a/ui/litellm-dashboard/src/components/view_logs/ToolsSection/utils.ts +++ b/ui/litellm-dashboard/src/components/view_logs/ToolsSection/utils.ts @@ -47,9 +47,9 @@ function extractToolsFromRequest(log: LogEntry): ToolDefinition[] { */ function extractToolCallsFromResponse(log: LogEntry): ToolCall[] { const responseData = parseData(log.response); - + if (!responseData || typeof responseData !== "object") return []; - + // OpenAI format: response.choices[0].message.tool_calls const choices = responseData.choices; if (Array.isArray(choices) && choices.length > 0) { @@ -59,7 +59,24 @@ function extractToolCallsFromResponse(log: LogEntry): ToolCall[] { return message.tool_calls; } } - + + // Anthropic format: response.content[].type === "tool_use" + if (Array.isArray(responseData.content)) { + const toolUseBlocks = responseData.content.filter( + (block: any) => block.type === "tool_use" + ); + if (toolUseBlocks.length > 0) { + return toolUseBlocks.map((block: any) => ({ + id: block.id, + type: "function", + function: { + name: block.name, + arguments: JSON.stringify(block.input || {}), + }, + })); + } + } + return []; } @@ -106,15 +123,20 @@ export function parseToolsFromLog(log: LogEntry): ParsedTool[] { }); // Parse each tool definition - return requestTools.map((tool: ToolDefinition, index: number) => { - const func = tool.function || { name: `Tool ${index + 1}` }; - const name = func.name || `Tool ${index + 1}`; - + // Handle both OpenAI format (tool.function.name) and Anthropic format (tool.name + tool.input_schema) + return requestTools.map((tool: any, index: number) => { + const name = + tool.function?.name || tool.name || `Tool ${index + 1}`; + const description = + tool.function?.description || tool.description || ""; + const parameters = + tool.function?.parameters || tool.input_schema || {}; + return { index: index + 1, - name: name, - description: func.description || "", - parameters: func.parameters || {}, + name, + description, + parameters, called: calledToolNames.has(name), callData: toolCallMap.get(name), };