diff --git a/src/renderer/src/aiCore/chunk/AiSdkToChunkAdapter.ts b/src/renderer/src/aiCore/chunk/AiSdkToChunkAdapter.ts index ef86ce2035..5495bb0d36 100644 --- a/src/renderer/src/aiCore/chunk/AiSdkToChunkAdapter.ts +++ b/src/renderer/src/aiCore/chunk/AiSdkToChunkAdapter.ts @@ -185,9 +185,8 @@ export class AiSdkToChunkAdapter { source: WebSearchSource.GEMINI } }) - } else { + } else if (final.webSearchResults.length) { const providerName = Object.keys(providerMetadata || {})[0] - // console.log('providerName', providerName) switch (providerName) { case WebSearchSource.OPENAI: this.onChunk({ diff --git a/src/renderer/src/aiCore/legacy/middleware/core/McpToolChunkMiddleware.ts b/src/renderer/src/aiCore/legacy/middleware/core/McpToolChunkMiddleware.ts index c0d85b0fde..fc0327925e 100644 --- a/src/renderer/src/aiCore/legacy/middleware/core/McpToolChunkMiddleware.ts +++ b/src/renderer/src/aiCore/legacy/middleware/core/McpToolChunkMiddleware.ts @@ -1,5 +1,5 @@ import { loggerService } from '@logger' -import { MCPCallToolResponse, MCPTool, MCPToolResponse, Model, ToolCallResponse } from '@renderer/types' +import { MCPCallToolResponse, MCPTool, MCPToolResponse, Model } from '@renderer/types' import { ChunkType, MCPToolCreatedChunk } from '@renderer/types/chunk' import { SdkMessageParam, SdkRawOutput, SdkToolCall } from '@renderer/types/sdk' import { @@ -230,7 +230,7 @@ async function executeToolCalls( model: Model, topicId?: string ): Promise<{ toolResults: SdkMessageParam[]; confirmedToolCalls: SdkToolCall[] }> { - const mcpToolResponses: ToolCallResponse[] = toolCalls + const mcpToolResponses: MCPToolResponse[] = toolCalls .map((toolCall) => { const mcpTool = ctx.apiClientInstance.convertSdkToolCallToMcp(toolCall, mcpTools) if (!mcpTool) { @@ -238,7 +238,7 @@ async function executeToolCalls( } return ctx.apiClientInstance.convertSdkToolCallToMcpToolResponse(toolCall, mcpTool) }) - .filter((t): t is ToolCallResponse => typeof t !== 'undefined') + .filter((t): t is MCPToolResponse => typeof t !== 'undefined') if (mcpToolResponses.length === 0) { logger.warn(`No valid MCP tool responses to execute`) diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageWebSearch.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageWebSearch.tsx index 64ea9b005f..a399c790e8 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageWebSearch.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageWebSearch.tsx @@ -53,6 +53,7 @@ const PrepareToolWrapper = styled.span` align-items: center; gap: 4px; font-size: 14px; + padding: 5px; padding-left: 0; ` @@ -60,6 +61,7 @@ const MessageWebSearchToolTitleTextWrapper = styled(Text)` display: flex; align-items: center; gap: 4px; + padding: 5px; ` // const MessageWebSearchToolBodyUlWrapper = styled.ul` diff --git a/src/renderer/src/types/chunk.ts b/src/renderer/src/types/chunk.ts index 15aa442600..6111060bad 100644 --- a/src/renderer/src/types/chunk.ts +++ b/src/renderer/src/types/chunk.ts @@ -1,6 +1,7 @@ import { ExternalToolResult, KnowledgeReference, + MCPTool, MCPToolResponse, NormalToolResponse, ToolUseResponse, @@ -294,7 +295,7 @@ export interface ExternalToolCompleteChunk { export interface MCPToolCreatedChunk { type: ChunkType.MCP_TOOL_CREATED tool_calls?: SdkToolCall[] // 工具调用 - tool_use_responses?: ToolUseResponse[] // 工具使用响应 + tool_use_responses?: (Omit & { tool: MCPTool })[] // 工具使用响应 } export interface MCPToolPendingChunk { diff --git a/src/renderer/src/types/index.ts b/src/renderer/src/types/index.ts index a6e6e3da85..b836a994c7 100644 --- a/src/renderer/src/types/index.ts +++ b/src/renderer/src/types/index.ts @@ -883,6 +883,7 @@ export interface MCPToolResponse extends Omit { tool: BaseTool + toolCallId: string } export interface MCPToolResultContent { diff --git a/src/renderer/src/utils/mcp-tools.ts b/src/renderer/src/utils/mcp-tools.ts index 1dc64a170e..d7c732737b 100644 --- a/src/renderer/src/utils/mcp-tools.ts +++ b/src/renderer/src/utils/mcp-tools.ts @@ -328,7 +328,11 @@ export function isToolAutoApproved(tool: BaseTool, server?: MCPServer): boolean return effectiveServer ? !effectiveServer.disabledAutoApproveTools?.includes(mcpTool.name) : false } -export function parseToolUse(content: string, mcpTools: MCPTool[], startIdx: number = 0): ToolUseResponse[] { +export function parseToolUse( + content: string, + mcpTools: MCPTool[], + startIdx: number = 0 +): (Omit & { tool: MCPTool })[] { if (!content || !mcpTools || mcpTools.length === 0) { return [] } @@ -346,7 +350,7 @@ export function parseToolUse(content: string, mcpTools: MCPTool[], startIdx: num const toolUsePattern = /([\s\S]*?)([\s\S]*?)<\/name>([\s\S]*?)([\s\S]*?)<\/arguments>([\s\S]*?)<\/tool_use>/g - const tools: ToolUseResponse[] = [] + const tools: (Omit & { tool: MCPTool })[] = [] let match let idx = startIdx // Find all tool use blocks