diff --git a/packages/aiCore/package.json b/packages/aiCore/package.json index 538b39cc7a..e44c62a244 100644 --- a/packages/aiCore/package.json +++ b/packages/aiCore/package.json @@ -37,7 +37,7 @@ "@ai-sdk/azure": "^2.0.16", "@ai-sdk/deepseek": "^1.0.9", "@ai-sdk/google": "^2.0.7", - "@ai-sdk/openai": "^2.0.16", + "@ai-sdk/openai": "^2.0.19", "@ai-sdk/openai-compatible": "^1.0.9", "@ai-sdk/provider": "^2.0.0", "@ai-sdk/provider-utils": "^3.0.4", diff --git a/packages/aiCore/src/core/plugins/built-in/webSearchPlugin/index.ts b/packages/aiCore/src/core/plugins/built-in/webSearchPlugin/index.ts index 2d8d5ea1fb..3d549eeac4 100644 --- a/packages/aiCore/src/core/plugins/built-in/webSearchPlugin/index.ts +++ b/packages/aiCore/src/core/plugins/built-in/webSearchPlugin/index.ts @@ -23,7 +23,6 @@ export const webSearchPlugin = (config: WebSearchPluginConfig = DEFAULT_WEB_SEAR transformParams: async (params: any, context: AiRequestContext) => { const { providerId } = context - console.log('providerId', providerId) switch (providerId) { case 'openai': { if (config.openai) { diff --git a/packages/aiCore/src/core/providers/creator.ts b/packages/aiCore/src/core/providers/creator.ts index 455d7e5114..d64f4e8e31 100644 --- a/packages/aiCore/src/core/providers/creator.ts +++ b/packages/aiCore/src/core/providers/creator.ts @@ -40,7 +40,7 @@ export async function createProvider(config: ProviderConfig, options: any): Prom // 方式二:动态导入 + 函数名 if (config.import && config.creatorFunctionName) { - const module = await config.import() + const module = (await config.import()) as Record const creatorFunction = module[config.creatorFunctionName] if (typeof creatorFunction !== 'function') { diff --git a/packages/aiCore/src/index.ts b/packages/aiCore/src/index.ts index 0a6519ffa5..b2f42a7ab5 100644 --- a/packages/aiCore/src/index.ts +++ b/packages/aiCore/src/index.ts @@ -98,6 +98,7 @@ export type { ToolResultPart, ToolSet, TypedToolCall, + TypedToolError, TypedToolResult, UserModelMessage } from 'ai' diff --git a/src/renderer/src/aiCore/chunk/AiSdkToChunkAdapter.ts b/src/renderer/src/aiCore/chunk/AiSdkToChunkAdapter.ts index f151dce576..57be46f6d7 100644 --- a/src/renderer/src/aiCore/chunk/AiSdkToChunkAdapter.ts +++ b/src/renderer/src/aiCore/chunk/AiSdkToChunkAdapter.ts @@ -185,19 +185,34 @@ export class AiSdkToChunkAdapter { source: WebSearchSource.GEMINI } }) + } else { + const providerName = Object.keys(providerMetadata || {})[0] + // console.log('providerName', providerName) + switch (providerName) { + case WebSearchSource.OPENAI: + this.onChunk({ + type: ChunkType.LLM_WEB_SEARCH_COMPLETE, + llm_web_search: { + results: final.webSearchResults, + source: WebSearchSource.OPENAI_RESPONSE + } + }) + break + default: + this.onChunk({ + type: ChunkType.LLM_WEB_SEARCH_COMPLETE, + llm_web_search: { + results: final.webSearchResults, + source: WebSearchSource.AISDK + } + }) + break + } } if (finishReason === 'tool-calls') { this.onChunk({ type: ChunkType.LLM_RESPONSE_CREATED }) } - // else { - // this.onChunk({ - // type: ChunkType.LLM_WEB_SEARCH_COMPLETE, - // llm_web_search: { - // results: final.webSearchResults, - // source: WebSearchSource.AISDK - // } - // }) - // } + final.webSearchResults = [] // final.reasoningId = '' break diff --git a/src/renderer/src/aiCore/chunk/handleToolCallChunk.ts b/src/renderer/src/aiCore/chunk/handleToolCallChunk.ts index c6e670f2bf..4ddc9dd927 100644 --- a/src/renderer/src/aiCore/chunk/handleToolCallChunk.ts +++ b/src/renderer/src/aiCore/chunk/handleToolCallChunk.ts @@ -155,7 +155,8 @@ export class ToolCallChunkHandler { return } - let tool: BaseTool | MCPTool + let tool: BaseTool + let mcpTool: MCPTool | undefined // 根据 providerExecuted 标志区分处理逻辑 if (providerExecuted) { @@ -176,15 +177,22 @@ export class ToolCallChunkHandler { description: toolName, type: 'builtin' } as BaseTool - } else { + } else if ((mcpTool = this.mcpTools.find((t) => t.name === toolName) as MCPTool)) { // 如果是客户端执行的 MCP 工具,沿用现有逻辑 logger.info(`[ToolCallChunkHandler] Handling client-side MCP tool: ${toolName}`) - const mcpTool = this.mcpTools.find((t) => t.name === toolName) - if (!mcpTool) { - logger.warn(`[ToolCallChunkHandler] MCP tool not found: ${toolName}`) - return + // mcpTool = this.mcpTools.find((t) => t.name === toolName) as MCPTool + // if (!mcpTool) { + // logger.warn(`[ToolCallChunkHandler] MCP tool not found: ${toolName}`) + // return + // } + tool = mcpTool + } else { + tool = { + id: toolCallId, + name: toolName, + description: toolName, + type: 'provider' } - tool = mcpTool as MCPTool } // 记录活跃的工具调用 diff --git a/src/renderer/src/aiCore/index_new.ts b/src/renderer/src/aiCore/index_new.ts index 0d1dd9fa4f..1758d5d201 100644 --- a/src/renderer/src/aiCore/index_new.ts +++ b/src/renderer/src/aiCore/index_new.ts @@ -69,15 +69,10 @@ export default class ModernAiProvider { config: AiSdkMiddlewareConfig & { assistant: Assistant // topicId for tracing - topicId?: string + topicId: string callType: string } ): Promise { - if (!config.topicId) { - logger.warn('No topicId provided, falling back to regular completions') - return await this.completions(modelId, params, config) - } - const traceName = `${this.actualProvider.name}.${modelId}.${config.callType}` const traceParams: StartSpanParams = { name: traceName, diff --git a/src/renderer/src/aiCore/provider/ProviderConfigProcessor.ts b/src/renderer/src/aiCore/provider/ProviderConfigProcessor.ts index 35776188f9..b1bb0abc12 100644 --- a/src/renderer/src/aiCore/provider/ProviderConfigProcessor.ts +++ b/src/renderer/src/aiCore/provider/ProviderConfigProcessor.ts @@ -38,13 +38,9 @@ export function providerToAiSdkConfig(actualProvider: Provider): { providerId: ProviderId | 'openai-compatible' options: ProviderSettingsMap[keyof ProviderSettingsMap] } { - // console.log('actualProvider', actualProvider) const aiSdkProviderId = getAiSdkProviderId(actualProvider) - // console.log('aiSdkProviderId', aiSdkProviderId) - // 如果provider是openai,则使用strict模式并且默认responses api const actualProviderType = actualProvider.type const openaiResponseOptions = - // 对于实际是openai的需要走responses,aiCore内部会判断model是否可用responses actualProviderType === 'openai-response' ? { mode: 'responses' diff --git a/yarn.lock b/yarn.lock index 03573ad797..83cbf4b839 100644 --- a/yarn.lock +++ b/yarn.lock @@ -215,7 +215,7 @@ __metadata: languageName: node linkType: hard -"@ai-sdk/openai@npm:2.0.16, @ai-sdk/openai@npm:^2.0.16": +"@ai-sdk/openai@npm:2.0.16": version: 2.0.16 resolution: "@ai-sdk/openai@npm:2.0.16" dependencies: @@ -227,6 +227,18 @@ __metadata: languageName: node linkType: hard +"@ai-sdk/openai@npm:^2.0.19": + version: 2.0.19 + resolution: "@ai-sdk/openai@npm:2.0.19" + dependencies: + "@ai-sdk/provider": "npm:2.0.0" + "@ai-sdk/provider-utils": "npm:3.0.5" + peerDependencies: + zod: ^3.25.76 || ^4 + checksum: 10c0/04db695669d783a810b80283e0cd48f6e7654667fd76ca2d35c7cffae6fdd68fb0473118e4e097ef1352f4432dd7c15c07f873d712b940c72495e5839b0ede98 + languageName: node + linkType: hard + "@ai-sdk/provider-utils@npm:3.0.3": version: 3.0.3 resolution: "@ai-sdk/provider-utils@npm:3.0.3" @@ -255,6 +267,20 @@ __metadata: languageName: node linkType: hard +"@ai-sdk/provider-utils@npm:3.0.5": + version: 3.0.5 + resolution: "@ai-sdk/provider-utils@npm:3.0.5" + dependencies: + "@ai-sdk/provider": "npm:2.0.0" + "@standard-schema/spec": "npm:^1.0.0" + eventsource-parser: "npm:^3.0.3" + zod-to-json-schema: "npm:^3.24.1" + peerDependencies: + zod: ^3.25.76 || ^4 + checksum: 10c0/4057810b320bda149a178dc1bfc9cdd592ca88b736c3c22bd0c1f8111c75ef69beec4a523f363e5d0d120348b876942fd66c0bb4965864da4c12c5cfddee15a3 + languageName: node + linkType: hard + "@ai-sdk/provider@npm:2.0.0, @ai-sdk/provider@npm:^2.0.0": version: 2.0.0 resolution: "@ai-sdk/provider@npm:2.0.0" @@ -2197,7 +2223,7 @@ __metadata: "@ai-sdk/azure": "npm:^2.0.16" "@ai-sdk/deepseek": "npm:^1.0.9" "@ai-sdk/google": "npm:^2.0.7" - "@ai-sdk/openai": "npm:^2.0.16" + "@ai-sdk/openai": "npm:^2.0.19" "@ai-sdk/openai-compatible": "npm:^1.0.9" "@ai-sdk/provider": "npm:^2.0.0" "@ai-sdk/provider-utils": "npm:^3.0.4"