UNPKG

@cherrystudio/ai-core

Version:

Cherry Studio AI Core - Unified AI Provider Interface Based on Vercel AI SDK

827 lines (815 loc) 27.7 kB
const require_factory = require('./factory-BRe13dSv.js'); const __ai_sdk_anthropic = require_factory.__toESM(require("@ai-sdk/anthropic")); const __ai_sdk_azure = require_factory.__toESM(require("@ai-sdk/azure")); const __ai_sdk_deepseek = require_factory.__toESM(require("@ai-sdk/deepseek")); const __ai_sdk_google = require_factory.__toESM(require("@ai-sdk/google")); const __ai_sdk_openai = require_factory.__toESM(require("@ai-sdk/openai")); const __ai_sdk_openai_compatible = require_factory.__toESM(require("@ai-sdk/openai-compatible")); const __ai_sdk_xai = require_factory.__toESM(require("@ai-sdk/xai")); const ai = require_factory.__toESM(require("ai")); //#region src/utils/model.ts function isOpenAIChatCompletionOnlyModel(modelId) { if (!modelId) return false; return modelId.includes("gpt-4o-search-preview") || modelId.includes("gpt-4o-mini-search-preview") || modelId.includes("o1-mini") || modelId.includes("o1-preview"); } //#endregion //#region src/core/providers/creator.ts var ProviderCreationError = class extends Error { constructor(message, providerId, cause) { super(message); this.providerId = providerId; this.cause = cause; this.name = "ProviderCreationError"; } }; /** * 创建 Provider 实例 * 支持两种模式:直接提供 creator 函数,或动态导入 + 函数名 */ async function createProvider(config, options) { try { if (!validateProviderConfig(config)) throw new ProviderCreationError("Invalid provider configuration: must provide either creator function or import configuration", config.id); config.validateOptions?.(options); if (config.creator) return config.creator(options); if (config.import && config.creatorFunctionName) { const module$1 = await config.import(); const creatorFunction = module$1[config.creatorFunctionName]; if (typeof creatorFunction !== "function") throw new ProviderCreationError(`Creator function "${config.creatorFunctionName}" not found in the imported module`, config.id); return creatorFunction(options); } throw new ProviderCreationError("Unexpected provider configuration state", config.id); } catch (error) { if (error instanceof ProviderCreationError) throw error; throw new ProviderCreationError(`Failed to create provider "${config.id}": ${error instanceof Error ? error.message : "Unknown error"}`, config.id, error instanceof Error ? error : void 0); } } /** * 创建图像生成 Provider 实例 */ async function createImageProvider(config, options) { try { if (!config.supportsImageGeneration) throw new ProviderCreationError(`Provider "${config.id}" does not support image generation`, config.id); if (config.imageCreator) return config.imageCreator(options); return await createProvider(config, options); } catch (error) { if (error instanceof ProviderCreationError) throw error; throw new ProviderCreationError(`Failed to create image provider "${config.id}": ${error instanceof Error ? error.message : "Unknown error"}`, config.id, error instanceof Error ? error : void 0); } } /** * 验证 Provider 配置 */ function validateProviderConfig(config) { if (!config.id || !config.name) return false; if (!config.creator && !(config.import && config.creatorFunctionName)) return false; return true; } //#endregion //#region src/core/providers/registry.ts var AiProviderRegistry = class AiProviderRegistry { static instance; registry = new Map(); constructor() { this.initializeProviders(); } static getInstance() { if (!AiProviderRegistry.instance) AiProviderRegistry.instance = new AiProviderRegistry(); return AiProviderRegistry.instance; } /** * 初始化所有支持的 Providers * 基于 AI SDK 官方文档: https://ai-sdk.dev/providers/ai-sdk-providers */ initializeProviders() { const providers = [ { id: "openai", name: "OpenAI", creator: __ai_sdk_openai.createOpenAI, supportsImageGeneration: true }, { id: "openai-responses", name: "OpenAI Responses", creator: (options) => { return (0, __ai_sdk_openai.createOpenAI)(options).responses; }, supportsImageGeneration: true }, { id: "openai-compatible", name: "OpenAI Compatible", creator: __ai_sdk_openai_compatible.createOpenAICompatible, supportsImageGeneration: true }, { id: "anthropic", name: "Anthropic", creator: __ai_sdk_anthropic.createAnthropic, supportsImageGeneration: false }, { id: "google", name: "Google Generative AI", creator: __ai_sdk_google.createGoogleGenerativeAI, supportsImageGeneration: true }, { id: "xai", name: "xAI (Grok)", creator: __ai_sdk_xai.createXai, supportsImageGeneration: true }, { id: "azure", name: "Azure OpenAI", creator: __ai_sdk_azure.createAzure, supportsImageGeneration: true }, { id: "deepseek", name: "DeepSeek", creator: __ai_sdk_deepseek.createDeepSeek, supportsImageGeneration: false } ]; providers.forEach((config) => { this.registry.set(config.id, config); }); } /** * 获取所有已注册的 Providers */ getAllProviders() { return Array.from(this.registry.values()); } /** * 根据 ID 获取 Provider 配置 */ getProvider(id) { return this.registry.get(id) || this.registry.get("openai-compatible"); } /** * 检查 Provider 是否支持(是否已注册) */ isSupported(id) { return this.registry.has(id); } /** * 注册新的 Provider(用于扩展) */ registerProvider(config) { if (!config.creator && !(config.import && config.creatorFunctionName)) throw new Error("Must provide either creator function or import configuration"); if (config.creator && config.import) console.warn("Both creator and import provided, creator will take precedence"); this.registry.set(config.id, config); } /** * 清理资源 */ cleanup() { this.registry.clear(); } }; const aiProviderRegistry = AiProviderRegistry.getInstance(); const getProvider = (id) => aiProviderRegistry.getProvider(id); const getAllProviders = () => aiProviderRegistry.getAllProviders(); const isProviderSupported = (id) => aiProviderRegistry.isSupported(id); const registerProvider = (config) => aiProviderRegistry.registerProvider(config); //#endregion //#region src/core/models/ModelCreator.ts var ModelCreationError = class extends Error { constructor(message, providerId, cause) { super(message); this.providerId = providerId; this.cause = cause; this.name = "ModelCreationError"; } }; async function createBaseModel({ providerId, modelId, providerSettings, extraModelConfig }) { try { const providerConfig = aiProviderRegistry.getProvider(providerId); if (!providerConfig) throw new ModelCreationError(`Provider "${providerId}" is not registered`, providerId); const provider = await createProvider(providerConfig, providerSettings); const finalProvider = handleProviderSpecificLogic(provider, providerConfig.id, providerSettings, modelId); if (typeof finalProvider === "function") { const model = finalProvider(modelId, extraModelConfig); return model; } else throw new ModelCreationError(`Unknown model access pattern for provider "${providerId}"`); } catch (error) { if (error instanceof ModelCreationError) throw error; throw new ModelCreationError(`Failed to create base model for provider "${providerId}": ${error instanceof Error ? error.message : "Unknown error"}`, providerId, error instanceof Error ? error : void 0); } } /** * 处理特定 Provider 的逻辑 */ function handleProviderSpecificLogic(provider, providerId, providerSettings, modelId) { if (providerId === "openai") if ("mode" in providerSettings && providerSettings.mode === "responses" && !isOpenAIChatCompletionOnlyModel(modelId)) return provider.responses; else return provider.chat; return provider; } async function createImageModel(providerId, modelId = "default", options) { try { if (!aiProviderRegistry.isSupported(providerId)) throw new ModelCreationError(`Provider "${providerId}" is not supported`, providerId); const providerConfig = aiProviderRegistry.getProvider(providerId); if (!providerConfig) throw new ModelCreationError(`Provider "${providerId}" is not registered`, providerId); if (!providerConfig.supportsImageGeneration) throw new ModelCreationError(`Provider "${providerId}" does not support image generation`, providerId); const provider = await createImageProvider(providerConfig, options); if (provider && typeof provider.image === "function") return provider.image(modelId); else throw new ModelCreationError(`Image model function not found for provider "${providerId}"`); } catch (error) { if (error instanceof ModelCreationError) throw error; throw new ModelCreationError(`Failed to create image model for provider "${providerId}": ${error instanceof Error ? error.message : "Unknown error"}`, providerId, error instanceof Error ? error : void 0); } } /** * 获取支持的 Providers 列表 */ function getSupportedProviders() { return aiProviderRegistry.getAllProviders().map((provider) => ({ id: provider.id, name: provider.name })); } /** * 获取 Provider 信息 */ function getProviderInfo(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), effectiveProvider: effectiveProviderId }; } //#endregion //#region src/core/middleware/wrapper.ts /** * 使用中间件包装模型 */ function wrapModelWithMiddlewares(model, middlewares) { if (middlewares.length === 0) return model; return (0, ai.wrapLanguageModel)({ model, middleware: middlewares }); } //#endregion //#region src/core/models/factory.ts /** * 创建模型 - 核心函数 */ async function createModel(config) { validateModelConfig(config); const baseModel = await createBaseModel(config); return config.middlewares?.length ? wrapModelWithMiddlewares(baseModel, config.middlewares) : baseModel; } /** * 验证模型配置 */ function validateModelConfig(config) { if (!config.providerId) throw new Error("ModelConfig: providerId is required"); if (!config.modelId) throw new Error("ModelConfig: modelId is required"); if (!config.providerSettings) throw new Error("ModelConfig: providerSettings is required"); } //#endregion //#region src/core/runtime/pluginEngine.ts /** * 插件增强的 AI 客户端 * 专注于插件处理,不暴露用户API */ var PluginEngine = class PluginEngine { pluginManager; constructor(providerId, plugins = []) { this.providerId = providerId; this.pluginManager = new require_factory.PluginManager(plugins); } /** * 添加插件 */ use(plugin) { this.pluginManager.use(plugin); return this; } /** * 批量添加插件 */ usePlugins(plugins) { plugins.forEach((plugin) => this.use(plugin)); return this; } /** * 移除插件 */ removePlugin(pluginName) { this.pluginManager.remove(pluginName); return this; } /** * 获取插件统计 */ getPluginStats() { return this.pluginManager.getStats(); } /** * 获取所有插件 */ getPlugins() { return this.pluginManager.getPlugins(); } /** * 执行带插件的操作(非流式) * 提供给AiExecutor使用 */ async executeWithPlugins(methodName, modelId, params, executor, _context) { const context = _context ? _context : require_factory.createContext(this.providerId, modelId, params); context.recursiveCall = async (newParams) => { context.isRecursiveCall = true; const result = await this.executeWithPlugins(methodName, modelId, newParams, executor, context); context.isRecursiveCall = false; return result; }; try { await this.pluginManager.executeConfigureContext(context); await this.pluginManager.executeParallel("onRequestStart", context); const model = await this.pluginManager.executeFirst("resolveModel", modelId, context); if (!model) throw new Error(`Failed to resolve model: ${modelId}`); const transformedParams = await this.pluginManager.executeSequential("transformParams", params, context); const result = await executor(model, transformedParams); const transformedResult = await this.pluginManager.executeSequential("transformResult", result, context); await this.pluginManager.executeParallel("onRequestEnd", context, transformedResult); return transformedResult; } catch (error) { await this.pluginManager.executeParallel("onError", context, void 0, error); throw error; } } /** * 执行流式调用的通用逻辑(支持流转换器) * 提供给AiExecutor使用 */ async executeStreamWithPlugins(methodName, modelId, params, executor, _context) { const context = _context ? _context : require_factory.createContext(this.providerId, modelId, params); context.recursiveCall = async (newParams) => { context.isRecursiveCall = true; const result = await this.executeStreamWithPlugins(methodName, modelId, newParams, executor, context); context.isRecursiveCall = false; return result; }; try { await this.pluginManager.executeConfigureContext(context); await this.pluginManager.executeParallel("onRequestStart", context); const model = await this.pluginManager.executeFirst("resolveModel", modelId, context); if (!model) throw new Error(`Failed to resolve model: ${modelId}`); const transformedParams = await this.pluginManager.executeSequential("transformParams", params, context); const streamTransforms = this.pluginManager.collectStreamTransforms(transformedParams, context); const result = await executor(model, transformedParams, streamTransforms); const transformedResult = await this.pluginManager.executeSequential("transformResult", result, context); await this.pluginManager.executeParallel("onRequestEnd", context, { stream: true }); return transformedResult; } catch (error) { await this.pluginManager.executeParallel("onError", context, void 0, error); throw error; } } /** * 创建 OpenAI Compatible 客户端 */ static createOpenAICompatible(config, plugins = []) { return new PluginEngine("openai-compatible", plugins); } static create(providerId, plugins = []) { if (isProviderSupported(providerId)) return new PluginEngine(providerId, plugins); else return new PluginEngine("openai-compatible", plugins); } }; //#endregion //#region src/core/runtime/executor.ts var RuntimeExecutor = class RuntimeExecutor { pluginEngine; config; constructor(config) { this.config = config; this.pluginEngine = new PluginEngine(config.providerId, config.plugins || []); } createResolveModelPlugin(middlewares) { return require_factory.definePlugin({ name: "_internal_resolveModel", enforce: "post", resolveModel: async (modelId, context) => { const extraModelConfig = context.extraModelConfig || {}; return await this.resolveModel(modelId, middlewares, extraModelConfig); } }); } createConfigureContextPlugin() { return require_factory.definePlugin({ name: "_internal_configureContext", configureContext: async (context) => { context.executor = this; } }); } async streamText(modelOrId, params, options) { this.pluginEngine.usePlugins([this.createResolveModelPlugin(options?.middlewares), this.createConfigureContextPlugin()]); return this.pluginEngine.executeStreamWithPlugins("streamText", typeof modelOrId === "string" ? modelOrId : modelOrId.modelId, params, async (model, transformedParams, streamTransforms) => { const experimental_transform = params?.experimental_transform ?? (streamTransforms.length > 0 ? streamTransforms : void 0); return await (0, ai.streamText)({ model, ...transformedParams, experimental_transform }); }); } async generateText(modelOrId, params, options) { this.pluginEngine.usePlugins([this.createResolveModelPlugin(options?.middlewares), this.createConfigureContextPlugin()]); return this.pluginEngine.executeWithPlugins("generateText", typeof modelOrId === "string" ? modelOrId : modelOrId.modelId, params, async (model, transformedParams) => { return await (0, ai.generateText)({ model, ...transformedParams }); }); } async generateObject(modelOrId, params, options) { this.pluginEngine.usePlugins([this.createResolveModelPlugin(options?.middlewares), this.createConfigureContextPlugin()]); return this.pluginEngine.executeWithPlugins("generateObject", typeof modelOrId === "string" ? modelOrId : modelOrId.modelId, params, async (model, transformedParams) => { return await (0, ai.generateObject)({ model, ...transformedParams }); }); } async streamObject(modelOrId, params, options) { this.pluginEngine.usePlugins([this.createResolveModelPlugin(options?.middlewares), this.createConfigureContextPlugin()]); return this.pluginEngine.executeWithPlugins("streamObject", typeof modelOrId === "string" ? modelOrId : modelOrId.modelId, params, async (model, transformedParams) => { return await (0, ai.streamObject)({ model, ...transformedParams }); }); } /** * 解析模型:如果是字符串则创建模型,如果是模型则直接返回 */ async resolveModel(modelOrId, middlewares, extraModelConfig) { if (typeof modelOrId === "string") return await createModel({ providerId: this.config.providerId, modelId: modelOrId, providerSettings: this.config.providerSettings, middlewares, extraModelConfig }); else return modelOrId; } /** * 获取客户端信息 */ getClientInfo() { return getProviderInfo(this.config.providerId); } /** * 创建执行器 - 支持已知provider的类型安全 */ static create(providerId, options, plugins) { return new RuntimeExecutor({ providerId, providerSettings: options, plugins }); } /** * 创建OpenAI Compatible执行器 */ static createOpenAICompatible(options, plugins = []) { return new RuntimeExecutor({ providerId: "openai-compatible", providerSettings: options, plugins }); } }; //#endregion //#region src/core/runtime/index.ts /** * 创建运行时执行器 - 支持类型安全的已知provider */ function createExecutor(providerId, options, plugins) { return RuntimeExecutor.create(providerId, options, plugins); } /** * 创建OpenAI Compatible执行器 */ function createOpenAICompatibleExecutor(options, plugins = []) { return RuntimeExecutor.createOpenAICompatible(options, plugins); } /** * 直接流式文本生成 - 支持middlewares */ async function streamText(providerId, options, modelId, params, plugins, middlewares) { const executor = createExecutor(providerId, options, plugins); return executor.streamText(modelId, params, { middlewares }); } /** * 直接生成文本 - 支持middlewares */ async function generateText(providerId, options, modelId, params, plugins, middlewares) { const executor = createExecutor(providerId, options, plugins); return executor.generateText(modelId, params, { middlewares }); } /** * 直接生成结构化对象 - 支持middlewares */ async function generateObject(providerId, options, modelId, params, plugins, middlewares) { const executor = createExecutor(providerId, options, plugins); return executor.generateObject(modelId, params, { middlewares }); } //#endregion //#region src/core/providers/factory.ts const configHandlers = { azure: (builder, provider) => { const azureBuilder = builder; const azureProvider = provider; azureBuilder.withAzureConfig({ apiVersion: azureProvider.apiVersion, resourceName: azureProvider.resourceName }); } }; var ProviderConfigBuilder = class { config = {}; constructor(providerId) { this.providerId = providerId; } withApiKey(apiKey, options) { this.config.apiKey = apiKey; if (this.providerId === "openai" && options) { const openaiConfig = this.config; if (options.organization) openaiConfig.organization = options.organization; if (options.project) openaiConfig.project = options.project; } return this; } /** * 设置基础 URL */ withBaseURL(baseURL) { this.config.baseURL = baseURL; return this; } /** * 设置请求配置 */ withRequestConfig(options) { if (options.headers) this.config.headers = { ...this.config.headers, ...options.headers }; if (options.fetch) this.config.fetch = options.fetch; return this; } withAzureConfig(options) { if (this.providerId === "azure") { const azureConfig = this.config; if (options.apiVersion) azureConfig.apiVersion = options.apiVersion; if (options.resourceName) azureConfig.resourceName = options.resourceName; } return this; } withGoogleCredentials() { return this; } /** * 设置自定义参数 */ withCustomParams(params) { Object.assign(this.config, params); return this; } /** * 构建最终配置 */ build() { return this.config; } }; /** * Provider 配置工厂 * 提供便捷的配置创建方法 */ var ProviderConfigFactory = class { /** * 创建配置构建器 */ static builder(providerId) { return new ProviderConfigBuilder(providerId); } /** * 从通用Provider对象创建配置 - 使用更优雅的处理器模式 */ static fromProvider(providerId, provider, options) { const builder = new ProviderConfigBuilder(providerId); if (provider.apiKey) builder.withApiKey(provider.apiKey); if (provider.baseURL) builder.withBaseURL(provider.baseURL); if (options?.headers) builder.withRequestConfig({ headers: options.headers }); const handler = configHandlers[providerId]; if (handler) handler(builder, provider); if (options) { const customOptions = { ...options }; delete customOptions.headers; if (Object.keys(customOptions).length > 0) builder.withCustomParams(customOptions); } return builder.build(); } /** * 快速创建 OpenAI 配置 */ static createOpenAI(apiKey, options) { const builder = this.builder("openai"); if (options?.organization || options?.project) builder.withApiKey(apiKey, { organization: options.organization, project: options.project }); else builder.withApiKey(apiKey); return builder.withBaseURL(options?.baseURL || "https://api.openai.com").build(); } /** * 快速创建 Anthropic 配置 */ static createAnthropic(apiKey, options) { return this.builder("anthropic").withApiKey(apiKey).withBaseURL(options?.baseURL || "https://api.anthropic.com").build(); } /** * 快速创建 Azure OpenAI 配置 */ static createAzureOpenAI(apiKey, options) { return this.builder("azure").withApiKey(apiKey).withBaseURL(options.baseURL).withAzureConfig({ apiVersion: options.apiVersion, resourceName: options.resourceName }).build(); } /** * 快速创建 Google 配置 */ static createGoogle(apiKey, options) { return this.builder("google").withApiKey(apiKey).withBaseURL(options?.baseURL || "https://generativelanguage.googleapis.com").build(); } /** * 快速创建 Vertex AI 配置 */ static createVertexAI() {} static createOpenAICompatible(baseURL, apiKey) { return this.builder("openai-compatible").withBaseURL(baseURL).withApiKey(apiKey).build(); } }; /** * 便捷的配置创建函数 */ const createProviderConfig = ProviderConfigFactory.fromProvider; const providerConfigBuilder = ProviderConfigFactory.builder; //#endregion //#region src/index.ts const AI_CORE_VERSION = "1.0.0"; const AI_CORE_NAME = "@cherrystudio/ai-core"; const AiCore = { version: AI_CORE_VERSION, name: AI_CORE_NAME, create(providerId, options, plugins = []) { return createExecutor(providerId, options, plugins); }, getSupportedProviders() { return getSupportedProviders(); }, isSupported(providerId) { return isProviderSupported(providerId); }, getClientInfo(providerId) { return getProviderInfo(providerId); } }; const createOpenAIExecutor = (options, plugins) => { return createExecutor("openai", options, plugins); }; const createAnthropicExecutor = (options, plugins) => { return createExecutor("anthropic", options, plugins); }; const createGoogleExecutor = (options, plugins) => { return createExecutor("google", options, plugins); }; const createXAIExecutor = (options, plugins) => { return createExecutor("xai", options, plugins); }; const DevTools = { listProviders() { return aiProviderRegistry.getAllProviders().map((p) => ({ id: p.id, name: p.name })); }, async testProvider(providerId, options) { try { const executor = createExecutor(providerId, options); const info = executor.getClientInfo(); return { success: true, providerId: info.id, name: info.name, isSupported: info.isSupported }; } catch (error) { return { success: false, providerId, error: error instanceof Error ? error.message : "Unknown error" }; } }, getProviderDetails() { const providers = aiProviderRegistry.getAllProviders(); return { supportedProviders: providers.length, registeredProviders: providers.length, providers: providers.map((p) => ({ id: p.id, name: p.name })) }; } }; //#endregion exports.AI_CORE_NAME = AI_CORE_NAME; exports.AI_CORE_VERSION = AI_CORE_VERSION; Object.defineProperty(exports, 'Agent', { enumerable: true, get: function () { return ai.Experimental_Agent; } }); exports.AiCore = AiCore; exports.DevTools = DevTools; exports.ModelCreationError = ModelCreationError; exports.PluginEngine = PluginEngine; exports.PluginManager = require_factory.PluginManager; exports.ProviderConfigFactory = ProviderConfigFactory; exports.aiProviderRegistry = aiProviderRegistry; Object.defineProperty(exports, 'aiSdk', { enumerable: true, get: function () { return ai; } }); exports.createAnthropicExecutor = createAnthropicExecutor; exports.createAnthropicOptions = require_factory.createAnthropicOptions; exports.createApiClient = createBaseModel; exports.createContext = require_factory.createContext; exports.createExecutor = createExecutor; exports.createGoogleExecutor = createGoogleExecutor; exports.createGoogleOptions = require_factory.createGoogleOptions; exports.createImageModel = createImageModel; exports.createModel = createModel; exports.createOpenAICompatibleExecutor = createOpenAICompatibleExecutor; exports.createOpenAIExecutor = createOpenAIExecutor; exports.createOpenAIOptions = require_factory.createOpenAIOptions; exports.createProviderConfig = createProviderConfig; exports.createXAIExecutor = createXAIExecutor; Object.defineProperty(exports, 'defaultSettingsMiddleware', { enumerable: true, get: function () { return ai.defaultSettingsMiddleware; } }); exports.definePlugin = require_factory.definePlugin; Object.defineProperty(exports, 'extractReasoningMiddleware', { enumerable: true, get: function () { return ai.extractReasoningMiddleware; } }); exports.generateObject = generateObject; exports.generateText = generateText; exports.getAllProviders = getAllProviders; exports.getClientInfo = getProviderInfo; exports.getProvider = getProvider; exports.getSupportedProviders = getSupportedProviders; exports.isProviderSupported = isProviderSupported; exports.mergeProviderOptions = require_factory.mergeProviderOptions; exports.providerConfigBuilder = providerConfigBuilder; exports.registerProvider = registerProvider; Object.defineProperty(exports, 'simulateStreamingMiddleware', { enumerable: true, get: function () { return ai.simulateStreamingMiddleware; } }); Object.defineProperty(exports, 'smoothStream', { enumerable: true, get: function () { return ai.smoothStream; } }); Object.defineProperty(exports, 'stepCountIs', { enumerable: true, get: function () { return ai.stepCountIs; } }); exports.streamText = streamText;