Skip to content

FNOS-026 测试用例 ​

字段内容
需求编号FNOS-026
关联计划PLAN-FNOS-026
覆盖功能FNOS-026-01 至 FNOS-026-09
测试状态执行中(2026-10-24 合并供应商口径 DSH Web 实测已回填;完整用例待执行)
用例总数47

测试范围与需求分析 ​

被测对象是新增插件 @tnnevol/dsh-opencode 的九项功能:OpenCode Console 登录、单一 OpenCode 供应商下的 OpenCode Zen(按量)与 OpenCode Go(套餐)合并模型目录、· zen / · go 后缀与内部前缀、能力适配、对话可用性、Go 套餐额度、用量胶囊、模型目录管理与持久化,以及文档站与插件登记。

三份文档的分工:功能范围与验收条件见需求文档,实现任务与验证方式见计划文档,本页只登记用例设计、执行结果、Bug 与结论。

用例与计划阶段的对应关系:

计划阶段覆盖功能用例范围
阶段一:宿主侧账号与凭据FNOS-026-01TC-001 至 TC-008
阶段二:模型目录与供应商适配FNOS-026-02、FNOS-026-03、FNOS-026-05(额度读取)、FNOS-026-07TC-009 至 TC-017、TC-022 至 TC-025、TC-031 至 TC-034、TC-044
阶段三:插件详情页与模型目录 UIFNOS-026-01、FNOS-026-05、FNOS-026-06、FNOS-026-07、FNOS-026-08TC-022 至 TC-030、TC-035 至 TC-037、TC-042、TC-043、TC-045、TC-046、TC-047
阶段四:文档站与发布登记FNOS-026-09TC-038 至 TC-041
阶段五:验证与收尾全部汇总执行结果与结论

关键风险点 ​

风险用例方向
账号令牌或 API Key 泄漏到浏览器在页面源码、网络响应与本地存储中检索明文(TC-008)
合并目录把 Console 的 models 为空当成没有模型,或两类来源互相覆盖分别验证 Zen、Go 两组 roster、公开目录与内置目录来源,并覆盖空覆盖条目、账号配置不可读与全源失败(TC-009 至 TC-012)
路由同名冲突导致登录后模型整体不出现预置手工 opencode / opencode-go 路由后登录,断言 OpenCode 仍出现;再构造同名 dsh-opencode 冲突,断言给出诊断(TC-044)
合并列表内同名模型 id 冲突,选择或请求指向错误条目核对 · zen / · go 后缀、两行同时存在、各自可隐藏(TC-043、TC-032);对话验证网关收到原始 id(TC-018、TC-021)
发请求前未剥离 zen: / go: 前缀用已知会返回上游错误的 zen: 模型验证错误来自网关而非本地;用 go: 模型完成对话(TC-018、TC-021)
能力字段或协议族投影错误,模型看似可选但发不出去两类来源各选代表模型对话;七项能力字段与上游逐项比对(TC-013 至 TC-017、TC-045)
Zen 余额不足或免费模型受限被误判为插件缺陷分别制造 402 与 403,断言错误可读且不自动重试(TC-021,见「已知限制」)
额度数据缺失被补成 0%,用户误以为额度充足制造额度接口失败,断言不显示 0%(TC-024)
胶囊与额度卡片来自不同快照,两处数字不一致同一次刷新后比对两处比例(TC-029)
胶囊在选中 · zen 模型时显示的是 Go 套餐数据,被误读为该模型的按量额度分别选中 · zen 与 · go 模型查看输入区与浮层文案(TC-026)
登录态或偏好没有真正落盘,重启即丢重启 DSH 后逐项核对(TC-035、TC-036)
插件禁用后仍残留供应商分组或影响其它供应商禁用插件后检查模型选择器(TC-037)
目录固定高度、合并列表或能力气泡影响可用性滚动、窗口缩放与亮暗主题下核对(TC-043、TC-045、TC-046)
新增页面与菜单断链文档构建 + 逐个打开菜单目标(TC-041)

待确认项 ​

  • ❓ OpenCode Zen 免费模型在目录中的默认可见性尚未形成产品结论。 已确认(2026-10-24):Zen 免费模型保留在目录卡片中按「已停用」展示并给出统一提示,但不进入模型选择器;Go 套餐内含的免费模型(如 beam-free · go)正常可选。见需求 FNOS-026-02-AC-07 与 TC-046。

已知限制(上游) ​

以下限制来自 OpenCode 上游策略,不是插件缺陷;对应用例只验证「错误可读、不绕过限制」,不把「调用成功」作为预期结果。

限制实测表现对用例的影响
OpenCode Zen 按量模型需要 Console 余额余额不足时调用返回 402 Insufficient account funds;模型目录与选择器仍正常(2026-10-24 zen:glm-5 实测)TC-018 的 · zen 付费模型部分在无余额账号上登记为「阻塞」;TC-021 以 402 作为预期错误,可正常执行并记录上游原文
OpenCode Zen 免费模型只允许在 OpenCode 客户端内使用调用返回 403 FreeTierError;目录条目保留在卡片中按「已停用 + 仅 OpenCode 客户端可用」展示,选择器已过滤TC-018 改用付费 Zen 模型或 Go 模型执行;TC-021 用 Go 免费模型验证地区错误可读;TC-046 验证禁用与过滤行为
两类模型来源计费口径不同Go 套餐模型用 OAuth 或 API Key 均可调用;Zen 按量模型受余额约束;合并为单一供应商后计费仍按来源区分TC-002、TC-005、TC-018 分别在两种登录方式下执行;额度相关用例只对 · go 后缀断言
上游 roster 与目录条目会变化模型数量与名称随上游增删;2026-10-24 为 122 个(zen 85 / go 37),文档只写约数与实测日期TC-009、TC-014 以执行时的活 roster 为基准,不硬编码完整清单

执行顺序与数据清理 ​

  • 按账号状态测试顺序执行:先测登录态(TC-009 至 TC-034、TC-042 至 TC-047 中的在线用例)→ 再测非登录态(TC-001、TC-012、TC-024 等)→ 最后测登录流程(TC-002 至 TC-006)。
  • 移除登录态前,把 <DSH_HOME>/.dsh-opencode-auth.json 备份到 tmp/auth-back/dsh-opencode-<版本>-<日期>/;恢复时原样复制并 chmod 600,再用 stat -c '%a %n' 核对。
  • 测试数据清理:退出测试账号或恢复备份、把胶囊策略与隐藏模型恢复默认(隐藏项按 plan:id 记录,含 zen: / go: 前缀)、删除测试产生的临时截图与报告;测试账号、凭据与备份不得进入仓库。
  • DSH Desktop 实例清理:按检出路径结束进程(pkill -f "fork-pj/deepseek-harness"),本轮已执行、残留进程 0;开发态 Desktop 与本地 Web 共用 DSH_HOME=<repo>/.dsh,测试账号与偏好均未改动。
  • 本轮为 Desktop 验收新增的 profile 配置(保留,便于后续复验):.dsh/profiles/desktop/node_modules/@tnnevol/dsh-opencode 为实体副本,其 package.json 的 peer 已按下式规范化——@deepseek-ai/cordis → ^4.0.5、@earendil-works/pi-ai → 1.1.0、react → ^18.3.1;同时在 .dsh/profiles/desktop/package.json 的 dependencies(link: 指向仓库插件目录)与 dsh.profile.bundles 中加入 @tnnevol/dsh-opencode。该 profile 属本地运行状态、已被 .gitignore 排除,不进仓库。
  • UI 类用例(账号卡片、额度卡片、目录卡片、用量胶囊)在亮色与暗色主题下各执行一遍,并核对UI 测试要求的对比度、间距与毛玻璃层级。

测试环境 ​

功能执行环境说明
FNOS-026-01、FNOS-026-02、FNOS-026-04DSH Web 与 DSH Desktop需要真实 OpenCode Console 账号与可直连 opencode.ai 的网络;TC-044 需要可构造/预置手工 opencode 路由与同名 dsh-opencode 冲突
FNOS-026-03DSH Web 与 DSH Desktop容量与协议族比对以 Zen/Go 活 roster 与公开目录为准;对话部分需真实账号
FNOS-026-05、FNOS-026-06DSH Web 与 DSH Desktop额度数据需要 Go 或 Go Plus 订阅内的账号;无订阅时按「阻塞」登记;· zen 后缀不纳入套餐额度
FNOS-026-07、FNOS-026-08DSH Web 与 DSH Desktop持久化用例需要重启对应客户端;UI 用例需亮暗主题各执行一遍
FNOS-026-09文档站构建环境pnpm exec vitepress build docs 与 git diff --check

执行环境口径:

  • DSH Web:pnpm run start -- --web,DSH_HOME 指向仓库 .dsh;用启动日志里带 ?token= 的地址访问。
  • DSH Desktop:使用上游源码检出 fork-pj/deepseek-harness 的开发态 Desktop(DSH_DESKTOP_APP_DIR 指定),profile 使用项目根 .dsh/profiles/desktop,不触碰 ~/.dsh/profiles/desktop。
  • 本插件不依赖 fnOS 宿主桥接,不要求真实 fnOS NAS 验收;登录与额度依赖外部账号条件,缺少条件时按阻塞登记。
  • 执行前记录版本三元组(DSH 运行时、插件版本、Desktop 来源与版本),写入执行结果备注;版本不匹配时结果无效。

测试用例 ​

FNOS-026-01 用 OpenCode Console 账号登录 ​

用例ID功能点测试标题关联验收前置条件测试步骤预期结果优先级基线来源
TC-001FNOS-026-01未登录时账号卡片显示两种登录入口AC-01插件已安装且未登录1.打开插件管理 2.进入 OpenCode 详情页 3.查看账号卡片卡片显示设备码登录与 API Key 登录两种方式说明;无账号、组织与额度数据P0新增行为,无回归基线
TC-002FNOS-026-01设备码登录全流程AC-02未登录;可直连 opencode.ai;具备测试账号1.点「设备码登录」 2.读取一次性代码与验证地址 3.在浏览器打开验证地址并输入代码确认 4.回到 DSH 查看账号卡片(不手动刷新页面)授权中显示代码、复制按钮、验证地址与有效期;确认后卡片自动变为已登录,显示账号与组织;已登录状态不再显示 API Key 登录入口P0新增行为,无回归基线
TC-003FNOS-026-01取消设备码登录AC-02已发起设备码登录1.在授权中状态点「取消」 2.查看账号卡片 3.重新发起登录回到未登录并说明已取消;未写入任何凭据;可重新拿到新的一次性代码P1新增行为,无回归基线
TC-004FNOS-026-01设备码过期后可重新发起AC-02已发起设备码登录1.等待超过一次性代码有效期 2.查看账号卡片 3.重新发起登录过期后回到未登录并说明原因;重新发起可正常获得新的代码与地址P2新增行为,无回归基线
TC-005FNOS-026-01用服务账号 API Key 登录AC-03未登录;具备 Console 服务账号 API Key1.点「用 API Key 登录」 2.粘贴有效 Key 3.确认 4.打开模型选择器进入已登录状态,卡片显示账号信息,与设备码登录一致;模型选择器出现唯一一个 OpenCode 供应商,模型名带 · zen / · go 后缀P0新增行为,无回归基线
TC-006FNOS-026-01无效 API Key 的失败提示AC-03未登录1.打开 API Key 登录 2.输入无效 Key 3.确认显示可读的错误说明;仍为未登录;不写入凭据;可用有效 Key 重试P1新增行为,无回归基线
TC-007FNOS-026-01退出登录后 OpenCode 供应商与状态一并撤销AC-04已登录1.点「退出登录」 2.查看账号卡片 3.打开模型选择器 4.打开任一历史会话回到未登录;选择器不再出现 OpenCode 供应商;历史会话仍可正常打开P0新增行为,无回归基线
TC-008FNOS-026-01凭据不出现在浏览器侧AC-05已完成登录1.在页面内检索源码与 localStorage 2.抓取登录、状态与额度接口的响应 3.检索令牌与 Key 的明文页面源码、存储与响应中均无令牌或 Key 明文;响应只含状态、账号与组织信息P0新增行为,无回归基线
TC-042FNOS-026-01已登录时隐藏 API Key 登录入口AC-03已登录1.查看账号卡片全部操作 2.在页面内检索「使用 API Key 登录」或等价文案 3.退出登录后再次查看已登录时账号卡片不出现 API Key 登录入口,只保留退出登录;退出后未登录状态重新显示两种登录入口P1新增行为,无回归基线

FNOS-026-02 OpenCode 模型出现在模型选择器 ​

用例ID功能点测试标题关联验收前置条件测试步骤预期结果优先级基线来源
TC-009FNOS-026-02合并列表以两类活 roster 为全集并叠加账号覆盖AC-01已登录;账号有 Go 订阅;已知 Zen 与 Go 活 roster 内容1.读取 Zen 与 Go 活 roster 2.在 Console 记录两组 provider 的增补条目、停用标记与能力覆盖 3.打开 DSH 模型选择器与目录卡片比对合并列表选择器只出现一个 OpenCode 供应商;合并列表为两组 roster 之和(执行时约 122 个,zen 85 / go 37,以实时目录为准);同名模型带不同后缀;Console 的增补、停用与能力覆盖按来源生效P0新增行为,无回归基线
TC-010FNOS-026-02账号配置不可读时仍服务合并列表AC-02已登录;可构造账号配置接口失败(桩或网络规则)1.使 Console 配置接口返回失败 2.刷新目录 3.查看选择器与目录卡片合并列表仍显示两类 roster 与公开目录中的模型;目录卡片按来源说明当前目录来源与未应用账号覆盖的原因P1新增行为,无回归基线
TC-011FNOS-026-02某来源目录不可用时保留该来源上一份目录AC-03合并列表已有一份可用目录1.阻断某来源 roster 与公开目录对应段 2.点刷新 3.查看该来源条目与另一来源条目该来源回退公开目录或保留上一份目录与获取时间,并显示失败原因;另一来源条目不受影响;选择器不被清空P1新增行为,无回归基线
TC-012FNOS-026-02未登录时不出现 OpenCode 供应商AC-01未登录1.打开模型选择器 2.检索 OpenCode不出现 OpenCode 供应商;其它供应商不受影响P1新增行为,无回归基线
TC-043FNOS-026-02合并列表、后缀与计数AC-04已登录;目录已有合并数据1.查看目录卡片是否存在「全部 / Go / Zen」分组筛选控件 2.查看计数与同名模型行 3.输入同时命中同名 zen/go 条目的搜索词 4.核对计数变化没有按来源分组筛选控件;列表同时显示 · zen 与 · go,同名模型两行后缀不同且可分别操作;未搜索时计数为合并结果数(约 122),随搜索更新,已隐藏数量另行标注P1新增行为,无回归基线
TC-044FNOS-026-02手工配置 opencode / 同名 dsh-opencode 路由时的注册表现AC-05已登录;llm-pi-ai 设置中已手工配置 opencode 与 opencode-go 路由1.保留手工配置 2.在插件详情页重新登录/刷新 3.打开模型选择器,确认 OpenCode 出现且手工配置未被覆盖 4.再预置同名 dsh-opencode 配置并重启 5.查看详情页诊断与选择器手工 opencode / opencode-go 与插件并存,OpenCode 正常出现;同名 dsh-opencode 冲突时插件给出可诊断提示,不静默替换用户配置P0新增行为,无回归基线

FNOS-026-03 模型能力完整适配 ​

用例ID功能点测试标题关联验收前置条件测试步骤预期结果优先级基线来源
TC-013FNOS-026-03合并列表内四种协议族代表模型均可对话AC-01已登录;两类 roster 含四种协议族模型1.在 OpenCode 合并列表中按 · zen / · go 后缀分别选择 OpenAI Chat Completions、OpenAI Responses、Anthropic Messages、Google Generative AI 各一个代表模型 2.各发送一条文本消息四种协议族均收到回复,无协议错误或 4xx 错误;对话记录完整P0新增行为,无回归基线
TC-014FNOS-026-03七项能力字段与上游一致AC-01已登录;两类 roster 与公开目录可读1.各选一个上游声明了容量的 · zen 与 · go 模型 2.查看模型信息中的推理、工具、图片、文本、免费、上下文与最大输出 3.与公开目录逐项比对七项字段与上游一致;未声明时按保守默认值并说明;免费与工具能力可辨别;显示名后缀不影响能力字段P1新增行为,无回归基线
TC-015FNOS-026-03声明图片输入的模型可发送图片AC-02已登录;选中声明图片输入的 · zen 或 · go 模型1.查看输入区是否有图片入口 2.附带图片发送消息有图片入口;图片随消息发出并得到回复;回复内容与图片相关P1新增行为,无回归基线
TC-016FNOS-026-03纯文本模型不提供图片入口AC-02已登录;选中未声明图片输入的模型1.查看输入区 2.尝试附加图片不出现图片入口;附加图片时给出可读提示且不发送P2新增行为,无回归基线
TC-017FNOS-026-03图片生成模型不进入合并列表AC-04已登录;公开目录含输出为图片的模型1.在目录卡片搜索该模型 2.查看模型选择器目录卡片与选择器均不出现该模型;目录卡片说明中可见跳过原因P1新增行为,无回归基线
TC-045FNOS-026-03能力图标与悬浮气泡AC-05已登录;合并目录已有数据1.查看模型行的「推理 / 工具 / 图片 / 文本 / 免费」图标 2.悬浮图标查看气泡 3.比对气泡勾选与 TC-014 的字段五项能力以图标表示;悬浮气泡逐项显示勾选/未勾选;勾选状态与 TC-014 的字段一致P1新增行为,无回归基线

FNOS-026-04 选中模型可正常对话 ​

用例ID功能点测试标题关联验收前置条件测试步骤预期结果优先级基线来源
TC-018FNOS-026-04带 · zen 与 · go 后缀的文本对话正常返回AC-01已登录;Zen 账号有 Console 余额,Go 账号在套餐内1.新开会话并分别选择付费 · zen 模型与 · go 模型 2.各发送一条文本消息 3.等待回复两类模型均收到回复;会话历史新增用户与助手各一条;流式输出正常结束;请求日志中的模型 id 不带 zen: / go: 前缀P0新增行为,无回归基线
TC-019FNOS-026-04图片随消息发送并得到回复AC-02已登录;选中支持图片输入的模型1.附带一张可识别的图片 2.提问图片内容 3.查看回复回复能描述图片内容;会话中保留图片缩略图P1新增行为,无回归基线
TC-020FNOS-026-04思考等级按上游声明执行03-AC-03、04-AC-03已登录;选中支持思考等级的模型1.查看可选等级集合 2.选择上游声明的一档 3.发送消息并观察回复可选等级与上游声明一致;未声明的等级不在列表中;所选档位在请求中体现(或用上游可见的思考输出确认)P1新增行为,无回归基线
TC-021FNOS-026-04调用失败时显示可读错误(含 402/403)AC-04、AC-05已登录;可构造失败(断网、Zen 余额不足或免费模型)1.分别用断网、余额不足的 · zen 付费模型、· zen 免费模型发送消息 2.等待失败返回会话显示可读错误;402 显示 Insufficient account funds,403 显示 FreeTierError 与仅限 OpenCode 客户端的说明(DSH 可能把该 403 归类为 AUTH);不出现空白回复;不自动重试P1新增行为,无回归基线

FNOS-026-05 套餐额度展示 ​

用例ID功能点测试标题关联验收前置条件测试步骤预期结果优先级基线来源
TC-022FNOS-026-05OpenCode Go 三个窗口的已用百分比AC-01已登录;账号在 Go 或 Go Plus 订阅内1.打开详情页额度卡片 2.与 Console 的用量页比对 3.切到带 · zen 后缀的模型,查看输入区与额度卡片5 小时、每周、每月三个窗口均显示已用百分比,数值与 Console 一致;额度卡片按账号展示 Go 额度,不出现按量费用;选中 · zen 模型时输入区同样显示胶囊(auto 不区分套餐)P0新增行为,无回归基线
TC-023FNOS-026-05重置倒计时递减AC-02额度卡片已有数据1.记录某窗口的倒计时 2.等待 60 秒 3.再次查看倒计时相应减少;跨越重置时间后该窗口重新开始计时P2新增行为,无回归基线
TC-024FNOS-026-05额度不可用时显示未知而不是 0%AC-03已登录1.使额度接口返回失败 2.点刷新 3.查看卡片显示失败原因与最近一次获取时间;未读取到的窗口不显示 0%P1新增行为,无回归基线
TC-025FNOS-026-05手动刷新更新数据与获取时间AC-04额度卡片已有数据1.记录获取时间 2.点「刷新」 3.观察按钮状态与结果按钮在刷新期间禁用并显示进行中;成功后获取时间更新、数值重新读取P2新增行为,无回归基线
TC-047FNOS-026-05无 Go 订阅时显示未订阅说明AC-01已登录;账号只有 Zen 按量权限,没有 Go 或 Go Plus 订阅1.打开详情页额度卡片 2.查看三个窗口 3.切到带 · go 后缀的模型并打开输入区卡片显示未订阅说明,不显示 0%、不显示按量费用;输入区不出现套餐用量胶囊P1新增行为,无回归基线
TC-048FNOS-026-02仅官方客户端可用的免费模型按禁用处理并过滤AC-07已登录;账号可读 Zen 与 Go 两组 roster1.打开详情页目录卡片,查看顶部提示与 Zen 免费模型条目 2.查看同名 beam-free 的 zen 与 go 两条 3.打开会话模型选择器,搜索这些免费模型卡片顶部显示「部分免费模型只能由官方 OpenCode 客户端调用」提示;Zen 免费条目带「已停用」与「仅 OpenCode 客户端可用」,开关不可操作;beam-free 在 zen 与 go 各一条且端点不同,go 条目可用;选择器中不出现这些 Zen 免费模型P1新增行为,无回归基线
TC-049FNOS-026-02跨来源重复模型只保留套餐那一侧AC-08已登录;账号在 Go 订阅内;Zen 与 Go 两组 roster 可读1.打开详情页目录卡片,搜索 beam-free 与 deepseek-v4.1-flash 2.打开模型选择器,搜索同一批模型 3.核对计数同一个模型 id 只出现一条:账号有 Go 时保留 · go 条目,· zen 重复项不出现;只存在于单一来源的模型(如 big-pickle)照常保留;目录卡片与选择器口径一致,去重后合计 101 个P1新增行为,无回归基线
TC-050FNOS-026-02目录排序:免费在前、付费按价格、禁用最后AC-09已登录;目录已读取1.打开详情页目录卡片,观察前三档顺序 2.切到模型选择器对比同一批模型的相对顺序 3.刷新目录后再看一次可用的免费模型排在最前且按时间降序;其后是可用的付费模型按价格升序;被禁用条目(含仅官方客户端可用的免费模型)全部在末尾;两处顺序一致,刷新后不抖动P2新增行为,无回归基线
TC-051FNOS-026-02登录或目录变化后选择器即时更新AC-10已登录;插件处于运行中,不重启插件与客户端1.登录后直接打开会话的模型选择器 2.在详情页隐藏某个模型(等价于目录变化) 3.不刷新页面再次打开选择器登录后即可在会话中选择 OpenCode 模型,无需禁用/启用插件;目录变化后选择器在不刷新页面的情况下反映新集合,且去重与排序正确P1新增行为,无回归基线
TC-052FNOS-026-06胶囊按重置周期最短的窗口展示AC-04已登录;账号有 Go 套餐额度;三个窗口都有数据1.选中任意 OpenCode 模型打开会话 2.悬浮输入区胶囊看摘要 3.与详情页额度卡片三个窗口比对摘要显示「5 小时窗口」的已用比例与重置倒计时(不是已用最多的每周窗口);5 小时窗口读不到时才显示每周、再退到每月P2新增行为,无回归基线
TC-053FNOS-026-02工具数量上限只提示不裁剪AC-11已登录;目录含 beam-free(可用状态)1.打开详情页目录卡片 2.查看顶部提示 3.核对模型行未被裁剪工具或标注为不可用卡片顶部提示「beam-free(≤ 128),启用较多插件或 MCP 时可能超出并返回 HTTP 400,插件不裁剪工具」;模型本身仍可正常选择;若目录里没有这类可用模型则不出现该提示P2新增行为,无回归基线
TC-054FNOS-026-01API Key 入口只在未登录且非授权中显示AC-06已登录测试账号1.已登录状态查看账号卡片 2.退出登录后再看 3.点「登录 OpenCode」进入设备码授权中再看已登录不显示「使用 API Key 登录」;未登录显示;授权进行中(已出现设备码)不显示P2新增行为,无回归基线

FNOS-026-06 对话输入区用量胶囊 ​

用例ID功能点测试标题关联验收前置条件测试步骤预期结果优先级基线来源
TC-026FNOS-026-06auto 策略在任意 OpenCode 模型下显示AC-01已登录;策略为 auto1.选中带 · go 后缀的 OpenCode 模型并查看输入区右侧 2.切到带 · zen 后缀的模型再查看 3.切换到其它供应商模型带 · go 与 · zen 后缀的模型都显示用量胶囊(不按套餐区分);其它供应商模型不显示,也不触发套餐额度请求P1新增行为,无回归基线
TC-027FNOS-026-06always 策略常驻显示AC-02已登录;策略为 always1.分别选中带 · go 后缀、带 · zen 后缀与其它供应商模型 2.查看输入区右侧三种情况下胶囊都显示;数值随刷新更新;没有 Go 数据时显示未知或未订阅,不补 0%P2新增行为,无回归基线
TC-028FNOS-026-06off 策略隐藏并停止刷新AC-02已登录;策略为 off1.选中带 · go 后缀的模型 2.查看输入区 3.观察一段时间内的额度请求胶囊不显示;不再产生额度自动刷新请求;详情页额度卡片仍可手动刷新P1新增行为,无回归基线
TC-029FNOS-026-06胶囊与额度卡片数字一致AC-03已登录;策略为 auto 或 always;选中带 · go 后缀的模型1.记录额度卡片的已用比例 2.在同一时刻查看胶囊 3.查看胶囊的重置时间两处比例一致;胶囊可查看重置时间且与卡片一致P1新增行为,无回归基线
TC-030FNOS-026-06修改策略后即时生效AC-04已登录;存在进行中的会话1.在设置区把策略从 auto 改为 off 2.不重启 DSH,回到会话查看 3.再改回 auto 查看策略变化后下一次进入会话或下一次对话即按新策略显示P2新增行为,无回归基线

FNOS-026-07 模型目录管理 ​

用例ID功能点测试标题关联验收前置条件测试步骤预期结果优先级基线来源
TC-031FNOS-026-07搜索即时过滤合并目录AC-01目录卡片已有合并数据1.输入某个模型名称片段 2.清空搜索框 3.输入同时命中同名 zen/go 条目的片段 4.核对计数列表即时过滤为匹配项;清空后恢复全部模型;同名 zen/go 条目同时命中且后缀不同;计数随搜索更新P2新增行为,无回归基线
TC-032FNOS-026-07隐藏模型后选择器不再出现,同名条目互不影响AC-02合并目录已有数据,存在同名 zen/go 条目1.隐藏同名条目中的 · zen 行 2.打开模型选择器并查看同名 · go 行 3.恢复 · zen 行 4.重启客户端后再查看被隐藏的条目不再出现在选择器;同名另一来源条目仍可见;偏好按 plan:id 保存并在重启后保持P1新增行为,无回归基线
TC-033FNOS-026-07刷新目录更新合并数据与获取时间AC-03合并目录已有数据1.记录获取时间 2.点「刷新」 3.比对合并列表与两类活 roster合并目录更新为最新读取结果;获取时间更新;刷新期间有进行中提示P1新增行为,无回归基线
TC-034FNOS-026-07刷新失败保留上一份目录AC-04合并目录已有数据1.阻断某来源目录 2.点「刷新」 3.查看该来源条目与提示该来源保持上一份可用目录;显示失败原因;另一来源与模型选择器不受影响P1新增行为,无回归基线
TC-046FNOS-026-07目录卡片固定高度与内部滚动AC-05合并目录已有数据,模型数量超过卡片高度1.查看目录卡片高度 2.滚动模型列表到底部 3.观察搜索框与计数 4.缩放窗口/切换亮暗主题卡片高度固定,只有列表区滚动;搜索框与计数始终可见;窗口缩放与亮暗主题下布局不溢出、不被裁切P1新增行为,无回归基线

FNOS-026-08 登录态与偏好持久化 ​

用例ID功能点测试标题关联验收前置条件测试步骤预期结果优先级基线来源
TC-035FNOS-026-08重启后登录态保持AC-01已登录且凭据未过期1.重启 DSH Web(或 DSH Desktop) 2.重新打开详情页 3.查看账号卡片与模型选择器仍为已登录;无需重新登录;选择器仍有唯一 OpenCode 供应商,模型名带 · zen / · go 后缀P0新增行为,无回归基线
TC-036FNOS-026-08偏好设置在重启后保持AC-02已登录1.分别隐藏一个 · zen 与一个同名 · go 条目、把策略改为 always、把刷新间隔改为非默认值 2.重启客户端 3.逐项核对三项设置保持;两条隐藏记录互不影响且仍不可选;策略与间隔为修改后的值P1新增行为,无回归基线
TC-037FNOS-026-08禁用插件不影响其它供应商AC-03已登录;已配置其它供应商1.禁用本插件 2.重启客户端 3.查看模型选择器与其它供应商用量其它供应商模型与用量正常;选择器无 OpenCode 残留分组;历史会话可打开P1新增行为,无回归基线

FNOS-026-09 文档站与插件登记 ​

用例ID功能点测试标题关联验收前置条件测试步骤预期结果优先级基线来源
TC-038FNOS-026-09插件总览与菜单可达AC-01文档站依赖已安装1.打开 /plugins/ 2.查找该插件的行 3.从左侧菜单点击 OpenCode总览包含该插件行并链接到说明页;菜单可进入 /plugins/dsh-opencode;版本号与插件清单一致P1新增行为,无回归基线
TC-039FNOS-026-09说明页内容完整AC-02说明页已发布1.逐节阅读说明页 2.对照需求「不在本次范围内」与已知约束包含安装命令、单一 OpenCode 供应商与 · zen / · go 后缀说明、能力字段、Go 套餐额度与胶囊、设置说明、Zen 402/403 已知限制与常见问题;未把未上线能力写成已可用P1新增行为,无回归基线
TC-040FNOS-026-09市场源列表包含该包AC-03插件已发布到 npm1.读取 docs/public/plugins/market/plugins.txt 2.检查生成的索引文件状态源列表含 @tnnevol/dsh-opencode;生成的 index.json 未被手工改写P2新增行为,无回归基线
TC-041FNOS-026-09文档构建与链接检查AC-04依赖已安装1.执行文档站构建 2.逐个打开新增菜单目标 3.执行 git diff --check构建通过;新增菜单目标文件均存在;无死链;git diff --check 无输出P0新增行为,无回归基线

测试执行结果 ​

用例定义已在上一节固定;本节只回填执行状态与联调证据。下面按时间列出的记录属于接口/端点或单项走查证据,除特别标注的用例外不改变其余用例的「未执行」状态;完整用例需在 DSH Web 与 DSH Desktop 上按版本三元组执行。

已完成的联调记录(2026-10-23,单 Go 供应商阶段) ​

2026-10-23 在 DSH Web(DSH_HOME 指向仓库 .dsh,独立端口)用真实账号完成一轮单 Go 供应商联调。以下是接口与端点层面的证据,不替代上方任何用例,也不产生用例通过结论。该轮目录为 36 个 Go 模型,双供应商与合并供应商阶段的复测见后续小节:

项目实测结果
插件加载插件加载成功,详情页可打开
API Key 登录/plugins/dsh-opencode/auth/key 返回 200
套餐额度/plugins/dsh-opencode/usage 返回 rolling 24% / weekly 78% / monthly 53%
模型目录/plugins/dsh-opencode/catalog 返回 36 个 Go 目录模型(当时只有 Go 一组来源)
协议端点直连探测路径正确:OpenAI Chat Completions 与 Anthropic Messages 返回 200;OpenAI Responses 因上游地区限制返回 403;Google Generative AI 因工作空间隐私设置返回 400(两者均为上游策略,不是路径错误)
网关会话头网关强制要求 x-opencode-session,缺失时返回 400 MissingSessionID

双供应商与路由修复复测(2026-10-23) ​

在 DSH Web(DSH 运行时 0.2.1-rc.2;插件工作区构建 0.2.1-rc.2.21)用同一真实账号完成修复后的接口级复测。本轮未执行目录卡片 UI(当时的分组筛选、固定高度、能力图标)、API Key 入口隐藏与 DSH Desktop 用例,因此不产生这些用例的通过/失败结论:

项目实测结果
根因登录后模型未出现在选择器:用户此前手工配置过 opencode-go 路由(llm-pi-ai),与插件注册的同名路由冲突(DUPLICATE_ADAPTER),不是目录读取失败
修复插件路由改为 dsh-opencode(OpenCode)与 dsh-opencode-go(OpenCode Go),与手工 opencode-go 路由并存
修复后目录模型选择器出现 OpenCode Zen 与 OpenCode Go 两组;Zen 活 roster 85 个、Go 活 roster 36 个
Go 模型调用OAuth 登录状态下调用 OpenCode Go 模型返回 HTTP 200
Zen 付费模型返回 402 Insufficient account funds(账号无余额;属上游限制,见「已知限制」)
Zen 免费模型返回 403 FreeTierError(仅允许在 OpenCode 客户端使用;属上游限制,见「已知限制」)
版本记录DSH 运行时 0.2.1-rc.2、插件 0.2.1-rc.2.21;DSH Desktop 版本待执行 Desktop 用例时补充

协议可用性与真实会话测试(2026-10-23,DSH Web 会话级) ​

在 DSH Web(插件 0.2.1-rc.2.22 构建 + 协议继承修复)用同一真实账号、同一会话逐个切换模型,提示词为「只回复 ok,不要调用任何工具」,每个模型 1 轮 1 步。目的是验证四种协议在 DSH 中端到端可用,并尽量选择最便宜(优先免费)的模型:

协议模型(OpenCode Go)价格(输入/输出,USD/1M)结果说明
OpenAI Chat CompletionsMiMo-V2.6-Flash0.14 / 0.28通过:回复 ok,4 秒,19.4K tok免费 beam-free 在当前地区返回 403 RegionError,改用最便宜可用模型
OpenAI ResponsesGrok 4.62.00 / 6.00通过:回复 ok,5 秒,19.1K tokgpt-6-luna、muse-spark-1.3-contributor 均因地区限制 403;Grok 为当前地区最便宜可用 Responses 模型
Anthropic MessagesClaude Haiku 5.50.10 / 0.50通过:回复 ok,2 秒,29.1K tok本轮最便宜的可用模型
Google Generative AIGemini 4 Argon Contributor4.00 / 20.00阻塞:上游 400(工作空间隐私设置未允许「会用于训练的付费端点」)请求已到达上游,路径与鉴权正确;需在 Console Privacy 设置中允许后才能使用

本轮同时发现并修复一个协议继承缺陷:Go roster 独有模型若只在 Zen 目录段有元数据(grok-4.6 为 Responses、qwen3.6-plus 为 Anthropic),此前会被 Go 的 provider 级 @ai-sdk/openai-compatible 覆盖,导致 DSH 返回 ModelProtocolUnsupported。修复后逐模型声明优先于 provider 缺省,两个模型已复测(Grok 4.6 会话级通过、Qwen3.6 Plus 端点级通过)。

费用:以上 3 次会话级调用合计约 67.6K 输入 token(含系统提示),按各自价格估算 < 0.05 USD;未测试高价位模型。

说明:这些是会话级联调证据,不改变上方用例的「未执行」状态;DSH Desktop 与设备码授权流程仍待完整验收。

协议与端点逐模型核对(2026-10-24) ​

按 https://opencode.ai/v2/docs、/docs/zen、/docs/go 的模型表与官方 opencode 1.19.4 的 /provider 输出逐模型核对协议族与端点,发现并修复两类问题:

问题触发模型修复
跨来源误覆盖:同名模型在另一来源的协议被当成高优先级,覆盖了本来源真实协议Zen minimax-m3 / minimax-m2.7 / qwen3.8-max(应为 Chat Completions,被投成 Anthropic)跨来源逐模型声明只在「本来源完全没有该模型」时生效
Console 的 aisdk: 包名覆盖公开目录Zen grok-build-0.1(应为 Responses,被投成 Chat Completions)公开目录逐模型 npm 优先于 Console 包名
只有端点、没有包名的模型无法判定协议部分目录条目新增按端点反推(/chat/completions、/responses、/messages、/google/v1beta)

修复后与官方 CLI 对齐核对 110 个可对照模型,协议族与端点 0 处不一致;新增 cli-parity 回归用例(4 条)与协议解析用例(5 条)。

端点前缀按来源固定:· zen 用 /inference/openai/v1、/inference/anthropic、/inference/google/v1beta;· go 在上述路径前加 /go。Google 端点的模型名位于路径末段(…/google/v1beta/models/<id>),其余协议走请求体里的模型名。

推理端点策略(2026-10-24) ​

账号只订阅 OpenCode Go、Console 没有余额,同一模型走两组端点的结果完全不同:

模型Go 端点Zen 端点
deepseek-v4.1-flash200(正常返回)402 Insufficient account funds
mistral-large-4(仅 Zen)400 Model is unavailable.402
big-pickle(仅 Zen,免费)400 Model is unavailable.403 FreeTierError

因此新增「推理端点」设置:auto(默认,读到 Go 套餐额度就把共用模型统一打到 Go 端点)、go、zen。本账号已订阅 Go,实测 auto 与 go 行为一致;zen 与切回 auto 时目录端点随之变化,auto 下共用模型落在 Go 端点。改写只作用于目标端点也存在同协议模型的条目;跨来源独有模型与跨来源协议不同的模型保持原生端点。用例覆盖:共用模型在 go 下改到 Go 端点、Zen 独有模型不动、zen 反向改写、auto 与重复调用回到原生端点、协议不同不切换。

用量胶囊标识(2026-10-24,DSH Web) ​

胶囊的环形中心由占位图形换成 OpenCode 官方标识:外框 + 内嵌深浅两段色块,比例取自官方 512×512 图标(外框 20×25,内部色块位于 25%–75% / 20%–80%,40% 处分成深浅两段),用 currentColor 与其 45% 透明度表达两段。DSH Web 中实测:选中 · go 模型后胶囊出现,中心标识渲染为 12×15 的 SVG,亮色主题下为深色描边配深浅灰块;胶囊整体仍为 26px 环形进度,· zen 模型下不显示。

合并供应商与 zen/go 后缀实测(2026-10-24,DSH Web) ​

2026-10-24 在 DSH Web 用真实账号完成合并供应商口径的实测。本轮确认选择器只有一个 OpenCode 分组、模型名带 · zen / · go 后缀、合计 122 个模型(zen 85 / go 37),并完成 go 模型会话与 zen 模型错误路径验证。本轮未执行 DSH Desktop、目录搜索/滚动/能力气泡、Console 覆盖逐项比对与 opencode 冲突回归,因此只对下列用例给出部分证据:

项目实测结果
供应商分组模型选择器只有一个 OpenCode 分组,模型名带 · zen(按量)/ · go(套餐)后缀;合计 122 个(zen 85 / go 37)
会话对话(headless)使用 go:mimo-v2.6-flash 成功对话,回复 ok,约 19.4K tok
会话对话(DSH Web)使用 go:mimo-v2.6-flash 成功对话,回复 ok,约 19.4K tok
前缀剥离zen:glm-5 返回上游 402 Insufficient account funds,证明插件已剥掉 zen: 前缀、网关收到原始模型 id
免费模型zen:big-pickle 在 DSH 中显示 API 密钥无效 AUTH;对应上游 403 FreeTierError 被 DSH 归类为 AUTH,属上游限制,不是插件缺陷
用量胶囊(auto)选中带 · go 后缀的模型时胶囊出现;切到带 · zen 后缀的模型后消失
未覆盖DSH Desktop、搜索/计数/固定高度滚动、能力图标气泡、Console 覆盖逐项比对、opencode 冲突回归、亮暗主题走查
版本记录DSH Web + 插件工作区最新构建;正式执行时补齐版本三元组

本轮证据对应的用例结论:TC-009(单分组、后缀与总数)、TC-018(go 模型对话)、TC-021(402 与免费模型错误)、TC-026(auto 胶囊只对 go 后缀显示)、TC-043(无分组筛选、后缀与计数)各取得部分证据,记为「部分通过(DSH Web)」;其余用例状态不变。

未执行说明:TC-042 至 TC-047 为双供应商阶段新增、并已随合并口径改写的用例;2026-10-24 只覆盖其中 TC-026、TC-043 的部分步骤。TC-044 有 2026-10-23 的接口级修复证据,但完整回归仍需在预置手工 opencode 与同名 dsh-opencode 配置的环境中按步骤执行,并覆盖 DSH Desktop。版本三元组中的 Desktop 一栏在正式执行时补充。

用例ID功能点执行环境结果执行日期备注
TC-001FNOS-026-01DSH Web、DSH Desktop未执行—待执行
TC-002FNOS-026-01DSH Web、DSH Desktop未执行—待执行;需真实账号
TC-003FNOS-026-01DSH Web未执行—待执行
TC-004FNOS-026-01DSH Web未执行—待执行
TC-005FNOS-026-01DSH Web、DSH Desktop未执行—待执行;需服务账号 Key
TC-006FNOS-026-01DSH Web未执行—待执行
TC-007FNOS-026-01DSH Web、DSH Desktop未执行—待执行
TC-008FNOS-026-01DSH Web未执行—待执行
TC-009FNOS-026-02DSH Web、DSH Desktop通过(DSH Web、DSH Desktop)2026-10-24已确认单分组、后缀与目录计数;去重后为 101 个。Desktop(开发态 0.2.1-rc.2,CDP 9333)实测:插件详情页显示 v0.2.1-rc.2.37、已登录、目录 101 个模型,未出现「不兼容 / 异常」
TC-010FNOS-026-02DSH Web未执行—待执行;需可构造账号配置失败
TC-011FNOS-026-02DSH Web未执行—待执行
TC-012FNOS-026-02DSH Web、DSH Desktop未执行—待执行
TC-013FNOS-026-03DSH Web、DSH Desktop未执行—待执行;覆盖四种协议族
TC-014FNOS-026-03DSH Web未执行—待执行
TC-015FNOS-026-03DSH Web、DSH Desktop未执行—待执行
TC-016FNOS-026-03DSH Web未执行—待执行
TC-017FNOS-026-03DSH Web未执行—待执行
TC-018FNOS-026-04DSH Web、DSH Desktop部分通过(DSH Web)2026-10-24go:mimo-v2.6-flash 在 headless 与 Web 成功;· zen 付费模型受余额限制未成功
TC-019FNOS-026-04DSH Web、DSH Desktop未执行—待执行
TC-020FNOS-026-04DSH Web未执行—待执行
TC-021FNOS-026-04DSH Web部分通过(DSH Web)2026-10-24已确认 402 与免费模型 403/AUTH 可读;断网与 Desktop 待执行
TC-022FNOS-026-05DSH Web、DSH Desktop通过(DSH Web、DSH Desktop)2026-10-24Desktop(开发态 0.2.1-rc.2,CDP 9333)实测:额度卡片显示 5 小时 8% / 每周 89% / 每月 58%,与 /plugins/dsh-opencode/usage 返回一致,含重置倒数与获取时间;选中 · zen 模型时输入区同样出现胶囊
TC-023FNOS-026-05DSH Web未执行—待执行
TC-024FNOS-026-05DSH Web未执行—待执行;需可构造额度接口失败
TC-025FNOS-026-05DSH Web未执行—待执行
TC-026FNOS-026-06DSH Web、DSH Desktop通过(DSH Web、DSH Desktop)2026-10-24口径修订:auto 改为按供应商判断,· zen 也显示。DSH Web 已验证 · go 与 · zen 均显示、其它供应商不显示;Desktop(开发态 0.2.1-rc.2,CDP 9333)实测:选中 jev-1.13 · zen 后输入区胶囊出现,aria-label 为「每周窗口 · 已用 89% · 1天 14小时后重置」
TC-027FNOS-026-06DSH Web未执行—待执行
TC-028FNOS-026-06DSH Web未执行—待执行
TC-029FNOS-026-06DSH Web、DSH Desktop未执行—待执行
TC-030FNOS-026-06DSH Web未执行—待执行
TC-031FNOS-026-07DSH Web未执行—待执行
TC-032FNOS-026-07DSH Web、DSH Desktop未执行—待执行
TC-033FNOS-026-07DSH Web未执行—待执行
TC-034FNOS-026-07DSH Web未执行—待执行
TC-035FNOS-026-08DSH Web、DSH Desktop未执行—待执行;需重启客户端
TC-036FNOS-026-08DSH Web未执行—待执行
TC-037FNOS-026-08DSH Web、DSH Desktop未执行—待执行
TC-038FNOS-026-09文档站构建环境未执行—待执行
TC-039FNOS-026-09文档站构建环境未执行—待执行
TC-040FNOS-026-09文档站构建环境未执行—待执行
TC-041FNOS-026-09文档站构建环境未执行—待执行
TC-042FNOS-026-01DSH Web、DSH Desktop未执行—待执行;已登录隐藏 API Key 入口
TC-043FNOS-026-02DSH Web、DSH Desktop部分通过(DSH Web)2026-10-24已确认无分组筛选、后缀与计数;搜索与 Desktop 待执行
TC-044FNOS-026-02DSH Web未执行—待执行;接口级修复已确认,完整回归需预置手工 opencode 与同名 dsh-opencode 配置
TC-045FNOS-026-03DSH Web、DSH Desktop未执行—待执行;能力图标与悬浮气泡
TC-046FNOS-026-07DSH Web、DSH Desktop未执行—待执行;固定高度、内部滚动与固定工具栏
TC-047FNOS-026-05DSH Web、DSH Desktop未执行—待执行;需无 Go 订阅账号
TC-048FNOS-026-02DSH Web通过(DSH Web)2026-10-24DSH Web 0.2.1-rc.2.29:卡片顶部提示已显示;8 个 Zen 免费模型均带「已停用 + 仅 OpenCode 客户端可用」且开关禁用;beam-free 的 zen 条目禁用、go 条目可选且端点分别为 inference/openai/v1 与 inference/go/openai/v1;选择器搜索 8 个免费模型 id 命中 0 条。DSH Desktop 待执行
TC-049FNOS-026-02DSH Web通过(DSH Web)2026-10-24DSH Web 实测:目录卡片与选择器中 beam-free 只保留 · go 一条、deepseek-v4.1-flash 只保留 · go 一条,big-pickle 等单一来源模型保留;去重后 101 个。DSH Desktop 待执行
TC-050FNOS-026-02DSH Web、DSH Desktop通过(DSH Web、DSH Desktop)2026-10-24DSH Web 实测:目录卡片 101 行,顺序为 Beam Free · go(免费)→ Muse Spark 1.2/1.3 Contributor(0.30)→ DeepSeek V4 Flash、MiMo V2.5、MiMo-V2.6-Flash(0.42),第 94 行起全部为「已停用」条目;目录接口返回同序。另修正「无价格元数据的模型被当成最便宜」的缺陷,改为沉到付费档末尾。Desktop(开发态 0.2.1-rc.2,CDP 9333)实测:目录卡片顺序与 Web 完全一致(Beam Free · go → 0.30 档 → 0.42 档),第 94 行起为「已停用」;模型选择器搜索 Beam Free 与 DeepSeek V4.1 Flash 均只剩 · go 一条
TC-051FNOS-026-02DSH Web通过(DSH Web)2026-10-24DSH Web 实测(页面不刷新):通过偏好接口隐藏 go:glm-5.3-flash 后,选择器里 GLM-5.3-Flash · go 立即消失,说明目录变化已广播到客户端;还原偏好后刷新页面,选择器只剩 GLM-5.3-Flash · go(去重正确)。遗留:广播前客户端已缓存的被移除条目可能残留到下次刷新页面,属 DSH 客户端目录缓存行为,已在插件说明登记。DSH Desktop 待执行
TC-052FNOS-026-06DSH Web部分通过(单元测试)2026-10-24primaryUsageWindow 单测覆盖:每周窗口已用 90% 时仍取 5 小时窗口;5 小时读不到时退到每周、再退到每月;空快照返回 undefined。DSH Web 页面观感待实例复验
TC-053FNOS-026-02DSH Web通过(DSH Web)2026-10-24DSH Web 0.2.1-rc.2.40 实测:详情页目录卡片顶部出现提示「以下模型限制单次请求可携带的工具数量(beam-free(≤ 128))。启用较多插件或 MCP 后可能超出上限并返回 HTTP 400;插件不对工具做裁剪。」,Beam Free · go 仍正常可选;单测同时覆盖前缀匹配、停用/仅客户端条目不提示、无命中返回空数组
TC-054FNOS-026-01DSH Web通过(DSH Web)2026-10-24DSH Web 实测三种状态:已登录 → 无「使用 API Key 登录」;退出登录 → 出现;点「登录 OpenCode」进入授权中(设备码已生成)→ 入口消失。测试后已取消授权并恢复账号凭据(signed-in)

Bug 记录 ​

Bug ID关联用例标题严重级别状态修复说明
BUG-01TC-044登录后模型不出现在选择器(路由同名冲突)P0已修复插件原先注册 opencode-go,与用户手工配置的同名路由冲突;改用 dsh-opencode(dsh- 前缀)后模型正常出现。双供应商阶段曾扩展为 dsh-opencode / dsh-opencode-go 两组,2026-10-24 合并为唯一 dsh-opencode 并复测确认单一 OpenCode 分组可用

本轮接口联调未发现其它 Bug。合并供应商与 zen/go 后缀口径已在需求 FNOS-026-02 与计划 T02-07 的变更记录登记。zen:big-pickle 的 API 密钥无效 AUTH 来自上游 403 被 DSH 归类,不是插件缺陷,已登记在「已知限制(上游)」。

测试结论 ​

  • 结论:需求级验收通过(2026-10-25,由需求负责人确认)。插件已发布到 npm,九项功能对应的验收条件判定通过,需求与计划状态置为「已完成验证 / 已完成」,结论同步在需求验收结论登记。
  • 用例级执行进度与本结论的区别:本页表格里仍有若干用例标记为「未执行」或「部分通过(DSH Web)」——这些是逐条用例的原始执行记录,保留原样,不因需求级验收而回填成功。判定通过依据的是需求负责人对整体功能的验收,不是这些条目逐条转为通过。
  • 已取得实测证据的主要条目:TC-009、TC-018、TC-021、TC-022、TC-026、TC-043、TC-048、TC-049、TC-050、TC-051、TC-053、TC-054(DSH Web,部分含 DSH Desktop);失败 0 条,阻塞 0 条。
  • 一句话结论:功能与发布均已完成并验收通过;用例表保留各条原始执行记录,后续如需逐条补齐,按已有证据继续回填即可,不影响本次验收判定。

遗留风险 ​

  1. 外部账号与网络依赖:登录、目录与对话依赖真实 OpenCode Console 账号与可直连 opencode.ai 的网络;Zen 付费模型需要 Console 余额,Go 模型需要 Go 或 Go Plus 订阅。缺条件时用例按阻塞登记,不据此判定功能缺陷。
  2. Zen 402/403 属上游限制:余额不足返回 402 Insufficient account funds,免费模型返回 403 FreeTierError;DSH 可能把该 403 归类为 AUTH 并显示「API 密钥无效」。插件只保证错误可读,不绕过限制,也不因此隐藏 roster 条目。
  3. 路由冲突已缓解但未完全消除:opencode / opencode-go 手工配置不再冲突;若用户手工配置了同名 dsh-opencode,仍会触发冲突,需要 TC-044 覆盖并给出诊断。
  4. 前缀剥离只在部分路径验证:2026-10-24 以 zen:glm-5 的 402 与 go:mimo-v2.6-flash 的会话确认前缀已剥离,但四种协议族与 Desktop 的完整组合仍需按 TC-013、TC-018 执行。
  5. 上游目录与额度接口未公开完整契约:字段漂移时插件按降级处理,用例以夹具固定已知形态;真实账号下出现新字段时需补用例。
  6. 合并目录 UI 尚未完成视觉验收:固定高度滚动、搜索与计数、能力图标气泡、同名条目分别隐藏目前只有接口/设计口径,未在 DSH Web 与 DSH Desktop 亮暗主题下走查。
  7. 桌面端仅覆盖开发态客户端:DSH Desktop 结论需来自 fork-pj/deepseek-harness 的开发态客户端,不作为发行版客户端的独立验收结论。

变更记录 ​

日期变更说明
2026-10-24改为单一 OpenCode 供应商与 zen/go 后缀口径,并回填 DSH Web 实测用例按合并口径改写:TC-005、TC-007、TC-009 至 TC-021、TC-022 至 TC-032、TC-035、TC-037、TC-039、TC-043 至 TC-047;TC-043 由「分组筛选与 plan 标签」改为「合并列表、后缀与计数」,TC-044 扩展为 opencode 与同名 dsh-opencode 两种路由场景,TC-032/TC-036 补充按 plan:id 分别隐藏。关键风险点新增前缀剥离与同名条目误操作两条;已知限制补充免费模型 403 在 DSH 中显示为 AUTH。执行结果新增「合并供应商与 zen/go 后缀实测(2026-10-24)」:单分组、122 个模型(zen 85 / go 37)、headless 与 Web 的 go:mimo-v2.6-flash 对话、zen:glm-5 402 证明前缀剥离、zen:big-pickle 显示 AUTH、auto 胶囊只对 go 后缀显示;回填 TC-009、TC-018、TC-021、TC-026、TC-043 为部分通过(DSH Web)。用例总数保持 47 条,编号连续。
2026-10-23改为双供应商与模型列表 UI 改版用例,并回填路由修复证据用例改为 OpenCode Zen(按量)与 OpenCode Go(套餐)双供应商口径:更新 TC-001、TC-005、TC-007、TC-009 至 TC-017、TC-018 至 TC-021、TC-022 至 TC-027、TC-031 至 TC-037、TC-039;新增 TC-042(已登录隐藏 API Key 入口)、TC-043(分组筛选与 plan 标签)、TC-044(opencode-go 路由冲突回归)、TC-045(能力图标与气泡)、TC-046(固定高度与内部滚动)、TC-047(无 Go 订阅)。补充「已知限制(上游)」登记 Zen 402/403;在执行结果新增双供应商与路由修复复测,记录根因 DUPLICATE_ADAPTER、dsh- 前缀修复、OAuth 调用 Go 模型 200、Zen 402/403;新增 BUG-01(已修复)。用例总数 41 → 47,状态改为执行中。
2026-10-23回填协议可用性与真实会话测试在 DSH Web 同一会话逐个切换模型,验证 Chat Completions(MiMo-V2.6-Flash)、Responses(Grok 4.6)、Anthropic Messages(Claude Haiku 5.5)端到端通过;Google Generative AI 因工作空间隐私设置阻塞;记录免费/低价模型选择、费用估算与协议继承缺陷修复。
2026-10-25需求级验收通过插件发布到 npm 后由需求负责人确认整体验收通过,测试文档结论由「执行中」改为「已完成」;明确需求级结论与用例级逐条执行记录的区别——未执行/部分通过的条目保留原样,不因验收而回填成功。
2026-10-23按真实账号联调结果更正目录口径与补充证据更正 TC-009(目录以公开清单为全集、账号配置只叠加覆盖,models 为空不代表没有模型)与 TC-010(账号配置不可读时仍服务公开目录并说明来源),补充一条风险点;在「测试执行结果」新增 2026-10-23 本地 DSH Web 联调记录(插件加载、API Key 登录、额度、36 个目录模型、四种协议端点直连探测与 x-opencode-session 要求),并标注未执行单模型对话用例。
2026-10-23建立 FNOS-026 测试用例文档按九个功能分节登记 41 条用例,覆盖正向、逆向、边界、权限与数据一致性五类;执行结果全部为「未执行」,Bug 与结论待回填。登记四条遗留风险(含同名路由冲突)与一条待确认项。

基于 VitePress 构建