Cherry Studio AI Core 2.0 演进解析:AI SDK v6 迁移与 Provider 插件化架构重构
Cherry Studio AI Core 2.0 演进解析AI SDK v6 迁移与 Provider 插件化架构重构【免费下载链接】cherry-studio Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端项目地址: https://gitcode.com/CherryHQ/cherry-studio本篇技术指南以 Cherry Studio 仓库内 packages/aiCore/CHANGELOG.md 为主线结合 packages/aiCore 包源码完整梳理cherrystudio/ai-core从 2.0.0 到 2.0.1 的架构演进包括 AI SDK v6 迁移带来的破坏性变更、Provider Extension / Variant 类型系统重构、toolFactories 工具工厂机制以及插件化运行时的生命周期模型。读完本文你将理解该包模型层 → 运行时层的设计脉络掌握ProviderVariantTSettings, TProvider, TOutput泛型设计与azure-anthropic变体修复的底层原理并能在自己的项目中正确安装、注册与调用该统一 AI Provider 接口。版本演进总览一次破坏性重构与一次精准修复cherrystudio/ai-core即packages/aiCore是 Cherry Studio 基于 Vercel AI SDK 构建的统一 AI Provider 接口包其 package.json 声明的主版本演进记录了两个关键节点2.0.0Major Changes由 PR #12235 引入完成向 AI SDK v6 的整体迁移对 Provider 与中间件架构做了完整重写complete rewrite同时包含若干破坏性变更2.0.1Patch Changes由 PR #14087 引入集中修复azure-anthropic变体的工具工厂与类型系统问题是理解 Variant 泛型设计的最佳案例。除版本自身内容外2.0.0 还包含两项 PatchPR #13787 补充缺失的openrouter/ai-sdk-provider依赖以修复包构建PR #12783 作为基线发布Baseline release将此前未纳管的历史变更收编并正式引入基于 changesets 的发布流程。从 changelog 可见2.0.0 同时将cherrystudio/ai-sdk-provider依赖更新至 0.1.6二者属于同仓库 workspace 联动演进见 pnpm-workspace.yaml。2.0.0 核心AI SDK v6 迁移的五大变化1. 移除遗留 API 客户端与中间件管线破坏性变更2.0.0 明确标注BREAKING移除所有遗留 API clients、middleware pipeline 以及 barrel 形式的index.ts。这意味着旧版中自维护的 HTTP 客户端封装、自建的中间件链均被废弃取而代之的是直接复用 AI SDK v6 的能力。从当前源码可以印证这一转向包的主入口 packages/aiCore/src/index.ts 已不再是一份厚重的 barrel 文件而是按模块分区runtime / plugins / providers / context / errors做轻量再导出核心执行器 RuntimeExecutor 直接调用 AI SDK 的streamText、generateText、generateImage、embedMany、rerank等顶层函数不再存在自定义的网络层。2. 图像生成迁移到原生 generateImage / editImagechangelog 指出图像生成从遗留 image middleware迁移为 AI SDK 原生的generateImage/editImage。源码中 RuntimeExecutor.generateImage 正是这一迁移的落点它支持字符串模型 ID 或模型对象两种入参通过pluginEngine.executeImageWithPlugins执行并借助wrapImageModel的 v3 middleware 实现了onProviderCall观测回调记录 requestId、providerId、modelId、imageCount、usage 与耗时指标观测逻辑通过 best-effort 方式保证不干扰正常 AI 结果见 emitProviderCall。3. Embedding迁移到 embedManychangelog 记录 Embedding 从遗留客户端迁移到 AI SDK 的embedMany并移除了遗留 embedding clients。这与 AI SDK v6 的能力边界一致——源码注释明确写着AI SDK v6 只有 embedMany没有 embed见 packages/aiCore/src/core/runtime/index.ts。RuntimeExecutor.embedMany 对模型 ID 使用registry.embeddingModel(${providerId}:${modelId})解析同样支持onProviderCall观测构造函数中还针对部分 v3 provider如openrouter/ai-sdk-provider只暴露textEmbeddingModel而非embeddingModel的情况做了兼容补丁。4. 模型列表ModelListService 重构为 Strategy Registry 模式2.0.0 将ModelListService重构为Strategy Registry 模式并consolidate schema files合并 schema 文件。这是架构层面的收敛把不同 provider 的模型列取策略统一注册到注册表中避免服务类中的分支膨胀。这一思路与包内 Extension Registry 一脉相承——ExtensionRegistry 是全局单例extensionRegistry负责 provider 创建与模型解析器的集中管理。5. 命名收敛与 OpenRouter / GitHub Copilot 适配重命名index_new.ts→AiProvider.tsModelListService.ts→listModels.ts消除了过渡期命名OpenRouter 图像通过openrouter/ai-sdk-provider2.3.3 提供原生图像端点支持generateImage/editImage包依赖同步升级至^2.10.0见 package.jsonGitHub Copilot通过移除ProviderV2cast 与wrapProvider简化扩展全面拥抱 V3 模型协议——resolveModel 会强制校验模型必须是 V3否则抛出 Model must be V3 错误。2.0.1 修复深度解读ProviderVariant 的 TOutput 泛型与工具工厂2.0.1 的修复集中在 Provider Variant变体系统changelog 将其概括为三个要点为ProviderVariant增加TOutput泛型使transform的输出类型能够流向toolFactories与resolveModel为azure-anthropic变体补充 Anthropic 专属的toolFactories修复provider.tools.webSearchPreview is not a function报错修复urlContextfactory 被错误映射到webSearch工具键的问题并修正BedrockExtension的satisfies类型。TOutput 泛型的设计意图在 packages/aiCore/src/core/providers/types/index.ts 中ProviderVariant声明为export interface ProviderVariant TSettings any, TProvider extends ProviderV3 ProviderV3, TOutput extends ProviderV3 TProvider { suffix: string name: string /** 类型安全的模型解析provider.responses(modelId) / provider.chat(modelId) */ resolveModel?: (provider: TOutput, modelId: string) LanguageModel /** 替换整个 provider如 azure-anthropic简单方法切换用 resolveModel */ transform?: (baseProvider: TProvider, settings?: TSettings) TOutput | PromiseTOutput toolFactories?: ToolFactoryMapTOutput }关键点在于当transform返回的 provider 类型与输入不同即TOutput不等于TProvider时toolFactories与resolveModel必须基于TOutput而非 TProvider 做类型推导。这正是azure-anthropic场景——Azure 变体通过createAnthropic整体重建 provider输出是AnthropicProvider而不是AzureOpenAIProvider因此其webSearch、urlContext工厂必须接收 Anthropic 的 provider 实例。azure-anthropic 变体的完整实现见 packages/aiCore/src/core/providers/core/initialization.ts{ suffix: anthropic, name: Azure Anthropic, transform: async (_provider, settings) (await import(ai-sdk/anthropic)).createAnthropic({ baseURL: (settings?.baseURL ?? ) /anthropic/v1, apiKey: settings?.apiKey ?? , headers: settings?.headers, // 转发调用方注入的 fetch如代理感知的 customFetch // 避免变体重建 provider 后请求静默回退到 SDK 默认 fetch fetch: settings?.fetch }), toolFactories: { webSearch: (provider) (config: NonNullableParametersAnthropicProvider[tools][webSearch_20260209][0]) ({ tools: { webSearch: provider.tools.webSearch_20260209(config) } }), urlContext: (provider) (config: NonNullableParametersAnthropicProvider[tools][webFetch_20260209][0]) ({ tools: { urlContext: provider.tools.webFetch_20260209(config) } }) } } satisfies ProviderVariantAzureOpenAIProviderSettings, AzureOpenAIProvider, AnthropicProvider该实现揭示了修复的三个层面类型层satisfies ProviderVariantAzureOpenAIProviderSettings, AzureOpenAIProvider, AnthropicProvider显式声明 TOutput 为AnthropicProvider让toolFactories与resolveModel的参数类型自动收敛到 Anthropic 类型行为层此前azure-anthropic变体未提供自己的 toolFactoriesExtensionRegistry.getToolFactory会回退到 base extension 的工厂见 ExtensionRegistry.ts而 base Azure 工厂使用AzureOpenAIProvider[tools][webSearchPreview]在 Anthropic provider 上调用即触发webSearchPreview is not a function补充 Anthropic 工厂后webSearch_20260209与webFetch_20260209得以正确调用映射层urlContext工厂此前误映射到webSearch工具键修复后正确输出tools: { urlContext: ... }。工具工厂的解析优先级ExtensionRegistry.resolveTool 体现了工具工厂的查找策略先看 provider 自身的 toolFactoriesvariant 级别优先于 base extension失败后再沿 provider 分段逐级回退如azure-anthropic→azure→ 基础扩展最终尝试从 provider 对象上直接取方法。测试用例 ExtensionRegistry.test.ts 覆盖了 variant 级工厂、回退与 undefined 场景。此外providerToolPlugin.ts 会把工厂返回的ToolFactoryPatchtools / providerOptions合并进请求参数打通工具工厂 → 插件 → 请求链路。插件系统请求生命周期的四类钩子2.0.0 重构后的运行时以插件为第一公民。插件接口定义在 packages/aiCore/src/core/plugins/types.ts按执行语义分为四类钩子类别钩子名称执行语义First首个命中resolveModel、loadTemplate串行遍历返回第一个非空结果Sequential串行链式configureContext、transformParams、transformResult逐个执行后者接收前者的输出Parallel并行副作用onRequestStart、onRequestEnd、onErrorPromise.all并发执行互不依赖Stream流处理transformStream基于 AI SDK 流变换收集后统一传入experimental_transform插件的排序规则为pre → normal → post由enforce字段控制实现在 PluginManager.sortPlugins。请求上下文AiRequestContext携带 providerId、model、originalParams、requestId、递归深度控制默认最大 10 层防止栈溢出以及可选的 MCP tools见 types.ts并预留recursiveCall供插件内部发起递归调用。运行时侧PluginEngine 是插件与 AI SDK 调用的桥梁RuntimeExecutor.streamText/generateText会依据入参是字符串模型 ID 还是模型对象决定是否注入_internal_resolveModel插件最终把插件链产出的模型对象、转换后的参数与流变换一并交给 AI SDK见 executor.ts。从 CHANGELOG 到实践安装与接入安装与依赖边界cherrystudio/ai-core通过 pnpm workspace 管理peerDependencies 要求 AI SDK 生态的版本对齐ai ^6.0.116、ai-sdk/openai ^3.0.109、ai-sdk/google ^3.0.113内部依赖则覆盖 Anthropic、Azure、DeepSeek、OpenAI-Compatible、xAI、OpenRouter 等 provider 包见 package.json产物同时导出dist/index.cjsCommonJS与dist/index.mjsESM并声明了react-native入口Node 运行环境要求18.0.0。独立的./built-in/plugins与./provider子路径导出允许按需引入插件或 provider 能力。在 React Native 环境中使用该包时需要在metro.config.js中补充resolverMainFields [react-native, browser, main]与平台列表详见 packages/aiCore/README.md。最小可运行示例import { createExecutor, streamText } from cherrystudio/ai-core // 函数式直接流式生成 const result await streamText( openai, { apiKey: your-api-key }, { model: gpt-4, messages: [{ role: user, content: Hello! }] } ) // 实例式可复用的执行器内部自动确保 provider 已初始化 const executor await createExecutor(anthropic, { apiKey: your-key }) const res await executor.generateText({ model: claude-3-5-sonnet, messages: [{ role: user, content: Hello! }] })从源码看createExecutor会先校验extensionRegistry.has(providerId)再调用extensionRegistry.createProvider创建 provider并从 variant 声明中提取类型安全的模型解析器见 packages/aiCore/src/core/runtime/index.ts——这也解释了 changelog 中TOutput类型流向resolveModel的工程价值变体的模型解析行为随类型系统一起被约束。注册自定义 Provider对非内置 provider可通过registerProvider注册支持直接传入 creator 或动态 import 两种方式随后即可像内置 provider 一样通过AiCore.create(id, { apiKey })调用。完整的注册示例与插件示例webSearchPlugin、loggingPlugin、definePlugin 自定义插件同样见 packages/aiCore/README.md 的「扩展 Provider 注册」与「插件系统」章节。结语从 2.0.0 的 AI SDK v6 全量迁移到 2.0.1 的 Variant 泛型修复cherrystudio/ai-core的演进主线十分清晰砍掉自维护的客户端与中间件层把能力下沉到 AI SDK 原生 API同时用类型系统ProviderVariant 的 TOutput 泛型、toolFactories、satisfies 约束与插件运行时First / Sequential / Parallel / Stream 四类钩子重新织起 Cherry Studio 自己的抽象。对想要阅读或复用该包的人建议按以下顺序深入先读 packages/aiCore/CHANGELOG.md 把握演进脉络再看 packages/aiCore/src/core/runtime/executor.ts 理解执行器与插件引擎的协作最后对照 initialization.ts 与 ExtensionRegistry.ts 研读 Provider Extension 的注册、变体与工具工厂机制。【免费下载链接】cherry-studio Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端项目地址: https://gitcode.com/CherryHQ/cherry-studio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

STC32G144K智能车开源库:总钻风摄像头配置与实战

STC32G144K智能车开源库:总钻风摄像头配置与实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 15:07:44 阅读更多 →
Referrer-Policy 响应头配置实战指南:从策略选型到源码级部署(Front-End-Checklist)

Referrer-Policy 响应头配置实战指南:从策略选型到源码级部署(Front-End-Checklist)

Referrer-Policy 响应头配置实战指南:从策略选型到源码级部署(Front-End-Checklist) 【免费下载链接】Front-End-Checklist 🗂 The essential checklist for modern web development, for humans and AI agents 项目地址: https…

2026/9/19 15:07:44 阅读更多 →
HDL十进制计数器设计:同步复位、进位链与时序约束

HDL十进制计数器设计:同步复位、进位链与时序约束

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 15:06:44 阅读更多 →

最新新闻

小家电安规设计核心:爬电距离、CE/CCC标志与电源线选型实战指南

小家电安规设计核心:爬电距离、CE/CCC标志与电源线选型实战指南

简介:本资源是一份面向小家电研发、生产及质检工程师的安规知识培训课件,聚焦家用电器出口与国内合规认证的核心要求,系统梳理全球主流安规标志识别与技术要点。课件以GB4706.1—2005为基准,深入解析GS、CE(含EMC/LVD/…

2026/9/19 16:06:14 阅读更多 →
用Python自动化生成SPC控制图培训教材

用Python自动化生成SPC控制图培训教材

简介:这是一份关于统计过程控制(SPC)的培训教材PPT,面向制造企业质量管理人员、生产一线主管及内部培训讲师,用于掌握控制图原理并建立预防式质量管理思路。内容从SPC概念、1924年休哈特博士提出的3Sigma控制图法讲起&…

2026/9/19 16:06:13 阅读更多 →
雅马哈机器人TCP通讯解析:CRLF与8位定长是关键

雅马哈机器人TCP通讯解析:CRLF与8位定长是关键

简介:这份雅马哈机器人与上位机TCP通讯的实战技术笔记,面向工业自动化工程师、机器人调试人员及上位机开发初学者,重点解决控制器与电脑之间的网络配置、数据收发和坐标解析问题。文档从IP设置、GP0通讯对象配置、TCPClient/服务器角色划分讲…

2026/9/19 16:06:13 阅读更多 →
ESP32P4 USB读卡器实战:TinyUSB实现MSC大容量存储设备

ESP32P4 USB读卡器实战:TinyUSB实现MSC大容量存储设备

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 16:06:13 阅读更多 →
JADX 完整教程:从 APK 反编译到 Java 源码还原

JADX 完整教程:从 APK 反编译到 Java 源码还原

做 Android 逆向或者开发调试时,手里只有一个 APK 却没有源码,很多人第一反应就是“反编译”。JADX 这个工具,在我用过的一堆方案里算是体验最省心的:下载、安装、把 APK 拖进去,Java 源码就出来了。这篇教程我打算把 …

2026/9/19 16:06:13 阅读更多 →
复杂相位图快速解包裹:梯度极性分割与区域合并

复杂相位图快速解包裹:梯度极性分割与区域合并

简介:面向信号处理与图像处理研究者的相位展开算法学习资源包,聚焦基于梯度极性的复杂相位图快速准确解包裹方法。资源适配具备Python与科学计算基础的硕博研究生、科研人员及光学测量、医学成像、InSAR从业者,解决传统算法在螺旋、剪切等复杂…

2026/9/19 16:05:13 阅读更多 →

日新闻

BP神经网络时序预测:滑窗长度与多窗口平均策略

BP神经网络时序预测:滑窗长度与多窗口平均策略

简介:面向机器学习、深度学习与数据建模学习者的一份完整研究文献,聚焦BP神经网络在农业产量预测中的应用。文档以1980—2018年全国棉花产量为样本,系统讲解数据归一化处理、激活函数原理、多层神经网络结构搭建及训练流程,展示敏…

2026/9/19 0:00:30 阅读更多 →
Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

上个月调一个Deformable DETR模型,在单卡上要跑将近两天。第二天早上我下意识打开终端翻日志,发现loss从凌晨两点就开始往上爬,一路从0.8涨到1.35,整整六个小时没人发现。那六个小时的训练不仅白跑,还霸占着卡——等于…

2026/9/19 0:00:30 阅读更多 →
OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南 【免费下载链接】opencloud 🌤️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign. 项目地址: htt…

2026/9/19 0:00:30 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/19 3:59:36 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/19 3:53:08 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/19 4:02:43 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/15 21:39:18 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →