Compare commits

...

2 Commits

Author SHA1 Message Date
suyao
9745621715 feat: upgrade middleware and model interfaces to support LanguageModelV3 2025-10-23 06:42:27 +08:00
suyao
ff87ccf8d8 chore: update ai-sdk dependencies and patch google SDK
- Removed patch for @ai-sdk/google version 2.0.20.
- Updated @ai-sdk/google to version 3.0.0-beta.27 with a new patch.
- Updated @ai-sdk/amazon-bedrock to version 4.0.0-beta.38.
- Updated @ai-sdk/google-vertex to version 4.0.0-beta.42.
- Updated @ai-sdk/mistral to version 3.0.0-beta.21.
- Updated @ai-sdk/perplexity to version 3.0.0-beta.20.
- Updated dependencies in @cherrystudio/ai-core to reflect new SDK versions.
- Updated zod to version 4.1.12.
- Updated ai to version 6.0.0-beta.66.
- Updated package version for @cherrystudio/ai-core to 1.0.2.
- Adjusted getModelPath function in google SDK to check for "models/" in modelId.
2025-10-23 06:22:45 +08:00
25 changed files with 272 additions and 237 deletions

View File

@@ -1,13 +0,0 @@
diff --git a/dist/index.mjs b/dist/index.mjs
index 69ab1599c76801dc1167551b6fa283dded123466..f0af43bba7ad1196fe05338817e65b4ebda40955 100644
--- a/dist/index.mjs
+++ b/dist/index.mjs
@@ -477,7 +477,7 @@ function convertToGoogleGenerativeAIMessages(prompt, options) {
// src/get-model-path.ts
function getModelPath(modelId) {
- return modelId.includes("/") ? modelId : `models/${modelId}`;
+ return modelId?.includes("models/") ? modelId : `models/${modelId}`;
}
// src/google-generative-ai-options.ts

View File

@@ -0,0 +1,22 @@
diff --git a/dist/index.mjs b/dist/index.mjs
index e89ff0185a2e317165abdeab9fa544f676386564..776237576e80f2afbda4e638dafff1544fdcf586 100644
--- a/dist/index.mjs
+++ b/dist/index.mjs
@@ -477,7 +477,7 @@ function convertToGoogleGenerativeAIMessages(prompt, options) {
// src/get-model-path.ts
function getModelPath(modelId) {
- return modelId.includes("/") ? modelId : `models/${modelId}`;
+ return modelId.includes("models/") ? modelId : `models/${modelId}`;
}
// src/google-generative-ai-options.ts
@@ -599,7 +599,7 @@ function prepareTools({
"gemini-flash-latest",
"gemini-flash-lite-latest",
"gemini-pro-latest"
- ].some((id) => id === modelId);
+ ].some((id) => modelId.includes(id));
const isGemini2 = modelId.includes("gemini-2") || isLatest;
const supportsDynamicRetrieval = modelId.includes("gemini-1.5-flash") && !modelId.includes("-8b");
if (tools == null) {

View File

@@ -101,10 +101,10 @@
"@agentic/exa": "^7.3.3",
"@agentic/searxng": "^7.3.3",
"@agentic/tavily": "^7.3.3",
"@ai-sdk/amazon-bedrock": "^3.0.35",
"@ai-sdk/google-vertex": "^3.0.40",
"@ai-sdk/mistral": "^2.0.19",
"@ai-sdk/perplexity": "^2.0.13",
"@ai-sdk/amazon-bedrock": "^4.0.0-beta.38",
"@ai-sdk/google-vertex": "^4.0.0-beta.42",
"@ai-sdk/mistral": "^3.0.0-beta.21",
"@ai-sdk/perplexity": "^3.0.0-beta.20",
"@ant-design/v5-patch-for-react-19": "^1.0.3",
"@anthropic-ai/sdk": "^0.41.0",
"@anthropic-ai/vertex-sdk": "patch:@anthropic-ai/vertex-sdk@npm%3A0.11.4#~/.yarn/patches/@anthropic-ai-vertex-sdk-npm-0.11.4-c19cb41edb.patch",
@@ -112,7 +112,7 @@
"@aws-sdk/client-bedrock-runtime": "^3.840.0",
"@aws-sdk/client-s3": "^3.840.0",
"@biomejs/biome": "2.2.4",
"@cherrystudio/ai-core": "workspace:^1.0.0-alpha.18",
"@cherrystudio/ai-core": "workspace:^1.0.3",
"@cherrystudio/embedjs": "^0.1.31",
"@cherrystudio/embedjs-libsql": "^0.1.31",
"@cherrystudio/embedjs-loader-csv": "^0.1.31",
@@ -223,7 +223,7 @@
"@viz-js/lang-dot": "^1.0.5",
"@viz-js/viz": "^3.14.0",
"@xyflow/react": "^12.4.4",
"ai": "^5.0.68",
"ai": "^6.0.0-beta.66",
"antd": "patch:antd@npm%3A5.27.0#~/.yarn/patches/antd-npm-5.27.0-aa91c36546.patch",
"archiver": "^7.0.1",
"async-mutex": "^0.5.0",
@@ -361,7 +361,7 @@
"yjs": "^13.6.27",
"youtubei.js": "^15.0.1",
"zipread": "^1.3.3",
"zod": "^4.1.5"
"zod": "^4.1.12"
},
"resolutions": {
"@codemirror/language": "6.11.3",
@@ -385,13 +385,13 @@
"undici": "6.21.2",
"vite": "npm:rolldown-vite@7.1.5",
"tesseract.js@npm:*": "patch:tesseract.js@npm%3A6.0.1#~/.yarn/patches/tesseract.js-npm-6.0.1-2562a7e46d.patch",
"@ai-sdk/google@npm:2.0.20": "patch:@ai-sdk/google@npm%3A2.0.20#~/.yarn/patches/@ai-sdk-google-npm-2.0.20-b9102f9d54.patch",
"@img/sharp-darwin-arm64": "0.34.3",
"@img/sharp-darwin-x64": "0.34.3",
"@img/sharp-linux-arm": "0.34.3",
"@img/sharp-linux-arm64": "0.34.3",
"@img/sharp-linux-x64": "0.34.3",
"@img/sharp-win32-x64": "0.34.3"
"@img/sharp-win32-x64": "0.34.3",
"@ai-sdk/google@npm:3.0.0-beta.27": "patch:@ai-sdk/google@npm%3A3.0.0-beta.27#~/.yarn/patches/@ai-sdk-google-npm-3.0.0-beta.27-8900c301e6.patch"
},
"packageManager": "yarn@4.9.1",
"lint-staged": {

View File

@@ -1,6 +1,6 @@
{
"name": "@cherrystudio/ai-core",
"version": "1.0.1",
"version": "1.0.3",
"description": "Cherry Studio AI Core - Unified AI Provider Interface Based on Vercel AI SDK",
"main": "dist/index.js",
"module": "dist/index.mjs",
@@ -36,15 +36,16 @@
"ai": "^5.0.26"
},
"dependencies": {
"@ai-sdk/anthropic": "^2.0.27",
"@ai-sdk/azure": "^2.0.49",
"@ai-sdk/deepseek": "^1.0.23",
"@ai-sdk/openai": "^2.0.48",
"@ai-sdk/openai-compatible": "^1.0.22",
"@ai-sdk/provider": "^2.0.0",
"@ai-sdk/provider-utils": "^3.0.12",
"@ai-sdk/xai": "^2.0.26",
"zod": "^4.1.5"
"@ai-sdk/anthropic": "^3.0.0-beta.34",
"@ai-sdk/azure": "^3.0.0-beta.34",
"@ai-sdk/deepseek": "^2.0.0-beta.21",
"@ai-sdk/google": "patch:@ai-sdk/google@npm%3A3.0.0-beta.27#~/.yarn/patches/@ai-sdk-google-npm-3.0.0-beta.27-8900c301e6.patch",
"@ai-sdk/openai": "^3.0.0-beta.34",
"@ai-sdk/openai-compatible": "^2.0.0-beta.21",
"@ai-sdk/provider": "^3.0.0-beta.8",
"@ai-sdk/provider-utils": "^4.0.0-beta.20",
"@ai-sdk/xai": "^3.0.0-beta.22",
"zod": "^4.1.12"
},
"devDependencies": {
"tsdown": "^0.12.9",

View File

@@ -2,15 +2,15 @@
* 中间件管理器
* 专注于 AI SDK 中间件的管理,与插件系统分离
*/
import { LanguageModelV2Middleware } from '@ai-sdk/provider'
import { LanguageModelV3Middleware } from '@ai-sdk/provider'
/**
* 创建中间件列表
* 合并用户提供的中间件
*/
export function createMiddlewares(userMiddlewares: LanguageModelV2Middleware[] = []): LanguageModelV2Middleware[] {
export function createMiddlewares(userMiddlewares: LanguageModelV3Middleware[] = []): LanguageModelV3Middleware[] {
// 未来可以在这里添加默认的中间件
const defaultMiddlewares: LanguageModelV2Middleware[] = []
const defaultMiddlewares: LanguageModelV3Middleware[] = []
return [...defaultMiddlewares, ...userMiddlewares]
}

View File

@@ -1,12 +1,12 @@
/**
* 中间件系统类型定义
*/
import { LanguageModelV2Middleware } from '@ai-sdk/provider'
import { LanguageModelV3Middleware } from '@ai-sdk/provider'
/**
* 具名中间件接口
*/
export interface NamedMiddleware {
name: string
middleware: LanguageModelV2Middleware
middleware: LanguageModelV3Middleware
}

View File

@@ -2,16 +2,16 @@
* 模型包装工具函数
* 用于将中间件应用到LanguageModel上
*/
import { LanguageModelV2, LanguageModelV2Middleware } from '@ai-sdk/provider'
import { LanguageModelV3, LanguageModelV3Middleware } from '@ai-sdk/provider'
import { wrapLanguageModel } from 'ai'
/**
* 使用中间件包装模型
*/
export function wrapModelWithMiddlewares(
model: LanguageModelV2,
middlewares: LanguageModelV2Middleware[]
): LanguageModelV2 {
model: LanguageModelV3,
middlewares: LanguageModelV3Middleware[]
): LanguageModelV3 {
if (middlewares.length === 0) {
return model
}

View File

@@ -5,7 +5,7 @@
* 集成了来自 ModelCreator 的特殊处理逻辑
*/
import { EmbeddingModelV2, ImageModelV2, LanguageModelV2, LanguageModelV2Middleware } from '@ai-sdk/provider'
import { EmbeddingModelV3, ImageModelV3, LanguageModelV3, LanguageModelV3Middleware } from '@ai-sdk/provider'
import { wrapModelWithMiddlewares } from '../middleware/wrapper'
import { DEFAULT_SEPARATOR, globalRegistryManagement } from '../providers/RegistryManagement'
@@ -23,10 +23,10 @@ export class ModelResolver {
modelId: string,
fallbackProviderId: string,
providerOptions?: any,
middlewares?: LanguageModelV2Middleware[]
): Promise<LanguageModelV2> {
middlewares?: LanguageModelV3Middleware[]
): Promise<LanguageModelV3> {
let finalProviderId = fallbackProviderId
let model: LanguageModelV2
let model: LanguageModelV3
// 🎯 处理 OpenAI 模式选择逻辑 (从 ModelCreator 迁移)
if ((fallbackProviderId === 'openai' || fallbackProviderId === 'azure') && providerOptions?.mode === 'chat') {
finalProviderId = `${fallbackProviderId}-chat`
@@ -51,7 +51,7 @@ export class ModelResolver {
/**
* 解析文本嵌入模型
*/
async resolveTextEmbeddingModel(modelId: string, fallbackProviderId: string): Promise<EmbeddingModelV2<string>> {
async resolveTextEmbeddingModel(modelId: string, fallbackProviderId: string): Promise<EmbeddingModelV3<string>> {
if (modelId.includes(DEFAULT_SEPARATOR)) {
return this.resolveNamespacedEmbeddingModel(modelId)
}
@@ -62,7 +62,7 @@ export class ModelResolver {
/**
* 解析图像模型
*/
async resolveImageModel(modelId: string, fallbackProviderId: string): Promise<ImageModelV2> {
async resolveImageModel(modelId: string, fallbackProviderId: string): Promise<ImageModelV3> {
if (modelId.includes(DEFAULT_SEPARATOR)) {
return this.resolveNamespacedImageModel(modelId)
}
@@ -74,7 +74,7 @@ export class ModelResolver {
* 解析命名空间格式的语言模型
* aihubmix:anthropic:claude-3 -> globalRegistryManagement.languageModel('aihubmix:anthropic:claude-3')
*/
private resolveNamespacedModel(modelId: string): LanguageModelV2 {
private resolveNamespacedModel(modelId: string): LanguageModelV3 {
return globalRegistryManagement.languageModel(modelId as any)
}
@@ -82,7 +82,7 @@ export class ModelResolver {
* 解析传统格式的语言模型
* providerId: 'openai', modelId: 'gpt-4' -> globalRegistryManagement.languageModel('openai:gpt-4')
*/
private resolveTraditionalModel(providerId: string, modelId: string): LanguageModelV2 {
private resolveTraditionalModel(providerId: string, modelId: string): LanguageModelV3 {
const fullModelId = `${providerId}${DEFAULT_SEPARATOR}${modelId}`
return globalRegistryManagement.languageModel(fullModelId as any)
}
@@ -90,14 +90,14 @@ export class ModelResolver {
/**
* 解析命名空间格式的嵌入模型
*/
private resolveNamespacedEmbeddingModel(modelId: string): EmbeddingModelV2<string> {
private resolveNamespacedEmbeddingModel(modelId: string): EmbeddingModelV3<string> {
return globalRegistryManagement.textEmbeddingModel(modelId as any)
}
/**
* 解析传统格式的嵌入模型
*/
private resolveTraditionalEmbeddingModel(providerId: string, modelId: string): EmbeddingModelV2<string> {
private resolveTraditionalEmbeddingModel(providerId: string, modelId: string): EmbeddingModelV3<string> {
const fullModelId = `${providerId}${DEFAULT_SEPARATOR}${modelId}`
return globalRegistryManagement.textEmbeddingModel(fullModelId as any)
}
@@ -105,14 +105,14 @@ export class ModelResolver {
/**
* 解析命名空间格式的图像模型
*/
private resolveNamespacedImageModel(modelId: string): ImageModelV2 {
private resolveNamespacedImageModel(modelId: string): ImageModelV3 {
return globalRegistryManagement.imageModel(modelId as any)
}
/**
* 解析传统格式的图像模型
*/
private resolveTraditionalImageModel(providerId: string, modelId: string): ImageModelV2 {
private resolveTraditionalImageModel(providerId: string, modelId: string): ImageModelV3 {
const fullModelId = `${providerId}${DEFAULT_SEPARATOR}${modelId}`
return globalRegistryManagement.imageModel(fullModelId as any)
}

View File

@@ -1,7 +1,7 @@
/**
* Creation 模块类型定义
*/
import { LanguageModelV2Middleware } from '@ai-sdk/provider'
import { LanguageModelV3Middleware } from '@ai-sdk/provider'
import type { ProviderId, ProviderSettingsMap } from '../providers/types'
@@ -9,7 +9,7 @@ export interface ModelConfig<T extends ProviderId = ProviderId> {
providerId: T
modelId: string
providerSettings: ProviderSettingsMap[T] & { mode?: 'chat' | 'responses' }
middlewares?: LanguageModelV2Middleware[]
middlewares?: LanguageModelV3Middleware[]
// 额外模型参数
extraModelConfig?: Record<string, any>
}

View File

@@ -1,11 +1,11 @@
import { type AnthropicProviderOptions } from '@ai-sdk/anthropic'
import { type GoogleGenerativeAIProviderOptions } from '@ai-sdk/google'
import { type OpenAIResponsesProviderOptions } from '@ai-sdk/openai'
import { type SharedV2ProviderMetadata } from '@ai-sdk/provider'
import { type SharedV3ProviderMetadata } from '@ai-sdk/provider'
import { type XaiProviderOptions } from '@ai-sdk/xai'
import { type OpenRouterProviderOptions } from '@openrouter/ai-sdk-provider'
export type ProviderOptions<T extends keyof SharedV2ProviderMetadata> = SharedV2ProviderMetadata[T]
export type ProviderOptions<T extends keyof SharedV3ProviderMetadata> = SharedV3ProviderMetadata[T]
/**
* 供应商选项类型如果map中没有说明没有约束
@@ -29,4 +29,4 @@ export type TypedProviderOptions = {
[K in keyof ProviderOptionsMap]?: ProviderOptionsMap[K]
} & {
[K in string]?: Record<string, any>
} & SharedV2ProviderMetadata
} & SharedV3ProviderMetadata

View File

@@ -1,6 +1,6 @@
// 核心类型和接口
export type { AiPlugin, AiRequestContext, HookResult, PluginManagerConfig } from './types'
import type { ImageModelV2 } from '@ai-sdk/provider'
import type { ImageModelV3 } from '@ai-sdk/provider'
import type { LanguageModel } from 'ai'
import type { ProviderId } from '../providers'
@@ -12,7 +12,7 @@ export { PluginManager } from './manager'
// 工具函数
export function createContext<T extends ProviderId>(
providerId: T,
model: LanguageModel | ImageModelV2,
model: LanguageModel | ImageModelV3,
originalParams: any
): AiRequestContext {
return {

View File

@@ -1,4 +1,4 @@
import type { ImageModelV2 } from '@ai-sdk/provider'
import type { ImageModelV3 } from '@ai-sdk/provider'
import type { LanguageModel, TextStreamPart, ToolSet } from 'ai'
import { type ProviderId } from '../providers/types'
@@ -14,7 +14,7 @@ export type RecursiveCallFn = (newParams: any) => Promise<any>
*/
export interface AiRequestContext {
providerId: ProviderId
model: LanguageModel | ImageModelV2
model: LanguageModel | ImageModelV3
originalParams: any
metadata: Record<string, any>
startTime: number
@@ -36,7 +36,7 @@ export interface AiPlugin {
resolveModel?: (
modelId: string,
context: AiRequestContext
) => Promise<LanguageModel | ImageModelV2 | null> | LanguageModel | ImageModelV2 | null
) => Promise<LanguageModel | ImageModelV3 | null> | LanguageModel | ImageModelV3 | null
loadTemplate?: (templateName: string, context: AiRequestContext) => any | null | Promise<any | null>
// 【Sequential】串行钩子 - 链式执行,支持数据转换

View File

@@ -5,7 +5,7 @@
* 例如: aihubmix:anthropic:claude-3.5-sonnet
*/
import { ProviderV2 } from '@ai-sdk/provider'
import { ProviderV3 as Provider } from '@ai-sdk/provider'
import { customProvider } from 'ai'
import { globalRegistryManagement } from './RegistryManagement'
@@ -47,10 +47,10 @@ function parseHubModelId(modelId: string): { provider: string; actualModelId: st
/**
* 创建Hub Provider
*/
export function createHubProvider(config: HubProviderConfig): ProviderV2 {
export function createHubProvider(config: HubProviderConfig): Provider {
const { hubId } = config
function getTargetProvider(providerId: string): ProviderV2 {
function getTargetProvider(providerId: string): Provider {
// 从全局注册表获取provider实例
try {
const provider = globalRegistryManagement.getProvider(providerId)

View File

@@ -4,10 +4,15 @@
* 基于 AI SDK 原生的 createProviderRegistry
*/
import { EmbeddingModelV2, ImageModelV2, LanguageModelV2, ProviderV2 } from '@ai-sdk/provider'
import {
EmbeddingModelV3 as EmbeddingModel,
ImageModelV3 as ImageModel,
LanguageModelV3 as LanguageModel,
ProviderV3 as Provider
} from '@ai-sdk/provider'
import { createProviderRegistry, type ProviderRegistryProvider } from 'ai'
type PROVIDERS = Record<string, ProviderV2>
type PROVIDERS = Record<string, Provider>
export const DEFAULT_SEPARATOR = '|'
@@ -26,7 +31,7 @@ export class RegistryManagement<SEPARATOR extends string = typeof DEFAULT_SEPARA
/**
* 注册已配置好的 provider 实例
*/
registerProvider(id: string, provider: ProviderV2, aliases?: string[]): this {
registerProvider(id: string, provider: Provider, aliases?: string[]): this {
// 注册主provider
this.providers[id] = provider
@@ -45,14 +50,14 @@ export class RegistryManagement<SEPARATOR extends string = typeof DEFAULT_SEPARA
/**
* 获取已注册的provider实例
*/
getProvider(id: string): ProviderV2 | undefined {
getProvider(id: string): Provider | undefined {
return this.providers[id]
}
/**
* 批量注册 providers
*/
registerProviders(providers: Record<string, ProviderV2>): this {
registerProviders(providers: Record<string, Provider>): this {
Object.assign(this.providers, providers)
this.rebuildRegistry()
return this
@@ -106,7 +111,7 @@ export class RegistryManagement<SEPARATOR extends string = typeof DEFAULT_SEPARA
/**
* 获取语言模型 - AI SDK 原生方法
*/
languageModel(id: `${string}${SEPARATOR}${string}`): LanguageModelV2 {
languageModel(id: `${string}${SEPARATOR}${string}`): LanguageModel {
if (!this.registry) {
throw new Error('No providers registered')
}
@@ -116,7 +121,7 @@ export class RegistryManagement<SEPARATOR extends string = typeof DEFAULT_SEPARA
/**
* 获取文本嵌入模型 - AI SDK 原生方法
*/
textEmbeddingModel(id: `${string}${SEPARATOR}${string}`): EmbeddingModelV2<string> {
textEmbeddingModel(id: `${string}${SEPARATOR}${string}`): EmbeddingModel<string> {
if (!this.registry) {
throw new Error('No providers registered')
}
@@ -126,7 +131,7 @@ export class RegistryManagement<SEPARATOR extends string = typeof DEFAULT_SEPARA
/**
* 获取图像模型 - AI SDK 原生方法
*/
imageModel(id: `${string}${SEPARATOR}${string}`): ImageModelV2 {
imageModel(id: `${string}${SEPARATOR}${string}`): ImageModel {
if (!this.registry) {
throw new Error('No providers registered')
}

View File

@@ -9,7 +9,7 @@ import { createDeepSeek } from '@ai-sdk/deepseek'
import { createGoogleGenerativeAI } from '@ai-sdk/google'
import { createOpenAI, type OpenAIProviderSettings } from '@ai-sdk/openai'
import { createOpenAICompatible } from '@ai-sdk/openai-compatible'
import { LanguageModelV2 } from '@ai-sdk/provider'
import { LanguageModelV2, LanguageModelV3 } from '@ai-sdk/provider'
import { createXai } from '@ai-sdk/xai'
import { createOpenRouter } from '@openrouter/ai-sdk-provider'
import { customProvider, Provider } from 'ai'
@@ -48,7 +48,7 @@ export const isBaseProvider = (id: ProviderId): id is BaseProviderId => {
type BaseProvider = {
id: BaseProviderId
name: string
creator: (options: any) => Provider | LanguageModelV2
creator: (options: any) => Provider | LanguageModelV2 | LanguageModelV3
supportsImageGeneration: boolean
}

View File

@@ -5,12 +5,12 @@ import { type GoogleGenerativeAIProviderSettings } from '@ai-sdk/google'
import { type OpenAIProviderSettings } from '@ai-sdk/openai'
import { type OpenAICompatibleProviderSettings } from '@ai-sdk/openai-compatible'
import {
EmbeddingModelV2 as EmbeddingModel,
ImageModelV2 as ImageModel,
LanguageModelV2 as LanguageModel,
ProviderV2,
SpeechModelV2 as SpeechModel,
TranscriptionModelV2 as TranscriptionModel
EmbeddingModelV3 as EmbeddingModel,
ImageModelV3 as ImageModel,
LanguageModelV3 as LanguageModel,
ProviderV3 as Provider,
SpeechModelV3 as SpeechModel,
TranscriptionModelV3 as TranscriptionModel
} from '@ai-sdk/provider'
import { type XaiProviderSettings } from '@ai-sdk/xai'
@@ -79,9 +79,9 @@ export const METHOD_MAP = {
embedding: 'textEmbeddingModel',
transcription: 'transcriptionModel',
speech: 'speechModel'
} as const satisfies Record<AiSdkModelType, keyof ProviderV2>
} as const satisfies Record<AiSdkModelType, keyof Provider>
export type AiSdkModelMethodMap = Record<AiSdkModelType, keyof ProviderV2>
export type AiSdkModelMethodMap = Record<AiSdkModelType, keyof Provider>
export type AiSdkModelReturnMap = {
text: LanguageModel

View File

@@ -1,4 +1,4 @@
import { ImageModelV2 } from '@ai-sdk/provider'
import { ImageModelV3 } from '@ai-sdk/provider'
import { experimental_generateImage as aiGenerateImage, NoImageGeneratedError } from 'ai'
import { beforeEach, describe, expect, it, vi } from 'vitest'
@@ -28,7 +28,7 @@ vi.mock('../../providers/RegistryManagement', () => ({
describe('RuntimeExecutor.generateImage', () => {
let executor: RuntimeExecutor<'openai'>
let mockImageModel: ImageModelV2
let mockImageModel: ImageModelV3
let mockGenerateImageResult: any
beforeEach(() => {
@@ -44,7 +44,7 @@ describe('RuntimeExecutor.generateImage', () => {
mockImageModel = {
modelId: 'dall-e-3',
provider: 'openai'
} as ImageModelV2
} as ImageModelV3
// Mock generateImage result
mockGenerateImageResult = {
@@ -256,7 +256,7 @@ describe('RuntimeExecutor.generateImage', () => {
const customImageModel = {
modelId: 'custom-model',
provider: 'openai'
} as ImageModelV2
} as ImageModelV3
const modelResolutionPlugin: AiPlugin = {
name: 'model-resolver',

View File

@@ -2,7 +2,7 @@
* 运行时执行器
* 专注于插件化的AI调用处理
*/
import { ImageModelV2, LanguageModelV2, LanguageModelV2Middleware } from '@ai-sdk/provider'
import { ImageModelV3, LanguageModelV2, LanguageModelV3, LanguageModelV3Middleware } from '@ai-sdk/provider'
import {
experimental_generateImage as _generateImage,
generateObject as _generateObject,
@@ -44,7 +44,7 @@ export class RuntimeExecutor<T extends ProviderId = ProviderId> {
this.pluginEngine = new PluginEngine(config.providerId, config.plugins || [])
}
private createResolveModelPlugin(middlewares?: LanguageModelV2Middleware[]) {
private createResolveModelPlugin(middlewares?: LanguageModelV3Middleware[]) {
return definePlugin({
name: '_internal_resolveModel',
enforce: 'post',
@@ -84,7 +84,7 @@ export class RuntimeExecutor<T extends ProviderId = ProviderId> {
async streamText(
params: streamTextParams,
options?: {
middlewares?: LanguageModelV2Middleware[]
middlewares?: LanguageModelV3Middleware[]
}
): Promise<ReturnType<typeof _streamText>> {
const { model } = params
@@ -123,7 +123,7 @@ export class RuntimeExecutor<T extends ProviderId = ProviderId> {
async generateText(
params: generateTextParams,
options?: {
middlewares?: LanguageModelV2Middleware[]
middlewares?: LanguageModelV3Middleware[]
}
): Promise<ReturnType<typeof _generateText>> {
const { model } = params
@@ -151,7 +151,7 @@ export class RuntimeExecutor<T extends ProviderId = ProviderId> {
async generateObject(
params: generateObjectParams,
options?: {
middlewares?: LanguageModelV2Middleware[]
middlewares?: LanguageModelV3Middleware[]
}
): Promise<ReturnType<typeof _generateObject>> {
const { model } = params
@@ -179,7 +179,7 @@ export class RuntimeExecutor<T extends ProviderId = ProviderId> {
streamObject(
params: streamObjectParams,
options?: {
middlewares?: LanguageModelV2Middleware[]
middlewares?: LanguageModelV3Middleware[]
}
): Promise<ReturnType<typeof _streamObject>> {
const { model } = params
@@ -237,8 +237,8 @@ export class RuntimeExecutor<T extends ProviderId = ProviderId> {
*/
private async resolveModel(
modelOrId: LanguageModel,
middlewares?: LanguageModelV2Middleware[]
): Promise<LanguageModelV2> {
middlewares?: LanguageModelV3Middleware[]
): Promise<LanguageModelV2 | LanguageModelV3> {
if (typeof modelOrId === 'string') {
// 🎯 字符串modelId使用新的ModelResolver解析传递完整参数
return await globalModelResolver.resolveLanguageModel(
@@ -256,7 +256,7 @@ export class RuntimeExecutor<T extends ProviderId = ProviderId> {
/**
* 解析图像模型:如果是字符串则创建图像模型,如果是模型则直接返回
*/
private async resolveImageModel(modelOrId: ImageModelV2 | string): Promise<ImageModelV2> {
private async resolveImageModel(modelOrId: ImageModelV3 | string): Promise<ImageModelV3> {
try {
if (typeof modelOrId === 'string') {
// 字符串modelId使用新的ModelResolver解析

View File

@@ -11,7 +11,7 @@ export type { RuntimeConfig } from './types'
// === 便捷工厂函数 ===
import { LanguageModelV2Middleware } from '@ai-sdk/provider'
import { LanguageModelV3Middleware } from '@ai-sdk/provider'
import { type AiPlugin } from '../plugins'
import { type ProviderId, type ProviderSettingsMap } from '../providers/types'
@@ -48,7 +48,7 @@ export async function streamText<T extends ProviderId>(
options: ProviderSettingsMap[T] & { mode?: 'chat' | 'responses' },
params: Parameters<RuntimeExecutor<T>['streamText']>[0],
plugins?: AiPlugin[],
middlewares?: LanguageModelV2Middleware[]
middlewares?: LanguageModelV3Middleware[]
): Promise<ReturnType<RuntimeExecutor<T>['streamText']>> {
const executor = createExecutor(providerId, options, plugins)
return executor.streamText(params, { middlewares })
@@ -62,7 +62,7 @@ export async function generateText<T extends ProviderId>(
options: ProviderSettingsMap[T] & { mode?: 'chat' | 'responses' },
params: Parameters<RuntimeExecutor<T>['generateText']>[0],
plugins?: AiPlugin[],
middlewares?: LanguageModelV2Middleware[]
middlewares?: LanguageModelV3Middleware[]
): Promise<ReturnType<RuntimeExecutor<T>['generateText']>> {
const executor = createExecutor(providerId, options, plugins)
return executor.generateText(params, { middlewares })
@@ -76,7 +76,7 @@ export async function generateObject<T extends ProviderId>(
options: ProviderSettingsMap[T] & { mode?: 'chat' | 'responses' },
params: Parameters<RuntimeExecutor<T>['generateObject']>[0],
plugins?: AiPlugin[],
middlewares?: LanguageModelV2Middleware[]
middlewares?: LanguageModelV3Middleware[]
): Promise<ReturnType<RuntimeExecutor<T>['generateObject']>> {
const executor = createExecutor(providerId, options, plugins)
return executor.generateObject(params, { middlewares })
@@ -90,7 +90,7 @@ export async function streamObject<T extends ProviderId>(
options: ProviderSettingsMap[T] & { mode?: 'chat' | 'responses' },
params: Parameters<RuntimeExecutor<T>['streamObject']>[0],
plugins?: AiPlugin[],
middlewares?: LanguageModelV2Middleware[]
middlewares?: LanguageModelV3Middleware[]
): Promise<ReturnType<RuntimeExecutor<T>['streamObject']>> {
const executor = createExecutor(providerId, options, plugins)
return executor.streamObject(params, { middlewares })

View File

@@ -1,5 +1,5 @@
/* eslint-disable @eslint-react/naming-convention/context-name */
import { ImageModelV2 } from '@ai-sdk/provider'
import { ImageModelV3 } from '@ai-sdk/provider'
import { experimental_generateImage, generateObject, generateText, LanguageModel, streamObject, streamText } from 'ai'
import { type AiPlugin, createContext, PluginManager } from '../plugins'
@@ -141,16 +141,16 @@ export class PluginEngine<T extends ProviderId = ProviderId> {
* 提供给AiExecutor使用
*/
async executeImageWithPlugins<
TParams extends Omit<Parameters<typeof experimental_generateImage>[0], 'model'> & { model: string | ImageModelV2 },
TParams extends Omit<Parameters<typeof experimental_generateImage>[0], 'model'> & { model: string | ImageModelV3 },
TResult extends ReturnType<typeof experimental_generateImage>
>(
methodName: string,
params: TParams,
executor: (model: ImageModelV2, transformedParams: TParams) => TResult,
executor: (model: ImageModelV3, transformedParams: TParams) => TResult,
_context?: ReturnType<typeof createContext>
): Promise<TResult> {
// 统一处理模型解析
let resolvedModel: ImageModelV2 | undefined
let resolvedModel: ImageModelV3 | undefined
let modelId: string
const { model } = params
if (typeof model === 'string') {
@@ -183,7 +183,7 @@ export class PluginEngine<T extends ProviderId = ProviderId> {
// 2. 解析模型(如果是字符串)
if (typeof model === 'string') {
const resolved = await this.pluginManager.executeFirst<ImageModelV2>('resolveModel', modelId, context)
const resolved = await this.pluginManager.executeFirst<ImageModelV3>('resolveModel', modelId, context)
if (!resolved) {
throw new Error(`Failed to resolve image model: ${modelId}`)
}

View File

@@ -1,7 +1,7 @@
/**
* Runtime 层类型定义
*/
import { ImageModelV2 } from '@ai-sdk/provider'
import { ImageModelV3 } from '@ai-sdk/provider'
import { experimental_generateImage, generateObject, generateText, streamObject, streamText } from 'ai'
import { type ModelConfig } from '../models/types'
@@ -18,7 +18,7 @@ export interface RuntimeConfig<T extends ProviderId = ProviderId> {
}
export type generateImageParams = Omit<Parameters<typeof experimental_generateImage>[0], 'model'> & {
model: string | ImageModelV2
model: string | ImageModelV3
}
export type generateObjectParams = Parameters<typeof generateObject>[0]
export type generateTextParams = Parameters<typeof generateText>[0]

View File

@@ -26,7 +26,7 @@ export { PluginEngine } from './core/runtime/pluginEngine'
// ==================== AI SDK 常用类型导出 ====================
// 直接导出 AI SDK 的常用类型,方便使用
export type { LanguageModelV2Middleware, LanguageModelV2StreamPart } from '@ai-sdk/provider'
export type { LanguageModelV3Middleware, LanguageModelV3StreamPart } from '@ai-sdk/provider'
export type { ToolCall } from '@ai-sdk/provider-utils'
export type { ReasoningPart } from '@ai-sdk/provider-utils'

View File

@@ -1,5 +1,5 @@
// ported from https://github.com/ben-vargas/ai-sdk-provider-claude-code/blob/main/src/map-claude-code-finish-reason.ts#L22
import type { LanguageModelV2FinishReason } from '@ai-sdk/provider'
import type { LanguageModelV3FinishReason } from '@ai-sdk/provider'
/**
* Maps Claude Code SDK result subtypes to AI SDK finish reasons.
@@ -20,7 +20,7 @@ import type { LanguageModelV2FinishReason } from '@ai-sdk/provider'
* - 'error_during_execution' -> 'error' (execution error)
* - default -> 'stop' (unknown subtypes treated as normal completion)
*/
export function mapClaudeCodeFinishReason(subtype?: string): LanguageModelV2FinishReason {
export function mapClaudeCodeFinishReason(subtype?: string): LanguageModelV3FinishReason {
switch (subtype) {
case 'success':
return 'stop'

View File

@@ -1,4 +1,4 @@
import type { LanguageModelV2Source } from '@ai-sdk/provider'
import type { LanguageModelV3Source } from '@ai-sdk/provider'
import type { WebSearchResultBlock } from '@anthropic-ai/sdk/resources'
import type OpenAI from '@cherrystudio/openai'
import type { GenerateImagesConfig, GroundingMetadata, PersonGeneration } from '@google/genai'
@@ -614,7 +614,7 @@ export type WebSearchProviderResponse = {
results: WebSearchProviderResult[]
}
export type AISDKWebSearchResult = Omit<Extract<LanguageModelV2Source, { sourceType: 'url' }>, 'sourceType'>
export type AISDKWebSearchResult = Omit<Extract<LanguageModelV3Source, { sourceType: 'url' }>, 'sourceType'>
export type WebSearchResults =
| WebSearchProviderResponse

266
yarn.lock
View File

@@ -74,133 +74,133 @@ __metadata:
languageName: node
linkType: hard
"@ai-sdk/amazon-bedrock@npm:^3.0.35":
version: 3.0.35
resolution: "@ai-sdk/amazon-bedrock@npm:3.0.35"
"@ai-sdk/amazon-bedrock@npm:^4.0.0-beta.38":
version: 4.0.0-beta.38
resolution: "@ai-sdk/amazon-bedrock@npm:4.0.0-beta.38"
dependencies:
"@ai-sdk/anthropic": "npm:2.0.27"
"@ai-sdk/provider": "npm:2.0.0"
"@ai-sdk/provider-utils": "npm:3.0.12"
"@ai-sdk/anthropic": "npm:3.0.0-beta.34"
"@ai-sdk/provider": "npm:3.0.0-beta.8"
"@ai-sdk/provider-utils": "npm:4.0.0-beta.20"
"@smithy/eventstream-codec": "npm:^4.0.1"
"@smithy/util-utf8": "npm:^4.0.0"
aws4fetch: "npm:^1.0.20"
peerDependencies:
zod: ^3.25.76 || ^4.1.8
checksum: 10c0/0e3e0ed1730fa6a14d8d7ca14b7823ec0b80c9d666435d97a505e7fb0c1818378343cdb647e3cc08d7f15d201cbeb04272c5128065f6cc6858b4404961eca761
checksum: 10c0/d6d7e41120b4dc1b7222fa898fc79c32ac8253ac9159e0315e22dc7d14ccd6f7b01a256cbf093cf7c93c20faeebb7d89a63b78876204f8d1ba31297fb8047633
languageName: node
linkType: hard
"@ai-sdk/anthropic@npm:2.0.27, @ai-sdk/anthropic@npm:^2.0.27":
version: 2.0.27
resolution: "@ai-sdk/anthropic@npm:2.0.27"
"@ai-sdk/anthropic@npm:3.0.0-beta.34, @ai-sdk/anthropic@npm:^3.0.0-beta.34":
version: 3.0.0-beta.34
resolution: "@ai-sdk/anthropic@npm:3.0.0-beta.34"
dependencies:
"@ai-sdk/provider": "npm:2.0.0"
"@ai-sdk/provider-utils": "npm:3.0.12"
"@ai-sdk/provider": "npm:3.0.0-beta.8"
"@ai-sdk/provider-utils": "npm:4.0.0-beta.20"
peerDependencies:
zod: ^3.25.76 || ^4.1.8
checksum: 10c0/b568b3b8639af8ec7ea9b766061a4f18bcdef16f2bb12da3a4c4124c751bd6aab1b96dbe1a0eb8e38831d305871ce0787a6536d1a4d8a8ab8aaf03aca3e48e3f
checksum: 10c0/4708b4e286d0a121f14141f5c32025d432f6ec8f16e9f457cde7912b074b4bdd0ac118b9477be8ca47e81713f692cc1d2371eb5999c883277a4592dda3289c5f
languageName: node
linkType: hard
"@ai-sdk/azure@npm:^2.0.49":
version: 2.0.49
resolution: "@ai-sdk/azure@npm:2.0.49"
"@ai-sdk/azure@npm:^3.0.0-beta.34":
version: 3.0.0-beta.34
resolution: "@ai-sdk/azure@npm:3.0.0-beta.34"
dependencies:
"@ai-sdk/openai": "npm:2.0.48"
"@ai-sdk/provider": "npm:2.0.0"
"@ai-sdk/provider-utils": "npm:3.0.12"
"@ai-sdk/openai": "npm:3.0.0-beta.34"
"@ai-sdk/provider": "npm:3.0.0-beta.8"
"@ai-sdk/provider-utils": "npm:4.0.0-beta.20"
peerDependencies:
zod: ^3.25.76 || ^4.1.8
checksum: 10c0/d4dc5a8e0cbe0cefc8db987c4a7b784a9898d40cc55ef38618c71eba7f40dbef77b754aec1d507559f643fed49e538ffe2b677b327f001a2efc0474f6b544ba9
checksum: 10c0/732a386035ffa295a4025d3bdbc6633c40268cda9d0dacfe413d2ce14442d2bbe7e1f706c52f6261f30d62fe43b8014bc4a4b1a51fbaa4df135ba81b4e1aaaee
languageName: node
linkType: hard
"@ai-sdk/deepseek@npm:^1.0.23":
version: 1.0.23
resolution: "@ai-sdk/deepseek@npm:1.0.23"
"@ai-sdk/deepseek@npm:^2.0.0-beta.21":
version: 2.0.0-beta.21
resolution: "@ai-sdk/deepseek@npm:2.0.0-beta.21"
dependencies:
"@ai-sdk/openai-compatible": "npm:1.0.22"
"@ai-sdk/provider": "npm:2.0.0"
"@ai-sdk/provider-utils": "npm:3.0.12"
"@ai-sdk/openai-compatible": "npm:2.0.0-beta.21"
"@ai-sdk/provider": "npm:3.0.0-beta.8"
"@ai-sdk/provider-utils": "npm:4.0.0-beta.20"
peerDependencies:
zod: ^3.25.76 || ^4.1.8
checksum: 10c0/39736e9787420ce86d0f2ce6935ba51f2b721acfb4c0d2b77064a8b939cf22b0767a83b82a5c99efff1311080532a3aaa2f34804d7981133f671a050521ed197
checksum: 10c0/3e0fcd4254d105c5398afb9ee07b4ff7cd029c4c635708c4c15536da8caece64093bde9fb6a06a407748975ecc1197aa8bd3881e995574216bab102ffd48eecc
languageName: node
linkType: hard
"@ai-sdk/gateway@npm:1.0.39":
version: 1.0.39
resolution: "@ai-sdk/gateway@npm:1.0.39"
"@ai-sdk/gateway@npm:2.0.0-beta.36":
version: 2.0.0-beta.36
resolution: "@ai-sdk/gateway@npm:2.0.0-beta.36"
dependencies:
"@ai-sdk/provider": "npm:2.0.0"
"@ai-sdk/provider-utils": "npm:3.0.12"
"@vercel/oidc": "npm:3.0.2"
"@ai-sdk/provider": "npm:3.0.0-beta.8"
"@ai-sdk/provider-utils": "npm:4.0.0-beta.20"
"@vercel/oidc": "npm:3.0.3"
peerDependencies:
zod: ^3.25.76 || ^4.1.8
checksum: 10c0/1b6eedf12ac641c96a1eb75e48e43474694b60eb7dca273f76a636a4e2bfc89efda1d9855d5abf9cc464e23cdbf5a3119fed65c3d22cec726e29a2bad3c3318b
checksum: 10c0/5acd5ba5b858e439013a1035af63701996caff57575fe956bd227eed55b969e295b538727567e911342e95d965b6f7db9d7cdfafe7deffbe28cff34e56a19f37
languageName: node
linkType: hard
"@ai-sdk/google-vertex@npm:^3.0.40":
version: 3.0.40
resolution: "@ai-sdk/google-vertex@npm:3.0.40"
"@ai-sdk/google-vertex@npm:^4.0.0-beta.42":
version: 4.0.0-beta.42
resolution: "@ai-sdk/google-vertex@npm:4.0.0-beta.42"
dependencies:
"@ai-sdk/anthropic": "npm:2.0.27"
"@ai-sdk/google": "npm:2.0.20"
"@ai-sdk/provider": "npm:2.0.0"
"@ai-sdk/provider-utils": "npm:3.0.12"
"@ai-sdk/anthropic": "npm:3.0.0-beta.34"
"@ai-sdk/google": "npm:3.0.0-beta.27"
"@ai-sdk/provider": "npm:3.0.0-beta.8"
"@ai-sdk/provider-utils": "npm:4.0.0-beta.20"
google-auth-library: "npm:^9.15.0"
peerDependencies:
zod: ^3.25.76 || ^4.1.8
checksum: 10c0/680a06e1b80bc036744e2f13e1a55b57661c3674000ab82b863d6536730edfc3696b1b0b2235f6354de11fa323c4ef817d8edbd2dbf94dc4037ea882e560c9ea
checksum: 10c0/45f3346877b67dfdca1eea7d7ae8ed3827732cedabe2dd5dec1aa6f7c133cbb3d5eb2d60085e20dabd2a0e348a1d5da76b86808501aea5243628a2817cb042ca
languageName: node
linkType: hard
"@ai-sdk/google@npm:2.0.20":
version: 2.0.20
resolution: "@ai-sdk/google@npm:2.0.20"
"@ai-sdk/google@npm:3.0.0-beta.27":
version: 3.0.0-beta.27
resolution: "@ai-sdk/google@npm:3.0.0-beta.27"
dependencies:
"@ai-sdk/provider": "npm:2.0.0"
"@ai-sdk/provider-utils": "npm:3.0.12"
"@ai-sdk/provider": "npm:3.0.0-beta.8"
"@ai-sdk/provider-utils": "npm:4.0.0-beta.20"
peerDependencies:
zod: ^3.25.76 || ^4.1.8
checksum: 10c0/9c73bb67061673b16f0996c85bf4e79ab9968c8a203c4f9731bf569e45960db88950dfc227aca69661ea805d381b285697ba1763faa03a38c01b86e6d2e90629
checksum: 10c0/b0d3431ceb0a7aaf0e4f68c1b6850fc38afc13b225032f5fce847e7dfc91e79c96b09cabfb51db607559724beecf8727b48f7c1a481bd6fe383a92787b73e7f0
languageName: node
linkType: hard
"@ai-sdk/google@patch:@ai-sdk/google@npm%3A2.0.20#~/.yarn/patches/@ai-sdk-google-npm-2.0.20-b9102f9d54.patch":
version: 2.0.20
resolution: "@ai-sdk/google@patch:@ai-sdk/google@npm%3A2.0.20#~/.yarn/patches/@ai-sdk-google-npm-2.0.20-b9102f9d54.patch::version=2.0.20&hash=1f2ccb"
"@ai-sdk/google@patch:@ai-sdk/google@npm%3A3.0.0-beta.27#~/.yarn/patches/@ai-sdk-google-npm-3.0.0-beta.27-8900c301e6.patch":
version: 3.0.0-beta.27
resolution: "@ai-sdk/google@patch:@ai-sdk/google@npm%3A3.0.0-beta.27#~/.yarn/patches/@ai-sdk-google-npm-3.0.0-beta.27-8900c301e6.patch::version=3.0.0-beta.27&hash=911263"
dependencies:
"@ai-sdk/provider": "npm:2.0.0"
"@ai-sdk/provider-utils": "npm:3.0.12"
"@ai-sdk/provider": "npm:3.0.0-beta.8"
"@ai-sdk/provider-utils": "npm:4.0.0-beta.20"
peerDependencies:
zod: ^3.25.76 || ^4.1.8
checksum: 10c0/2d567361d533a4e2be83aa135cb5f01f09ea54c255d7751171855ef4244cfaeff73fe7b3c7b044b384a9c170e89d053160a26933176ad68dcaf03bd3c69c0be3
checksum: 10c0/7adaaa600456fee0712284ee35bdaf4fdf0205c9658e2dbaf1d9884fc1e863980e4abd5d08359f2153d2748a7949ec415bfc10adab21533fd92224f72fffba86
languageName: node
linkType: hard
"@ai-sdk/mistral@npm:^2.0.19":
version: 2.0.19
resolution: "@ai-sdk/mistral@npm:2.0.19"
"@ai-sdk/mistral@npm:^3.0.0-beta.21":
version: 3.0.0-beta.21
resolution: "@ai-sdk/mistral@npm:3.0.0-beta.21"
dependencies:
"@ai-sdk/provider": "npm:2.0.0"
"@ai-sdk/provider-utils": "npm:3.0.12"
"@ai-sdk/provider": "npm:3.0.0-beta.8"
"@ai-sdk/provider-utils": "npm:4.0.0-beta.20"
peerDependencies:
zod: ^3.25.76 || ^4.1.8
checksum: 10c0/522d1e4631e9318f82f5993030c8fa2a28341e749bc920d32966d91d5cd5a4d1638980b7e0a62601aaaaf7a25e04fefed18b07ce50034c5c5d903ac5bebb65ec
checksum: 10c0/2ce97b88d9eb2baebb1357a82fc338e719836245ed586a748aff57ae8b51e9332c3c5862536b366d784b8fddb37a4467649a26f8165eb8a06e00287e73ba5410
languageName: node
linkType: hard
"@ai-sdk/openai-compatible@npm:1.0.22, @ai-sdk/openai-compatible@npm:^1.0.22":
version: 1.0.22
resolution: "@ai-sdk/openai-compatible@npm:1.0.22"
"@ai-sdk/openai-compatible@npm:2.0.0-beta.21, @ai-sdk/openai-compatible@npm:^2.0.0-beta.21":
version: 2.0.0-beta.21
resolution: "@ai-sdk/openai-compatible@npm:2.0.0-beta.21"
dependencies:
"@ai-sdk/provider": "npm:2.0.0"
"@ai-sdk/provider-utils": "npm:3.0.12"
"@ai-sdk/provider": "npm:3.0.0-beta.8"
"@ai-sdk/provider-utils": "npm:4.0.0-beta.20"
peerDependencies:
zod: ^3.25.76 || ^4.1.8
checksum: 10c0/31eb07b63eaf07384391e81d824e16589af540f3af2fde1cb24f2a6d04dd07ddb843c9301dbceca78fa5ae5002cb235fc376c41532ab167d1564491526e6011b
checksum: 10c0/69663b4521a175e45f68fca57c47c0a0de481d1cbdee2210cd6b96ad243d406c3287f83f1c35330e46e967e1b52e48772de1410adcfd20fc48f04b2146371026
languageName: node
linkType: hard
@@ -216,15 +216,15 @@ __metadata:
languageName: node
linkType: hard
"@ai-sdk/openai@npm:2.0.48, @ai-sdk/openai@npm:^2.0.48":
version: 2.0.48
resolution: "@ai-sdk/openai@npm:2.0.48"
"@ai-sdk/openai@npm:3.0.0-beta.34, @ai-sdk/openai@npm:^3.0.0-beta.34":
version: 3.0.0-beta.34
resolution: "@ai-sdk/openai@npm:3.0.0-beta.34"
dependencies:
"@ai-sdk/provider": "npm:2.0.0"
"@ai-sdk/provider-utils": "npm:3.0.12"
"@ai-sdk/provider": "npm:3.0.0-beta.8"
"@ai-sdk/provider-utils": "npm:4.0.0-beta.20"
peerDependencies:
zod: ^3.25.76 || ^4.1.8
checksum: 10c0/6c584d7ffb80025da6b7253106a83f8c7a023e8ca322fd32e6858453782d6a0a6d268d7afa7145e3ea743a9c6cbc882932bb59eb1a659750f5205639c414fb49
checksum: 10c0/2abb4e528c606bd41dcd02d51612152d9aa34500909ef7ad896ec21ddee42a751fc04606a88e85929d6be503120473c95c48891e7e46c7875e14d52c45fdce43
languageName: node
linkType: hard
@@ -240,15 +240,15 @@ __metadata:
languageName: node
linkType: hard
"@ai-sdk/perplexity@npm:^2.0.13":
version: 2.0.13
resolution: "@ai-sdk/perplexity@npm:2.0.13"
"@ai-sdk/perplexity@npm:^3.0.0-beta.20":
version: 3.0.0-beta.20
resolution: "@ai-sdk/perplexity@npm:3.0.0-beta.20"
dependencies:
"@ai-sdk/provider": "npm:2.0.0"
"@ai-sdk/provider-utils": "npm:3.0.12"
"@ai-sdk/provider": "npm:3.0.0-beta.8"
"@ai-sdk/provider-utils": "npm:4.0.0-beta.20"
peerDependencies:
zod: ^3.25.76 || ^4.1.8
checksum: 10c0/80434eebec088d5f373901f1beb77ca4ba564df5f04dec43c69a7996ea0d88344a3d86ca5e5ef2dc4f5c45f45fc478dabf3a0e44a3faea86a0190c087491a661
checksum: 10c0/7964c7bfe14d2c7a6d4c145c845245cc1c772b922d7dd0af768021bbdf55387948d22d8178ee008ff6c55b91a03c0c44b98f9e30c8fd057f0cef0de0d2daacf8
languageName: node
linkType: hard
@@ -278,20 +278,30 @@ __metadata:
languageName: node
linkType: hard
"@ai-sdk/provider-utils@npm:3.0.12, @ai-sdk/provider-utils@npm:^3.0.12":
version: 3.0.12
resolution: "@ai-sdk/provider-utils@npm:3.0.12"
"@ai-sdk/provider-utils@npm:4.0.0-beta.20, @ai-sdk/provider-utils@npm:^4.0.0-beta.20":
version: 4.0.0-beta.20
resolution: "@ai-sdk/provider-utils@npm:4.0.0-beta.20"
dependencies:
"@ai-sdk/provider": "npm:2.0.0"
"@ai-sdk/provider": "npm:3.0.0-beta.8"
"@standard-schema/spec": "npm:^1.0.0"
eventsource-parser: "npm:^3.0.5"
peerDependencies:
"@valibot/to-json-schema": ^1.3.0
arktype: ^2.1.22
effect: ^3.18.4
zod: ^3.25.76 || ^4.1.8
checksum: 10c0/83886bf188cad0cc655b680b710a10413989eaba9ec59dd24a58b985c02a8a1d50ad0f96dd5259385c07592ec3c37a7769fdf4a1ef569a73c9edbdb2cd585915
peerDependenciesMeta:
"@valibot/to-json-schema":
optional: true
arktype:
optional: true
effect:
optional: true
checksum: 10c0/74f1265e8f635910bde16632ba07d35b3bb89b7dea337fa044190089879cc96b994ebeafcf1012911b6bcd8273011374805d8a9c689db4a093edd02ae2f77ca8
languageName: node
linkType: hard
"@ai-sdk/provider@npm:2.0.0, @ai-sdk/provider@npm:^2.0.0":
"@ai-sdk/provider@npm:2.0.0":
version: 2.0.0
resolution: "@ai-sdk/provider@npm:2.0.0"
dependencies:
@@ -300,6 +310,15 @@ __metadata:
languageName: node
linkType: hard
"@ai-sdk/provider@npm:3.0.0-beta.8, @ai-sdk/provider@npm:^3.0.0-beta.8":
version: 3.0.0-beta.8
resolution: "@ai-sdk/provider@npm:3.0.0-beta.8"
dependencies:
json-schema: "npm:^0.4.0"
checksum: 10c0/7ce4d8f56180da8ce60faccd4caff871924c3fa6234dcafcf3f877f1c81973685c607da2b00118878e0a7fc12dff8c8fa0692a4b422ceaca40aea6e48c85c028
languageName: node
linkType: hard
"@ai-sdk/provider@npm:^2.1.0-beta.4":
version: 2.1.0-beta.5
resolution: "@ai-sdk/provider@npm:2.1.0-beta.5"
@@ -309,16 +328,16 @@ __metadata:
languageName: node
linkType: hard
"@ai-sdk/xai@npm:^2.0.26":
version: 2.0.26
resolution: "@ai-sdk/xai@npm:2.0.26"
"@ai-sdk/xai@npm:^3.0.0-beta.22":
version: 3.0.0-beta.22
resolution: "@ai-sdk/xai@npm:3.0.0-beta.22"
dependencies:
"@ai-sdk/openai-compatible": "npm:1.0.22"
"@ai-sdk/provider": "npm:2.0.0"
"@ai-sdk/provider-utils": "npm:3.0.12"
"@ai-sdk/openai-compatible": "npm:2.0.0-beta.21"
"@ai-sdk/provider": "npm:3.0.0-beta.8"
"@ai-sdk/provider-utils": "npm:4.0.0-beta.20"
peerDependencies:
zod: ^3.25.76 || ^4.1.8
checksum: 10c0/72fef55a96d9c3820de02beb9b63e53902649c5db906a892b7818a984b6e8afe161daa225b8d527b74f783e2c4eecd474af6e96efbb95761aca2c508e0c7c2d9
checksum: 10c0/ac6fd663a79bd72fba59917b1b76654b2505a92cbd464b4fc621e200cafd71644203d968ff227388adf1959d925228a088a242160c169ab466b12b0d16fbaf2b
languageName: node
linkType: hard
@@ -2435,22 +2454,23 @@ __metadata:
languageName: node
linkType: hard
"@cherrystudio/ai-core@workspace:^1.0.0-alpha.18, @cherrystudio/ai-core@workspace:packages/aiCore":
"@cherrystudio/ai-core@workspace:^1.0.3, @cherrystudio/ai-core@workspace:packages/aiCore":
version: 0.0.0-use.local
resolution: "@cherrystudio/ai-core@workspace:packages/aiCore"
dependencies:
"@ai-sdk/anthropic": "npm:^2.0.27"
"@ai-sdk/azure": "npm:^2.0.49"
"@ai-sdk/deepseek": "npm:^1.0.23"
"@ai-sdk/openai": "npm:^2.0.48"
"@ai-sdk/openai-compatible": "npm:^1.0.22"
"@ai-sdk/provider": "npm:^2.0.0"
"@ai-sdk/provider-utils": "npm:^3.0.12"
"@ai-sdk/xai": "npm:^2.0.26"
"@ai-sdk/anthropic": "npm:^3.0.0-beta.34"
"@ai-sdk/azure": "npm:^3.0.0-beta.34"
"@ai-sdk/deepseek": "npm:^2.0.0-beta.21"
"@ai-sdk/google": "patch:@ai-sdk/google@npm%3A3.0.0-beta.27#~/.yarn/patches/@ai-sdk-google-npm-3.0.0-beta.27-8900c301e6.patch"
"@ai-sdk/openai": "npm:^3.0.0-beta.34"
"@ai-sdk/openai-compatible": "npm:^2.0.0-beta.21"
"@ai-sdk/provider": "npm:^3.0.0-beta.8"
"@ai-sdk/provider-utils": "npm:^4.0.0-beta.20"
"@ai-sdk/xai": "npm:^3.0.0-beta.22"
tsdown: "npm:^0.12.9"
typescript: "npm:^5.0.0"
vitest: "npm:^3.2.4"
zod: "npm:^4.1.5"
zod: "npm:^4.1.12"
peerDependencies:
ai: ^5.0.26
languageName: unknown
@@ -13541,10 +13561,10 @@ __metadata:
languageName: node
linkType: hard
"@vercel/oidc@npm:3.0.2":
version: 3.0.2
resolution: "@vercel/oidc@npm:3.0.2"
checksum: 10c0/8d4c8553baa5aed339ab7614d775139bc124a6d443b76877ab17e98c156daa4dbeb3cf2f3bf21fabfae2ac0dd3ff462ab43b9398708e02483e5923d302a1c4c8
"@vercel/oidc@npm:3.0.3":
version: 3.0.3
resolution: "@vercel/oidc@npm:3.0.3"
checksum: 10c0/c8eecb1324559435f4ab8a955f5ef44f74f546d11c2ddcf28151cb636d989bd4b34e0673fd8716cb21bb21afb34b3de663bacc30c9506036eeecbcbf2fd86241
languageName: node
linkType: hard
@@ -13851,10 +13871,10 @@ __metadata:
"@agentic/exa": "npm:^7.3.3"
"@agentic/searxng": "npm:^7.3.3"
"@agentic/tavily": "npm:^7.3.3"
"@ai-sdk/amazon-bedrock": "npm:^3.0.35"
"@ai-sdk/google-vertex": "npm:^3.0.40"
"@ai-sdk/mistral": "npm:^2.0.19"
"@ai-sdk/perplexity": "npm:^2.0.13"
"@ai-sdk/amazon-bedrock": "npm:^4.0.0-beta.38"
"@ai-sdk/google-vertex": "npm:^4.0.0-beta.42"
"@ai-sdk/mistral": "npm:^3.0.0-beta.21"
"@ai-sdk/perplexity": "npm:^3.0.0-beta.20"
"@ant-design/v5-patch-for-react-19": "npm:^1.0.3"
"@anthropic-ai/claude-agent-sdk": "patch:@anthropic-ai/claude-agent-sdk@npm%3A0.1.1#~/.yarn/patches/@anthropic-ai-claude-agent-sdk-npm-0.1.1-d937b73fed.patch"
"@anthropic-ai/sdk": "npm:^0.41.0"
@@ -13863,7 +13883,7 @@ __metadata:
"@aws-sdk/client-bedrock-runtime": "npm:^3.840.0"
"@aws-sdk/client-s3": "npm:^3.840.0"
"@biomejs/biome": "npm:2.2.4"
"@cherrystudio/ai-core": "workspace:^1.0.0-alpha.18"
"@cherrystudio/ai-core": "workspace:^1.0.3"
"@cherrystudio/embedjs": "npm:^0.1.31"
"@cherrystudio/embedjs-libsql": "npm:^0.1.31"
"@cherrystudio/embedjs-loader-csv": "npm:^0.1.31"
@@ -13978,7 +13998,7 @@ __metadata:
"@viz-js/lang-dot": "npm:^1.0.5"
"@viz-js/viz": "npm:^3.14.0"
"@xyflow/react": "npm:^12.4.4"
ai: "npm:^5.0.68"
ai: "npm:^6.0.0-beta.66"
antd: "patch:antd@npm%3A5.27.0#~/.yarn/patches/antd-npm-5.27.0-aa91c36546.patch"
archiver: "npm:^7.0.1"
async-mutex: "npm:^0.5.0"
@@ -14129,7 +14149,7 @@ __metadata:
yjs: "npm:^13.6.27"
youtubei.js: "npm:^15.0.1"
zipread: "npm:^1.3.3"
zod: "npm:^4.1.5"
zod: "npm:^4.1.12"
languageName: unknown
linkType: soft
@@ -14242,17 +14262,17 @@ __metadata:
languageName: node
linkType: hard
"ai@npm:^5.0.68":
version: 5.0.68
resolution: "ai@npm:5.0.68"
"ai@npm:^6.0.0-beta.66":
version: 6.0.0-beta.66
resolution: "ai@npm:6.0.0-beta.66"
dependencies:
"@ai-sdk/gateway": "npm:1.0.39"
"@ai-sdk/provider": "npm:2.0.0"
"@ai-sdk/provider-utils": "npm:3.0.12"
"@ai-sdk/gateway": "npm:2.0.0-beta.36"
"@ai-sdk/provider": "npm:3.0.0-beta.8"
"@ai-sdk/provider-utils": "npm:4.0.0-beta.20"
"@opentelemetry/api": "npm:1.9.0"
peerDependencies:
zod: ^3.25.76 || ^4.1.8
checksum: 10c0/0c042cd58c7193a47b06b3074a9e62790c4d5a8134e8e12bbb750714151e9aa217c641ee60c8cbe59d9869bade52ccbb283f9fcbf6d79711ebf1f774fa3feee3
checksum: 10c0/025ace76e0be1bfa4d23288d7107027313191cd30eaf7e5100216608490c0d667592c66c3ec5333795d0c2b07c2fb578a311c04806b1244b297c46b75f708c8c
languageName: node
linkType: hard
@@ -30192,10 +30212,10 @@ __metadata:
languageName: node
linkType: hard
"zod@npm:^4.1.5":
version: 4.1.5
resolution: "zod@npm:4.1.5"
checksum: 10c0/7826fb931bc71d4d0fff2fbb72f1a1cf30a6672cf9dbe6933a216bbb60242ef1c3bdfbcd3c5b27e806235a35efaad7a4a9897ff4d3621452f9ea278bce6fd42a
"zod@npm:^4.1.12":
version: 4.1.12
resolution: "zod@npm:4.1.12"
checksum: 10c0/b64c1feb19e99d77075261eaf613e0b2be4dfcd3551eff65ad8b4f2a079b61e379854d066f7d447491fcf193f45babd8095551a9d47973d30b46b6d8e2c46774
languageName: node
linkType: hard