From 1c5a30cf49d5fcec60d1e43d2185f1119061c48a Mon Sep 17 00:00:00 2001 From: MyPrototypeWhat Date: Wed, 18 Jun 2025 19:23:14 +0800 Subject: [PATCH] feat: enhance AI Core with new client and plugin system features - Introduced `PluginEnabledAiClient` for a more flexible client interface with integrated plugin support. - Updated `ApiClientFactory` and `UniversalAiSdkClient` to utilize new provider settings for improved type safety. - Added a comprehensive plugin management system, allowing for dynamic plugin registration and execution. - Enhanced the provider registry to include new AI providers and updated existing provider settings. - Removed deprecated files and streamlined the codebase for better maintainability and clarity. - Updated documentation to reflect new features and usage examples for the plugin system. --- packages/aiCore/README.md | 21 +- packages/aiCore/package.json | 1 + .../aiCore/src/clients/ApiClientFactory.ts | 57 +- .../src/clients/PluginEnabledAiClient.ts | 306 +++++++++++ .../src/clients/UniversalAiSdkClient.ts | 134 ++++- packages/aiCore/src/clients/types.ts | 66 ++- packages/aiCore/src/index.ts | 110 ++-- .../src/middleware/examples/example-usage.ts | 102 ---- .../src/{middleware => plugins}/README.md | 0 .../examples/example-plugins.ts | 0 .../src/plugins/examples/example-usage.ts | 255 +++++++++ .../src/{middleware => plugins}/index.ts | 0 .../src/{middleware => plugins}/manager.ts | 0 .../src/{middleware => plugins}/types.ts | 23 + packages/aiCore/src/providers/registry.ts | 107 +++- packages/aiCore/src/types/index.ts | 66 --- yarn.lock | 496 +++++++++++++++++- 17 files changed, 1492 insertions(+), 252 deletions(-) create mode 100644 packages/aiCore/src/clients/PluginEnabledAiClient.ts delete mode 100644 packages/aiCore/src/middleware/examples/example-usage.ts rename packages/aiCore/src/{middleware => plugins}/README.md (100%) rename packages/aiCore/src/{middleware => plugins}/examples/example-plugins.ts (100%) create mode 100644 packages/aiCore/src/plugins/examples/example-usage.ts rename packages/aiCore/src/{middleware => plugins}/index.ts (100%) rename packages/aiCore/src/{middleware => plugins}/manager.ts (100%) rename packages/aiCore/src/{middleware => plugins}/types.ts (75%) delete mode 100644 packages/aiCore/src/types/index.ts diff --git a/packages/aiCore/README.md b/packages/aiCore/README.md index 99aa6ecc2a..ddccffdda2 100644 --- a/packages/aiCore/README.md +++ b/packages/aiCore/README.md @@ -15,6 +15,7 @@ Cherry Studio AI Core 是一个基于 Vercel AI SDK 的统一 AI Provider 接口 基于 [AI SDK 官方支持的 providers](https://ai-sdk.dev/providers/ai-sdk-providers): **核心 Providers:** + - OpenAI - Anthropic - Google Generative AI @@ -25,6 +26,7 @@ Cherry Studio AI Core 是一个基于 Vercel AI SDK 的统一 AI Provider 接口 - Amazon Bedrock **扩展 Providers:** + - Cohere - Groq - Together.ai @@ -64,17 +66,13 @@ const client = await createAiSdkClient('openai', { // 流式生成 const result = await client.stream({ modelId: 'gpt-4', - messages: [ - { role: 'user', content: 'Hello!' } - ] + messages: [{ role: 'user', content: 'Hello!' }] }) // 非流式生成 const response = await client.generate({ modelId: 'gpt-4', - messages: [ - { role: 'user', content: 'Hello!' } - ] + messages: [{ role: 'user', content: 'Hello!' }] }) ``` @@ -89,12 +87,9 @@ const client = await createOpenAIClient({ }) // 便捷流式生成 -const result = await streamGeneration( - 'openai', - 'gpt-4', - [{ role: 'user', content: 'Hello!' }], - { apiKey: 'your-api-key' } -) +const result = await streamGeneration('openai', 'gpt-4', [{ role: 'user', content: 'Hello!' }], { + apiKey: 'your-api-key' +}) ``` ### 多 Provider 支持 @@ -111,4 +106,4 @@ const xaiClient = await createAiSdkClient('xai', { apiKey: 'xai-key' }) ## License -MIT \ No newline at end of file +MIT diff --git a/packages/aiCore/package.json b/packages/aiCore/package.json index f366799b20..d1f810e404 100644 --- a/packages/aiCore/package.json +++ b/packages/aiCore/package.json @@ -40,6 +40,7 @@ "@ai-sdk/togetherai": "^0.2.14", "@ai-sdk/vercel": "^0.0.1", "@ai-sdk/xai": "^1.2.16", + "@openrouter/ai-sdk-provider": "^0.1.0", "ai": "^4.3.16", "anthropic-vertex-ai": "^1.0.2", "ollama-ai-provider": "^1.2.0", diff --git a/packages/aiCore/src/clients/ApiClientFactory.ts b/packages/aiCore/src/clients/ApiClientFactory.ts index 0d3547a57a..ed2b3c514b 100644 --- a/packages/aiCore/src/clients/ApiClientFactory.ts +++ b/packages/aiCore/src/clients/ApiClientFactory.ts @@ -7,6 +7,7 @@ import type { ImageModelV1 } from '@ai-sdk/provider' import { type LanguageModelV1, wrapLanguageModel } from 'ai' import { aiProviderRegistry } from '../providers/registry' +import { type ProviderId, type ProviderSettingsMap } from './types' // 客户端配置接口 export interface ClientConfig { @@ -33,23 +34,29 @@ export class ClientFactoryError extends Error { export class ApiClientFactory { /** * 创建 AI SDK 模型实例 - * 直接返回 LanguageModelV1 实例用于 streamText/generateText + * 对于已知的 Provider 使用严格类型检查,未知的 Provider 默认使用 openai-compatible */ + static async createClient( + providerId: T, + modelId: string, + options: ProviderSettingsMap[T] + ): Promise + static async createClient( providerId: string, - modelId: string = 'default', - options: any = {} - ): Promise { + modelId: string, + options: ProviderSettingsMap['openai-compatible'] + ): Promise + + static async createClient(providerId: string, modelId: string = 'default', options: any): Promise { try { - // 验证provider是否支持 - if (!aiProviderRegistry.isSupported(providerId)) { - throw new ClientFactoryError(`Provider "${providerId}" is not supported`, providerId) - } + // 对于不在注册表中的 provider,默认使用 openai-compatible + const effectiveProviderId = aiProviderRegistry.isSupported(providerId) ? providerId : 'openai-compatible' // 获取Provider配置 - const providerConfig = aiProviderRegistry.getProvider(providerId) + const providerConfig = aiProviderRegistry.getProvider(effectiveProviderId) if (!providerConfig) { - throw new ClientFactoryError(`Provider "${providerId}" is not registered`, providerId) + throw new ClientFactoryError(`Provider "${effectiveProviderId}" is not registered`, providerId) } // 动态导入模块 @@ -60,10 +67,9 @@ export class ApiClientFactory { if (typeof creatorFunction !== 'function') { throw new ClientFactoryError( - `Creator function "${providerConfig.creatorFunctionName}" not found in the imported module for provider "${providerId}"` + `Creator function "${providerConfig.creatorFunctionName}" not found in the imported module for provider "${effectiveProviderId}"` ) } - // 创建provider实例 const provider = creatorFunction(options) @@ -81,7 +87,7 @@ export class ApiClientFactory { return model } else { - throw new ClientFactoryError(`Unknown model access pattern for provider "${providerId}"`) + throw new ClientFactoryError(`Unknown model access pattern for provider "${effectiveProviderId}"`) } } catch (error) { if (error instanceof ClientFactoryError) { @@ -163,19 +169,36 @@ export class ApiClientFactory { id: string name: string isSupported: boolean + effectiveProvider: string } { - const provider = aiProviderRegistry.getProvider(providerId) + const effectiveProviderId = aiProviderRegistry.isSupported(providerId) ? providerId : 'openai-compatible' + const provider = aiProviderRegistry.getProvider(effectiveProviderId) + return { id: providerId, name: provider?.name || providerId, - isSupported: aiProviderRegistry.isSupported(providerId) + isSupported: aiProviderRegistry.isSupported(providerId), + effectiveProvider: effectiveProviderId } } } // 便捷导出函数 -export const createClient = (providerId: string, modelId?: string, options?: any) => - ApiClientFactory.createClient(providerId, modelId, options) +export function createClient( + providerId: T, + modelId: string, + options: ProviderSettingsMap[T] +): Promise + +export function createClient( + providerId: string, + modelId: string, + options: ProviderSettingsMap['openai-compatible'] +): Promise + +export function createClient(providerId: string, modelId: string = 'default', options: any): Promise { + return ApiClientFactory.createClient(providerId, modelId, options) +} export const getSupportedProviders = () => ApiClientFactory.getSupportedProviders() diff --git a/packages/aiCore/src/clients/PluginEnabledAiClient.ts b/packages/aiCore/src/clients/PluginEnabledAiClient.ts new file mode 100644 index 0000000000..271c29d58d --- /dev/null +++ b/packages/aiCore/src/clients/PluginEnabledAiClient.ts @@ -0,0 +1,306 @@ +/** + * AI Client - Cherry Studio AI Core 的主要客户端接口 + * 默认集成插件系统,提供完整的 AI 调用能力 + * + * ## 使用方式 + * + * ```typescript + * import { AiClient } from '@cherry-studio/ai-core' + * + * // 创建客户端(默认带插件系统) + * const client = AiClient.create('openai', { + * name: 'openai', + * apiKey: process.env.OPENAI_API_KEY + * }, [LoggingPlugin, ContentFilterPlugin]) + * + * // 使用方式与 UniversalAiSdkClient 完全相同 + * const result = await client.generateText('gpt-4', { + * messages: [{ role: 'user', content: 'Hello!' }] + * }) + * ``` + */ + +import { generateObject, generateText, streamObject, streamText } from 'ai' + +import { AiPlugin, createContext, PluginManager } from '../plugins' +import { ApiClientFactory } from './ApiClientFactory' +import { type ProviderId, type ProviderSettingsMap } from './types' +import { UniversalAiSdkClient } from './UniversalAiSdkClient' + +/** + * Cherry Studio AI Core 的主要客户端 + * 默认集成插件系统,提供完整的 AI 调用能力 + */ +export class PluginEnabledAiClient { + private pluginManager: PluginManager + private baseClient: UniversalAiSdkClient + + constructor( + private readonly providerId: T, + private readonly options: ProviderSettingsMap[T], + plugins: AiPlugin[] = [] + ) { + this.pluginManager = new PluginManager(plugins) + this.baseClient = UniversalAiSdkClient.create(providerId, options) + } + + /** + * 添加单个插件 + */ + use(plugin: AiPlugin): this { + this.pluginManager.use(plugin) + return this + } + + /** + * 批量添加插件 + */ + usePlugins(plugins: AiPlugin[]): this { + plugins.forEach((plugin) => this.pluginManager.use(plugin)) + return this + } + + /** + * 移除插件 + */ + removePlugin(pluginName: string): this { + this.pluginManager.remove(pluginName) + return this + } + + /** + * 获取插件统计信息 + */ + getPluginStats() { + return this.pluginManager.getStats() + } + + /** + * 获取插件列表 + */ + getPlugins() { + return this.pluginManager.getPlugins() + } + + /** + * 执行插件处理的通用逻辑 + * 1-5步骤的通用处理 + */ + private async executeWithPlugins( + methodName: string, + modelId: string, + params: TParams, + executor: (finalModelId: string, transformedParams: TParams) => Promise + ): Promise { + // 创建请求上下文 + const context = createContext(this.providerId, modelId, params) + + try { + // 1. 触发请求开始事件 + await this.pluginManager.executeParallel('onRequestStart', context) + + // 2. 解析模型别名 + const resolvedModelId = await this.pluginManager.executeFirst('resolveModel', modelId, context) + const finalModelId = resolvedModelId || modelId + + // 3. 转换请求参数 + const transformedParams = await this.pluginManager.executeSequential('transformParams', params, context) + + // 4. 执行具体的 API 调用 + const result = await executor(finalModelId, transformedParams) + + // 5. 转换结果(对于非流式调用) + const transformedResult = await this.pluginManager.executeSequential('transformResult', result, context) + + // 6. 触发完成事件 + await this.pluginManager.executeParallel('onRequestEnd', context, transformedResult) + + return transformedResult + } catch (error) { + // 7. 触发错误事件 + await this.pluginManager.executeParallel('onError', context, undefined, error as Error) + throw error + } + } + + /** + * 执行流式调用的通用逻辑 + * 流式调用的特殊处理(支持流转换器) + */ + private async executeStreamWithPlugins( + methodName: string, + modelId: string, + params: TParams, + executor: (finalModelId: string, transformedParams: TParams, streamTransforms: any[]) => Promise + ): Promise { + // 创建请求上下文 + const context = createContext(this.providerId, modelId, params) + + try { + // 1. 触发请求开始事件 + await this.pluginManager.executeParallel('onRequestStart', context) + + // 2. 解析模型别名 + const resolvedModelId = await this.pluginManager.executeFirst('resolveModel', modelId, context) + const finalModelId = resolvedModelId || modelId + + // 3. 转换请求参数 + const transformedParams = await this.pluginManager.executeSequential('transformParams', params, context) + + // 4. 收集流转换器 + const streamTransforms = this.pluginManager.collectStreamTransforms() + + // 5. 执行流式 API 调用 + const result = await executor(finalModelId, transformedParams, streamTransforms) + + // 6. 触发完成事件(注意:对于流式调用,这里触发的是开始流式响应的事件) + await this.pluginManager.executeParallel('onRequestEnd', context, { stream: true }) + + return result + } catch (error) { + // 7. 触发错误事件 + await this.pluginManager.executeParallel('onError', context, undefined, error as Error) + throw error + } + } + + /** + * 流式文本生成 - 集成插件系统 + */ + async streamText( + modelId: string, + params: Omit[0], 'model'> + ): Promise> { + return this.executeStreamWithPlugins( + 'streamText', + modelId, + params, + async (finalModelId, transformedParams, streamTransforms) => { + // 对于流式调用,需要直接调用 AI SDK 以支持流转换器 + const model = await ApiClientFactory.createClient(this.providerId, finalModelId, this.options) + + return streamText({ + model, + ...transformedParams, + experimental_transform: streamTransforms.length > 0 ? streamTransforms : undefined + }) + } + ) + } + + /** + * 生成文本 - 集成插件系统 + */ + async generateText( + modelId: string, + params: Omit[0], 'model'> + ): Promise> { + return this.executeWithPlugins('generateText', modelId, params, async (finalModelId, transformedParams) => { + return this.baseClient.generateText(finalModelId, transformedParams) + }) + } + + /** + * 生成结构化对象 - 集成插件系统 + */ + async generateObject( + modelId: string, + params: Omit[0], 'model'> + ): Promise> { + return this.executeWithPlugins('generateObject', modelId, params, async (finalModelId, transformedParams) => { + return this.baseClient.generateObject(finalModelId, transformedParams) + }) + } + + /** + * 流式生成结构化对象 - 集成插件系统 + * 注意:streamObject 目前不支持流转换器,所以使用普通的插件处理 + */ + async streamObject( + modelId: string, + params: Omit[0], 'model'> + ): Promise> { + return this.executeWithPlugins('streamObject', modelId, params, async (finalModelId, transformedParams) => { + return this.baseClient.streamObject(finalModelId, transformedParams) + }) + } + + /** + * 获取客户端信息 + */ + getClientInfo() { + return this.baseClient.getClientInfo() + } + + /** + * 获取底层客户端实例(用于高级用法) + */ + getBaseClient(): UniversalAiSdkClient { + return this.baseClient + } + + // === 静态工厂方法 === + + /** + * 创建 OpenAI Compatible 客户端 + */ + static createOpenAICompatible( + config: ProviderSettingsMap['openai-compatible'], + plugins: AiPlugin[] = [] + ): PluginEnabledAiClient<'openai-compatible'> { + return new PluginEnabledAiClient('openai-compatible', config, plugins) + } + + /** + * 创建标准提供商客户端 + */ + static create( + providerId: T, + options: ProviderSettingsMap[T], + plugins?: AiPlugin[] + ): PluginEnabledAiClient + + static create( + providerId: string, + options: ProviderSettingsMap['openai-compatible'], + plugins?: AiPlugin[] + ): PluginEnabledAiClient<'openai-compatible'> + + static create(providerId: string, options: any, plugins: AiPlugin[] = []): PluginEnabledAiClient { + if (providerId in ({} as ProviderSettingsMap)) { + return new PluginEnabledAiClient(providerId as ProviderId, options, plugins) + } else { + // 对于未知 provider,使用 openai-compatible + return new PluginEnabledAiClient('openai-compatible', options, plugins) + } + } +} + +/** + * 创建 AI 客户端的工厂函数(默认带插件系统) + */ +export function createClient( + providerId: T, + options: ProviderSettingsMap[T], + plugins?: AiPlugin[] +): PluginEnabledAiClient + +export function createClient( + providerId: string, + options: ProviderSettingsMap['openai-compatible'], + plugins?: AiPlugin[] +): PluginEnabledAiClient<'openai-compatible'> + +export function createClient(providerId: string, options: any, plugins: AiPlugin[] = []): PluginEnabledAiClient { + return PluginEnabledAiClient.create(providerId, options, plugins) +} + +/** + * 创建 OpenAI Compatible 客户端的便捷函数 + */ +export function createCompatibleClient( + config: ProviderSettingsMap['openai-compatible'], + plugins: AiPlugin[] = [] +): PluginEnabledAiClient<'openai-compatible'> { + return PluginEnabledAiClient.createOpenAICompatible(config, plugins) +} diff --git a/packages/aiCore/src/clients/UniversalAiSdkClient.ts b/packages/aiCore/src/clients/UniversalAiSdkClient.ts index d2df5c3013..700a52f3ac 100644 --- a/packages/aiCore/src/clients/UniversalAiSdkClient.ts +++ b/packages/aiCore/src/clients/UniversalAiSdkClient.ts @@ -1,20 +1,93 @@ /** * Universal AI SDK Client * 统一的AI SDK客户端实现 + * + * ## 使用方式 + * + * ### 1. 官方提供商 + * ```typescript + * import { UniversalAiSdkClient } from '@cherry-studio/ai-core' + * + * // OpenAI + * const openai = UniversalAiSdkClient.create('openai', { + * name: 'openai', + * apiHost: 'https://api.openai.com/v1', + * apiKey: process.env.OPENAI_API_KEY + * }) + * + * // Anthropic + * const anthropic = UniversalAiSdkClient.create('anthropic', { + * name: 'anthropic', + * apiHost: 'https://api.anthropic.com', + * apiKey: process.env.ANTHROPIC_API_KEY + * }) + * ``` + * + * ### 2. OpenAI Compatible 第三方提供商 + * ```typescript + * // LM Studio (本地运行) + * const lmStudio = UniversalAiSdkClient.createOpenAICompatible({ + * name: 'lm-studio', + * baseURL: 'http://localhost:1234/v1' + * }) + * + * // Ollama (本地运行) + * const ollama = UniversalAiSdkClient.createOpenAICompatible({ + * name: 'ollama', + * baseURL: 'http://localhost:11434/v1' + * }) + * + * // 自定义第三方 API + * const customProvider = UniversalAiSdkClient.createOpenAICompatible({ + * name: 'my-provider', + * apiKey: process.env.CUSTOM_API_KEY, + * baseURL: 'https://api.customprovider.com/v1', + * headers: { + * 'X-Custom-Header': 'value', + * 'User-Agent': 'MyApp/1.0' + * }, + * queryParams: { + * 'api-version': '2024-01' + * } + * }) + * ``` + * + * ### 3. 使用客户端进行 AI 调用 + * ```typescript + * // 流式文本生成 + * const stream = await client.streamText('gpt-4', { + * messages: [{ role: 'user', content: 'Hello!' }] + * }) + * + * // 生成文本 + * const { text } = await client.generateText('gpt-4', { + * messages: [{ role: 'user', content: 'Hello!' }] + * }) + * + * // 生成结构化对象 + * const { object } = await client.generateObject('gpt-4', { + * messages: [{ role: 'user', content: 'Generate a user profile' }], + * schema: z.object({ + * name: z.string(), + * age: z.number() + * }) + * }) + * ``` */ import { experimental_generateImage as generateImage, generateObject, generateText, streamObject, streamText } from 'ai' import { ApiClientFactory } from './ApiClientFactory' +import { type ProviderId, type ProviderSettingsMap } from './types' /** * 通用 AI SDK 客户端 * 为特定 AI 提供商创建的客户端实例 */ -export class UniversalAiSdkClient { +export class UniversalAiSdkClient { constructor( - private readonly providerId: string, - private readonly options: any = {} + private readonly providerId: T, + private readonly options: ProviderSettingsMap[T] ) {} /** @@ -82,11 +155,62 @@ export class UniversalAiSdkClient { getClientInfo() { return ApiClientFactory.getClientInfo(this.providerId) } + + // === 静态工厂方法 === + + /** + * 创建 OpenAI Compatible 客户端 + * 用于那些实现 OpenAI API 的第三方提供商 + */ + static createOpenAICompatible( + config: ProviderSettingsMap['openai-compatible'] + ): UniversalAiSdkClient<'openai-compatible'> { + return new UniversalAiSdkClient('openai-compatible', config) + } + + /** + * 创建标准提供商客户端 + * 对于已知的 Provider 使用严格类型检查,未知的 Provider 默认使用 openai-compatible + */ + static create(providerId: T, options: ProviderSettingsMap[T]): UniversalAiSdkClient + + static create( + providerId: string, + options: ProviderSettingsMap['openai-compatible'] + ): UniversalAiSdkClient<'openai-compatible'> + + static create(providerId: string, options: any): UniversalAiSdkClient { + if (providerId in ({} as ProviderSettingsMap)) { + return new UniversalAiSdkClient(providerId as ProviderId, options) + } else { + // 对于未知 provider,使用 openai-compatible + return new UniversalAiSdkClient('openai-compatible', options) + } + } } /** * 创建客户端实例的工厂函数 */ -export function createUniversalClient(providerId: string, options: ProviderOptions): UniversalAiSdkClient { - return new UniversalAiSdkClient(providerId, options) +export function createUniversalClient( + providerId: T, + options: ProviderSettingsMap[T] +): UniversalAiSdkClient + +export function createUniversalClient( + providerId: string, + options: ProviderSettingsMap['openai-compatible'] +): UniversalAiSdkClient<'openai-compatible'> + +export function createUniversalClient(providerId: string, options: any): UniversalAiSdkClient { + return UniversalAiSdkClient.create(providerId, options) +} + +/** + * 创建 OpenAI Compatible 客户端的便捷函数 + */ +export function createOpenAICompatibleClient( + config: ProviderSettingsMap['openai-compatible'] +): UniversalAiSdkClient<'openai-compatible'> { + return UniversalAiSdkClient.createOpenAICompatible(config) } diff --git a/packages/aiCore/src/clients/types.ts b/packages/aiCore/src/clients/types.ts index f080edb225..f9c6b37fe2 100644 --- a/packages/aiCore/src/clients/types.ts +++ b/packages/aiCore/src/clients/types.ts @@ -1,6 +1,66 @@ -export type ProviderOptions = { +import { FetchFunction } from '@ai-sdk/provider-utils' + +import type { ProviderSettingsMap } from '../providers/registry' + +// ProviderSettings 是所有 Provider Settings 的联合类型 +export type ProviderSettings = ProviderSettingsMap[keyof ProviderSettingsMap] + +// 基础 Provider 配置类型(为了向后兼容和通用场景) +export type BaseProviderSettings = { + /** + * API key for authentication + */ apiKey?: string + /** + * Base URL for the API calls + */ baseURL?: string - apiVersion?: string - headers?: Record + /** + * Custom headers to include in the requests + */ + headers?: Record + /** + * Optional custom url query parameters to include in request urls + */ + queryParams?: Record + /** + * Custom fetch implementation. You can use it as a middleware to intercept requests, + * or to provide a custom fetch implementation for e.g. testing. + */ + fetch?: FetchFunction + /** + * Allow additional properties for provider-specific settings + */ + [key: string]: any } + +// 重新导出 ProviderSettingsMap 中的所有类型 +export type { + AmazonBedrockProviderSettings, + AnthropicProviderSettings, + AnthropicVertexProviderSettings, + AzureOpenAIProviderSettings, + CerebrasProviderSettings, + CohereProviderSettings, + DeepInfraProviderSettings, + DeepSeekProviderSettings, + FalProviderSettings, + FireworksProviderSettings, + GoogleGenerativeAIProviderSettings, + GoogleVertexProviderSettings, + GroqProviderSettings, + MistralProviderSettings, + OllamaProviderSettings, + OpenAICompatibleProviderSettings, + OpenAIProviderSettings, + OpenRouterProviderSettings, + PerplexityProviderSettings, + ProviderId, + ProviderSettingsMap, + QwenProviderSettings, + ReplicateProviderSettings, + TogetherAIProviderSettings, + VercelProviderSettings, + XaiProviderSettings, + ZhipuProviderSettings +} from '../providers/registry' diff --git a/packages/aiCore/src/index.ts b/packages/aiCore/src/index.ts index 59201cc913..12da6b844d 100644 --- a/packages/aiCore/src/index.ts +++ b/packages/aiCore/src/index.ts @@ -5,43 +5,96 @@ // 导入内部使用的类和函数 import { ApiClientFactory } from './clients/ApiClientFactory' -import { ProviderOptions } from './clients/types' +import { createClient } from './clients/PluginEnabledAiClient' +import { type ProviderSettingsMap } from './clients/types' import { createUniversalClient } from './clients/UniversalAiSdkClient' import { aiProviderRegistry, isProviderSupported } from './providers/registry' -// 核心导出 +// ==================== 主要客户端接口 ==================== +// 默认使用集成插件系统的客户端 +export { + PluginEnabledAiClient as AiClient, + createClient, + createCompatibleClient +} from './clients/PluginEnabledAiClient' + +// 为了向后兼容,也导出原名称 +export { PluginEnabledAiClient } from './clients/PluginEnabledAiClient' + +// ==================== 插件系统 ==================== +export type { AiPlugin, AiRequestContext, HookResult, HookType, PluginManagerConfig } from './plugins' +export { createContext, definePlugin, PluginManager } from './plugins' + +// ==================== 底层客户端(高级用法) ==================== +// 不带插件系统的基础客户端,用于需要绕过插件系统的场景 +export { + createOpenAICompatibleClient as createBasicOpenAICompatibleClient, + createUniversalClient, + UniversalAiSdkClient +} from './clients/UniversalAiSdkClient' + +// ==================== 低级 API ==================== export { ApiClientFactory } from './clients/ApiClientFactory' -export { createUniversalClient, UniversalAiSdkClient } from './clients/UniversalAiSdkClient' export { aiProviderRegistry } from './providers/registry' -// 类型导出 +// ==================== 类型定义 ==================== export type { ClientFactoryError } from './clients/ApiClientFactory' +export type { BaseProviderSettings, ProviderSettings } from './clients/types' export type { ProviderConfig } from './providers/registry' export type { ProviderError } from './providers/types' -// 便捷函数导出 -export { createClient, getClientInfo, getSupportedProviders } from './clients/ApiClientFactory' +// 重新导出所有 Provider Settings 类型 +export type { + AmazonBedrockProviderSettings, + AnthropicProviderSettings, + AnthropicVertexProviderSettings, + AzureOpenAIProviderSettings, + CerebrasProviderSettings, + CohereProviderSettings, + DeepInfraProviderSettings, + DeepSeekProviderSettings, + FalProviderSettings, + FireworksProviderSettings, + GoogleGenerativeAIProviderSettings, + GoogleVertexProviderSettings, + GroqProviderSettings, + MistralProviderSettings, + OllamaProviderSettings, + OpenAICompatibleProviderSettings, + OpenAIProviderSettings, + OpenRouterProviderSettings, + PerplexityProviderSettings, + ProviderId, + ProviderSettingsMap, + QwenProviderSettings, + ReplicateProviderSettings, + TogetherAIProviderSettings, + VercelProviderSettings, + XaiProviderSettings, + ZhipuProviderSettings +} from './clients/types' + +// ==================== 工具函数 ==================== +export { createClient as createApiClient, getClientInfo, getSupportedProviders } from './clients/ApiClientFactory' export { getAllProviders, getProvider, isProviderSupported, registerProvider } from './providers/registry' -// 默认导出 - 主要的工厂类 -export { ApiClientFactory as default } from './clients/ApiClientFactory' - -// 包信息 +// ==================== 包信息 ==================== export const AI_CORE_VERSION = '1.0.0' export const AI_CORE_NAME = '@cherry-studio/ai-core' -// 包配置和实用工具 +// ==================== 便捷 API ==================== +// 主要的便捷工厂类 export const AiCore = { version: AI_CORE_VERSION, name: AI_CORE_NAME, - // 快速创建客户端 - async createClient(providerId: string, modelId: string = 'default', options: any = {}) { - return ApiClientFactory.createClient(providerId, modelId, options) + // 创建主要客户端(默认带插件系统) + create(providerId: string, options: any = {}, plugins: any[] = []) { + return createClient(providerId, options, plugins) }, - // 创建通用客户端 - createUniversalClient(providerId: string, options: any = {}) { + // 创建基础客户端(不带插件系统) + createBasic(providerId: string, options: any = {}) { return createUniversalClient(providerId, options) }, @@ -61,28 +114,23 @@ export const AiCore = { } } -// 便捷的预配置clients创建函数 -export const createOpenAIClient = (options: ProviderOptions) => { - return createUniversalClient('openai', options) +export const createOpenAIClient = (options: ProviderSettingsMap['openai'], plugins?: any[]) => { + return createClient('openai', options, plugins) } -export const createOpenAICompatibleClient = (options: ProviderOptions) => { - return createUniversalClient('openai-compatible', options) +export const createAnthropicClient = (options: ProviderSettingsMap['anthropic'], plugins?: any[]) => { + return createClient('anthropic', options, plugins) } -export const createAnthropicClient = (options: ProviderOptions) => { - return createUniversalClient('anthropic', options) +export const createGoogleClient = (options: ProviderSettingsMap['google'], plugins?: any[]) => { + return createClient('google', options, plugins) } -export const createGoogleClient = (options: ProviderOptions) => { - return createUniversalClient('google', options) +export const createXAIClient = (options: ProviderSettingsMap['xai'], plugins?: any[]) => { + return createClient('xai', options, plugins) } -export const createXAIClient = (options: ProviderOptions) => { - return createUniversalClient('xai', options) -} - -// 调试和开发工具 +// ==================== 调试和开发工具 ==================== export const DevTools = { // 列出所有注册的providers listProviders() { @@ -95,7 +143,7 @@ export const DevTools = { // 测试provider连接 async testProvider(providerId: string, options: any) { try { - const client = createUniversalClient(providerId, options) + const client = createClient(providerId, options) const info = client.getClientInfo() return { success: true, diff --git a/packages/aiCore/src/middleware/examples/example-usage.ts b/packages/aiCore/src/middleware/examples/example-usage.ts deleted file mode 100644 index 9b85a9983e..0000000000 --- a/packages/aiCore/src/middleware/examples/example-usage.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { openai } from '@ai-sdk/openai' -import { streamText } from 'ai' - -import { createContext, PluginManager } from '..' -import { ContentFilterPlugin, LoggingPlugin } from './example-plugins' - -/** - * 完整的 AI SDK 集成示例 - */ -export async function exampleAiRequest() { - // 1. 创建插件管理器 - const pluginManager = new PluginManager([LoggingPlugin, ContentFilterPlugin]) - - // 2. 创建请求上下文 - const context = createContext('openai', 'gpt-4', { - messages: [{ role: 'user', content: 'Hello!' }] - }) - - try { - // 3. 触发请求开始事件 - await pluginManager.executeParallel('onRequestStart', context) - - // 4. 解析模型别名 - // const resolvedModel = await pluginManager.executeFirst('resolveModel', 'gpt-4', context) - // const modelId = resolvedModel || 'gpt-4' - - // 5. 转换请求参数 - const params = { - messages: [{ role: 'user' as const, content: 'Hello, AI!' }], - temperature: 0.7 - } - const transformedParams = await pluginManager.executeSequential('transformParams', params, context) - - // 6. 收集流转换器(关键:AI SDK 原生支持数组!) - const streamTransforms = pluginManager.collectStreamTransforms() - - // 7. 调用 AI SDK,直接传入转换器工厂数组 - const result = await streamText({ - model: openai('gpt-4'), - ...transformedParams, - experimental_transform: streamTransforms // 直接传入工厂函数数组 - }) - - // 8. 处理结果 - let fullText = '' - for await (const textPart of result.textStream) { - fullText += textPart - console.log('Streaming:', textPart) - } - - // 9. 转换最终结果 - const finalResult = { text: fullText, usage: await result.usage } - const transformedResult = await pluginManager.executeSequential('transformResult', finalResult, context) - - // 10. 触发完成事件 - await pluginManager.executeParallel('onRequestEnd', context, transformedResult) - - return transformedResult - } catch (error) { - // 11. 触发错误事件 - await pluginManager.executeParallel('onError', context, undefined, error as Error) - throw error - } -} - -/** - * 流转换器数组的其他使用方式 - */ -export function demonstrateStreamTransforms() { - const pluginManager = new PluginManager([ - ContentFilterPlugin, - { - name: 'text-replacer', - transformStream() { - return () => - new TransformStream({ - transform(chunk, controller) { - if (chunk.type === 'text-delta') { - const replaced = chunk.textDelta.replace(/hello/gi, 'hi') - controller.enqueue({ ...chunk, textDelta: replaced }) - } else { - controller.enqueue(chunk) - } - } - }) - } - } - ]) - - // 获取所有流转换器 - const transforms = pluginManager.collectStreamTransforms() - console.log(`收集到 ${transforms.length} 个流转换器`) - - // 可以单独使用每个转换器 - transforms.forEach((factory, index) => { - console.log(`转换器 ${index + 1} 已准备就绪`) - const transform = factory({ stopStream: () => {} }) - console.log('Transform created:', transform) - }) - - return transforms -} diff --git a/packages/aiCore/src/middleware/README.md b/packages/aiCore/src/plugins/README.md similarity index 100% rename from packages/aiCore/src/middleware/README.md rename to packages/aiCore/src/plugins/README.md diff --git a/packages/aiCore/src/middleware/examples/example-plugins.ts b/packages/aiCore/src/plugins/examples/example-plugins.ts similarity index 100% rename from packages/aiCore/src/middleware/examples/example-plugins.ts rename to packages/aiCore/src/plugins/examples/example-plugins.ts diff --git a/packages/aiCore/src/plugins/examples/example-usage.ts b/packages/aiCore/src/plugins/examples/example-usage.ts new file mode 100644 index 0000000000..2ef253c11a --- /dev/null +++ b/packages/aiCore/src/plugins/examples/example-usage.ts @@ -0,0 +1,255 @@ +import { openai } from '@ai-sdk/openai' +import { streamText } from 'ai' + +import { PluginEnabledAiClient } from '../../clients/PluginEnabledAiClient' +import { createContext, PluginManager } from '../' +import { ContentFilterPlugin, LoggingPlugin } from './example-plugins' + +/** + * 使用 PluginEnabledAiClient 的推荐方式 + * 这是最简单直接的使用方法 + */ +export async function exampleWithPluginEnabledClient() { + console.log('=== 使用 PluginEnabledAiClient 示例 ===') + + // 1. 创建带插件的客户端 - 链式调用方式 + const client = PluginEnabledAiClient.create('openai-compatible', { + name: 'openai', + baseURL: 'https://api.openai.com/v1', + apiKey: process.env.OPENAI_API_KEY || 'sk-test' + }) + .use(LoggingPlugin) + .use(ContentFilterPlugin) + + // 2. 或者在创建时传入插件(也可以这样使用) + // const clientWithPlugins = PluginEnabledAiClient.create( + // 'openai-compatible', + // { + // name: 'openai', + // baseURL: 'https://api.openai.com/v1', + // apiKey: process.env.OPENAI_API_KEY || 'sk-test' + // }, + // [LoggingPlugin, ContentFilterPlugin] + // ) + + // 3. 查看插件统计信息 + console.log('插件统计:', client.getPluginStats()) + + try { + // 4. 使用客户端进行 AI 调用(插件会自动生效) + console.log('开始生成文本...') + const result = await client.generateText('gpt-4', { + messages: [{ role: 'user', content: 'Hello, world!' }], + temperature: 0.7 + }) + + console.log('生成的文本:', result.text) + + // 5. 流式调用(支持流转换器) + console.log('开始流式生成...') + const streamResult = await client.streamText('gpt-4', { + messages: [{ role: 'user', content: 'Tell me a short story about AI' }] + }) + + console.log('开始流式响应...') + for await (const textPart of streamResult.textStream) { + process.stdout.write(textPart) + } + console.log('\n流式响应完成') + + return result + } catch (error) { + console.error('调用失败:', error) + throw error + } +} + +/** + * 创建 OpenAI Compatible 客户端的示例 + */ +export function exampleOpenAICompatible() { + console.log('=== OpenAI Compatible 示例 ===') + + // Ollama 示例 + const ollama = PluginEnabledAiClient.createOpenAICompatible( + { + name: 'ollama', + baseURL: 'http://localhost:11434/v1' + }, + [LoggingPlugin] + ) + + // LM Studio 示例 + const lmStudio = PluginEnabledAiClient.createOpenAICompatible({ + name: 'lm-studio', + baseURL: 'http://localhost:1234/v1' + }).use(ContentFilterPlugin) + + console.log('Ollama 插件统计:', ollama.getPluginStats()) + console.log('LM Studio 插件统计:', lmStudio.getPluginStats()) + + return { ollama, lmStudio } +} + +/** + * 动态插件管理示例 + */ +export function exampleDynamicPlugins() { + console.log('=== 动态插件管理示例 ===') + + const client = PluginEnabledAiClient.create('openai-compatible', { + name: 'openai', + baseURL: 'https://api.openai.com/v1', + apiKey: 'your-api-key' + }) + + console.log('初始状态:', client.getPluginStats()) + + // 动态添加插件 + client.use(LoggingPlugin) + console.log('添加 LoggingPlugin 后:', client.getPluginStats()) + + client.usePlugins([ContentFilterPlugin]) + console.log('添加 ContentFilterPlugin 后:', client.getPluginStats()) + + // 移除插件 + client.removePlugin('content-filter') + console.log('移除 content-filter 后:', client.getPluginStats()) + + return client +} + +/** + * 完整的低级 API 示例(原有的 example-usage.ts 的方式) + * 这种方式适合需要精细控制插件生命周期的场景 + */ +export async function exampleLowLevelApi() { + console.log('=== 低级 API 示例 ===') + + // 1. 创建插件管理器 + const pluginManager = new PluginManager([LoggingPlugin, ContentFilterPlugin]) + + // 2. 创建请求上下文 + const context = createContext('openai', 'gpt-4', { + messages: [{ role: 'user', content: 'Hello!' }] + }) + + try { + // 3. 触发请求开始事件 + await pluginManager.executeParallel('onRequestStart', context) + + // 4. 解析模型别名 + const resolvedModel = await pluginManager.executeFirst('resolveModel', 'gpt-4', context) + console.log('Resolved model:', resolvedModel || 'gpt-4') + + // 5. 转换请求参数 + const params = { + messages: [{ role: 'user' as const, content: 'Hello, AI!' }], + temperature: 0.7 + } + const transformedParams = await pluginManager.executeSequential('transformParams', params, context) + + // 6. 收集流转换器(关键:AI SDK 原生支持数组!) + const streamTransforms = pluginManager.collectStreamTransforms() + + // 7. 调用 AI SDK,直接传入转换器工厂数组 + const result = await streamText({ + model: openai('gpt-4'), + ...transformedParams, + experimental_transform: streamTransforms // 直接传入工厂函数数组 + }) + + // 8. 处理结果 + let fullText = '' + for await (const textPart of result.textStream) { + fullText += textPart + console.log('Streaming:', textPart) + } + + // 9. 转换最终结果 + const finalResult = { text: fullText, usage: await result.usage } + const transformedResult = await pluginManager.executeSequential('transformResult', finalResult, context) + + // 10. 触发完成事件 + await pluginManager.executeParallel('onRequestEnd', context, transformedResult) + + return transformedResult + } catch (error) { + // 11. 触发错误事件 + await pluginManager.executeParallel('onError', context, undefined, error as Error) + throw error + } +} + +/** + * 流转换器数组的其他使用方式 + */ +export function demonstrateStreamTransforms() { + console.log('=== 流转换器示例 ===') + + const pluginManager = new PluginManager([ + ContentFilterPlugin, + { + name: 'text-replacer', + transformStream() { + return () => + new TransformStream({ + transform(chunk, controller) { + if (chunk.type === 'text-delta') { + const replaced = chunk.textDelta.replace(/hello/gi, 'hi') + controller.enqueue({ ...chunk, textDelta: replaced }) + } else { + controller.enqueue(chunk) + } + } + }) + } + } + ]) + + // 获取所有流转换器 + const transforms = pluginManager.collectStreamTransforms() + console.log(`收集到 ${transforms.length} 个流转换器`) + + // 可以单独使用每个转换器 + transforms.forEach((factory, index) => { + console.log(`转换器 ${index + 1} 已准备就绪`) + const transform = factory({ stopStream: () => {} }) + console.log('Transform created:', transform) + }) + + return transforms +} + +/** + * 运行所有示例 + */ +export async function runAllExamples() { + console.log('🚀 开始运行所有示例...\n') + + try { + // 1. PluginEnabledAiClient 示例(推荐) + await exampleWithPluginEnabledClient() + console.log('✅ PluginEnabledAiClient 示例完成\n') + + // 2. OpenAI Compatible 示例 + exampleOpenAICompatible() + console.log('✅ OpenAI Compatible 示例完成\n') + + // 3. 动态插件管理示例 + exampleDynamicPlugins() + console.log('✅ 动态插件管理示例完成\n') + + // 4. 流转换器示例 + demonstrateStreamTransforms() + console.log('✅ 流转换器示例完成\n') + + // 5. 低级 API 示例 + // await exampleLowLevelApi() + console.log('✅ 低级 API 示例完成\n') + + console.log('🎉 所有示例运行完成!') + } catch (error) { + console.error('❌ 示例运行失败:', error) + } +} diff --git a/packages/aiCore/src/middleware/index.ts b/packages/aiCore/src/plugins/index.ts similarity index 100% rename from packages/aiCore/src/middleware/index.ts rename to packages/aiCore/src/plugins/index.ts diff --git a/packages/aiCore/src/middleware/manager.ts b/packages/aiCore/src/plugins/manager.ts similarity index 100% rename from packages/aiCore/src/middleware/manager.ts rename to packages/aiCore/src/plugins/manager.ts diff --git a/packages/aiCore/src/middleware/types.ts b/packages/aiCore/src/plugins/types.ts similarity index 75% rename from packages/aiCore/src/middleware/types.ts rename to packages/aiCore/src/plugins/types.ts index 94594744d8..7d41f4d2d8 100644 --- a/packages/aiCore/src/middleware/types.ts +++ b/packages/aiCore/src/plugins/types.ts @@ -1,5 +1,28 @@ import type { LanguageModelV1Middleware, TextStreamPart, ToolSet } from 'ai' +/** + * 生命周期阶段定义 + */ +export enum LifecycleStage { + PRE_REQUEST = 'pre-request', // 请求预处理 + REQUEST_EXECUTION = 'execution', // 请求执行 + STREAM_PROCESSING = 'stream', // 流式处理(仅流模式) + POST_RESPONSE = 'post-response', // 响应后处理 + ERROR_HANDLING = 'error' // 错误处理 +} + +/** + * 生命周期上下文 + */ +export interface LifecycleContext { + currentStage: LifecycleStage + startTime: number + stageStartTime: number + completedStages: Set + stageDurations: Map + metadata: Record +} + /** * AI 请求上下文 */ diff --git a/packages/aiCore/src/providers/registry.ts b/packages/aiCore/src/providers/registry.ts index 8f84ea1cee..863e979348 100644 --- a/packages/aiCore/src/providers/registry.ts +++ b/packages/aiCore/src/providers/registry.ts @@ -2,10 +2,68 @@ import type { LanguageModelV1Middleware } from 'ai' /** * AI Provider 注册表 - * 统一管理所有 AI SDK Providers 的动态导入和工厂函数 + * 静态类型 + 动态导入模式:所有类型静态导入,所有实现动态导入 */ -// Provider 配置接口(简化版) +// 静态导入所有 AI SDK 类型 +import { type AmazonBedrockProviderSettings } from '@ai-sdk/amazon-bedrock' +import { type AnthropicProviderSettings } from '@ai-sdk/anthropic' +import { type AzureOpenAIProviderSettings } from '@ai-sdk/azure' +import { type CerebrasProviderSettings } from '@ai-sdk/cerebras' +import { type CohereProviderSettings } from '@ai-sdk/cohere' +import { type DeepInfraProviderSettings } from '@ai-sdk/deepinfra' +import { type DeepSeekProviderSettings } from '@ai-sdk/deepseek' +import { type FalProviderSettings } from '@ai-sdk/fal' +import { type FireworksProviderSettings } from '@ai-sdk/fireworks' +import { type GoogleGenerativeAIProviderSettings } from '@ai-sdk/google' +import { type GoogleVertexProviderSettings } from '@ai-sdk/google-vertex' +import { type GroqProviderSettings } from '@ai-sdk/groq' +import { type MistralProviderSettings } from '@ai-sdk/mistral' +import { type OpenAIProviderSettings } from '@ai-sdk/openai' +import { type OpenAICompatibleProviderSettings } from '@ai-sdk/openai-compatible' +import { type PerplexityProviderSettings } from '@ai-sdk/perplexity' +import { type ReplicateProviderSettings } from '@ai-sdk/replicate' +import { type TogetherAIProviderSettings } from '@ai-sdk/togetherai' +import { type VercelProviderSettings } from '@ai-sdk/vercel' +import { type XaiProviderSettings } from '@ai-sdk/xai' +import { type OpenRouterProviderSettings } from '@openrouter/ai-sdk-provider' +import { type AnthropicVertexProviderSettings } from 'anthropic-vertex-ai' +import { type OllamaProviderSettings } from 'ollama-ai-provider' +import { type QwenProviderSettings } from 'qwen-ai-provider' +import { type ZhipuProviderSettings } from 'zhipu-ai-provider' + +// 类型安全的 Provider Settings 映射 +export type ProviderSettingsMap = { + openai: OpenAIProviderSettings + 'openai-compatible': OpenAICompatibleProviderSettings + anthropic: AnthropicProviderSettings + google: GoogleGenerativeAIProviderSettings + 'google-vertex': GoogleVertexProviderSettings + mistral: MistralProviderSettings + xai: XaiProviderSettings + azure: AzureOpenAIProviderSettings + bedrock: AmazonBedrockProviderSettings + cohere: CohereProviderSettings + groq: GroqProviderSettings + together: TogetherAIProviderSettings + fireworks: FireworksProviderSettings + deepseek: DeepSeekProviderSettings + cerebras: CerebrasProviderSettings + deepinfra: DeepInfraProviderSettings + replicate: ReplicateProviderSettings + perplexity: PerplexityProviderSettings + fal: FalProviderSettings + vercel: VercelProviderSettings + ollama: OllamaProviderSettings + qwen: QwenProviderSettings + zhipu: ZhipuProviderSettings + 'anthropic-vertex': AnthropicVertexProviderSettings + openrouter: OpenRouterProviderSettings +} + +export type ProviderId = keyof ProviderSettingsMap + +// 统一的 Provider 配置接口(所有都使用动态导入) export interface ProviderConfig { id: string name: string @@ -44,7 +102,7 @@ export class AiProviderRegistry { */ private initializeProviders(): void { const providers: ProviderConfig[] = [ - // 核心 AI SDK Providers + // 官方 AI SDK Providers (19个) { id: 'openai', name: 'OpenAI', @@ -175,13 +233,10 @@ export class AiProviderRegistry { id: 'vercel', name: 'Vercel', import: () => import('@ai-sdk/vercel'), - creatorFunctionName: 'createVercel', - supportsImageGeneration: false - } - ] + creatorFunctionName: 'createVercel' + }, - // 社区提供的 Providers - const communityProviders: ProviderConfig[] = [ + // 社区 Providers (5个) { id: 'ollama', name: 'Ollama', @@ -219,9 +274,8 @@ export class AiProviderRegistry { } ] - // 注册所有 providers(官方 + 社区) - const allProviders = [...providers, ...communityProviders] - allProviders.forEach((config) => { + // 注册所有 providers (总计24个) + providers.forEach((config) => { this.registry.set(config.id, config) }) } @@ -289,3 +343,32 @@ export const registerProvider = (config: ProviderConfig) => aiProviderRegistry.r // 兼容现有实现的导出 export const PROVIDER_REGISTRY = aiProviderRegistry.getCompatibleRegistry() + +// 重新导出所有类型供外部使用 +export type { + AmazonBedrockProviderSettings, + AnthropicProviderSettings, + AnthropicVertexProviderSettings, + AzureOpenAIProviderSettings, + CerebrasProviderSettings, + CohereProviderSettings, + DeepInfraProviderSettings, + DeepSeekProviderSettings, + FalProviderSettings, + FireworksProviderSettings, + GoogleGenerativeAIProviderSettings, + GoogleVertexProviderSettings, + GroqProviderSettings, + MistralProviderSettings, + OllamaProviderSettings, + OpenAICompatibleProviderSettings, + OpenAIProviderSettings, + OpenRouterProviderSettings, + PerplexityProviderSettings, + QwenProviderSettings, + ReplicateProviderSettings, + TogetherAIProviderSettings, + VercelProviderSettings, + XaiProviderSettings, + ZhipuProviderSettings +} diff --git a/packages/aiCore/src/types/index.ts b/packages/aiCore/src/types/index.ts deleted file mode 100644 index e580a4953f..0000000000 --- a/packages/aiCore/src/types/index.ts +++ /dev/null @@ -1,66 +0,0 @@ -/** - * AI Core 类型定义 - * 直接使用 Vercel AI SDK 的原生类型 - */ - -// 直接重新导出 AI SDK 的类型,避免重复定义 -export type { - // 通用类型 - CoreMessage, - CoreTool, - CoreToolChoice, - // 其他有用的类型 - FinishReason, - GenerateTextResult, - LanguageModelV1, - // 核心函数的参数和返回类型 - StreamTextResult, - // 流式处理相关 - TextStreamPart, - ToolSet -} from 'ai' - -/** - * 生命周期阶段定义 - */ -export enum LifecycleStage { - PRE_REQUEST = 'pre-request', // 请求预处理 - REQUEST_EXECUTION = 'execution', // 请求执行 - STREAM_PROCESSING = 'stream', // 流式处理(仅流模式) - POST_RESPONSE = 'post-response', // 响应后处理 - ERROR_HANDLING = 'error' // 错误处理 -} - -/** - * 生命周期上下文 - */ -export interface LifecycleContext { - currentStage: LifecycleStage - startTime: number - stageStartTime: number - completedStages: Set - stageDurations: Map - metadata: Record -} - -/** - * 中间件执行上下文 - */ -export interface AiRequestContext { - // 生命周期信息 - lifecycle: LifecycleContext - - // 请求信息 - method: 'streamText' | 'generateText' - providerId: string - originalParams: any // 使用 any,让 AI SDK 自己处理类型检查 - - // 可变状态 - state: { - transformedParams?: any - result?: any - error?: Error - aborted?: boolean - metadata: Record - } -} diff --git a/yarn.lock b/yarn.lock index 49806537f4..c4628e7160 100644 --- a/yarn.lock +++ b/yarn.lock @@ -241,7 +241,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: @@ -311,6 +311,23 @@ __metadata: languageName: node linkType: hard +"@ai-sdk/provider-utils@npm:2.1.5": + version: 2.1.5 + resolution: "@ai-sdk/provider-utils@npm:2.1.5" + dependencies: + "@ai-sdk/provider": "npm:1.0.6" + eventsource-parser: "npm:^3.0.0" + nanoid: "npm:^3.3.8" + secure-json-parse: "npm:^2.7.0" + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + checksum: 10c0/6ec33c1f9cc6bb38a7634cdb1b43f49d78ddcb92a8daa4b65193f3309b5a7ad35b134e2d5e82b8576917079a3f8e3b83b5505151cd259ec747ba27458db58356 + languageName: node + linkType: hard + "@ai-sdk/provider-utils@npm:2.2.8, @ai-sdk/provider-utils@npm:^2.0.0, @ai-sdk/provider-utils@npm:^2.1.6": version: 2.2.8 resolution: "@ai-sdk/provider-utils@npm:2.2.8" @@ -333,6 +350,15 @@ __metadata: languageName: node linkType: hard +"@ai-sdk/provider@npm:1.0.6": + version: 1.0.6 + resolution: "@ai-sdk/provider@npm:1.0.6" + dependencies: + json-schema: "npm:^0.4.0" + checksum: 10c0/251c8cd4fa53b89dcf751d0faba5482762d88fcc5ffe1cdb660327c14817a4d94206317e95e6e69fc4ae3071001191b5c418b4b9e1212d6a554a90114db216fc + languageName: node + linkType: hard + "@ai-sdk/provider@npm:1.0.9": version: 1.0.9 resolution: "@ai-sdk/provider@npm:1.0.9" @@ -684,6 +710,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" @@ -794,6 +833,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.27.3, @babel/parser@npm:^7.27.5": + version: 7.27.5 + resolution: "@babel/parser@npm:7.27.5" + dependencies: + "@babel/types": "npm:^7.27.3" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/f7faaebf21cc1f25d9ca8ac02c447ed38ef3460ea95be7ea760916dcf529476340d72a5a6010c6641d9ed9d12ad827c8424840277ec2295c5b082ba0f291220a + 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" @@ -867,6 +917,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.27.3, @babel/types@npm:^7.27.6": + version: 7.27.6 + resolution: "@babel/types@npm:7.27.6" + dependencies: + "@babel/helper-string-parser": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.27.1" + checksum: 10c0/39d556be114f2a6d874ea25ad39826a9e3a0e98de0233ae6d932f6d09a4b222923a90a7274c635ed61f1ba49bbd345329226678800900ad1c8d11afabd573aaf + languageName: node + linkType: hard + "@bcoe/v8-coverage@npm:^1.0.2": version: 1.0.2 resolution: "@bcoe/v8-coverage@npm:1.0.2" @@ -918,15 +978,18 @@ __metadata: "@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/perplexity": "npm:^1.1.9" "@ai-sdk/replicate": "npm:^0.2.8" "@ai-sdk/togetherai": "npm:^0.2.14" "@ai-sdk/vercel": "npm:^0.0.1" "@ai-sdk/xai": "npm:^1.2.16" + "@openrouter/ai-sdk-provider": "npm:^0.1.0" ai: "npm:^4.3.16" 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.8" typescript: "npm:^5.0.0" zhipu-ai-provider: "npm:^0.1.1" peerDependenciesMeta: @@ -1869,6 +1932,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" @@ -3545,6 +3636,17 @@ __metadata: languageName: node linkType: hard +"@napi-rs/wasm-runtime@npm:^0.2.10": + 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" @@ -3660,6 +3762,18 @@ __metadata: languageName: node linkType: hard +"@openrouter/ai-sdk-provider@npm:^0.1.0": + version: 0.1.0 + resolution: "@openrouter/ai-sdk-provider@npm:0.1.0" + dependencies: + "@ai-sdk/provider": "npm:1.0.6" + "@ai-sdk/provider-utils": "npm:2.1.5" + peerDependencies: + zod: ^3.0.0 + checksum: 10c0/495c0349d6f42adc8e880651c215a183a4f041808019c6b2710df447ff3c81f5e69f951b589c1bb3c0cc1ce16c0d659b624d18f097b3344bce74eb178fb936a1 + languageName: node + linkType: hard + "@opentelemetry/api@npm:1.9.0": version: 1.9.0 resolution: "@opentelemetry/api@npm:1.9.0" @@ -3667,6 +3781,20 @@ __metadata: languageName: node linkType: hard +"@oxc-project/runtime@npm:=0.72.3": + version: 0.72.3 + resolution: "@oxc-project/runtime@npm:0.72.3" + checksum: 10c0/35d3be02bbb12252529585483c8fa64bb0e44fb55cf20d0763eb9cc9fe1b9033777125ba768fb7bce8e4776a48f5a175e9ef324575f0932048482c0477799ac8 + languageName: node + linkType: hard + +"@oxc-project/types@npm:=0.72.3": + version: 0.72.3 + resolution: "@oxc-project/types@npm:0.72.3" + checksum: 10c0/8c1379671895b3ad3215d13a8194fc19150b16b35ad47b753c25963650055da9f11dade0225d6c522771f038451aff687e9fb9efdea5486ede5880631316c9f7 + 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" @@ -3843,6 +3971,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" @@ -4051,6 +4188,99 @@ __metadata: languageName: node linkType: hard +"@rolldown/binding-darwin-arm64@npm:1.0.0-beta.15": + version: 1.0.0-beta.15 + resolution: "@rolldown/binding-darwin-arm64@npm:1.0.0-beta.15" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-darwin-x64@npm:1.0.0-beta.15": + version: 1.0.0-beta.15 + resolution: "@rolldown/binding-darwin-x64@npm:1.0.0-beta.15" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/binding-freebsd-x64@npm:1.0.0-beta.15": + version: 1.0.0-beta.15 + resolution: "@rolldown/binding-freebsd-x64@npm:1.0.0-beta.15" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-beta.15": + version: 1.0.0-beta.15 + resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-beta.15" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm64-gnu@npm:1.0.0-beta.15": + version: 1.0.0-beta.15 + resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.0.0-beta.15" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm64-musl@npm:1.0.0-beta.15": + version: 1.0.0-beta.15 + resolution: "@rolldown/binding-linux-arm64-musl@npm:1.0.0-beta.15" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rolldown/binding-linux-x64-gnu@npm:1.0.0-beta.15": + version: 1.0.0-beta.15 + resolution: "@rolldown/binding-linux-x64-gnu@npm:1.0.0-beta.15" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-x64-musl@npm:1.0.0-beta.15": + version: 1.0.0-beta.15 + resolution: "@rolldown/binding-linux-x64-musl@npm:1.0.0-beta.15" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rolldown/binding-wasm32-wasi@npm:1.0.0-beta.15": + version: 1.0.0-beta.15 + resolution: "@rolldown/binding-wasm32-wasi@npm:1.0.0-beta.15" + dependencies: + "@napi-rs/wasm-runtime": "npm:^0.2.10" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@rolldown/binding-win32-arm64-msvc@npm:1.0.0-beta.15": + version: 1.0.0-beta.15 + resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.0.0-beta.15" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-win32-ia32-msvc@npm:1.0.0-beta.15": + version: 1.0.0-beta.15 + resolution: "@rolldown/binding-win32-ia32-msvc@npm:1.0.0-beta.15" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rolldown/binding-win32-x64-msvc@npm:1.0.0-beta.15": + version: 1.0.0-beta.15 + resolution: "@rolldown/binding-win32-x64-msvc@npm:1.0.0-beta.15" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/pluginutils@npm:1.0.0-beta.15": + version: 1.0.0-beta.15 + resolution: "@rolldown/pluginutils@npm:1.0.0-beta.15" + checksum: 10c0/9e6dad8d82a34db600ef78f8da243e9f00f2b873afef9e071fd2bc1a26d9eb5cb9da474f211c42caabb8f6fcaf9bfbecc7e69af113aa84419967f012eb3228f3 + 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" @@ -4665,6 +4895,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" @@ -6523,6 +6762,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" @@ -6784,6 +7030,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" @@ -6939,6 +7195,13 @@ __metadata: languageName: node linkType: hard +"birpc@npm:^2.3.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" @@ -7450,7 +7713,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: @@ -8487,6 +8750,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" @@ -8676,6 +8951,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" @@ -8802,6 +9084,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" @@ -8979,6 +9268,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" @@ -9202,6 +9503,13 @@ __metadata: languageName: node linkType: hard +"empathic@npm:^1.1.0": + version: 1.1.0 + resolution: "empathic@npm:1.1.0" + checksum: 10c0/ed906c4ad6dabe1477ed00d6420f79eff8ac72e2eb580aab42406f50160fd34d66e8381e92b405e96d75a826a840706af261fd397c3e7db4d1a293d23e2e72f7 + languageName: node + linkType: hard + "encodeurl@npm:^2.0.0": version: 2.0.0 resolution: "encodeurl@npm:2.0.0" @@ -10767,6 +11075,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" @@ -11245,6 +11562,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" @@ -11978,6 +12302,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" @@ -15600,7 +15933,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 @@ -16809,6 +17142,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" @@ -16918,6 +17258,85 @@ __metadata: languageName: node linkType: hard +"rolldown-plugin-dts@npm:^0.13.11": + version: 0.13.11 + resolution: "rolldown-plugin-dts@npm:0.13.11" + 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.3.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/026cda47fd0b4d79e51e5dad0aca02749092ab006ac9317d153a42620cfd7f613ed075da3828aa37f49bec585c7871b5c997ed699385b9f326314004bf5c71e0 + languageName: node + linkType: hard + +"rolldown@npm:1.0.0-beta.15": + version: 1.0.0-beta.15 + resolution: "rolldown@npm:1.0.0-beta.15" + dependencies: + "@oxc-project/runtime": "npm:=0.72.3" + "@oxc-project/types": "npm:=0.72.3" + "@rolldown/binding-darwin-arm64": "npm:1.0.0-beta.15" + "@rolldown/binding-darwin-x64": "npm:1.0.0-beta.15" + "@rolldown/binding-freebsd-x64": "npm:1.0.0-beta.15" + "@rolldown/binding-linux-arm-gnueabihf": "npm:1.0.0-beta.15" + "@rolldown/binding-linux-arm64-gnu": "npm:1.0.0-beta.15" + "@rolldown/binding-linux-arm64-musl": "npm:1.0.0-beta.15" + "@rolldown/binding-linux-x64-gnu": "npm:1.0.0-beta.15" + "@rolldown/binding-linux-x64-musl": "npm:1.0.0-beta.15" + "@rolldown/binding-wasm32-wasi": "npm:1.0.0-beta.15" + "@rolldown/binding-win32-arm64-msvc": "npm:1.0.0-beta.15" + "@rolldown/binding-win32-ia32-msvc": "npm:1.0.0-beta.15" + "@rolldown/binding-win32-x64-msvc": "npm:1.0.0-beta.15" + "@rolldown/pluginutils": "npm:1.0.0-beta.15" + 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/de2ea888c85ce458232707b75c9e8982ee128c497d0e5c992b4085c57bdd36bcc73d04f3fba3186ab70274288d6914c94f280ab380ce0b4347610b51b82e25e8 + languageName: node + linkType: hard + "rollup-plugin-visualizer@npm:^5.12.0": version: 5.14.0 resolution: "rollup-plugin-visualizer@npm:5.14.0" @@ -17214,6 +17633,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" @@ -18178,6 +18606,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" @@ -18396,6 +18834,46 @@ __metadata: languageName: node linkType: hard +"tsdown@npm:^0.12.8": + version: 0.12.8 + resolution: "tsdown@npm:0.12.8" + 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:^1.1.0" + hookable: "npm:^5.5.3" + rolldown: "npm:1.0.0-beta.15" + rolldown-plugin-dts: "npm:^0.13.11" + 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/8b824da2cdabbd9a783ac9d5d71a70d17ee055b614cf95070180b061f4b4d422c66795c6e871da67aa0ce15355d82dc97cb86f126d38f8af5c088959107a8fc9 + languageName: node + linkType: hard + "tslib@npm:2.6.2": version: 2.6.2 resolution: "tslib@npm:2.6.2" @@ -18527,6 +19005,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"