From 417f90df3bf0d2cd2a117de7bfb847d8ddb3eb15 Mon Sep 17 00:00:00 2001 From: MyPrototypeWhat Date: Mon, 25 Aug 2025 16:04:47 +0800 Subject: [PATCH] feat(dependencies): update @ai-sdk/openai and @ai-sdk/provider-utils versions - Upgraded `@ai-sdk/openai` to version 2.0.19 in `yarn.lock` and `package.json` for improved functionality and compatibility. - Updated `@ai-sdk/provider-utils` to version 3.0.5, enhancing dependency management. - Added `TypedToolError` type export in `index.ts` for better error handling. - Removed unnecessary console logs in `webSearchPlugin` for cleaner code. - Refactored type handling in `createProvider` to ensure proper type assertions. - Enforced `topicId` as a required field in the `ModernAiProvider` configuration for stricter validation. --- packages/aiCore/package.json | 2 +- .../plugins/built-in/webSearchPlugin/index.ts | 1 - packages/aiCore/src/core/providers/creator.ts | 2 +- packages/aiCore/src/index.ts | 1 + .../src/aiCore/chunk/AiSdkToChunkAdapter.ts | 33 ++++++++++++++----- .../src/aiCore/chunk/handleToolCallChunk.ts | 22 +++++++++---- src/renderer/src/aiCore/index_new.ts | 7 +--- .../provider/ProviderConfigProcessor.ts | 4 --- yarn.lock | 30 +++++++++++++++-- 9 files changed, 71 insertions(+), 31 deletions(-) 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"