Skip to content

OpenCode ​

@tnnevol/dsh-opencode 把 OpenCode Zen(按量) 与 OpenCode Go(套餐) 的模型接入 DSH:用 OpenCode Console 账号登录后,模型选择器出现一个 OpenCode 供应商,Zen 与 Go 两类模型合并成一个列表(2026-10-24 为 122 个:zen 85 / go 37),模型名用 · zen 或 · go 后缀标明来源与计费口径;目录叠加 Console 账号下发的增补、停用、能力与容量覆盖以及推理路由头,Go 套餐额度也随账号实时读取。

该插件暂未随 fnOS 应用内置分发,请在目标 DSH 环境中按下面的命令安装。

安装 ​

sh
dsh plugin --profile web add @tnnevol/dsh-opencode@7.0.2

安装后重启 DSH Web profile。插件版本信息见插件总览。

登录 ​

  1. 在 DSH 左侧打开「插件」,进入 OpenCode 详情页。
  2. 账号卡片点「设备码登录」,页面会显示一次性代码、复制按钮与验证地址。
  3. 在浏览器打开验证地址,输入一次性代码并确认;授权完成后返回 DSH,账号卡片变为已登录,显示账号与组织。
  4. 设备码不可用时,可在同一卡片改用 Console 服务账号 API Key 登录。
mermaid
flowchart TD
  A[打开 OpenCode 详情页] --> B[点设备码登录]
  B --> C[复制一次性代码]
  C --> D[在浏览器验证页输入代码并确认]
  D --> E[返回 DSH:账号卡片显示已登录]
  E --> F[模型选择器出现一个 OpenCode 供应商]
  F --> G[按模型名后缀选择 zen 或 go 模型开始对话]

同一时间只保留一个 Console 账号;账号卡片提供「退出登录」,退出后 OpenCode 供应商不再出现在模型选择器。已登录时账号卡片不再显示「使用 API Key 登录」入口,需要切换登录方式时先退出登录。

模型 ​

登录后,模型选择器只新增一个供应商:

供应商路由模型来源计费与限制
OpenCodedsh-opencodeOpenCode Zen(按量)与 OpenCode Go(套餐)合并列表:Zen 来自 https://opencode.ai/inference/v1/models 与公开目录 opencode 段,Go 来自 https://opencode.ai/inference/go/v1/models 与公开目录 opencode-go 段;2026-10-24 合计 122 个(zen 85 / go 37)· zen 模型按 token 计费,需要 Console 余额,免费模型只允许在 OpenCode 客户端使用(已按停用展示并从选择器过滤);· go 模型受 Go 或 Go Plus 套餐额度约束,OAuth 与 API Key 均可调用,套餐内含的免费模型可正常使用

两类来源分别以自己的**实时模型清单(活 roster)**为全集;清单不可用时回退公开目录对应段,再失败时使用内置目录或保留上一份可用目录。详情页会说明当前目录来源。

后缀与计费 ​

显示名后缀内部模型 id含义计费口径
· zenzen:<真实 id>(例如 zen:glm-5)来自 OpenCode Zen 的按量模型按 token 计费,需要 Console 余额;套餐额度不适用
· gogo:<真实 id>(例如 go:mimo-v2.6-flash)来自 OpenCode Go 的套餐模型受 Go 或 Go Plus 套餐额度约束
  • 后缀只用于在合并列表里区分来源与计费;供应商始终是一个 OpenCode。
  • 内部模型 id 带 zen: / go: 前缀,保证同名模型在合并列表内唯一;插件在发请求前会剥掉前缀,网关收到的仍是原始模型 id。
  • 同名模型可能在两类来源中各有一条,按后缀分辨;目录里的显隐开关也按 plan:id 分别记录,可以只隐藏其中之一。

路由与冲突 ​

  • 路由 id 使用 dsh-opencode,而不是 pi-ai 内置的 opencode / opencode-go。dsh- 前缀是为了避免与用户手工配置的同名路由冲突——此前的同名冲突曾导致登录后模型完全不出现在选择器,改用前缀后已消除。
  • 如果此前已在模型设置里手工配置过 opencode 或 opencode-go,它和插件的 dsh-opencode 可以并存,插件不会覆盖它。
  • 若用户手工配置了同名 dsh-opencode,插件会给出可诊断提示且不覆盖用户配置;移除该配置后重试即可。

账号配置只做覆盖 ​

  • Console 下发的停用标记、能力与容量覆盖会按来源应用到合并目录,推理请求也会带上工作空间路由头。
  • Console 里没有额外的覆盖条目(models 为空)是正常状态,不代表没有可用模型;Console 也可以增补 roster 之外的条目。
  • 读取不到账号配置时,合并后的模型仍然可用,详情页会说明未应用账号覆盖的原因。

模型能力 ​

每个模型的协议族、推理、工具调用、图片输入、文本输入、免费标记、上下文窗口与最大输出都按上游目录投影到 DSH,不需要手工配置:

  • 协议族逐模型独立解析,模型分属 OpenAI Chat Completions、OpenAI Responses、Anthropic Messages、Google Generative AI 四种上游协议,插件自动选择,不需要手工配置。

协议与端点 ​

每个模型的协议族与端点逐个模型决定,不能按供应商或套餐一刀切:

上游声明插件读取来源端点
AI SDK 包名公开目录的逐模型 provider.npm;缺失时用 Console 的 aisdk:<npm>按协议族固定
完整端点公开目录的逐模型 provider.api(含 /chat/completions、/responses、/messages、/google/v1beta 等)由端点反推协议
两者都缺本供应商的 provider 级缺省按协议族固定

解析优先级是本来源的逐模型声明 → 另一来源的逐模型声明(仅当本来源完全没有该模型)→ 供应商级缺省。这条规则很重要,因为同名模型在两个来源可能是不同协议:minimax-m3 在 Zen 走 Chat Completions、在 Go 走 Anthropic Messages;grok-4.6、qwen3.6-plus 在两个来源都是 Responses / Anthropic。若让另一来源覆盖本来源,DSH 会拿到 ModelProtocolUnsupported。

端点前缀由来源与协议共同决定:

来源Chat CompletionsResponsesAnthropic MessagesGoogle Generative AI
· zen/inference/openai/v1/inference/openai/v1/inference/anthropic/inference/google/v1beta
· go/inference/go/openai/v1/inference/go/openai/v1/inference/go/anthropic/inference/go/google/v1beta

这套映射已与官方 opencode 1.19.4 命令行逐模型核对:两个来源共 110 个可对照模型,协议族与端点全部一致。

端点策略 ​

同名模型在两类来源里都存在时(当前 21 个),请求走哪一组端点由推理端点设置决定:

取值行为
auto(默认)跟随账号套餐:能读到 Go 套餐额度就把共用模型统一打到 Go 端点,否则保持各自原生端点
go共用模型统一打 Go 端点,消耗套餐额度
zen共用模型统一打按量端点,消耗 Console 余额

只切换目标端点也存在的模型:只出现在单一来源的模型(如 Zen 的 big-pickle、Go 的 beam-free)保持原生端点。强行改到另一端点上游会直接返回 Model is unavailable.,实测确认。

同一模型在两个来源的协议不同时(如 minimax-m3)也不切换——端点按协议族固定,换过去就是错端点。

修改设置后目录卡片展示的端点与下一次请求使用的端点会同步更新,不会留下上一次的改写结果。已订阅 OpenCode Go 的账号在 auto 下等价于 go;没有 Go 套餐时 auto 保持各模型的原生端点。

  • 能力图标:目录每行以「推理 / 工具 / 图片 / 文本 / 免费」五个图标表示能力;悬浮时显示气泡,逐项标记勾选或未勾选。
  • 上下文与最大输出以文本显示在模型行内;上游未声明时使用保守默认值并说明。
  • 图片生成模型不纳入适配,不会出现在可对话模型列表里。

模型列表 ​

详情页的模型目录卡片是一个合并列表,不再按来源分组筛选:

  • 固定高度、内部滚动:只有模型列表区滚动,搜索框与计数固定在工具栏,长目录不会把整页撑高。
  • 来源标识:每行模型名带 · zen 或 · go 后缀。
  • 跨来源去重:同一模型 id 在 Zen 与 Go 都出现时(2026-10-24 实测 21 个,如 beam-free、deepseek-v4.1-flash),只保留账号套餐对应的那一条——账号有 Go 时保留 · go 条目、去掉 · zen 重复项,只有 Zen 时反之;只存在于单一来源的模型照常保留。去重后合计 101 个(原 122 个)。模型选择器与详情页目录卡片口径一致。
  • 排序:可用的免费模型排在最前,按上架/发布时间降序(新的在前,缺时间的排在该档末尾);其次是可用的付费模型,按「输入 + 输出」价格从低到高;被禁用的条目(含仅官方客户端可用的免费模型)统一排到最后。模型选择器与目录卡片顺序一致,同一档内以模型 id 兜底,刷新后不抖动。
  • 搜索:按模型名称、标识、家族、描述或协议族过滤,结果即时更新。
  • 计数:显示当前搜索结果数;已隐藏的模型数量单独标注。
  • 隐藏:逐个模型开关,按 plan:id 记录,隐藏后该模型不再出现在模型选择器;重新打开后恢复。
  • 仅官方客户端可用的免费模型按停用展示:Zen 的免费模型(big-pickle、*-free 等)只能由官方 OpenCode 客户端调用,插件在目录里保留条目并标记「已停用 + 仅 OpenCode 客户端可用」,开关不可操作,也不进入模型选择器;卡片顶部有统一提示说明原因。Go 套餐内含的免费模型(beam-free · go)不受影响,正常可选。
  • 工具数量上限只提示、不裁剪:beam-free 限制单次请求最多 128 个工具,启用较多插件或 MCP 后请求会超限并返回 HTTP 400(Invalid value for 'tools': maximum number of items is 128)。插件不对工具做裁剪——裁剪会让模型在不知情的情况下少看见能力,排错更难;目录卡片顶部会给出这条提示,需要时可减少启用的插件/MCP 或改用其它模型。
  • 地区受限模型不禁用:如 beam-free、cat-jam-free 在部分地区不可用,插件照常列出,选中后按上游返回的地区错误提示。
  • 刷新:立即重新读取两类来源的目录,并显示获取时间。

目录刷新失败时保留上一份可用目录,不把已经能用的模型清空;某类来源失败不影响另一类。

账号 ​

详情页「账号」卡片支持两种登录方式:设备码(推荐)与 Console API Key(兜底)。

  • 未登录时显示「登录 OpenCode」与「使用 API Key 登录」两个入口。
  • 设备码授权进行中不显示 API Key 入口:此时只保留设备码与该授权页,避免同时摆两条登录路径让人以为设备码流程卡住。
  • 已登录后只保留账号信息与「退出登录」,不再显示任何登录入口。

套餐额度与用量胶囊## 套餐额度与用量胶囊 ​

套餐额度只对 OpenCode Go(· go 后缀模型)生效。详情页的额度卡片显示 OpenCode Go 三个额度窗口的已用百分比与重置倒计时:

窗口含义
5 小时滚动 5 小时窗口,约占月度额度的 20%
每周每周窗口,约占月度额度的 50%
每月月度窗口,即该模型的月度上限

额度接口读取失败时,卡片显示失败原因与最近一次获取时间,不会把没读到的窗口显示成 0%。账号没有 Go 订阅时,卡片显示未订阅说明,不显示 0%,也不显示按量费用。

对话输入区右侧会显示 OpenCode Go 用量胶囊,用于在对话过程中随时查看已用比例与重置时间。胶囊与悬浮摘要固定采用重置周期最短的窗口(5 小时 → 每周 → 每月,前一个读不到才退到下一个),因为短周期窗口最先重置、也最能反映「现在还能用多久」。胶囊由环形进度与 OpenCode 官方标识组成:外框加内嵌深浅两段色块,几何按官方 512×512 图标实测像素折算(外框 256×320、内孔上 1/3 深色、下 2/3 浅一档)。标识取主文字色 --dsw-alias-label-primary(浅色主题近黑、深色主题近白,即官方黑白观感),并以块级元素居中与圆环同心;进度弧仍用次要文字色。胶囊有三种策略:

策略表现
auto(默认)只要当前会话选中的是 OpenCode 模型就显示,· go 与 · zen 后缀不区分;选中其它供应商模型时不显示
always插件已登录时常驻显示;没有 Go 数据时显示未知或未订阅,不补 0%
off隐藏,并停止额度自动刷新(详情页仍可手动刷新)

胶囊展示的始终是账号的 Go 套餐窗口:选中带 · zen 后缀的按量模型时同样显示该套餐数据,但插件不提供按量余额、费用或账单展示。策略在详情页设置区修改,下一次进入会话或下一次对话即生效,无需重启 DSH。

设置项说明 ​

全部设置位于插件管理页 → OpenCode 详情页,修改后立即生效,不需要重启。设置弹框中没有本插件的配置入口。

设置项说明取值范围默认值
用量胶囊输入区右侧胶囊的显隐策略;auto 在选中任意 OpenCode 模型(· go 或 · zen)时生效auto / always / offauto
推理端点共用模型使用哪一组上游端点:auto 跟随账号套餐(读到 Go 套餐额度就用 Go 端点),也可固定为 Go 或 Zen 端点auto / go / zenauto
自动刷新间隔目录与额度的后台刷新周期(分钟);0 表示关闭自动刷新0–24015
隐藏的模型在模型选择器中隐藏的模型,按 plan:id 记录(如 zen:big-pickle、go:mimo-v2.6-flash)逐模型开关空

已知约束 ​

  • 需要能直连 opencode.ai:登录、模型目录、套餐额度与模型调用都发往该域名(公开目录在 models.opencode.ai)。运行环境无法访问时,登录与目录会给出连接失败提示。
  • OpenCode Zen 按量模型需要 Console 余额:余额不足时上游返回 402 Insufficient account funds,模型目录仍可读取,但对话无法完成;插件不自动重试,充值后重试即可。
  • OpenCode Zen 免费模型只允许在 OpenCode 客户端使用:big-pickle、*-free 等 Zen 免费模型的上游调用返回 403 FreeTierError,因此插件在目录卡片中把它们按「已停用 + 仅 OpenCode 客户端可用」展示,并不放进模型选择器;卡片顶部有统一提示说明原因。Go 套餐内含的免费模型不受此限制(beam-free · go 可正常选择),同一模型在 Zen 与 Go 两段会分别列出并各用自身端点。
  • 地区受限模型按上游限制处理:如 beam-free、cat-jam-free 在部分地区返回 403 RegionError。插件不在后台禁用这类模型,选中后按上游返回的错误提示用户。
  • OpenCode Go 套餐按模型月度上限计算额度:额度由 OpenCode 按套餐与模型的月度上限计算,插件只做展示,不参与计费或换算金额;OAuth 与 Console 服务账号 API Key 均可调用 Go 模型。
  • 路由使用 dsh- 前缀:插件只注册 dsh-opencode,与手工配置的 opencode / opencode-go 并存;不要为同一用途再手工创建同名 dsh-opencode 路由。
  • 图片生成、视频生成模型不参与对话:它们与 DSH 对话所需的文本输入协议不同,不在本插件范围内。
  • 部分模型受地区限制:gpt-6-luna、muse-spark-*、beam-free 等模型在部分国家/地区返回 403(unsupported_country_region_territory / RegionError);目录仍会展示,调用失败时按上游错误提示,插件不提供绕过方式。
  • Google Generative AI 需要工作空间隐私设置:Gemini 模型要求 Console 工作空间允许「会用于训练的付费端点」,否则上游返回 400;这是工作空间级设置,插件无法代为开启。

常见问题 ​

模型名后面的 · zen / · go 是什么意思 ​

分别表示模型来自 OpenCode Zen(按量)与 OpenCode Go(套餐)。供应商只有一个 OpenCode,后缀只用于区分来源与计费口径:· zen 模型需要 Console 余额,· go 模型受套餐额度约束。同名模型可能同时出现两条,按后缀分辨。

登录后看不到模型 ​

先确认插件正常加载并且账号已登录。模型来自公开的实时模型清单,不需要在 Console 里逐项启用。如果详情页提示目录读取失败,可以点目录卡片上的「刷新」重试;如果提示同名 dsh-opencode 路由冲突,按提示移除该配置后再登录。

模型列表和 Console 里不一致 ​

目录以两类来源的实时模型清单为全集,Console 配置只做增补、停用与能力/容量覆盖。上游新增模型需要等下一次刷新(默认 15 分钟)或在详情页手动刷新后出现。若详情页提示未应用账号覆盖,说明账号配置暂时不可读,恢复后刷新即可。

选择带 · zen 后缀的模型后没有用量胶囊或套餐额度 ​

这是预期行为。套餐额度与胶囊只对 · go 后缀的模型生效;· zen 按量模型不占用套餐额度,插件也不展示按量余额或费用。胶囊策略为 always 时会常驻显示,但展示的仍是账号的 Go 套餐数据。

调用 Zen 模型报 402、403 或地区错误 ​

  • 402 Insufficient account funds:Console 余额不足,需要在 OpenCode Console 充值后重试。
  • 403 FreeTierError:只出现在 Zen 免费模型上,只允许在 OpenCode 客户端内使用,DSH 无法调用。这类模型已在目录卡片中按「已停用」展示且不进入选择器,正常流程下不会触发;若通过历史会话残留选择到它,改用付费 Zen 模型或 · go 模型即可。
  • 403 RegionError:该模型不在当前地区可用(如 beam-free、cat-jam-free),换用其它模型即可。

这些都是上游策略,不是插件缺陷;插件不会自动重试或绕过限制。

登录后或目录刷新后模型没出现在会话里 ​

正常情况下不需要重启:插件在模型集合发生变化时会主动广播 llm/adapters-updated,客户端的模型选择器随即重新拉取目录。

若仍看到旧列表,按下面顺序排查:

  1. 选择器里少了某个刚被隐藏/移除的模型,或残留了已移除的条目:客户端把广播当作重新拉取的信号,但被移除的条目可能要等一次页面刷新才消失。刷新页面即可。
  2. 刚登录后选择器为空:确认详情页「账号」显示已登录;插件的模型列表依赖访问令牌,令牌可读时会自动出现,无需禁用/启用插件。
  3. 长时间仍是旧目录:看详情页「模型目录」的「更新于」时间,必要时点「刷新」。

用量胶囊不显示### 用量胶囊不显示 ​

检查胶囊策略:auto 在选中任意 OpenCode 模型(· go 或 · zen 后缀)时显示,选中其它供应商模型或设为 off 时完全不显示。

额度卡片显示读取失败或未订阅 ​

额度接口可能暂时不可用或被网络阻断。卡片会保留最近一次获取时间与失败原因,稍后点「刷新」重试即可,不影响已经可用的模型。账号没有 Go 订阅时显示未订阅说明,而不是 0%。

对话报认证失败 ​

账号凭据可能已失效。打开详情页的账号卡片重新登录即可;模型选择器会随登录状态更新。

登录后为什么找不到「使用 API Key 登录」 ​

这是预期行为:账号已登录时只保留退出登录入口,避免误触切换账号。需要改用 API Key 登录时,先退出登录,入口会重新出现。

同名模型怎么分别隐藏 ​

目录卡片里的显隐开关按 plan:id 保存:隐藏 zen:xxx 不会同时隐藏 go:xxx,反之亦然。按模型名后缀确认要隐藏的条目即可。

与手工配置的供应商冲突 ​

插件使用 dsh-opencode,不会与手工配置的 opencode / opencode-go 冲突。只有手工配置了同名 dsh-opencode 时才会冲突;按详情页提示移除对应配置后重试即可。

基于 VitePress 构建