9月21日消息,智谱在 9月18日的工作区上传争议后将 ZCode 以 Apache 2.0 协议开源。开源能自证到什么程度,答案要进代码里找。本文核查的是 GitHub 仓库 zai-org/ZCode 当前唯一一次提交(commit 872ad96,9月20日,提交信息为「feat: open source」)。先回答争议本身:那个上传功能还在不在。
上传链路整体消失,检查点重写为本地实现
对照争议中逆向出的上传链路逐条核查:快照上传凭证接口、RSA-OAEP 信封加密、AES-256-CTR、阿里云 OSS 直传与 STS 临时令牌,在这份快照里找不到对应代码。旧版客户端里「训练」「索引」两个开关的文案,在当前语言包和设置页中找不到。
检查点功能没有消失,而是换了实现:现在的检查点基于本地 git,以提交号和分支引用存储在本地目录,整个模块没有任何网络调用。争议中「锁定 checkpoints 目录会弄坏回滚功能」的代价不复存在,因为数据不再离开本机。
残留的踪迹只剩名词级两条:网络遥测的请求路径分类清单里还留着 snapshot 和 upload-credential 两个条目,磁盘占用统计的目录清单里还留着 v2/checkpoints 路径。它们是这个功能存在过的证据。
但有三件事这份快照证明不了。其一,整个仓库只有一次提交,没有开发历史,「删了什么、什么时候删的」无法审计,能验证的只有当前状态。其二,争议涉及的是旧版本 v3.12.3 的行为,快照回答不了当时传了什么。其三,已上传数据的处置依赖信通院与绿盟的第三方核验结论,不在代码审计范围内。
遥测系统:开关是开的,只是没配接收端
ZCode 的遥测代码横跨六个专用目录,覆盖 UI 漏斗、会话创建、MCP 调用、网络批量上报等事件类型,事件结构体完整保留在共享包里。按不同口径统计,提及遥测的文件在 276 到 293 个之间。从代码能看出这套系统要收集什么——对刚经历数据争议的 ZCode 来说,这是用户最关心的部分。
但「开源版强制禁用遥测」的说法不准确。共享环境配置里,遥测总开关硬编码为开启;真正让事件终止的是上报端点默认为空字符串——遥测核心代码在总开关开启但端点未配置时丢弃事件。也就是说,开源版是「没有地方可报」,不是「功能被关掉」:任何自行构建的人设置对应环境变量,就能恢复上报到自己的端点。
凭据加密:默认密钥可以从本机环境重算
用户在 ZCode 里保存的各模型厂商 API Key 与 OAuth token,经 AES-256-GCM 加密后落盘在 ~/.zcode 的 credentials.json。加密存在,问题在密钥来源:默认密钥是「zcode-credential-fallback + 平台名 + 家目录路径 + 用户名」拼接后做一次 SHA-256,无盐、无 KDF。这些输入都能从本机环境读出,密文文件的属主就是用户名。唯一的自定义出口是环境变量 ZCODE_CREDENTIAL_SECRET——全仓只有两处代码读取它,没有任何位置赋值,设置页也没有入口;桌面端两个创建加密器的调用点都是无参调用,走兜底分支。 开发者 AkaraChen 在一份公开分析中把这定性为「等效于明文存储」:对同机同用户权限的进程,解密成本是重算一次哈希;密钥不含硬件因子,密文跨机器可解。ZCode 自己的 NOTICE.md 也写明,默认密钥可从本机环境信息派生,「并非系统钥匙串」。对照行业基线:macOS 有 Keychain,Chrome 的 cookie 加密走的就是它。
多数官方插件没有随源码发布
官方插件定义文件逐一核对后:Android 模拟器、iOS 模拟器、Documents、PDF、演示文档、电子表格、搜图、skill-creator、zcode-guide 等插件的源码目录在这份仓库中不存在。电脑控制(Computer Use)插件有一个配套包,但只有编译产物,没有源码。
例外是 Browser Use 和 node-repl-host,两者有完整源码。「官方插件均未开源」的说法因此也不准确。
构建机制上,插件 seed 缺少目录时会拒绝生成残缺缓存,所以开源构建的产物确实不含这些插件;运行时它们从官方 CDN 插件市场补齐。也就是说,这部分功能对用户可用,但其源码不可审计。
升级入口的优惠展示被剥离
设置页的升级按钮组件里有一行注释:「开源版不享受额度活动权益,升级入口只展示操作,不附带优惠徽标或规则说明。」代码与注释一致,按钮只有图标和文案。
剥离比注释写的更彻底:优惠活动、首购优惠等文案只残留在语言包里,全仓没有任何组件引用;折扣数据字段有类型定义和传输管道,同样没有组件渲染。需要说明的是,「不享受权益」是注释声明的产品策略——价格与折扣由服务端支付预览下发,这份仓库证明不了服务端会如何对待开源构建的用户。
服务端不下发提示词,但握着一批远程开关
排查远程配置、内建供应商配置、子代理提示词三个通道,未发现服务端直接向客户端下发系统提示词内容的机制:子代理提示词来自本地文件;构建期嵌入的供应商配置文件(180KB)全部是模型路由规则。
但桌面端每小时向 /api/v1/client/configs 拉取一次单功能配置,服务端借此持有一批客户端行为的远程开关。本文写作时实测该接口(无需登录):「桌面上下文提示词」开关为开启状态(提示词内容仍在客户端,服务端握的是开关与版本号);渲染层行为追踪同为开启,采样率 20%,覆盖 core 与 settings 两组。接口里还有计费折扣、离峰、Computer Use、通知卡片等配置键。
另一条通道在插件体系:官方插件的技能文本会进入 Agent 的上下文,而插件内容经官方 CDN 市场分发。修改 CDN 上的插件内容,就能改变所有启用该插件的客户端的行为。这是插件市场的标准机制,与 VS Code 扩展同理,不是隐蔽设计——但它是服务端可触达客户端提示词内容的一条真实路径。
开源把审计边界推到了仓库门口
这份快照本身也有边界。README 称仓库包含客户端、后端服务与 Agent 运行时的完整源码,版本号 3.14.0 与整改版本一致。但优惠展示组件的缺失说明,官方内部代码库与这份快照并不等同——官网下载的安装包是否由这份代码构建,从仓库本身无法证实,需要解包比对才有答案。
对使用者和审计者,现在的状态是:客户端做什么,可以逐行查;但哪些功能开着、行为追踪按多大比例采样、插件市场发什么内容、给不给折扣,这些开关都在服务端——本次实测时,「桌面上下文提示词」和「行为追踪」两个开关就是开着的。开源解决的是前一半的透明度。