feat: update package dependencies and introduce new patches for AI SDK tools

- Added patches for `@ai-sdk/google-vertex` and `@ai-sdk/openai-compatible` to enhance functionality and fix issues.
- Updated `package.json` to reflect new dependency versions and patch paths.
- Refactored `transformParameters` and `ApiService` to support new tool configurations and improve parameter handling.
- Introduced utility functions for setting up tools and managing options, enhancing the overall integration of tools within the AI SDK.
This commit is contained in:
suyao 2025-06-27 13:21:33 +08:00
parent c934b45c09
commit 87f803b0d3
No known key found for this signature in database
17 changed files with 927 additions and 1359 deletions

View File

@ -0,0 +1,94 @@
diff --git a/dist/index.js b/dist/index.js
index 287fe679c32d30a9745270a00589eb90de8da786..5892d4526529e89fca868251ee0c1b081748c358 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -321,8 +321,8 @@ var OpenAICompatibleChatLanguageModel = class {
} : { type: "json_object" } : void 0,
stop: stopSequences,
seed,
- ...providerMetadata == null ? void 0 : providerMetadata[this.providerOptionsName],
reasoning_effort: (_d = (_b = providerMetadata == null ? void 0 : providerMetadata[this.providerOptionsName]) == null ? void 0 : _b.reasoningEffort) != null ? _d : (_c = providerMetadata == null ? void 0 : providerMetadata["openai-compatible"]) == null ? void 0 : _c.reasoningEffort,
+ ...providerMetadata == null ? void 0 : providerMetadata[this.providerOptionsName],
// messages:
messages: convertToOpenAICompatibleChatMessages(prompt)
};
@@ -510,7 +510,7 @@ var OpenAICompatibleChatLanguageModel = class {
...args,
stream: true,
// only include stream_options when in strict compatibility mode:
- stream_options: this.config.includeUsage ? { include_usage: true } : void 0
+ ...(this.config.includeUsage ? { stream_options: { include_usage: true } } : {})
};
const metadataExtractor = (_a = this.config.metadataExtractor) == null ? void 0 : _a.createStreamExtractor();
const { responseHeaders, value: response } = await (0, import_provider_utils2.postJsonToApi)({
@@ -1324,10 +1324,11 @@ function createOpenAICompatible(options) {
headers: getHeaders,
fetch: options.fetch
});
- const createLanguageModel = (modelId, settings = {}) => createChatModel(modelId, settings);
- const createChatModel = (modelId, settings = {}) => new OpenAICompatibleChatLanguageModel(modelId, settings, {
+ const createLanguageModel = (modelId, settings = {}, config = {}) => createChatModel(modelId, settings, config);
+ const createChatModel = (modelId, settings = {}, config = {}) => new OpenAICompatibleChatLanguageModel(modelId, settings, {
...getCommonModelConfig("chat"),
- defaultObjectGenerationMode: "tool"
+ defaultObjectGenerationMode: "tool",
+ ...config
});
const createCompletionModel = (modelId, settings = {}) => new OpenAICompatibleCompletionLanguageModel(
modelId,
@@ -1344,7 +1345,7 @@ function createOpenAICompatible(options) {
settings,
getCommonModelConfig("image")
);
- const provider = (modelId, settings) => createLanguageModel(modelId, settings);
+ const provider = (modelId, settings, config) => createLanguageModel(modelId, settings, config);
provider.languageModel = createLanguageModel;
provider.chatModel = createChatModel;
provider.completionModel = createCompletionModel;
diff --git a/dist/index.mjs b/dist/index.mjs
index 6446ad8d3a96c798bea3a17c1802810139d24143..7bb81eb126992cc64453134cc2581c2314c022c1 100644
--- a/dist/index.mjs
+++ b/dist/index.mjs
@@ -305,8 +305,8 @@ var OpenAICompatibleChatLanguageModel = class {
} : { type: "json_object" } : void 0,
stop: stopSequences,
seed,
- ...providerMetadata == null ? void 0 : providerMetadata[this.providerOptionsName],
reasoning_effort: (_d = (_b = providerMetadata == null ? void 0 : providerMetadata[this.providerOptionsName]) == null ? void 0 : _b.reasoningEffort) != null ? _d : (_c = providerMetadata == null ? void 0 : providerMetadata["openai-compatible"]) == null ? void 0 : _c.reasoningEffort,
+ ...providerMetadata == null ? void 0 : providerMetadata[this.providerOptionsName],
// messages:
messages: convertToOpenAICompatibleChatMessages(prompt)
};
@@ -494,7 +494,7 @@ var OpenAICompatibleChatLanguageModel = class {
...args,
stream: true,
// only include stream_options when in strict compatibility mode:
- stream_options: this.config.includeUsage ? { include_usage: true } : void 0
+ ...(this.config.includeUsage ? { stream_options: { include_usage: true } } : {})
};
const metadataExtractor = (_a = this.config.metadataExtractor) == null ? void 0 : _a.createStreamExtractor();
const { responseHeaders, value: response } = await postJsonToApi({
@@ -1331,10 +1331,11 @@ function createOpenAICompatible(options) {
headers: getHeaders,
fetch: options.fetch
});
- const createLanguageModel = (modelId, settings = {}) => createChatModel(modelId, settings);
- const createChatModel = (modelId, settings = {}) => new OpenAICompatibleChatLanguageModel(modelId, settings, {
+ const createLanguageModel = (modelId, settings = {}, config = {}) => createChatModel(modelId, settings, config);
+ const createChatModel = (modelId, settings = {}, config = {}) => new OpenAICompatibleChatLanguageModel(modelId, settings, {
...getCommonModelConfig("chat"),
- defaultObjectGenerationMode: "tool"
+ defaultObjectGenerationMode: "tool",
+ ...config
});
const createCompletionModel = (modelId, settings = {}) => new OpenAICompatibleCompletionLanguageModel(
modelId,
@@ -1351,7 +1352,7 @@ function createOpenAICompatible(options) {
settings,
getCommonModelConfig("image")
);
- const provider = (modelId, settings) => createLanguageModel(modelId, settings);
+ const provider = (modelId, settings, config) => createLanguageModel(modelId, settings, config);
provider.languageModel = createLanguageModel;
provider.chatModel = createChatModel;
provider.completionModel = createCompletionModel;

View File

@ -231,7 +231,9 @@
"app-builder-lib@npm:26.0.13": "patch:app-builder-lib@npm%3A26.0.13#~/.yarn/patches/app-builder-lib-npm-26.0.13-a064c9e1d0.patch",
"openai@npm:^4.87.3": "patch:openai@npm%3A5.1.0#~/.yarn/patches/openai-npm-5.1.0-0e7b3ccb07.patch",
"app-builder-lib@npm:26.0.15": "patch:app-builder-lib@npm%3A26.0.15#~/.yarn/patches/app-builder-lib-npm-26.0.15-360e5b0476.patch",
"@langchain/core@npm:^0.3.26": "patch:@langchain/core@npm%3A0.3.44#~/.yarn/patches/@langchain-core-npm-0.3.44-41d5c3cb0a.patch"
"@langchain/core@npm:^0.3.26": "patch:@langchain/core@npm%3A0.3.44#~/.yarn/patches/@langchain-core-npm-0.3.44-41d5c3cb0a.patch",
"@ai-sdk/openai-compatible@npm:0.2.14": "patch:@ai-sdk/openai-compatible@npm%3A0.2.14#~/.yarn/patches/@ai-sdk-openai-compatible-npm-0.2.14-bb0a64a4be.patch",
"@ai-sdk/google-vertex@npm:2.2.24": "patch:@ai-sdk/google-vertex@npm%3A2.2.24#~/.yarn/patches/@ai-sdk-google-vertex-npm-2.2.24-b89772c4de.patch"
},
"packageManager": "yarn@4.9.1",
"lint-staged": {

View File

@ -5,7 +5,7 @@
"main": "src/index.ts",
"types": "src/index.ts",
"scripts": {
"build": "tsc",
"build": "tsdown",
"dev": "tsc -w",
"clean": "rm -rf dist"
},
@ -31,12 +31,13 @@
"@ai-sdk/fal": "^0.1.12",
"@ai-sdk/fireworks": "^0.2.14",
"@ai-sdk/google": "^1.2.19",
"@ai-sdk/google-vertex": "^2.2.24",
"@ai-sdk/google-vertex": "patch:@ai-sdk/google-vertex@npm%3A2.2.24#~/.yarn/patches/@ai-sdk-google-vertex-npm-2.2.24-b89772c4de.patch",
"@ai-sdk/groq": "^1.2.9",
"@ai-sdk/mistral": "^1.2.8",
"@ai-sdk/openai": "^1.3.22",
"@ai-sdk/openai-compatible": "^0.2.14",
"@ai-sdk/openai-compatible": "patch:@ai-sdk/openai-compatible@npm%3A0.2.14#~/.yarn/patches/@ai-sdk-openai-compatible-npm-0.2.14-bb0a64a4be.patch",
"@ai-sdk/perplexity": "^1.1.9",
"@ai-sdk/provider": "^1.1.3",
"@ai-sdk/replicate": "^0.2.8",
"@ai-sdk/togetherai": "^0.2.14",
"@ai-sdk/vercel": "^0.0.1",
@ -108,6 +109,7 @@
}
},
"devDependencies": {
"tsdown": "^0.12.9",
"typescript": "^5.0.0"
},
"files": [

File diff suppressed because it is too large Load Diff

View File

@ -1,2 +0,0 @@
patchedDependencies:
'@ai-sdk/google-vertex': patches/@ai-sdk__google-vertex.patch

View File

@ -162,16 +162,8 @@ export default class ModernAiProvider {
}
try {
// 合并传入的配置和实例配置
const finalConfig: AiSdkMiddlewareConfig = {
...middlewareConfig,
provider: this.provider,
// 工具相关信息从 params 中获取
enableTool: !!Object.keys(params.tools || {}).length
}
// 动态构建中间件数组
const middlewares = buildAiSdkMiddlewares(finalConfig)
const middlewares = buildAiSdkMiddlewares(middlewareConfig)
console.log('构建的中间件:', middlewares)
// 创建带有中间件的执行器
@ -179,27 +171,29 @@ export default class ModernAiProvider {
// 流式处理 - 使用适配器
const adapter = new AiSdkToChunkAdapter(middlewareConfig.onChunk)
// 创建MCP Prompt插件
const mcpPromptPlugin = createMCPPromptPlugin({
enabled: true,
createSystemMessage: (systemPrompt, params, context) => {
console.log('createSystemMessage_context', context.isRecursiveCall)
if (context.modelId.includes('o1-mini') || context.modelId.includes('o1-preview')) {
if (context.isRecursiveCall) {
if (middlewareConfig.enableTool) {
const mcpPromptPlugin = createMCPPromptPlugin({
enabled: true,
createSystemMessage: (systemPrompt, params, context) => {
console.log('createSystemMessage_context', context.isRecursiveCall)
if (context.modelId.includes('o1-mini') || context.modelId.includes('o1-preview')) {
if (context.isRecursiveCall) {
return null
}
params.messages = [
{
role: 'assistant',
content: systemPrompt
},
...params.messages
]
return null
}
params.messages = [
{
role: 'assistant',
content: systemPrompt
},
...params.messages
]
return null
return systemPrompt
}
return systemPrompt
}
})
this.modernExecutor.pluginEngine.use(mcpPromptPlugin)
})
this.modernExecutor.pluginEngine.use(mcpPromptPlugin)
}
const streamResult = await this.modernExecutor.streamText(
modelId,
params,

View File

@ -18,6 +18,7 @@ export interface AiSdkMiddlewareConfig {
model?: Model
provider?: Provider
enableReasoning?: boolean
// 是否开启提示词工具调用
enableTool?: boolean
enableWebSearch?: boolean
mcpTools?: MCPTool[]

View File

@ -39,9 +39,8 @@ export default function thinkingTimeMiddleware(): LanguageModelV1Middleware {
hasThinkingContent = false
thinkingStartTime = 0
accumulatedThinkingContent = ''
} else {
controller.enqueue(chunk)
}
controller.enqueue(chunk)
}
},
flush(controller) {

View File

@ -11,18 +11,18 @@ const PROVIDER_MAPPING: Record<string, ProviderId> = {
}
export function getAiSdkProviderId(provider: Provider): ProviderId | 'openai-compatible' {
const providerType = PROVIDER_MAPPING[provider.type] // 有些第三方需要映射到aicore对应sdk
if (providerType) {
return providerType
}
const providerId = PROVIDER_MAPPING[provider.id]
if (providerId) {
return providerId
}
const providerType = PROVIDER_MAPPING[provider.type] // 有些第三方需要映射到aicore对应sdk
if (providerType) {
return providerType
}
if (AiCore.isSupported(provider.id)) {
return provider.id as ProviderId as ProviderId
}

View File

@ -4,7 +4,6 @@
*/
import { type CoreMessage, type StreamTextParams } from '@cherrystudio/ai-core'
import { aiSdk } from '@cherrystudio/ai-core'
import { DEFAULT_MAX_TOKENS } from '@renderer/config/constant'
import {
isGenerateImageModel,
@ -18,18 +17,16 @@ import {
isWebSearchModel
} from '@renderer/config/models'
import { getAssistantSettings, getDefaultModel } from '@renderer/services/AssistantService'
import type { Assistant, MCPTool, MCPToolInputSchema, MCPToolResponse, Message, Model } from '@renderer/types'
import type { Assistant, MCPTool, Message, Model } from '@renderer/types'
import { FileTypes } from '@renderer/types'
import { callMCPTool } from '@renderer/utils/mcp-tools'
import { findFileBlocks, findImageBlocks, getMainTextContent } from '@renderer/utils/messageUtils/find'
import { buildSystemPrompt } from '@renderer/utils/prompt'
import { defaultTimeout } from '@shared/config/constant'
// import { jsonSchemaToZod } from 'json-schema-to-zod'
import { jsonSchema } from 'ai'
import { setupToolsConfig } from './utils/mcp'
import { buildProviderOptions } from './utils/options'
import { buildProviderOptions } from './utils/reasoning'
const { tool } = aiSdk
/**
*
*/
@ -190,7 +187,6 @@ export async function buildStreamTextParams(
assistant: Assistant,
options: {
mcpTools?: MCPTool[]
// FIXME: 上游没传
enableTools?: boolean
requestOptions?: {
signal?: AbortSignal
@ -199,7 +195,7 @@ export async function buildStreamTextParams(
}
} = {}
): Promise<{ params: StreamTextParams; modelId: string }> {
const { mcpTools } = options
const { mcpTools, enableTools } = options
const model = assistant.model || getDefaultModel()
@ -221,11 +217,11 @@ export async function buildStreamTextParams(
(isSupportedDisableGenerationModel(model) ? assistant.enableGenerateImage || false : true)
// 构建系统提示
let systemPrompt = assistant.prompt || ''
// TODO:根据调用类型判断是否添加systemPrompt
if (mcpTools && mcpTools.length > 0 && assistant.settings?.toolUseMode === 'prompt') {
systemPrompt = await buildSystemPromptWithTools(systemPrompt, mcpTools, assistant)
}
const { tools } = setupToolsConfig({
mcpTools,
model,
enableToolUse: enableTools
})
// 构建真正的 providerOptions
const providerOptions = buildProviderOptions(assistant, model, {
@ -240,22 +236,14 @@ export async function buildStreamTextParams(
maxTokens: maxTokens || DEFAULT_MAX_TOKENS,
temperature: getTemperature(assistant, model),
topP: getTopP(assistant, model),
system: systemPrompt || undefined,
system: assistant.prompt || '',
abortSignal: options.requestOptions?.signal,
headers: options.requestOptions?.headers,
providerOptions,
tools,
maxSteps: 10
}
const tools = mcpTools ? convertMcpToolsToAiSdkTools(mcpTools) : {}
console.log('tools', tools)
console.log('enableTools', assistant?.mcpServers?.length)
// console.log('tools.length > 0', tools.length > 0)
// 添加工具(如果启用且有工具)
if (!!assistant?.mcpServers?.length && Object.keys(tools).length > 0) {
params.tools = tools
}
return { params, modelId: model.id }
}
@ -273,76 +261,3 @@ export async function buildGenerateTextParams(
// 复用流式参数的构建逻辑
return await buildStreamTextParams(messages, assistant, options)
}
/**
* MCPToolInputSchema JSONSchema7
*/
function convertMcpSchemaToJsonSchema7(schema: MCPToolInputSchema): any {
// 创建符合 JSONSchema7 的对象
const jsonSchema7: Record<string, any> = {
type: 'object',
properties: schema.properties || {},
required: schema.required || []
}
// 如果有 description添加它
if (schema.description) {
jsonSchema7.description = schema.description
}
// 如果有 title添加它
if (schema.title) {
jsonSchema7.title = schema.title
}
return jsonSchema7
}
/**
* MCPTool AI SDK
*/
export function convertMcpToolsToAiSdkTools(mcpTools: MCPTool[]): Record<string, any> {
const tools: Record<string, any> = {}
for (const mcpTool of mcpTools) {
console.log('mcpTool', mcpTool.inputSchema)
tools[mcpTool.name] = tool({
description: mcpTool.description || `Tool from ${mcpTool.serverName}`,
parameters: jsonSchema<Record<string, object>>(convertMcpSchemaToJsonSchema7(mcpTool.inputSchema)),
execute: async (params) => {
console.log('execute_params', params)
// 创建适配的 MCPToolResponse 对象
const toolResponse: MCPToolResponse = {
id: `tool_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
tool: mcpTool,
arguments: params,
status: 'invoking',
toolCallId: `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`
}
try {
// 复用现有的 callMCPTool 函数
const result = await callMCPTool(toolResponse)
// 返回结果AI SDK 会处理序列化
if (result.isError) {
throw new Error(result.content?.[0]?.text || 'Tool execution failed')
}
console.log('result', result)
// 返回工具执行结果
return {
success: true,
data: result
}
} catch (error) {
console.error(`MCP Tool execution failed: ${mcpTool.name}`, error)
throw new Error(
`Tool ${mcpTool.name} execution failed: ${error instanceof Error ? error.message : String(error)}`
)
}
}
})
}
return tools
}

View File

@ -0,0 +1,88 @@
import { aiSdk, Tool } from '@cherrystudio/ai-core'
import { SYSTEM_PROMPT_THRESHOLD } from '@renderer/config/constant'
import { isFunctionCallingModel } from '@renderer/config/models'
import { MCPCallToolResponse, MCPTool, MCPToolResponse, Model } from '@renderer/types'
import { callMCPTool } from '@renderer/utils/mcp-tools'
import { JSONSchema7 } from 'json-schema'
type ToolCallResult = {
success: boolean
data: MCPCallToolResponse
}
type AiSdkTool = Tool<any, ToolCallResult>
// Setup tools configuration based on provided parameters
export function setupToolsConfig(params: { mcpTools?: MCPTool[]; model: Model; enableToolUse?: boolean }): {
tools: Record<string, AiSdkTool>
useSystemPromptForTools?: boolean
} {
const { mcpTools, model, enableToolUse } = params
let tools: Record<string, AiSdkTool> = {}
if (!mcpTools?.length) {
return { tools }
}
tools = convertMcpToolsToAiSdkTools(mcpTools)
if (mcpTools.length > SYSTEM_PROMPT_THRESHOLD) {
return { tools, useSystemPromptForTools: true }
}
if (isFunctionCallingModel(model) && enableToolUse) {
return { tools, useSystemPromptForTools: false }
}
return { tools, useSystemPromptForTools: true }
}
/**
* MCPTool AI SDK
*/
export function convertMcpToolsToAiSdkTools(mcpTools: MCPTool[]): Record<string, Tool<any, ToolCallResult>> {
const tools: Record<string, Tool<any, ToolCallResult>> = {}
for (const mcpTool of mcpTools) {
console.log('mcpTool', mcpTool.inputSchema)
tools[mcpTool.name] = aiSdk.tool<any, ToolCallResult>({
description: mcpTool.description || `Tool from ${mcpTool.serverName}`,
parameters: aiSdk.jsonSchema(mcpTool.inputSchema as JSONSchema7),
execute: async (params): Promise<ToolCallResult> => {
console.log('execute_params', params)
// 创建适配的 MCPToolResponse 对象
const toolResponse: MCPToolResponse = {
id: `tool_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
tool: mcpTool,
arguments: params,
status: 'invoking',
toolCallId: `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`
}
try {
// 复用现有的 callMCPTool 函数
const result = await callMCPTool(toolResponse)
// 返回结果AI SDK 会处理序列化
if (result.isError) {
throw new Error(result.content?.[0]?.text || 'Tool execution failed')
}
console.log('result', result)
// 返回工具执行结果
return {
success: true,
data: result
}
} catch (error) {
console.error(`MCP Tool execution failed: ${mcpTool.name}`, error)
throw new Error(
`Tool ${mcpTool.name} execution failed: ${error instanceof Error ? error.message : String(error)}`
)
}
}
})
}
return tools
}

View File

@ -0,0 +1,203 @@
import { getProviderByModel } from '@renderer/services/AssistantService'
import { Assistant, Model } from '@renderer/types'
import { getAiSdkProviderId } from '../provider/factory'
import {
getAnthropicReasoningParams,
getCustomParameters,
getGeminiReasoningParams,
getOpenAIReasoningParams,
getReasoningEffort
} from './reasoning'
/**
* AI SDK providerOptions
* provider
* { 'providerId': providerOptions }
*/
export function buildProviderOptions(
assistant: Assistant,
model: Model,
capabilities: {
enableReasoning: boolean
enableWebSearch: boolean
enableGenerateImage: boolean
}
): Record<string, any> {
const provider = getProviderByModel(model)
const providerId = getAiSdkProviderId(provider)
// 构建 provider 特定的选项
let providerSpecificOptions: Record<string, any> = {}
// 根据 provider 类型分离构建逻辑
switch (provider.type) {
case 'openai-response':
case 'azure-openai':
providerSpecificOptions = buildOpenAIProviderOptions(assistant, model, capabilities)
break
case 'anthropic':
providerSpecificOptions = buildAnthropicProviderOptions(assistant, model, capabilities)
break
case 'gemini':
case 'vertexai':
providerSpecificOptions = buildGeminiProviderOptions(assistant, model, capabilities)
break
default:
// 对于其他 provider使用通用的构建逻辑
providerSpecificOptions = buildGenericProviderOptions(assistant, model, capabilities)
break
}
// 合并自定义参数到 provider 特定的选项中
providerSpecificOptions = {
...providerSpecificOptions,
...getCustomParameters(assistant)
}
// 返回 AI Core SDK 要求的格式:{ 'providerId': providerOptions }
return {
[providerId]: providerSpecificOptions
}
}
/**
* OpenAI providerOptions
*/
function buildOpenAIProviderOptions(
assistant: Assistant,
model: Model,
capabilities: {
enableReasoning: boolean
enableWebSearch: boolean
enableGenerateImage: boolean
}
): Record<string, any> {
const { enableReasoning, enableWebSearch, enableGenerateImage } = capabilities
let providerOptions: Record<string, any> = {}
// OpenAI 推理参数
if (enableReasoning) {
const reasoningParams = getOpenAIReasoningParams(assistant, model)
providerOptions = {
...providerOptions,
...reasoningParams
}
}
// Web 搜索和图像生成暂时使用通用格式
if (enableWebSearch) {
providerOptions.webSearch = { enabled: true }
}
if (enableGenerateImage) {
providerOptions.generateImage = { enabled: true }
}
return providerOptions
}
/**
* Anthropic providerOptions
*/
function buildAnthropicProviderOptions(
assistant: Assistant,
model: Model,
capabilities: {
enableReasoning: boolean
enableWebSearch: boolean
enableGenerateImage: boolean
}
): Record<string, any> {
const { enableReasoning, enableWebSearch, enableGenerateImage } = capabilities
let providerOptions: Record<string, any> = {}
// Anthropic 推理参数
if (enableReasoning) {
const reasoningParams = getAnthropicReasoningParams(assistant, model)
providerOptions = {
...providerOptions,
...reasoningParams
}
}
if (enableWebSearch) {
providerOptions.webSearch = { enabled: true }
}
if (enableGenerateImage) {
providerOptions.generateImage = { enabled: true }
}
return providerOptions
}
/**
* Gemini providerOptions
*/
function buildGeminiProviderOptions(
assistant: Assistant,
model: Model,
capabilities: {
enableReasoning: boolean
enableWebSearch: boolean
enableGenerateImage: boolean
}
): Record<string, any> {
const { enableReasoning, enableWebSearch, enableGenerateImage } = capabilities
const providerOptions: Record<string, any> = {}
// Gemini 推理参数
if (enableReasoning) {
const reasoningParams = getGeminiReasoningParams(assistant, model)
Object.assign(providerOptions, reasoningParams)
}
if (enableWebSearch) {
providerOptions.webSearch = { enabled: true }
}
if (enableGenerateImage) {
providerOptions.generateImage = { enabled: true }
}
return providerOptions
}
/**
* providerOptions provider
*/
function buildGenericProviderOptions(
assistant: Assistant,
model: Model,
capabilities: {
enableReasoning: boolean
enableWebSearch: boolean
enableGenerateImage: boolean
}
): Record<string, any> {
const { enableReasoning, enableWebSearch, enableGenerateImage } = capabilities
let providerOptions: Record<string, any> = {}
// 使用原有的通用推理逻辑
if (enableReasoning) {
const reasoningParams = getReasoningEffort(assistant, model)
providerOptions = {
...providerOptions,
...reasoningParams
}
}
if (enableWebSearch) {
providerOptions.webSearch = { enabled: true }
}
if (enableGenerateImage) {
providerOptions.generateImage = { enabled: true }
}
return providerOptions
}

View File

@ -17,8 +17,6 @@ import { getAssistantSettings, getProviderByModel } from '@renderer/services/Ass
import { Assistant, EFFORT_RATIO, Model } from '@renderer/types'
import { ReasoningEffortOptionalParams } from '@renderer/types/sdk'
import { getAiSdkProviderId } from '../provider/factory'
export function getReasoningEffort(assistant: Assistant, model: Model): ReasoningEffortOptionalParams {
const provider = getProviderByModel(model)
if (provider.id === 'groq') {
@ -138,192 +136,11 @@ export function getReasoningEffort(assistant: Assistant, model: Model): Reasonin
return {}
}
/**
* AI SDK providerOptions
* provider
* { 'providerId': providerOptions }
*/
export function buildProviderOptions(
assistant: Assistant,
model: Model,
capabilities: {
enableReasoning: boolean
enableWebSearch: boolean
enableGenerateImage: boolean
}
): Record<string, any> {
const provider = getProviderByModel(model)
const providerId = getAiSdkProviderId(provider)
// 构建 provider 特定的选项
let providerSpecificOptions: Record<string, any> = {}
// 根据 provider 类型分离构建逻辑
switch (provider.type) {
case 'openai':
case 'azure-openai':
providerSpecificOptions = buildOpenAIProviderOptions(assistant, model, capabilities)
break
case 'anthropic':
providerSpecificOptions = buildAnthropicProviderOptions(assistant, model, capabilities)
break
case 'gemini':
case 'vertexai':
providerSpecificOptions = buildGeminiProviderOptions(assistant, model, capabilities)
break
default:
// 对于其他 provider使用通用的构建逻辑
providerSpecificOptions = buildGenericProviderOptions(assistant, model, capabilities)
break
}
// 合并自定义参数到 provider 特定的选项中
const customParameters = getCustomParameters(assistant)
Object.assign(providerSpecificOptions, customParameters)
// 返回 AI Core SDK 要求的格式:{ 'providerId': providerOptions }
return {
[providerId]: providerSpecificOptions
}
}
/**
* OpenAI providerOptions
*/
function buildOpenAIProviderOptions(
assistant: Assistant,
model: Model,
capabilities: {
enableReasoning: boolean
enableWebSearch: boolean
enableGenerateImage: boolean
}
): Record<string, any> {
const { enableReasoning, enableWebSearch, enableGenerateImage } = capabilities
const providerOptions: Record<string, any> = {}
// OpenAI 推理参数
if (enableReasoning) {
const reasoningParams = getOpenAIReasoningParams(assistant, model)
Object.assign(providerOptions, reasoningParams)
}
// Web 搜索和图像生成暂时使用通用格式
if (enableWebSearch) {
providerOptions.webSearch = { enabled: true }
}
if (enableGenerateImage) {
providerOptions.generateImage = { enabled: true }
}
return providerOptions
}
/**
* Anthropic providerOptions
*/
function buildAnthropicProviderOptions(
assistant: Assistant,
model: Model,
capabilities: {
enableReasoning: boolean
enableWebSearch: boolean
enableGenerateImage: boolean
}
): Record<string, any> {
const { enableReasoning, enableWebSearch, enableGenerateImage } = capabilities
const providerOptions: Record<string, any> = {}
// Anthropic 推理参数
if (enableReasoning) {
const reasoningParams = getAnthropicReasoningParams(assistant, model)
Object.assign(providerOptions, reasoningParams)
}
if (enableWebSearch) {
providerOptions.webSearch = { enabled: true }
}
if (enableGenerateImage) {
providerOptions.generateImage = { enabled: true }
}
return providerOptions
}
/**
* Gemini providerOptions
*/
function buildGeminiProviderOptions(
assistant: Assistant,
model: Model,
capabilities: {
enableReasoning: boolean
enableWebSearch: boolean
enableGenerateImage: boolean
}
): Record<string, any> {
const { enableReasoning, enableWebSearch, enableGenerateImage } = capabilities
const providerOptions: Record<string, any> = {}
// Gemini 推理参数
if (enableReasoning) {
const reasoningParams = getGeminiReasoningParams(assistant, model)
Object.assign(providerOptions, reasoningParams)
}
if (enableWebSearch) {
providerOptions.webSearch = { enabled: true }
}
if (enableGenerateImage) {
providerOptions.generateImage = { enabled: true }
}
return providerOptions
}
/**
* providerOptions provider
*/
function buildGenericProviderOptions(
assistant: Assistant,
model: Model,
capabilities: {
enableReasoning: boolean
enableWebSearch: boolean
enableGenerateImage: boolean
}
): Record<string, any> {
const { enableReasoning, enableWebSearch, enableGenerateImage } = capabilities
const providerOptions: Record<string, any> = {}
// 使用原有的通用推理逻辑
if (enableReasoning) {
const reasoningParams = getReasoningEffort(assistant, model)
Object.assign(providerOptions, reasoningParams)
}
if (enableWebSearch) {
providerOptions.webSearch = { enabled: true }
}
if (enableGenerateImage) {
providerOptions.generateImage = { enabled: true }
}
return providerOptions
}
/**
* OpenAI
* OpenAIResponseAPIClient OpenAIAPIClient
*/
function getOpenAIReasoningParams(assistant: Assistant, model: Model): Record<string, any> {
export function getOpenAIReasoningParams(assistant: Assistant, model: Model): Record<string, any> {
if (!isReasoningModel(model)) {
return {}
}
@ -348,7 +165,7 @@ function getOpenAIReasoningParams(assistant: Assistant, model: Model): Record<st
* Anthropic
* AnthropicAPIClient
*/
function getAnthropicReasoningParams(assistant: Assistant, model: Model): Record<string, any> {
export function getAnthropicReasoningParams(assistant: Assistant, model: Model): Record<string, any> {
if (!isReasoningModel(model)) {
return {}
}
@ -394,7 +211,7 @@ function getAnthropicReasoningParams(assistant: Assistant, model: Model): Record
* Gemini
* GeminiAPIClient
*/
function getGeminiReasoningParams(assistant: Assistant, model: Model): Record<string, any> {
export function getGeminiReasoningParams(assistant: Assistant, model: Model): Record<string, any> {
if (!isReasoningModel(model)) {
return {}
}
@ -440,7 +257,7 @@ function getGeminiReasoningParams(assistant: Assistant, model: Model): Record<st
*
* assistant
*/
function getCustomParameters(assistant: Assistant): Record<string, any> {
export function getCustomParameters(assistant: Assistant): Record<string, any> {
return (
assistant?.settings?.customParameters?.reduce((acc, param) => {
if (!param.name?.trim()) {

View File

@ -1,6 +1,7 @@
export const DEFAULT_TEMPERATURE = 1.0
export const DEFAULT_CONTEXTCOUNT = 5
export const DEFAULT_MAX_TOKENS = 4096
export const SYSTEM_PROMPT_THRESHOLD = 128
export const DEFAULT_KNOWLEDGE_DOCUMENT_COUNT = 6
export const DEFAULT_KNOWLEDGE_THRESHOLD = 0.0

View File

@ -20,6 +20,7 @@ import { type Chunk, ChunkType } from '@renderer/types/chunk'
import { Message } from '@renderer/types/newMessage'
import { SdkModel } from '@renderer/types/sdk'
import { removeSpecialCharactersForTopicName } from '@renderer/utils'
import { isEnabledToolUse } from '@renderer/utils/mcp-tools'
import { findFileBlocks, getMainTextContent } from '@renderer/utils/messageUtils/find'
import { isEmpty, takeRight } from 'lodash'
@ -302,6 +303,7 @@ export async function fetchChatCompletion({
// 使用 transformParameters 模块构建参数
const { params: aiSdkParams, modelId } = await buildStreamTextParams(messages, assistant, {
mcpTools: mcpTools,
enableTools: isEnabledToolUse(assistant),
requestOptions: options
})
@ -311,6 +313,7 @@ export async function fetchChatCompletion({
model: assistant.model,
provider: provider,
enableReasoning: assistant.settings?.reasoning_effort !== undefined,
enableTool: assistant.settings?.toolUseMode === 'prompt',
mcpTools
}

492
yarn.lock
View File

@ -190,7 +190,7 @@ __metadata:
languageName: node
linkType: hard
"@ai-sdk/google-vertex@npm:^2.2.24":
"@ai-sdk/google-vertex@npm:2.2.24":
version: 2.2.24
resolution: "@ai-sdk/google-vertex@npm:2.2.24"
dependencies:
@ -205,6 +205,21 @@ __metadata:
languageName: node
linkType: hard
"@ai-sdk/google-vertex@patch:@ai-sdk/google-vertex@npm%3A2.2.24#~/.yarn/patches/@ai-sdk-google-vertex-npm-2.2.24-b89772c4de.patch":
version: 2.2.24
resolution: "@ai-sdk/google-vertex@patch:@ai-sdk/google-vertex@npm%3A2.2.24#~/.yarn/patches/@ai-sdk-google-vertex-npm-2.2.24-b89772c4de.patch::version=2.2.24&hash=ec30c6"
dependencies:
"@ai-sdk/anthropic": "npm:1.2.12"
"@ai-sdk/google": "npm:1.2.19"
"@ai-sdk/provider": "npm:1.1.3"
"@ai-sdk/provider-utils": "npm:2.2.8"
google-auth-library: "npm:^9.15.0"
peerDependencies:
zod: ^3.0.0
checksum: 10c0/6afbb0557e5c82e09fa9fed5b9cb77e7a4b667023e4dce883524ad5df41607b416a5e1a0487367434909fb60971d956c1bad6350d5d261fafaf7e4ac123ac0bd
languageName: node
linkType: hard
"@ai-sdk/google@npm:1.2.19, @ai-sdk/google@npm:^1.2.19":
version: 1.2.19
resolution: "@ai-sdk/google@npm:1.2.19"
@ -241,7 +256,7 @@ __metadata:
languageName: node
linkType: hard
"@ai-sdk/openai-compatible@npm:0.2.14, @ai-sdk/openai-compatible@npm:^0.2.14":
"@ai-sdk/openai-compatible@npm:0.2.14":
version: 0.2.14
resolution: "@ai-sdk/openai-compatible@npm:0.2.14"
dependencies:
@ -253,6 +268,18 @@ __metadata:
languageName: node
linkType: hard
"@ai-sdk/openai-compatible@patch:@ai-sdk/openai-compatible@npm%3A0.2.14#~/.yarn/patches/@ai-sdk-openai-compatible-npm-0.2.14-bb0a64a4be.patch":
version: 0.2.14
resolution: "@ai-sdk/openai-compatible@patch:@ai-sdk/openai-compatible@npm%3A0.2.14#~/.yarn/patches/@ai-sdk-openai-compatible-npm-0.2.14-bb0a64a4be.patch::version=0.2.14&hash=f24fda"
dependencies:
"@ai-sdk/provider": "npm:1.1.3"
"@ai-sdk/provider-utils": "npm:2.2.8"
peerDependencies:
zod: ^3.0.0
checksum: 10c0/ba49e5fc1434c6fdd8482c82dba98c9775753333c7854300801b3003d503784bfc628acc4abc100e956f72287a14990d65773d3dfab17389d1ff152e749068ab
languageName: node
linkType: hard
"@ai-sdk/openai@npm:1.3.22, @ai-sdk/openai@npm:^1.3.22":
version: 1.3.22
resolution: "@ai-sdk/openai@npm:1.3.22"
@ -368,7 +395,7 @@ __metadata:
languageName: node
linkType: hard
"@ai-sdk/provider@npm:1.1.3, @ai-sdk/provider@npm:^1.0.0, @ai-sdk/provider@npm:^1.0.7":
"@ai-sdk/provider@npm:1.1.3, @ai-sdk/provider@npm:^1.0.0, @ai-sdk/provider@npm:^1.0.7, @ai-sdk/provider@npm:^1.1.3":
version: 1.1.3
resolution: "@ai-sdk/provider@npm:1.1.3"
dependencies:
@ -710,6 +737,19 @@ __metadata:
languageName: node
linkType: hard
"@babel/generator@npm:^7.27.5":
version: 7.27.5
resolution: "@babel/generator@npm:7.27.5"
dependencies:
"@babel/parser": "npm:^7.27.5"
"@babel/types": "npm:^7.27.3"
"@jridgewell/gen-mapping": "npm:^0.3.5"
"@jridgewell/trace-mapping": "npm:^0.3.25"
jsesc: "npm:^3.0.2"
checksum: 10c0/8f649ef4cd81765c832bb11de4d6064b035ffebdecde668ba7abee68a7b0bce5c9feabb5dc5bb8aeba5bd9e5c2afa3899d852d2bd9ca77a711ba8c8379f416f0
languageName: node
linkType: hard
"@babel/helper-compilation-targets@npm:^7.26.5":
version: 7.27.0
resolution: "@babel/helper-compilation-targets@npm:7.27.0"
@ -820,6 +860,17 @@ __metadata:
languageName: node
linkType: hard
"@babel/parser@npm:^7.27.3, @babel/parser@npm:^7.27.5":
version: 7.27.7
resolution: "@babel/parser@npm:7.27.7"
dependencies:
"@babel/types": "npm:^7.27.7"
bin:
parser: ./bin/babel-parser.js
checksum: 10c0/f6202faeb873f0b3083022e50a5046fe07266d337c0a3bd80a491f8435ba6d9e383d49725e3dcd666b3b52c0dccb4e0f1f1004915762345f7eeed5ba54ea9fd2
languageName: node
linkType: hard
"@babel/plugin-transform-arrow-functions@npm:^7.25.9":
version: 7.25.9
resolution: "@babel/plugin-transform-arrow-functions@npm:7.25.9"
@ -893,6 +944,16 @@ __metadata:
languageName: node
linkType: hard
"@babel/types@npm:^7.27.3, @babel/types@npm:^7.27.6, @babel/types@npm:^7.27.7":
version: 7.27.7
resolution: "@babel/types@npm:7.27.7"
dependencies:
"@babel/helper-string-parser": "npm:^7.27.1"
"@babel/helper-validator-identifier": "npm:^7.27.1"
checksum: 10c0/1d1dcb5fa7cfba2b4034a3ab99ba17049bfc4af9e170935575246cdb1cee68b04329a0111506d9ae83fb917c47dbd4394a6db5e32fbd041b7834ffbb17ca086b
languageName: node
linkType: hard
"@bcoe/v8-coverage@npm:^1.0.2":
version: 1.0.2
resolution: "@bcoe/v8-coverage@npm:1.0.2"
@ -940,12 +1001,13 @@ __metadata:
"@ai-sdk/fal": "npm:^0.1.12"
"@ai-sdk/fireworks": "npm:^0.2.14"
"@ai-sdk/google": "npm:^1.2.19"
"@ai-sdk/google-vertex": "npm:^2.2.24"
"@ai-sdk/google-vertex": "patch:@ai-sdk/google-vertex@npm%3A2.2.24#~/.yarn/patches/@ai-sdk-google-vertex-npm-2.2.24-b89772c4de.patch"
"@ai-sdk/groq": "npm:^1.2.9"
"@ai-sdk/mistral": "npm:^1.2.8"
"@ai-sdk/openai": "npm:^1.3.22"
"@ai-sdk/openai-compatible": "npm:^0.2.14"
"@ai-sdk/openai-compatible": "patch:@ai-sdk/openai-compatible@npm%3A0.2.14#~/.yarn/patches/@ai-sdk-openai-compatible-npm-0.2.14-bb0a64a4be.patch"
"@ai-sdk/perplexity": "npm:^1.1.9"
"@ai-sdk/provider": "npm:^1.1.3"
"@ai-sdk/replicate": "npm:^0.2.8"
"@ai-sdk/togetherai": "npm:^0.2.14"
"@ai-sdk/vercel": "npm:^0.0.1"
@ -955,6 +1017,7 @@ __metadata:
anthropic-vertex-ai: "npm:^1.0.2"
ollama-ai-provider: "npm:^1.2.0"
qwen-ai-provider: "npm:^0.1.0"
tsdown: "npm:^0.12.9"
typescript: "npm:^5.0.0"
zhipu-ai-provider: "npm:^0.1.1"
peerDependenciesMeta:
@ -1897,6 +1960,34 @@ __metadata:
languageName: node
linkType: hard
"@emnapi/core@npm:^1.4.3":
version: 1.4.3
resolution: "@emnapi/core@npm:1.4.3"
dependencies:
"@emnapi/wasi-threads": "npm:1.0.2"
tslib: "npm:^2.4.0"
checksum: 10c0/e30101d16d37ef3283538a35cad60e22095aff2403fb9226a35330b932eb6740b81364d525537a94eb4fb51355e48ae9b10d779c0dd1cdcd55d71461fe4b45c7
languageName: node
linkType: hard
"@emnapi/runtime@npm:^1.4.3":
version: 1.4.3
resolution: "@emnapi/runtime@npm:1.4.3"
dependencies:
tslib: "npm:^2.4.0"
checksum: 10c0/3b7ab72d21cb4e034f07df80165265f85f445ef3f581d1bc87b67e5239428baa00200b68a7d5e37a0425c3a78320b541b07f76c5530f6f6f95336a6294ebf30b
languageName: node
linkType: hard
"@emnapi/wasi-threads@npm:1.0.2":
version: 1.0.2
resolution: "@emnapi/wasi-threads@npm:1.0.2"
dependencies:
tslib: "npm:^2.4.0"
checksum: 10c0/f0621b1fc715221bd2d8332c0ca922617bcd77cdb3050eae50a124eb8923c54fa425d23982dc8f29d505c8798a62d1049bace8b0686098ff9dd82270e06d772e
languageName: node
linkType: hard
"@emotion/hash@npm:^0.8.0":
version: 0.8.0
resolution: "@emotion/hash@npm:0.8.0"
@ -3573,6 +3664,17 @@ __metadata:
languageName: node
linkType: hard
"@napi-rs/wasm-runtime@npm:^0.2.4":
version: 0.2.11
resolution: "@napi-rs/wasm-runtime@npm:0.2.11"
dependencies:
"@emnapi/core": "npm:^1.4.3"
"@emnapi/runtime": "npm:^1.4.3"
"@tybys/wasm-util": "npm:^0.9.0"
checksum: 10c0/049bd14c58b99fbe0967b95e9921c5503df196b59be22948d2155f17652eb305cff6728efd8685338b855da7e476dd2551fbe3a313fc2d810938f0717478441e
languageName: node
linkType: hard
"@neon-rs/load@npm:^0.0.4":
version: 0.0.4
resolution: "@neon-rs/load@npm:0.0.4"
@ -3707,6 +3809,20 @@ __metadata:
languageName: node
linkType: hard
"@oxc-project/runtime@npm:0.71.0":
version: 0.71.0
resolution: "@oxc-project/runtime@npm:0.71.0"
checksum: 10c0/37823f241ebb74c902d34c784a1f0d963572812a59129436a9a34c7a8a8ea08a23ec9b13fdff9807482f3715832dd2b96e6d364c038ce91ca05c4d86114464c5
languageName: node
linkType: hard
"@oxc-project/types@npm:0.71.0":
version: 0.71.0
resolution: "@oxc-project/types@npm:0.71.0"
checksum: 10c0/899f3af74f6aaee1ef5611ce78d85867948a5676829b4dce61d4ee6ea75755b574a2cf4671858f1d6015dd7ae66c9aeedb6f89cf61278c319fa0fb2b2abaae89
languageName: node
linkType: hard
"@parcel/watcher-android-arm64@npm:2.5.1":
version: 2.5.1
resolution: "@parcel/watcher-android-arm64@npm:2.5.1"
@ -3883,6 +3999,15 @@ __metadata:
languageName: node
linkType: hard
"@quansync/fs@npm:^0.1.1":
version: 0.1.3
resolution: "@quansync/fs@npm:0.1.3"
dependencies:
quansync: "npm:^0.2.10"
checksum: 10c0/15d9914328d296df6626b6b2d5e9f455f618d5c8ffff09270ca3ce42c1bd21e4a91b53d6c1d857fbcae3be8c07b33ab82a83532870f2c5bf74904fe0ac60a3d1
languageName: node
linkType: hard
"@rc-component/async-validator@npm:^5.0.3":
version: 5.0.4
resolution: "@rc-component/async-validator@npm:5.0.4"
@ -4091,6 +4216,99 @@ __metadata:
languageName: node
linkType: hard
"@rolldown/binding-darwin-arm64@npm:1.0.0-beta.9-commit.d91dfb5":
version: 1.0.0-beta.9-commit.d91dfb5
resolution: "@rolldown/binding-darwin-arm64@npm:1.0.0-beta.9-commit.d91dfb5"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@rolldown/binding-darwin-x64@npm:1.0.0-beta.9-commit.d91dfb5":
version: 1.0.0-beta.9-commit.d91dfb5
resolution: "@rolldown/binding-darwin-x64@npm:1.0.0-beta.9-commit.d91dfb5"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@rolldown/binding-freebsd-x64@npm:1.0.0-beta.9-commit.d91dfb5":
version: 1.0.0-beta.9-commit.d91dfb5
resolution: "@rolldown/binding-freebsd-x64@npm:1.0.0-beta.9-commit.d91dfb5"
conditions: os=freebsd & cpu=x64
languageName: node
linkType: hard
"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-beta.9-commit.d91dfb5":
version: 1.0.0-beta.9-commit.d91dfb5
resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-beta.9-commit.d91dfb5"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
"@rolldown/binding-linux-arm64-gnu@npm:1.0.0-beta.9-commit.d91dfb5":
version: 1.0.0-beta.9-commit.d91dfb5
resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.0.0-beta.9-commit.d91dfb5"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
"@rolldown/binding-linux-arm64-musl@npm:1.0.0-beta.9-commit.d91dfb5":
version: 1.0.0-beta.9-commit.d91dfb5
resolution: "@rolldown/binding-linux-arm64-musl@npm:1.0.0-beta.9-commit.d91dfb5"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
"@rolldown/binding-linux-x64-gnu@npm:1.0.0-beta.9-commit.d91dfb5":
version: 1.0.0-beta.9-commit.d91dfb5
resolution: "@rolldown/binding-linux-x64-gnu@npm:1.0.0-beta.9-commit.d91dfb5"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
"@rolldown/binding-linux-x64-musl@npm:1.0.0-beta.9-commit.d91dfb5":
version: 1.0.0-beta.9-commit.d91dfb5
resolution: "@rolldown/binding-linux-x64-musl@npm:1.0.0-beta.9-commit.d91dfb5"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
"@rolldown/binding-wasm32-wasi@npm:1.0.0-beta.9-commit.d91dfb5":
version: 1.0.0-beta.9-commit.d91dfb5
resolution: "@rolldown/binding-wasm32-wasi@npm:1.0.0-beta.9-commit.d91dfb5"
dependencies:
"@napi-rs/wasm-runtime": "npm:^0.2.4"
conditions: cpu=wasm32
languageName: node
linkType: hard
"@rolldown/binding-win32-arm64-msvc@npm:1.0.0-beta.9-commit.d91dfb5":
version: 1.0.0-beta.9-commit.d91dfb5
resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.0.0-beta.9-commit.d91dfb5"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"@rolldown/binding-win32-ia32-msvc@npm:1.0.0-beta.9-commit.d91dfb5":
version: 1.0.0-beta.9-commit.d91dfb5
resolution: "@rolldown/binding-win32-ia32-msvc@npm:1.0.0-beta.9-commit.d91dfb5"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
"@rolldown/binding-win32-x64-msvc@npm:1.0.0-beta.9-commit.d91dfb5":
version: 1.0.0-beta.9-commit.d91dfb5
resolution: "@rolldown/binding-win32-x64-msvc@npm:1.0.0-beta.9-commit.d91dfb5"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@rolldown/pluginutils@npm:1.0.0-beta.9-commit.d91dfb5":
version: 1.0.0-beta.9-commit.d91dfb5
resolution: "@rolldown/pluginutils@npm:1.0.0-beta.9-commit.d91dfb5"
checksum: 10c0/63fa64fdd98a2cc99f21dab5c1819ffec172d2282cbff5dcb1089a84d2bb5c556dc6af503e778058f4a038d1941c0179f677ceddd0e30f024b57c543f21042f0
languageName: node
linkType: hard
"@rollup/rollup-android-arm-eabi@npm:4.40.0":
version: 4.40.0
resolution: "@rollup/rollup-android-arm-eabi@npm:4.40.0"
@ -4705,6 +4923,15 @@ __metadata:
languageName: node
linkType: hard
"@tybys/wasm-util@npm:^0.9.0":
version: 0.9.0
resolution: "@tybys/wasm-util@npm:0.9.0"
dependencies:
tslib: "npm:^2.4.0"
checksum: 10c0/f9fde5c554455019f33af6c8215f1a1435028803dc2a2825b077d812bed4209a1a64444a4ca0ce2ea7e1175c8d88e2f9173a36a33c199e8a5c671aa31de8242d
languageName: node
linkType: hard
"@types/aria-query@npm:^5.0.1":
version: 5.0.4
resolution: "@types/aria-query@npm:5.0.4"
@ -6564,6 +6791,13 @@ __metadata:
languageName: node
linkType: hard
"ansis@npm:^4.0.0, ansis@npm:^4.1.0":
version: 4.1.0
resolution: "ansis@npm:4.1.0"
checksum: 10c0/df62d017a7791babdaf45b93f930d2cfd6d1dab5568b610735c11434c9a5ef8f513740e7cfd80bcbc3530fc8bd892b88f8476f26621efc251230e53cbd1a2c24
languageName: node
linkType: hard
"antd@npm:^5.22.5":
version: 5.24.7
resolution: "antd@npm:5.24.7"
@ -6825,6 +7059,16 @@ __metadata:
languageName: node
linkType: hard
"ast-kit@npm:^2.1.0":
version: 2.1.0
resolution: "ast-kit@npm:2.1.0"
dependencies:
"@babel/parser": "npm:^7.27.3"
pathe: "npm:^2.0.3"
checksum: 10c0/67246f34745f40b6a5bee2467a1a00f7f006a051f80d7cda7e3b7fe5f7d7a1f262521b72643fcbffb21d33f36aa59868636229a769b2802355d687815ad7b13d
languageName: node
linkType: hard
"ast-types@npm:^0.13.4":
version: 0.13.4
resolution: "ast-types@npm:0.13.4"
@ -6980,6 +7224,13 @@ __metadata:
languageName: node
linkType: hard
"birpc@npm:^2.4.0":
version: 2.4.0
resolution: "birpc@npm:2.4.0"
checksum: 10c0/6ecda217b540189221913f215055baf4f10f264a1a8f0000ef6db3ecb0ccc5e4fde135b5f0719c389f1a593e64af3041404019711225ab31badf23c2a98d7778
languageName: node
linkType: hard
"bl@npm:^1.0.0":
version: 1.2.3
resolution: "bl@npm:1.2.3"
@ -7491,7 +7742,7 @@ __metadata:
languageName: node
linkType: hard
"chokidar@npm:^4.0.0":
"chokidar@npm:^4.0.0, chokidar@npm:^4.0.3":
version: 4.0.3
resolution: "chokidar@npm:4.0.3"
dependencies:
@ -8528,6 +8779,18 @@ __metadata:
languageName: node
linkType: hard
"debug@npm:^4.4.1":
version: 4.4.1
resolution: "debug@npm:4.4.1"
dependencies:
ms: "npm:^2.1.3"
peerDependenciesMeta:
supports-color:
optional: true
checksum: 10c0/d2b44bc1afd912b49bb7ebb0d50a860dc93a4dd7d946e8de94abc957bb63726b7dd5aa48c18c2386c379ec024c46692e15ed3ed97d481729f929201e671fcd55
languageName: node
linkType: hard
"decamelize@npm:1.2.0":
version: 1.2.0
resolution: "decamelize@npm:1.2.0"
@ -8717,6 +8980,13 @@ __metadata:
languageName: node
linkType: hard
"defu@npm:^6.1.4":
version: 6.1.4
resolution: "defu@npm:6.1.4"
checksum: 10c0/2d6cc366262dc0cb8096e429368e44052fdf43ed48e53ad84cc7c9407f890301aa5fcb80d0995abaaf842b3949f154d060be4160f7a46cb2bc2f7726c81526f5
languageName: node
linkType: hard
"degenerator@npm:^5.0.0":
version: 5.0.1
resolution: "degenerator@npm:5.0.1"
@ -8843,6 +9113,13 @@ __metadata:
languageName: node
linkType: hard
"diff@npm:^8.0.2":
version: 8.0.2
resolution: "diff@npm:8.0.2"
checksum: 10c0/abfb387f033e089df3ec3be960205d17b54df8abf0924d982a7ced3a94c557a4e6cbff2e78b121f216b85f466b3d8d041673a386177c311aaea41459286cc9bc
languageName: node
linkType: hard
"dingbat-to-unicode@npm:^1.0.1":
version: 1.0.1
resolution: "dingbat-to-unicode@npm:1.0.1"
@ -9020,6 +9297,18 @@ __metadata:
languageName: node
linkType: hard
"dts-resolver@npm:^2.1.1":
version: 2.1.1
resolution: "dts-resolver@npm:2.1.1"
peerDependencies:
oxc-resolver: ">=11.0.0"
peerDependenciesMeta:
oxc-resolver:
optional: true
checksum: 10c0/bc36d71822d39f23cfe274b6781fae4b1729bd8b0a07e4a011fe243a73c5dbbb30ea067fb0d6248fdfedc29cf4dfc0ff19f0dd38950158444409d109c1c55b7e
languageName: node
linkType: hard
"duck@npm:^0.1.12":
version: 0.1.12
resolution: "duck@npm:0.1.12"
@ -9243,6 +9532,13 @@ __metadata:
languageName: node
linkType: hard
"empathic@npm:^2.0.0":
version: 2.0.0
resolution: "empathic@npm:2.0.0"
checksum: 10c0/7d3b14b04a93b35c47bcc950467ec914fd241cd9acc0269b0ea160f13026ec110f520c90fae64720fde72cc1757b57f3f292fb606617b7fccac1f4d008a76506
languageName: node
linkType: hard
"encodeurl@npm:^2.0.0":
version: 2.0.0
resolution: "encodeurl@npm:2.0.0"
@ -10808,6 +11104,15 @@ __metadata:
languageName: node
linkType: hard
"get-tsconfig@npm:^4.10.1":
version: 4.10.1
resolution: "get-tsconfig@npm:4.10.1"
dependencies:
resolve-pkg-maps: "npm:^1.0.0"
checksum: 10c0/7f8e3dabc6a49b747920a800fb88e1952fef871cdf51b79e98db48275a5de6cdaf499c55ee67df5fa6fe7ce65f0063e26de0f2e53049b408c585aa74d39ffa21
languageName: node
linkType: hard
"get-uri@npm:^6.0.1":
version: 6.0.4
resolution: "get-uri@npm:6.0.4"
@ -11286,6 +11591,13 @@ __metadata:
languageName: node
linkType: hard
"hookable@npm:^5.5.3":
version: 5.5.3
resolution: "hookable@npm:5.5.3"
checksum: 10c0/275f4cc84d27f8d48c5a5cd5685b6c0fea9291be9deea5bff0cfa72856ed566abde1dcd8cb1da0f9a70b4da3d7ec0d60dc3554c4edbba647058cc38816eced3d
languageName: node
linkType: hard
"hosted-git-info@npm:^4.1.0":
version: 4.1.0
resolution: "hosted-git-info@npm:4.1.0"
@ -12019,6 +12331,15 @@ __metadata:
languageName: node
linkType: hard
"jiti@npm:^2.4.2":
version: 2.4.2
resolution: "jiti@npm:2.4.2"
bin:
jiti: lib/jiti-cli.mjs
checksum: 10c0/4ceac133a08c8faff7eac84aabb917e85e8257f5ad659e843004ce76e981c457c390a220881748ac67ba1b940b9b729b30fb85cbaf6e7989f04b6002c94da331
languageName: node
linkType: hard
"js-base64@npm:^3.7.5":
version: 3.7.7
resolution: "js-base64@npm:3.7.7"
@ -15641,7 +15962,7 @@ __metadata:
languageName: node
linkType: hard
"quansync@npm:^0.2.8":
"quansync@npm:^0.2.10, quansync@npm:^0.2.8":
version: 0.2.10
resolution: "quansync@npm:0.2.10"
checksum: 10c0/f86f1d644f812a3a7c42de79eb401c47a5a67af82a9adff8a8afb159325e03e00f77cebbf42af6340a0bd47bd0c1fbe999e7caf7e1bbb30d7acb00c8729b7530
@ -16850,6 +17171,13 @@ __metadata:
languageName: node
linkType: hard
"resolve-pkg-maps@npm:^1.0.0":
version: 1.0.0
resolution: "resolve-pkg-maps@npm:1.0.0"
checksum: 10c0/fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab
languageName: node
linkType: hard
"responselike@npm:^2.0.0":
version: 2.0.1
resolution: "responselike@npm:2.0.1"
@ -16959,6 +17287,85 @@ __metadata:
languageName: node
linkType: hard
"rolldown-plugin-dts@npm:^0.13.12":
version: 0.13.12
resolution: "rolldown-plugin-dts@npm:0.13.12"
dependencies:
"@babel/generator": "npm:^7.27.5"
"@babel/parser": "npm:^7.27.5"
"@babel/types": "npm:^7.27.6"
ast-kit: "npm:^2.1.0"
birpc: "npm:^2.4.0"
debug: "npm:^4.4.1"
dts-resolver: "npm:^2.1.1"
get-tsconfig: "npm:^4.10.1"
peerDependencies:
"@typescript/native-preview": ">=7.0.0-dev.20250601.1"
rolldown: ^1.0.0-beta.9
typescript: ^5.0.0
vue-tsc: ~2.2.0
peerDependenciesMeta:
"@typescript/native-preview":
optional: true
typescript:
optional: true
vue-tsc:
optional: true
checksum: 10c0/811d1bef1649119895aaf7f87f0a23bd73438680d839c9c8331791995184ae4983deee67ed9b21abfc5521f4bda704f3ebbb84fda2259d6789d15d0c4411e36f
languageName: node
linkType: hard
"rolldown@npm:^1.0.0-beta.19":
version: 1.0.0-beta.9-commit.d91dfb5
resolution: "rolldown@npm:1.0.0-beta.9-commit.d91dfb5"
dependencies:
"@oxc-project/runtime": "npm:0.71.0"
"@oxc-project/types": "npm:0.71.0"
"@rolldown/binding-darwin-arm64": "npm:1.0.0-beta.9-commit.d91dfb5"
"@rolldown/binding-darwin-x64": "npm:1.0.0-beta.9-commit.d91dfb5"
"@rolldown/binding-freebsd-x64": "npm:1.0.0-beta.9-commit.d91dfb5"
"@rolldown/binding-linux-arm-gnueabihf": "npm:1.0.0-beta.9-commit.d91dfb5"
"@rolldown/binding-linux-arm64-gnu": "npm:1.0.0-beta.9-commit.d91dfb5"
"@rolldown/binding-linux-arm64-musl": "npm:1.0.0-beta.9-commit.d91dfb5"
"@rolldown/binding-linux-x64-gnu": "npm:1.0.0-beta.9-commit.d91dfb5"
"@rolldown/binding-linux-x64-musl": "npm:1.0.0-beta.9-commit.d91dfb5"
"@rolldown/binding-wasm32-wasi": "npm:1.0.0-beta.9-commit.d91dfb5"
"@rolldown/binding-win32-arm64-msvc": "npm:1.0.0-beta.9-commit.d91dfb5"
"@rolldown/binding-win32-ia32-msvc": "npm:1.0.0-beta.9-commit.d91dfb5"
"@rolldown/binding-win32-x64-msvc": "npm:1.0.0-beta.9-commit.d91dfb5"
"@rolldown/pluginutils": "npm:1.0.0-beta.9-commit.d91dfb5"
ansis: "npm:^4.0.0"
dependenciesMeta:
"@rolldown/binding-darwin-arm64":
optional: true
"@rolldown/binding-darwin-x64":
optional: true
"@rolldown/binding-freebsd-x64":
optional: true
"@rolldown/binding-linux-arm-gnueabihf":
optional: true
"@rolldown/binding-linux-arm64-gnu":
optional: true
"@rolldown/binding-linux-arm64-musl":
optional: true
"@rolldown/binding-linux-x64-gnu":
optional: true
"@rolldown/binding-linux-x64-musl":
optional: true
"@rolldown/binding-wasm32-wasi":
optional: true
"@rolldown/binding-win32-arm64-msvc":
optional: true
"@rolldown/binding-win32-ia32-msvc":
optional: true
"@rolldown/binding-win32-x64-msvc":
optional: true
bin:
rolldown: bin/cli.mjs
checksum: 10c0/fae589d1e3de6174a00bc02954abc6418fe1df70b109e709c0bc7d95ac51b9d18c478137948dc89283967c1e1e5fb02d3a79c1c448496d14d02ad117d03b761d
languageName: node
linkType: hard
"rollup-plugin-visualizer@npm:^5.12.0":
version: 5.14.0
resolution: "rollup-plugin-visualizer@npm:5.14.0"
@ -17255,6 +17662,15 @@ __metadata:
languageName: node
linkType: hard
"semver@npm:^7.7.2":
version: 7.7.2
resolution: "semver@npm:7.7.2"
bin:
semver: bin/semver.js
checksum: 10c0/aca305edfbf2383c22571cb7714f48cadc7ac95371b4b52362fb8eeffdfbc0de0669368b82b2b15978f8848f01d7114da65697e56cd8c37b0dab8c58e543f9ea
languageName: node
linkType: hard
"send@npm:^1.1.0, send@npm:^1.2.0":
version: 1.2.0
resolution: "send@npm:1.2.0"
@ -18219,6 +18635,16 @@ __metadata:
languageName: node
linkType: hard
"tinyglobby@npm:^0.2.14":
version: 0.2.14
resolution: "tinyglobby@npm:0.2.14"
dependencies:
fdir: "npm:^6.4.4"
picomatch: "npm:^4.0.2"
checksum: 10c0/f789ed6c924287a9b7d3612056ed0cda67306cd2c80c249fd280cf1504742b12583a2089b61f4abbd24605f390809017240e250241f09938054c9b363e51c0a6
languageName: node
linkType: hard
"tinypool@npm:^1.0.2":
version: 1.0.2
resolution: "tinypool@npm:1.0.2"
@ -18437,6 +18863,46 @@ __metadata:
languageName: node
linkType: hard
"tsdown@npm:^0.12.9":
version: 0.12.9
resolution: "tsdown@npm:0.12.9"
dependencies:
ansis: "npm:^4.1.0"
cac: "npm:^6.7.14"
chokidar: "npm:^4.0.3"
debug: "npm:^4.4.1"
diff: "npm:^8.0.2"
empathic: "npm:^2.0.0"
hookable: "npm:^5.5.3"
rolldown: "npm:^1.0.0-beta.19"
rolldown-plugin-dts: "npm:^0.13.12"
semver: "npm:^7.7.2"
tinyexec: "npm:^1.0.1"
tinyglobby: "npm:^0.2.14"
unconfig: "npm:^7.3.2"
peerDependencies:
"@arethetypeswrong/core": ^0.18.1
publint: ^0.3.0
typescript: ^5.0.0
unplugin-lightningcss: ^0.4.0
unplugin-unused: ^0.5.0
peerDependenciesMeta:
"@arethetypeswrong/core":
optional: true
publint:
optional: true
typescript:
optional: true
unplugin-lightningcss:
optional: true
unplugin-unused:
optional: true
bin:
tsdown: dist/run.mjs
checksum: 10c0/5dd4842982815181f5a79bc87fff1dd9afc6952aaec065dcececde5ba76887163a01de313272964003ea90df8ac23efdfc8aabb290c5b8f8dae5332e9905c05b
languageName: node
linkType: hard
"tslib@npm:2.6.2":
version: 2.6.2
resolution: "tslib@npm:2.6.2"
@ -18568,6 +19034,18 @@ __metadata:
languageName: node
linkType: hard
"unconfig@npm:^7.3.2":
version: 7.3.2
resolution: "unconfig@npm:7.3.2"
dependencies:
"@quansync/fs": "npm:^0.1.1"
defu: "npm:^6.1.4"
jiti: "npm:^2.4.2"
quansync: "npm:^0.2.8"
checksum: 10c0/245a0add92413b9a04a0bad879c7ee4d6904e58c9d091dbb1ea89fb7491d22d0f2ad17bd561329e006cb1954b5ece00f4cd9f9300a72af5013a927dc7fd5d27b
languageName: node
linkType: hard
"underscore@npm:^1.13.1":
version: 1.13.7
resolution: "underscore@npm:1.13.7"