From b8235f5c75125c0a527e040eebcd8d2563f737b0 Mon Sep 17 00:00:00 2001 From: suyao Date: Thu, 29 Jan 2026 20:49:17 +0800 Subject: [PATCH] fix: typecheck again --- package.json | 8 ++- packages/ai-sdk-provider/package.json | 6 +-- .../toolUsePlugin/promptToolUsePlugin.ts | 2 +- pnpm-lock.yaml | 49 ++++++++++++++----- .../src/aiCore/plugins/PluginBuilder.ts | 7 ++- ...eMiddleware.ts => anthropicCachePlugin.ts} | 15 +++++- .../aiCore/prepareParams/parameterBuilder.ts | 17 +++---- .../src/aiCore/types/middlewareConfig.ts | 1 + 8 files changed, 74 insertions(+), 31 deletions(-) rename src/renderer/src/aiCore/plugins/{anthropicCacheMiddleware.ts => anthropicCachePlugin.ts} (85%) diff --git a/package.json b/package.json index b4be401d3e..1990341c2e 100644 --- a/package.json +++ b/package.json @@ -94,17 +94,21 @@ "@agentic/tavily": "^7.3.3", "@ai-sdk/amazon-bedrock": "^4.0.37", "@ai-sdk/anthropic": "^3.0.29", + "@ai-sdk/azure": "^3.0.22", "@ai-sdk/cerebras": "^2.0.24", "@ai-sdk/gateway": "^3.0.27", "@ai-sdk/google": "3.0.0", "@ai-sdk/google-vertex": "^4.0.35", "@ai-sdk/huggingface": "^1.0.23", "@ai-sdk/mistral": "^3.0.13", - "@ai-sdk/openai": "3.0.0", + "@ai-sdk/openai": "^3.0.0", "@ai-sdk/perplexity": "^3.0.12", "@ai-sdk/provider": "^3.0.5", "@ai-sdk/provider-utils": "^4.0.10", "@ai-sdk/test-server": "^1.0.3", + "@ai-sdk/xai": "^3.0.0", + "@ant-design/cssinjs": "1.23.0", + "@ant-design/icons": "5.6.1", "@ant-design/v5-patch-for-react-19": "^1.0.3", "@anthropic-ai/sdk": "^0.41.0", "@anthropic-ai/vertex-sdk": "0.11.4", @@ -201,6 +205,7 @@ "@tiptap/y-tiptap": "^3.0.0", "@truto/turndown-plugin-gfm": "^1.0.2", "@tryfabric/martian": "^1.2.4", + "@types/adm-zip": "^0.5.7", "@types/cli-progress": "^3", "@types/content-type": "^1.1.9", "@types/cors": "^2.8.19", @@ -244,6 +249,7 @@ "@viz-js/lang-dot": "^1.0.5", "@viz-js/viz": "^3.14.0", "@xyflow/react": "^12.4.4", + "adm-zip": "0.4.16", "ai": "^6.0.59", "antd": "5.27.0", "archiver": "^7.0.1", diff --git a/packages/ai-sdk-provider/package.json b/packages/ai-sdk-provider/package.json index 4b60e32bd2..1459f41f5e 100644 --- a/packages/ai-sdk-provider/package.json +++ b/packages/ai-sdk-provider/package.json @@ -36,14 +36,14 @@ }, "peerDependencies": { "@ai-sdk/anthropic": "^3.0.0", - "@ai-sdk/google": "^3.0.0", + "@ai-sdk/google": "3.0.0", "@ai-sdk/openai": "^3.0.0", "ai": "^6.0.26" }, "dependencies": { "@ai-sdk/openai-compatible": "2.0.0", - "@ai-sdk/provider": "^3.0.0", - "@ai-sdk/provider-utils": "^4.0.0" + "@ai-sdk/provider": "^3.0.5", + "@ai-sdk/provider-utils": "^4.0.10" }, "devDependencies": { "tsdown": "^0.13.3", diff --git a/packages/aiCore/src/core/plugins/built-in/toolUsePlugin/promptToolUsePlugin.ts b/packages/aiCore/src/core/plugins/built-in/toolUsePlugin/promptToolUsePlugin.ts index 2755c9259f..b647ba611e 100644 --- a/packages/aiCore/src/core/plugins/built-in/toolUsePlugin/promptToolUsePlugin.ts +++ b/packages/aiCore/src/core/plugins/built-in/toolUsePlugin/promptToolUsePlugin.ts @@ -302,7 +302,7 @@ export const createPromptToolUsePlugin = ( const promptTools: ToolSet = {} for (const [toolName, tool] of Object.entries(params.tools as ToolSet)) { - if (tool.type === 'provider-defined') { + if (tool.type === 'provider') { // provider 类型的工具保留在 tools 参数中 providerDefinedTools[toolName] = tool } else { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 67c3f8508f..0d562a4336 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -164,6 +164,9 @@ importers: '@ai-sdk/anthropic': specifier: ^3.0.29 version: 3.0.29(zod@4.3.4) + '@ai-sdk/azure': + specifier: ^3.0.22 + version: 3.0.22(zod@4.3.4) '@ai-sdk/cerebras': specifier: ^2.0.24 version: 2.0.24(zod@4.3.4) @@ -183,8 +186,8 @@ importers: specifier: ^3.0.13 version: 3.0.13(zod@4.3.4) '@ai-sdk/openai': - specifier: 3.0.0 - version: 3.0.0(patch_hash=0de8145a8df9e7d3d2166789cf1a033e7560d2383142dd7dda4a461b36db2d72)(zod@4.3.4) + specifier: ^3.0.0 + version: 3.0.21(zod@4.3.4) '@ai-sdk/perplexity': specifier: ^3.0.12 version: 3.0.12(zod@4.3.4) @@ -197,6 +200,15 @@ importers: '@ai-sdk/test-server': specifier: ^1.0.3 version: 1.0.3(@types/node@22.17.2)(typescript@5.8.3) + '@ai-sdk/xai': + specifier: ^3.0.0 + version: 3.0.41(zod@4.3.4) + '@ant-design/cssinjs': + specifier: 1.23.0 + version: 1.23.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@ant-design/icons': + specifier: 5.6.1 + version: 5.6.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@ant-design/v5-patch-for-react-19': specifier: ^1.0.3 version: 1.0.3(antd@5.27.0(patch_hash=cdc383bd0d9b9fe0df2ce7b1f1d4ead200012b7f9517d9257b4ea0a5b324e243)(moment@2.30.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -485,6 +497,9 @@ importers: '@tryfabric/martian': specifier: ^1.2.4 version: 1.2.4(encoding@0.1.13) + '@types/adm-zip': + specifier: ^0.5.7 + version: 0.5.7 '@types/cli-progress': specifier: ^3 version: 3.11.6 @@ -614,6 +629,9 @@ importers: '@xyflow/react': specifier: ^12.4.4 version: 12.10.0(@types/react@19.2.7)(immer@11.1.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + adm-zip: + specifier: 0.4.16 + version: 0.4.16 ai: specifier: ^6.0.59 version: 6.0.59(zod@4.3.4) @@ -1201,7 +1219,7 @@ importers: specifier: ^3.0.0 version: 3.0.29(zod@4.3.6) '@ai-sdk/google': - specifier: ^3.0.0 + specifier: 3.0.0 version: 3.0.0(patch_hash=540e635fb8eaa926cb5541afd0842705ed1530ce94ec9627d9e9694ccea58115)(zod@4.3.6) '@ai-sdk/openai': specifier: ^3.0.0 @@ -1210,10 +1228,10 @@ importers: specifier: 2.0.0 version: 2.0.0(patch_hash=8485d66a36f6f8fc2640cd0a3da860a01fb7b7b94f9ef7847f7e14fa333f8ea8)(zod@4.3.6) '@ai-sdk/provider': - specifier: ^3.0.0 + specifier: ^3.0.5 version: 3.0.5 '@ai-sdk/provider-utils': - specifier: ^4.0.0 + specifier: ^4.0.10 version: 4.0.10(zod@4.3.6) ai: specifier: ^6.0.26 @@ -5061,6 +5079,9 @@ packages: '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/adm-zip@0.5.7': + resolution: {integrity: sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw==} + '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -16693,6 +16714,10 @@ snapshots: tslib: 2.8.1 optional: true + '@types/adm-zip@0.5.7': + dependencies: + '@types/node': 22.17.2 + '@types/aria-query@5.0.4': {} '@types/body-parser@1.19.6': @@ -17702,11 +17727,11 @@ snapshots: - utf-8-validate - vite - '@vitest/browser@3.2.4(msw@2.12.7(@types/node@24.10.4)(typescript@5.8.3))(playwright@1.57.0)(rolldown-vite@7.3.0(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(vitest@3.2.4)': + '@vitest/browser@3.2.4(msw@2.12.7(@types/node@24.10.4)(typescript@5.8.3))(playwright@1.57.0)(rolldown-vite@7.3.0(@types/node@22.17.2)(esbuild@0.25.12)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(vitest@3.2.4)': dependencies: '@testing-library/dom': 10.4.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) - '@vitest/mocker': 3.2.4(msw@2.12.7(@types/node@24.10.4)(typescript@5.8.3))(rolldown-vite@7.3.0(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(msw@2.12.7(@types/node@24.10.4)(typescript@5.8.3))(rolldown-vite@7.3.0(@types/node@22.17.2)(esbuild@0.25.12)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/utils': 3.2.4 magic-string: 0.30.21 sirv: 3.0.2 @@ -17760,14 +17785,14 @@ snapshots: msw: 2.12.7(@types/node@22.17.2)(typescript@5.8.3) vite: rolldown-vite@7.3.0(@types/node@22.17.2)(esbuild@0.25.12)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/mocker@3.2.4(msw@2.12.7(@types/node@24.10.4)(typescript@5.8.3))(rolldown-vite@7.3.0(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@3.2.4(msw@2.12.7(@types/node@24.10.4)(typescript@5.8.3))(rolldown-vite@7.3.0(@types/node@22.17.2)(esbuild@0.25.12)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.12.7(@types/node@24.10.4)(typescript@5.8.3) - vite: rolldown-vite@7.3.0(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + vite: rolldown-vite@7.3.0(@types/node@22.17.2)(esbuild@0.25.12)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) '@vitest/pretty-format@3.2.4': dependencies: @@ -17798,7 +17823,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.4)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(esbuild@0.25.12)(jiti@2.6.1)(jsdom@26.1.0)(msw@2.12.7(@types/node@24.10.4)(typescript@5.8.3))(tsx@4.21.0)(yaml@2.8.2) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(esbuild@0.25.12)(jiti@2.6.1)(jsdom@26.1.0)(msw@2.12.7(@types/node@22.17.2)(typescript@5.8.3))(tsx@4.21.0)(yaml@2.8.2) '@vitest/utils@3.2.4': dependencies: @@ -25175,7 +25200,7 @@ snapshots: dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.12.7(@types/node@24.10.4)(typescript@5.8.3))(rolldown-vite@7.3.0(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(msw@2.12.7(@types/node@24.10.4)(typescript@5.8.3))(rolldown-vite@7.3.0(@types/node@22.17.2)(esbuild@0.25.12)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -25199,7 +25224,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 24.10.4 - '@vitest/browser': 3.2.4(msw@2.12.7(@types/node@24.10.4)(typescript@5.8.3))(playwright@1.57.0)(rolldown-vite@7.3.0(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(vitest@3.2.4) + '@vitest/browser': 3.2.4(msw@2.12.7(@types/node@24.10.4)(typescript@5.8.3))(playwright@1.57.0)(rolldown-vite@7.3.0(@types/node@22.17.2)(esbuild@0.25.12)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(vitest@3.2.4) '@vitest/ui': 3.2.4(vitest@3.2.4) jsdom: 26.1.0 transitivePeerDependencies: diff --git a/src/renderer/src/aiCore/plugins/PluginBuilder.ts b/src/renderer/src/aiCore/plugins/PluginBuilder.ts index 13db9de183..3226b4f7f9 100644 --- a/src/renderer/src/aiCore/plugins/PluginBuilder.ts +++ b/src/renderer/src/aiCore/plugins/PluginBuilder.ts @@ -11,6 +11,7 @@ import { getAiSdkProviderId } from '../provider/factory' import type { AiSdkMiddlewareConfig } from '../types/middlewareConfig' import { isOpenRouterGeminiGenerateImageModel } from '../utils/image' import { getReasoningTagName } from '../utils/reasoning' +import { createAnthropicCachePlugin } from './anthropicCachePlugin' import { createNoThinkPlugin } from './noThinkPlugin' import { createOpenrouterGenerateImagePlugin } from './openrouterGenerateImagePlugin' import { createOpenrouterReasoningPlugin } from './openrouterReasoningPlugin' @@ -26,7 +27,7 @@ const logger = loggerService.withContext('PluginBuilder') * 根据条件构建插件数组 */ export function buildPlugins( - middlewareConfig: AiSdkMiddlewareConfig & { assistant: Assistant; topicId?: string; mcpMode?: string } + middlewareConfig: AiSdkMiddlewareConfig & { assistant: Assistant; topicId?: string } ): AiPlugin[] { const plugins: AiPlugin[] = [] @@ -55,6 +56,10 @@ export function buildPlugins( const tagName = getReasoningTagName(middlewareConfig.model?.id.toLowerCase()) plugins.push(createReasoningExtractionPlugin({ tagName })) } + + if (providerType === 'anthropic' && middlewareConfig.provider.anthropicCacheControl?.tokenThreshold) { + plugins.push(createAnthropicCachePlugin()) + } } // 0.3 OpenRouter reasoning redaction diff --git a/src/renderer/src/aiCore/plugins/anthropicCacheMiddleware.ts b/src/renderer/src/aiCore/plugins/anthropicCachePlugin.ts similarity index 85% rename from src/renderer/src/aiCore/plugins/anthropicCacheMiddleware.ts rename to src/renderer/src/aiCore/plugins/anthropicCachePlugin.ts index c122d3e76f..eeac5c3db8 100644 --- a/src/renderer/src/aiCore/plugins/anthropicCacheMiddleware.ts +++ b/src/renderer/src/aiCore/plugins/anthropicCachePlugin.ts @@ -3,6 +3,7 @@ * @see https://ai-sdk.dev/providers/ai-sdk-providers/anthropic#cache-control */ import type { LanguageModelV3Message } from '@ai-sdk/provider' +import { definePlugin } from '@cherrystudio/ai-core/core/plugins' import { estimateTextTokens } from '@renderer/services/TokenService' import type { Provider } from '@renderer/types' import type { LanguageModelMiddleware } from 'ai' @@ -24,9 +25,9 @@ function estimateContentTokens(content: LanguageModelV3Message['content']): numb return 0 } -export function anthropicCacheMiddleware(provider: Provider): LanguageModelMiddleware { +function anthropicCacheMiddleware(provider: Provider): LanguageModelMiddleware { return { - middlewareVersion: 'v3', + specificationVersion: 'v3', transformParams: async ({ params }) => { const settings = provider.anthropicCacheControl if (!settings?.tokenThreshold || !Array.isArray(params.prompt) || params.prompt.length === 0) { @@ -83,3 +84,13 @@ export function anthropicCacheMiddleware(provider: Provider): LanguageModelMiddl } } } + +export const createAnthropicCachePlugin = () => + definePlugin({ + name: 'anthropicCache', + enforce: 'pre', + configureContext: (context) => { + context.middlewares = context.middlewares || [] + context.middlewares.push(anthropicCacheMiddleware(context.provider)) + } + }) diff --git a/src/renderer/src/aiCore/prepareParams/parameterBuilder.ts b/src/renderer/src/aiCore/prepareParams/parameterBuilder.ts index 80b310662f..5327096eae 100644 --- a/src/renderer/src/aiCore/prepareParams/parameterBuilder.ts +++ b/src/renderer/src/aiCore/prepareParams/parameterBuilder.ts @@ -195,17 +195,12 @@ export async function buildStreamTextParams( case 'anthropic': case 'azure-anthropic': case 'google-vertex-anthropic': - tools.web_fetch = ( - ['anthropic', 'azure-anthropic'].includes(aiSdkProviderId) - ? anthropic.tools.webFetch_20250910({ - maxUses: webSearchConfig.maxResults, - blockedDomains: blockedDomains.length > 0 ? blockedDomains : undefined - }) - : vertexAnthropic.tools.webFetch_20250910({ - maxUses: webSearchConfig.maxResults, - blockedDomains: blockedDomains.length > 0 ? blockedDomains : undefined - }) - ) as ProviderDefinedTool + if (['anthropic', 'azure-anthropic'].includes(aiSdkProviderId)) { + tools.web_fetch = anthropic.tools.webFetch_20250910({ + maxUses: webSearchConfig.maxResults, + blockedDomains: blockedDomains.length > 0 ? blockedDomains : undefined + }) as ProviderDefinedTool + } break } } diff --git a/src/renderer/src/aiCore/types/middlewareConfig.ts b/src/renderer/src/aiCore/types/middlewareConfig.ts index 94743cb140..41e01603a2 100644 --- a/src/renderer/src/aiCore/types/middlewareConfig.ts +++ b/src/renderer/src/aiCore/types/middlewareConfig.ts @@ -23,4 +23,5 @@ export interface AiSdkMiddlewareConfig { uiMessages?: Message[] webSearchPluginConfig?: WebSearchPluginConfig knowledgeRecognition?: 'off' | 'on' + mcpMode?: string }