ARTICLE / ai

免费模型清单五天换一次血,你的 Agent 配置跟得上吗

免费模型清单五天少了五个:把 OpenCode Zen 的 Free 接进 Agent 前,先看这三件事

用 AI 编码工具的都有体会:各家"限时免费"的模型是最好的起步额度,也是最不稳定的依赖。今天 /models 里躺着一排 Free,明天你的 agent 任务就可能报 model not found。2026 年 10 月的最后一周,OpenCode Zen 的免费清单就演示了这种不稳定有多夸张——五天之内五个模型退出、一个新增。

这篇文章解决一个具体问题:如果你打算把免费模型接进自己的工作流(尤其是无人值守的 agent 循环),怎么配置才能不被清单变动打断。 素材来自 OpenCode Zen 官方文档、一份逐日跟踪清单变化的第三方记录,以及一个专门做匿名免费调用的开源插件项目。

先看事实:清单到底变得多快

第三方站点 VibeiDE 对 Zen 免费列表做了逐日核对,数字变化是这样的:10 月 20 日 14 个免费模型,10 月 23 日 13 个,10 月 24 日 11 个,10 月 25 日 10 个。被点名的离场者包括 MiniMax M3.1 Flash、LL Alpha、Exo、MiMo-V2.5、LongCat 2.5 Preview;同期 Flint 40B Free 进场。该站自己的结论很干脆:“每一条免费都标注 ‘for a limited time’,所以把它当成一件需要去查的事,而不是需要记住的事。”

这不是某一周的偶然。Zen 官方定价页上每个免费行的口径都是"限时免费、无截止日期"。换句话说,免费清单的产品定位就是引流和收集反馈的实验场,退场时间由运营方随时决定,任何写死的清单必然过时。

第二个坑:免费不等于免注册,也不等于隐私无价

关于"能不能白嫖",社区里流传着两种互相矛盾的说法,实际规则要看接入方式。

走官方通道(OpenCode CLI + Zen provider):需要在 opencode.ai 注册并创建 API key,然后 /connect 选 OpenCode Zen、粘贴 key、/models 里挑标 Free 的行。这条路拿到的是你名下的私有免费额度。

匿名调用:开源插件 dsh-opencode-zen 验证了另一条路——Zen 的免费模型接受匿名请求,装好插件零配置就能在模型选择器里看到一批可用模型。但它 README 同时写清了代价:“免费额度是共享的,匿名调用最容易撞限流器。这是 Zen 的策略,插件能做的只是把原因说清楚。“当额度耗尽时,这个插件会明确告诉你当前是匿名还是带 key、下一步该怎么办——这本身就是个好设计:失败要 fail-loud,别只甩一句 Rate limit exceeded。

数据政策是最容易被忽略的一列。 Zen 免费模型的文档里每个模型自带一条 data note,VibeiDE 的整理显示差异很大:GLM-5.3-Flash Free 和 DeepSeek V4.1 Flash Free 标注"零保留、不用于训练”;Big Pickle、Flint 40B Free、MiMo-V2.6-Flash Free 标注"免费期间收集的数据可能用于改进模型”;Beam Free 不训练但保留 30 天;Nemotron 系列标注"仅限试用,不要发个人或机密数据"。同一个"免费"标签下,藏着从最严到最松完全不同的隐私条款。把公司代码或客户数据发给哪一档,应该由这条 note 决定,而不是由"反正免费"决定。

顺带一个 Go 订阅计划的坑:OpenCode 另有 $10/月的 Go 计划,其官方文档列出的模型表里 DeepSeek V4.1 Flash(不带 Free 后缀)作为计量项出现,Go 的用量限额按月度美元额度定义。也就是说同一个模型家族在 Zen 免费页是 $0、在 Go 计划里要计入限额——“免费"是分通道的,跨通道比价容易比错。

第三个坑:静默切换比下线更危险

比"模型没了"更糟的是"模型悄悄换了”。OpenCode 仓库 10 月 4 日开的 issue #53060 记录了一个扑朔迷离的案例,值得完整讲一遍。一位用户把 7 个 agent 固定在 opencode-go/muse-spark-1.3-free 上,该模型从目录里消失后,日志里只有一行 ModelUnavailableError;随后他发现已开启会话里派生的子代理跑到了另一个 provider 的 muse-spark-1.3-contributor-free 上——一个不存在于他任何配置文件里的模型字符串,而且三天里连续 63 个子代理都这样跑,父 agent 和他本人都没收到提示。

但故事的后半段同样重要:维护者在 2.0.22 版本上两次尝试复现"自动回退"都失败了——配置里的模型消失时,subagent 调用是明确报错的,不会静默换。他们提出了两个替代解释:其一,subagent 工具接受可选的 model 参数且优先级高于 agent 头部配置,可能是父 agent 在首次失败后自己调了 models 工具查可用模型、然后在后续每次调用里显式传了这个值;其二,如果父 agent 持续续用已有子会话(传 sessionID),子会话会保留它已经存好的模型。因为要区分"父 agent 主动选择"和"运行时静默回退"需要用户提供脱敏后的 tool-call trace,而用户没有跟进,issue 在 10 月 30 日以 not planned 关闭。

这个案例对用免费模型的人的启示反而更扎实了:不管是运行时回退还是父 agent 自作主张,结果都是你的任务连续跑了三天"你没选过的模型",而你在配置和日志里都看不出来。 免费模型从目录里消失是真实发生过的(ModelUnavailableError 就是证据),消失之后会发生什么取决于 agent 的行为链——这恰恰是不透明的部分。对你的直接含义:配置里写死 opencode/deepseek-v4.1-flash-free 这类免费模型 ID 时,最坏情况不是报错,而是产出质量变了、数据政策可能也变了(上一节说过,免费模型之间的保留策略天差地别),你还蒙在鼓里。跨社区的共识诉求就一个词:fail-loud。

一套经得起清单变动的接法

综合上面三条事实,给想把免费模型纳入工作流的三层做法。

第一层:让清单成为运行时数据,不做硬编码。 dsh-opencode-zen 的实现思路可以直接借鉴:它的可用模型列表不写死,启动时从 models.dev 取"哪些免费、上下文多大",再和 Zen 模型端点的"哪些还存在"求交集。它 README 里那句话就是原则本身:“免费模型是限时提供的,所以任何硬编码清单注定过时。“你自己搭 fallback 链同理——每次会话开始先刷新再选模型,比如 OpenCode 原生的 opencode models --refresh 加 opencode models opencode,以实时结果为准。

第二层:把免费模型限定在"错了也能立刻发现"的任务上。 VibeiDE 给的适用面划分很清楚:写测试(跑一遍就知道成没成)、有明确前后对比的小重构、解释陌生代码、起草本来就要人改的文档和 commit message。而长链条、开放式的任务——一次走歪整段返工的——留在你最信任的付费模型上,让免费模型干它们周围的杂活。这个分配同时化解了两个风险:质量波动和额度突然清零。

第三层:本地网关统一收口,配额感知做在中间层。 如果你有多个 agent 工具都要吃免费额度,别让每个工具各自持有一份会过期的配置。用一个本地模型网关(LiteLLM 这类)做统一入口:上游供应商挂一个探活+计数,命中 FreeUsageLimitError、402、404 这类信号时自动切下一家,并把"当前走的是谁"写进每条响应的日志。dsh 插件那个"告诉你是匿名还是 keyed、下一步干什么"的设计,翻译成网关语言就是:降级可以发生,但必须可见。

决策表

你的处境建议动作
个人尝鲜,偶尔用注册拿 key 走官方通道,别用匿名共享池,体验稳定得多
有代码/数据保密要求只选 data note 为"零保留、不训练"的行,其余一律不碰
无人值守 agent 产线免费模型只做子任务+全走网关,主链路必须有付费兜底
清单里的模型突然 404先 opencode models --refresh 确认是退场不是抽风,再决定换模型还是换通道
怀疑被静默切换在网关层记录每次实际命中的 provider/model,事后比对

免费模型这一层的本质是一个随时会重新分配的公共池塘,用它没问题,但要按公共资源的规则用:取用时查证、使用时隔离、枯竭时有备胎。把"查清单"做成自动化里的固定步骤而不是靠记忆,你就赢过了大多数还在手改配置文件的人。