diff --git a/packages/aiCore/src/core/models/ModelCreator.ts b/packages/aiCore/src/core/models/ModelCreator.ts deleted file mode 100644 index ef63893d3c..0000000000 --- a/packages/aiCore/src/core/models/ModelCreator.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * 模型创建器 - * 负责创建模型并应用中间件,不暴露原始model给用户 - */ -import { LanguageModel } from 'ai' - -import { wrapModelWithMiddlewares } from '../middleware' -import { createBaseModel } from './ProviderCreator' -import { ModelCreationRequest, ResolvedConfig } from './types' - -/** - * 根据解析后的配置创建包装好的模型 - */ -export async function createModelFromConfig(config: ResolvedConfig): Promise { - // 使用ProviderCreator创建基础模型(不应用中间件) - const baseModel = await createBaseModel(config.provider.id, config.model.id, config.provider.options) - - // 在creation层应用中间件,用户不直接接触原始model - return wrapModelWithMiddlewares(baseModel, config.middlewares) -} - -/** - * 直接根据请求参数创建模型 - */ -export async function createModel(request: ModelCreationRequest): Promise { - // 使用ProviderCreator创建基础模型(不应用中间件) - const baseModel = await createBaseModel(request.providerId, request.modelId, request.options) - - const middlewares = request.middlewares || [] - return wrapModelWithMiddlewares(baseModel, middlewares) -} diff --git a/packages/aiCore/src/core/models/ProviderCreator.ts b/packages/aiCore/src/core/models/ProviderCreator.ts index d326dd0f6c..b9c7bf3adc 100644 --- a/packages/aiCore/src/core/models/ProviderCreator.ts +++ b/packages/aiCore/src/core/models/ProviderCreator.ts @@ -25,26 +25,43 @@ export class ProviderCreationError extends Error { * 创建基础 AI SDK 模型实例 * 对于已知的 Provider 使用严格类型检查,未知的 Provider 默认使用 openai-compatible */ -export async function createBaseModel( - providerId: T, - modelId: string, - options: ProviderSettingsMap[T], - middlewares?: LanguageModelV2Middleware[] -): Promise +export async function createBaseModel({ + providerId, + modelId, + providerSettings + // middlewares +}: { + providerId: T + modelId: string + providerSettings: ProviderSettingsMap[T] + // middlewares?: LanguageModelV1Middleware[] +}): Promise -export async function createBaseModel( - providerId: string, - modelId: string, - options: ProviderSettingsMap['openai-compatible'], - middlewares?: LanguageModelV2Middleware[] -): Promise +export async function createBaseModel({ + providerId, + modelId, + providerSettings + // middlewares +}: { + providerId: string + modelId: string + providerSettings: ProviderSettingsMap['openai-compatible'] + // middlewares?: LanguageModelV1Middleware[] +}): Promise -export async function createBaseModel( - providerId: string, - modelId: string = 'default', - options: any, - middlewares?: LanguageModelV2Middleware[] -): Promise { +export async function createBaseModel({ + providerId, + modelId, + providerSettings, + // middlewares, + extraModelConfig +}: { + providerId: string + modelId: string + providerSettings: ProviderSettingsMap[ProviderId] + // middlewares?: LanguageModelV1Middleware[] + extraModelConfig?: any +}): Promise { try { // 对于不在注册表中的 provider,默认使用 openai-compatible const effectiveProviderId = aiProviderRegistry.isSupported(providerId) ? providerId : 'openai-compatible' @@ -67,7 +84,7 @@ export async function createBaseModel( ) } // 创建provider实例 - let provider = creatorFunction(options) + let provider = creatorFunction(providerSettings) // 加一个特判 if (providerConfig.id === 'openai' && !isOpenAIChatCompletionOnlyModel(modelId)) { @@ -75,15 +92,16 @@ export async function createBaseModel( } // 返回模型实例 if (typeof provider === 'function') { - let model: LanguageModelV2 = provider(modelId) + // extraModelConfig:例如google的useSearchGrounding + const model: LanguageModelV2 = provider(modelId, extraModelConfig) - // 应用 AI SDK 中间件 - if (middlewares && middlewares.length > 0) { - model = wrapLanguageModel({ - model: model, - middleware: middlewares - }) - } + // // 应用 AI SDK 中间件 + // if (middlewares && middlewares.length > 0) { + // model = wrapLanguageModel({ + // model: model, + // middleware: middlewares + // }) + // } return model } else { diff --git a/packages/aiCore/src/core/models/factory.ts b/packages/aiCore/src/core/models/factory.ts index 7d26760cf0..983b714579 100644 --- a/packages/aiCore/src/core/models/factory.ts +++ b/packages/aiCore/src/core/models/factory.ts @@ -5,16 +5,9 @@ import { LanguageModelV2, LanguageModelV2Middleware } from '@ai-sdk/provider' import { LanguageModel } from 'ai' -import { type ProviderId, type ProviderSettingsMap } from '../../types' import { wrapModelWithMiddlewares } from '../middleware' import { createBaseModel } from './ProviderCreator' - -export interface ModelConfig { - providerId: ProviderId - modelId: string - options: ProviderSettingsMap[ProviderId] - middlewares?: LanguageModelV2Middleware[] -} +import { ModelConfig } from './types' /** * 创建模型 - 核心函数 @@ -23,7 +16,7 @@ export async function createModel(config: ModelConfig): Promise validateModelConfig(config) // 1. 创建基础模型 - const baseModel = await createBaseModel(config.providerId, config.modelId, config.options) + const baseModel = await createBaseModel(config) // 2. 应用中间件(如果有) return config.middlewares?.length ? wrapModelWithMiddlewares(baseModel, config.middlewares) : baseModel @@ -46,7 +39,7 @@ function validateModelConfig(config: ModelConfig): void { if (!config.modelId) { throw new Error('ModelConfig: modelId is required') } - if (!config.options) { - throw new Error('ModelConfig: options is required') + if (!config.providerSettings) { + throw new Error('ModelConfig: providerSettings is required') } } diff --git a/packages/aiCore/src/core/models/index.ts b/packages/aiCore/src/core/models/index.ts index cee1eab374..89f6a31514 100644 --- a/packages/aiCore/src/core/models/index.ts +++ b/packages/aiCore/src/core/models/index.ts @@ -4,7 +4,7 @@ */ // 主要的模型创建API -export { createModel, createModels, type ModelConfig } from './factory' +export { createModel, createModels } from './factory' // 底层Provider创建功能(供高级用户使用) export { @@ -16,4 +16,4 @@ export { } from './ProviderCreator' // 保留原有类型 -export type { ModelCreationRequest, ResolvedConfig } from './types' +export type { ModelConfig } from './types' diff --git a/packages/aiCore/src/core/models/types.ts b/packages/aiCore/src/core/models/types.ts index cb8e1284c2..2bb98a67e8 100644 --- a/packages/aiCore/src/core/models/types.ts +++ b/packages/aiCore/src/core/models/types.ts @@ -3,30 +3,11 @@ */ import { LanguageModelV2Middleware } from '@ai-sdk/provider' -import { ProviderId, ProviderSettingsMap } from '../../types' -import { AiPlugin } from '../plugins' +import type { ProviderId, ProviderSettingsMap } from '../../types' -/** - * 模型创建请求 - */ -export interface ModelCreationRequest { +export interface ModelConfig { providerId: ProviderId modelId: string options: ProviderSettingsMap[ProviderId] middlewares?: LanguageModelV2Middleware[] } - -/** - * 配置解析结果 - */ -export interface ResolvedConfig { - provider: { - id: ProviderId - options: ProviderSettingsMap[ProviderId] - } - model: { - id: string - } - plugins: AiPlugin[] - middlewares: LanguageModelV2Middleware[] -} diff --git a/packages/aiCore/src/core/plugins/built-in/webSearchPlugin/helper.ts b/packages/aiCore/src/core/plugins/built-in/webSearchPlugin/helper.ts index a917be68c0..2f14d648a2 100644 --- a/packages/aiCore/src/core/plugins/built-in/webSearchPlugin/helper.ts +++ b/packages/aiCore/src/core/plugins/built-in/webSearchPlugin/helper.ts @@ -51,27 +51,29 @@ export function adaptOpenAIWebSearch(params: any, webSearchConfig: WebSearchConf } /** + * * 适配 Gemini 网络搜索 * 将 googleSearch 工具放入 providerOptions.google.tools */ -export function adaptGeminiWebSearch(params: any, webSearchConfig: WebSearchConfig | boolean): any { - const config = typeof webSearchConfig === 'boolean' ? {} : webSearchConfig - const googleSearchTool = { googleSearch: {} } +// export function adaptGeminiWebSearch(params: any, webSearchConfig: WebSearchConfig | boolean): any { +// const config = typeof webSearchConfig === 'boolean' ? {} : webSearchConfig +// const googleSearchTool = { googleSearch: {} } - const existingTools = Array.isArray(params.providerOptions?.google?.tools) ? params.providerOptions.google.tools : [] +// const existingTools = Array.isArray(params.providerOptions?.google?.tools) ? params.providerOptions.google.tools : [] - return { - ...params, - providerOptions: { - ...params.providerOptions, - google: { - ...params.providerOptions?.google, - tools: [...existingTools, googleSearchTool], - ...(config.extra || {}) - } - } - } -} +// return { +// ...params, +// providerOptions: { +// ...params.providerOptions, +// google: { +// ...params.providerOptions?.google, +// useSearchGrounding: true, +// // tools: [...existingTools, googleSearchTool], +// ...(config.extra || {}) +// } +// } +// } +// } /** * 适配 Anthropic 网络搜索 @@ -115,9 +117,10 @@ export function adaptWebSearchForProvider( case 'openai': return adaptOpenAIWebSearch(params, webSearchConfig) - case 'google': - case 'google-vertex': - return adaptGeminiWebSearch(params, webSearchConfig) + // google的需要通过插件,在创建model的时候传入参数 + // case 'google': + // case 'google-vertex': + // return adaptGeminiWebSearch(params, webSearchConfig) case 'anthropic': return adaptAnthropicWebSearch(params, webSearchConfig) @@ -127,12 +130,3 @@ export function adaptWebSearchForProvider( return params } } - -/** - * 检查 provider 是否支持网络搜索 - */ -export function isWebSearchSupported(providerId: string): boolean { - const supportedProviders = ['openai', 'google', 'google-vertex', 'anthropic'] - - return supportedProviders.includes(providerId) -} diff --git a/packages/aiCore/src/core/plugins/built-in/webSearchPlugin/index.ts b/packages/aiCore/src/core/plugins/built-in/webSearchPlugin/index.ts index 4833f45f2f..86d4b4da0e 100644 --- a/packages/aiCore/src/core/plugins/built-in/webSearchPlugin/index.ts +++ b/packages/aiCore/src/core/plugins/built-in/webSearchPlugin/index.ts @@ -5,7 +5,7 @@ import { definePlugin } from '../../' import type { AiRequestContext } from '../../types' -import { adaptWebSearchForProvider, isWebSearchSupported, type WebSearchConfig } from './helper' +import { adaptWebSearchForProvider, type WebSearchConfig } from './helper' /** * 网络搜索插件 @@ -14,42 +14,51 @@ import { adaptWebSearchForProvider, isWebSearchSupported, type WebSearchConfig } * options.ts 文件负责将高层级的设置(如 assistant.enableWebSearch) * 转换为 providerOptions 中的 webSearch: { enabled: true } 配置。 */ -export const webSearchPlugin = definePlugin({ - name: 'webSearch', +export const webSearchPlugin = (config) => + definePlugin({ + name: 'webSearch', + enforce: 'pre', - transformParams: async (params: any, context: AiRequestContext) => { - const { providerId } = context + // configureModel: async (modelConfig: any, context: AiRequestContext) => { + // if (context.providerId === 'google') { + // return { + // ...modelConfig + // } + // } + // return null + // }, - // 从 providerOptions 中提取 webSearch 配置 - const webSearchConfig = params.providerOptions?.[providerId]?.webSearch + transformParams: async (params: any, context: AiRequestContext) => { + const { providerId } = context - // 检查是否启用了网络搜索 (enabled: false 可用于显式禁用) - if (!webSearchConfig || (typeof webSearchConfig === 'object' && webSearchConfig.enabled === false)) { - return params + // 从 providerOptions 中提取 webSearch 配置 + const webSearchConfig = params.providerOptions?.[providerId]?.webSearch + + // 检查是否启用了网络搜索 (enabled: false 可用于显式禁用) + if (!webSearchConfig || (typeof webSearchConfig === 'object' && webSearchConfig.enabled === false)) { + return params + } + console.log('webSearchConfig', webSearchConfig) + // // 检查当前 provider 是否支持网络搜索 + // if (!isWebSearchSupported(providerId)) { + // // 对于不支持的 provider,只记录警告,不修改参数 + // console.warn( + // `[webSearchPlugin] Provider '${providerId}' does not support web search. Ignoring webSearch parameter.` + // ) + // return params + // } + + // 使用适配器函数处理网络搜索 + const adaptedParams = adaptWebSearchForProvider(params, providerId, webSearchConfig as WebSearchConfig | boolean) + // 清理原始的 webSearch 配置 + if (adaptedParams.providerOptions?.[providerId]) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { webSearch, ...rest } = adaptedParams.providerOptions[providerId] + adaptedParams.providerOptions[providerId] = rest + } + return adaptedParams } - - // 检查当前 provider 是否支持网络搜索 - if (!isWebSearchSupported(providerId)) { - // 对于不支持的 provider,只记录警告,不修改参数 - console.warn( - `[webSearchPlugin] Provider '${providerId}' does not support web search. Ignoring webSearch parameter.` - ) - return params - } - - // 使用适配器函数处理网络搜索 - const adaptedParams = adaptWebSearchForProvider(params, providerId, webSearchConfig as WebSearchConfig | boolean) - - // 清理原始的 webSearch 配置 - if (adaptedParams.providerOptions?.[providerId]) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { webSearch, ...rest } = adaptedParams.providerOptions[providerId] - adaptedParams.providerOptions[providerId] = rest - } - - return adaptedParams - } -}) + }) // 导出类型定义供开发者使用 export type { WebSearchConfig } from './helper' diff --git a/packages/aiCore/src/core/plugins/index.ts b/packages/aiCore/src/core/plugins/index.ts index 8b64b5b0d8..5883c0a41d 100644 --- a/packages/aiCore/src/core/plugins/index.ts +++ b/packages/aiCore/src/core/plugins/index.ts @@ -1,13 +1,17 @@ // 核心类型和接口 export type { AiPlugin, AiRequestContext, HookResult, HookType, PluginManagerConfig } from './types' -import { ProviderId } from '../providers/registry' +import type { ProviderId } from '../../types' import type { AiPlugin, AiRequestContext } from './types' // 插件管理器 export { PluginManager } from './manager' // 工具函数 -export function createContext(providerId: ProviderId, modelId: string, originalParams: any): AiRequestContext { +export function createContext( + providerId: T, + modelId: string, + originalParams: any +): AiRequestContext { return { providerId, modelId, diff --git a/packages/aiCore/src/core/plugins/manager.ts b/packages/aiCore/src/core/plugins/manager.ts index d37976b288..5c381aa964 100644 --- a/packages/aiCore/src/core/plugins/manager.ts +++ b/packages/aiCore/src/core/plugins/manager.ts @@ -52,7 +52,7 @@ export class PluginManager { */ async executeFirst( hookName: 'resolveModel' | 'loadTemplate', - arg: string, + arg: any, context: AiRequestContext ): Promise { for (const plugin of this.plugins) { @@ -71,7 +71,7 @@ export class PluginManager { * 执行 Sequential 钩子 - 链式数据转换 */ async executeSequential( - hookName: 'transformParams' | 'transformResult', + hookName: 'transformParams' | 'transformResult' | 'configureModel', initialValue: T, context: AiRequestContext ): Promise { @@ -120,7 +120,9 @@ export class PluginManager { * 收集所有流转换器(返回数组,AI SDK 原生支持) */ collectStreamTransforms(params: any, context: AiRequestContext) { - return this.plugins.map((plugin) => plugin.transformStream?.(params, context)) + return this.plugins + .filter((plugin) => plugin.transformStream) + .map((plugin) => plugin.transformStream?.(params, context)) } /** diff --git a/packages/aiCore/src/core/runtime/executor.ts b/packages/aiCore/src/core/runtime/executor.ts index e1a867ea13..8483bc5f01 100644 --- a/packages/aiCore/src/core/runtime/executor.ts +++ b/packages/aiCore/src/core/runtime/executor.ts @@ -218,7 +218,7 @@ export class RuntimeExecutor { return await createModel({ providerId: this.config.providerId, modelId: modelOrId, - options: this.config.options, + providerSettings: this.config.providerSettings, middlewares }) } else { @@ -246,7 +246,7 @@ export class RuntimeExecutor { ): RuntimeExecutor { return new RuntimeExecutor({ providerId, - options, + providerSettings: options, plugins }) } @@ -260,7 +260,7 @@ export class RuntimeExecutor { ): RuntimeExecutor<'openai-compatible'> { return new RuntimeExecutor({ providerId: 'openai-compatible', - options, + providerSettings: options, plugins }) } diff --git a/packages/aiCore/src/core/runtime/types.ts b/packages/aiCore/src/core/runtime/types.ts index e4df242e3a..c5cb6cc7ef 100644 --- a/packages/aiCore/src/core/runtime/types.ts +++ b/packages/aiCore/src/core/runtime/types.ts @@ -9,7 +9,7 @@ import { type AiPlugin } from '../plugins' */ export interface RuntimeConfig { providerId: T - options: ProviderSettingsMap[T] + providerSettings: ProviderSettingsMap[T] plugins?: AiPlugin[] }