安装
在 DeepSeek Harness 里通过 dsh-market 安装
dsh plugin --profile web add dshmarket
或使用命令行
dsh plugin --profile web add github:HaydenSmith1121/dsh-opencode-go-plus
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络。请先审阅源码,并尽量锁定 commit(github:owner/repo#sha)。
README
在 DeepSeek Harness 中使用 OpenCode Go 订阅模型,支持流式回复、工具调用、图片输入与额度显示。
插件自动添加 OpenCode Go 所需的会话请求头,并从网关获取可用模型目录,显示套餐剩余额度。通过 DSH 插件命令安装,无需修改 DSH 源码。
网关新上线的模型会自动适配:插件按同族已知模型克隆协议与参数,同族不存在时退到全局最接近的模型兜底(详见下文"自动适配新模型"),无需等待目录更新。
本包是
dsh-opencode-go的维护分支,针对两个会把模型静默地从列表里弄丢的场景做了修复,详见与上游的差异。支持的 harness 版本:
0.1.6-alpha.1及以后的0.1.6/0.1.7系列,以及从0.2.0-rc.1起的0.2系列(含桌面版)。不同系列用不同的设置模型,本包在运行时探测并分流,无需版本豁免; 见兼容性。
安装与使用
0.4.7 适配 Harness 桌面版 0.2.0-rc.1,修复升级后因版本范围校验而显示“异常”的问题。已安装旧版时,在插件管理器更新本插件,再确认版本为 0.4.7;无需版本豁免。
0.4.6 修复设置卡片刷新后又显示“尚未检查连接”的问题:检查结果保留在 Host 中,重新打开卡片或收到设置更新时继续显示最近结果;更换密钥、端点或启停配置后失效,需重新检查。重启 Host 后仍需重新检查。
桌面版(含 0.1.7-rc.2 / 0.2.0-rc.1)
在 插件 → 添加插件 → Git 仓库 中填写:
https://github.com/HaydenSmith1121/dsh-opencode-go-plus
0.4.1 起无需为本插件允许 @google/genai、protobufjs 的安装脚本。
OpenCode Go 使用的 OpenAI / Anthropic 协议模块已随包预编译;安装时不会再拉取完整
pi-ai 的 Google / Protobuf 依赖链,也不需要本地构建。
如果之前停在“需要允许安装脚本”,关闭旧安装任务,重新从上述仓库发起安装以获取 0.4.1 或更新版本。旧任务仍可能引用旧提交;请在安装详情里确认版本。若同一 profile 还有其他插件依赖这些包,它们的脚本提示需要单独处理。此修复不修改全局脚本策略。
配置密钥与刷新状态(0.4.2 起)
登录 OpenCode 官网不会自动连接 Harness。 OpenCode Go 使用 API Key; 请在 OpenCode 控制台 中确认 Go 订阅并复制对应密钥。 官方接入说明见 OpenCode Go。
- 在 Harness 打开 设置 → 模型 → OpenCode Go。
- 直接在卡片的 OpenCode Go API Key 输入框粘贴密钥,点击 保存并检查。 无需点上方通用“编辑”:Harness 0.1.7-rc.2 的通用编辑器暂不识别第三方插件。
- 之后可点击 刷新状态:重新读取凭据、同步模型路由、检查用量接口认证,并重新获取模型目录。 仅打开页面不会发起外网认证检查。
卡片是可折叠的:标题行左侧的箭头或整行文字都可以点开/收起;已配置密钥时会默认收成 一行状态摘要,未配置时默认展开,方便直接粘贴。状态摘要按语义着色 —— 需要处理的 (未配置 / 未验证 / 目录异常)为橙色,认证失败为红色,完全就绪为绿色。
卡片明确区分未配置、未验证、认证成功、401、403、429、网络/服务故障和目录刷新失败。 顶部红绿点只表示宿主是否存有凭据,实际连接结果请看卡片中的检查状态。 检查使用只读的用量和模型目录接口,不发送聊天请求。已有密钥不会回显;空输入不会清除密钥。 密钥通过 Harness 凭据服务保存,不写入插件配置、状态响应或浏览器本地存储。 若凭据由环境或只读来源提供,会显示不可覆盖的提示。
Web
dsh plugin --profile web add dsh-opencode-go-plus
安装后启动或重启 dsh web:
- 打开 设置 → 模型,找到 OpenCode Go 一行。
- 该行显示 API Key 状态(绿点 = 已配置)。
- 在会话的模型选择器中选择 OpenCode Go 模型。
API Key 来自你的 OpenCode Go 订阅(默认引用 OPENCODE_API_KEY)。改引用名的位置随
harness 版本不同:dsh <= 0.1.6 在 settings.yaml 的 llm-opencode-go.apiKeyEnv,
dsh >= 0.1.7 在 profile 的 cordis.patch.yml 中该 entry 的 config 里。安装插件不会
自动更改默认模型。
0.3.0 起,插件不再有独立的"设置 → OpenCode Go"分区。 配置入口就是 设置 → 模型 里的 OpenCode Go 行,与其它 provider 并列。
refreshMinutes、autoDiscover、图片预算等插件专有字段的位置同样随版本走(见上面 兼容性的表)。详见 更新日志 0.3.0。
Headless
安装到 Headless profile:
dsh plugin --profile headless add dsh-opencode-go-plus
将以下内容保存为 headless.patch.yml,选择默认模型:
- id: agent-default-model
config:
provider: opencode-go
model: deepseek-v4.1-flash
在 Bash 或 Zsh 中读取 API Key,然后运行任务:
read -s OPENCODE_API_KEY
export OPENCODE_API_KEY
dsh --profile headless --patch ./headless.patch.yml "你好"
模型 ID 须在当前网关目录中可用。Web 和 Headless 使用各自的 profile,需要分别安装插件。
与上游 dsh-opencode-go 的差异
本包以 dsh-opencode-go@0.1.2 的编译产物为基线,只改动 lib/ 内的宿主侧逻辑,UI 与协议转换保持不变。五处改动都针对同一类事故:模型明明在网关目录里,却没出现在选择器中,而且不给任何提示。
1. 与基线共存时不再拖垮整棵插件树 ★
这一条最严重,也最容易被漏掉。上游只处理了路由冲突(registerAdapter),却漏掉了第二处同样 all-or-nothing 的注册:ctx.llm.registerModelDiscovery(settingsNs, …),它以设置命名空间为键,重复注册抛 DUPLICATE_DISCOVERY。
而本包为了保证旧配置继续生效,刻意沿用了同一个设置命名空间 llm-opencode-go。于是基线包与本包装进同一个 profile 时,后加载的那个会在 discovery 这一步抛错——上游没有捕获它,错误从 loader 自身的 effect 里抛出,直接导致 dsh web 完全起不来:
Error: dsh: plugin tree failed to load: failed to apply loader entry
opencode-go-plus (dsh-opencode-go-plus):
model discovery for "llm-opencode-go" is already registered
注意受害面:挂掉的不只是 OpenCode Go,同一 profile 里其余的插件(market / trae / receipt / quota…)全部一起加载失败。
现在会在claim 路由之前先做这一步,撞车时本包静默退场(不占用路由、不挂设置页),并打一条 warn 说明原因与修法:
llm-opencode-go: model discovery for the settings namespace "llm-opencode-go"
is already registered by another plugin, so OpenCode Go Plus stays disabled in
this profile. The baseline package "dsh-opencode-go" owns both that namespace
and the "opencode-go" route and shares neither, so the two cannot coexist in one
profile; remove the other one ("dsh plugin --profile <profile> remove
dsh-opencode-go") and restart to use this package instead.
⚠️ 本包不能与
dsh-opencode-go同时安装。 两者共用设置命名空间与 provider 路由, 且谁先加载谁赢:升级时请先卸载旧包,见examples/migrate-from-fork.patch.yml。本包的退场是安静的:命令行上只会看到
dsh web正常启动,模型列表停在旧包的内容。 判断依据是同族外 ID 在不在(如grok-4.7、hy3-preview)以及模型总数比不比基线多, 不要记具体条数 —— 网关上下线模型会让它变。见常见问题。
2. opencode-go 路由被占用时不再静默放弃
ctx.llm.registerAdapter() 同样是全有或全无的:只要请求的路由已被占用就抛 DUPLICATE_ADAPTER。
上游捕获后只写一行 error 日志然后放弃,结果整个动态目录都不可用,而占位的往往是
settings.yaml 里 llm-pi-ai.providers.opencode-go 那种手工物化的静态模型表 ——
它不会自己增长,于是网关新上线的模型永远不出现。
现在会在 DUPLICATE_ADAPTER 时改注册 opencode-go-plus 路由,并打一条 warn 说明原因与修法:
llm-opencode-go: provider "opencode-go" is already registered by another adapter,
so this plugin serves "opencode-go-plus" instead. The usual cause is a model list
materialized into settings.yaml under "llm-pi-ai.providers.opencode-go"; removing
that entry lets this plugin own "opencode-go" and serve the live catalog there.
想让插件重新占用
opencode-go这个名字,删掉settings.yaml里那一段即可。 注意:不要在 dsh 的「设置 → 模型 → opencode-go」里点「获取可用模型 → 添加所选」, 那一步会把目录重新物化回settings.yaml,问题复现。
3. 全新家族的模型不再被丢弃
上游要求未知模型必须能找到同族(首词归一化后相同)的已知模型才能克隆协议与参数,
找不到就整条丢掉。网关一旦上线一个全新品牌的模型(例如 union-alpha),它就永远不出现在列表里。
现在同族缺失时改为借用全局最接近的模型:先按 token 重叠度打分,再归到目录内多数协议,
最后用 ID 长度接近度决胜。网关 /models 只返回 id/object/created/owned_by,
不含任何容量或协议信息,所以这仍然是估计值 —— 但用户能在选择器里看到它、能选中它、能改它,
而丢弃只会让人以为网关没有这个模型。猜错的参数可以在设置里用 modelOverrides 覆盖。
4. 解析结果自检日志
每次目录解析都会打一行四项计数,回答"为什么这个模型不在列表里":
llm-opencode-go: catalog resolved (curated 28, live listing 38, adapted 10, omitted 0, served 38)
curated—— 内置 pi-ai 目录 +catalogAdditions追加项live listing—— 网关/models返回的条数(失败时该行降级为 warn,并显示退回本地表)adapted—— 未知 ID 按族克隆/借用后加入的条数omitted—— 完全无法描述的 ID(现在应为 0;非 0 时会列出具体 ID 并提示用catalogAdditions补)served—— 最终出现在选择器里的条数
另有 missing 提示:目录里有、但网关已不再列出的 ID(通常是已下线)会被标注为 withheld。
5. catalogAdditions 改为可配置
上游把追加项硬编码在源码里。现在它是设置项,默认值不变,可在 设置 → OpenCode Go 里增删:
llm-opencode-go:
catalogAdditions:
- id: deepseek-v4.1-flash
siblingId: deepseek-v4-flash
inputSiblingId: deepseek-v4-flash-vision-exp
name: DeepSeek V4.1 Flash
条目必须四个字段齐全,缺一个会被忽略(不会半成品地塞进目录)。
与上游相同的部分
- 请求头:Harness User-Agent(
attributionHeaders())+x-opencode-session,字段与上游一致 - 设置命名空间仍为
llm-opencode-go,原有配置项继续生效 - 新增的设置项只有
catalogAdditions一项,其余 schema 未动 dsh.bundle/dsh.client清单未动,客户端 UI 与lib/client.js未改
自动适配新模型
网关 /models 目录只返回模型 ID,不披露协议与参数,而网关轮换模型的速度快于任何目录的发版。本插件的模型列表 = 内置适配表 ∩ 网关实时目录,再加上自动适配的未知模型:
- 家族匹配:未知 ID 按首词归族(版本号归一化,
qwen4-max与qwen3.6-plus同属qwen族),克隆同族中匹配度最高的模型的协议、兼容参数、思考档位与容量。 - 多数协议:同族协议不一致时(如 qwen 族同时存在 completions 与 messages 条目),按族内多数协议选择克隆来源。
- 视觉输入:ID 带
vision/vl/omni/multimodal的模型继承族内支持图片的同族模型的输入模态。 - 全新家族(网关和内置目录都没有同族模型):退回全局候选,按 token 重叠度 + 多数协议 + ID 长度接近度借用参数。不会再被丢弃;参数是估计值,可用
modelOverrides覆盖。 - 推断只影响该模型自身的请求,即使猜错也不影响其他模型;容量(上下文窗口等)为估计值。
- 设置页 设置 → OpenCode Go → 自动适配新模型 开关可随时关闭,恢复"仅展示已适配模型"的行为。
- 默认每 5 分钟重新解析一次实时目录(可在高级设置中调整),新模型自动出现在选择器中。
订阅用量显示
订阅额度由插件的 usage 面板显示,路径为 GET {baseURL}/usage。
兼容性
本包是预编译产物(只发布 lib/,没有源码树),无法针对每个 harness 版本重新发版。
因此它把支持的版本写进 peerDependencies,并在接口真的变了的地方运行时探测能力,
而不是相信版本号。
| dsh 版本 | 支持 | 差异 |
|---|---|---|
0.1.5-rc.3 及更早 |
不支持 | dsh-llm 还没有路由侧图片 offload API,peer 范围会拒绝 |
0.1.6-alpha.1 / alpha.2 |
支持 | 旧设置模型:SettingsProvider,插件配置是 settings.yaml 里的一个段 |
0.1.7-alpha.1 … 0.1.7-rc.2(含桌面版) |
支持 | 新设置模型:SettingsForms,插件配置是 loader entry 自己的 config |
0.2.0-rc.1 起的 0.2 系列 |
支持 | 在 0.2.0-rc.1 实测版本检查、真实模型服务、连接 RPC 和设置表单;继续使用新设置模型 |
0.2.0-rc.1 之前的 0.2.0 预发布、0.3 及以后 |
未声明 | 保留明确的版本边界,不自动放行未经验证的新系列 |
配置放在哪里,取决于 harness 版本:
dsh <= 0.1.6 |
dsh >= 0.1.7 |
|
|---|---|---|
| 配置位置 | settings.yaml 的 llm-opencode-go 段 |
profile 的 cordis.patch.yml 里 llm-opencode-go 这条 entry 的 config |
| 编辑方式 | 手改 settings.yaml,或在设置页的分区里改 |
设置页的模型行直接生成表单(改了立刻生效,不重挂插件) |
两种模型下 apply() 都走同一份代码:先试 installSection(旧),再退到
configure(新),两个都没有时打一条 warning 并在日志里说明。运行时的探测项清单见
docs/compatibility.md,各版本的实测证据见
docs/verification.md § 0.4.0 / 0.4.7。
正常情况下不需要任何"兼容性豁免"。 0.1.7 系列启动时会校验 peer 范围,而
0.3.0 的精确钉版匹配不上 0.1.7-rc.2,必须手工放行;0.4.0 把范围拆成
每列车一条后,0.1.7-rc.2 本身就落在范围内 —— 实测把 profile 的
compatibility.json 清空为 {} 后,0.1.7-rc.2 照样正常加载、模型数不变。
如果将来某个版本又落在范围外,启动器会打印放行命令;也可以手工执行:
dsh plugin --profile web allow-version dsh-opencode-go-plus@0.4.0 \
--dsh-version 0.1.7-rc.2 --accept-risk
豁免只对"这个精确的包版本 + 这个精确的运行时版本"生效,存放在
profiles/<name>/compatibility.json;dsh plugin version-exemptions 可以列出,
revoke-version 可以撤销。仅在确认过上面的差异表之后再放行。
配置
Web 用户可直接在 设置 → 模型 里找到 OpenCode Go 一行,从那里改配置。启用开关立即生效。
常见问题
从 dsh-opencode-go 升级过来,插件好像没生效
这是最常见的迁移问题,而且完全没有报错。 本包与基线包共用设置命名空间 llm-opencode-go 和 provider 路由 opencode-go,两者不能同时安装:谁先加载谁赢,后加载的那个会安静退场,dsh web 照常启动。
装完后请核对模型数量:
| 现象 | 说明 |
|---|---|
比基线多(grok-4.7、hy3-preview 等同族外 ID 也在) |
本包在服务,升级成功 |
| 与基线一样少、且缺那些 ID | 旧包还在服务,本包已退场 |
具体条数会随网关上下线模型而变(2026-09-26 实测 43,基线同期更少),所以不要记数量。
更稳的判据是只在"同族外" ID 上体现的那条差异:基线会把已知模型族之外的 ID 丢掉,
本包会把它们自动适配到最接近的同族协议上。当前这类 ID 有 grok-4.7、hy3-preview、
space-bunny-free 等(随时间变化);它们出现在列表里就是本包在服务。
插件注册路由时会写一行日志供排查,但注意它只进 harness 的内存日志环形缓冲、不打印到终端:
llm-opencode-go: route "opencode-go" registered as OpenCode Go
确认修法:
dsh plugin --profile web remove dsh-opencode-go
dsh plugin --profile web add ./dsh-opencode-go-plus-0.4.0.tgz
ctx.llm.registerModelDiscovery() 以设置命名空间为键,重复注册会抛 DUPLICATE_DISCOVERY,而它从 loader 自身的 effect 里抛出 —— 若不捕获,整棵插件树加载失败,dsh web 直接起不来,且 market / trae / receipt / quota 全部一起挂掉。本包因此选择捕获它并安静退场。
同时 ctx.logger.warn 只写入 harness 的内存日志环形缓冲,不输出到终端,所以命令行上看不到任何提示。退场原因只在日志通道里可见。
提示 opencode-go 路由已被占用
同一 profile 中只能有一个适配器提供 opencode-go 路由。如果已经通过其他插件或通用 pi-ai 配置接入 OpenCode Go,本插件会自动改用 opencode-go-plus 路由并在日志中说明,模型列表照常可用。想让插件重新占用 opencode-go,请先停用那一项配置(通常是删掉 llm-pi-ai.providers.opencode-go 那段 —— dsh <= 0.1.6 在 settings.yaml,dsh >= 0.1.7 在 profile 的 cordis.patch.yml)。
注意与上一条区分:路由被占用的原因是通用 pi-ai 配置里的静态模型表,本包会换个路由继续服务(模型数不变);而基线包被安装的原因是同名插件共存,本包会完全退场。
没有出现预期的模型
先看日志里那行 catalog resolved (...):
served比live listing少 → 看紧随其后的omitted/withheld行,那里会列出具体 IDomitted非 0 → 该 ID 无法归入任何已知族,用catalogAdditions手工补- 整行是 warn 且带"WITHOUT the live listing" → 实时目录获取失败,适配器在用本地表兜底;检查网络与设置页的模型发现
也可在高级设置中缩短"目录刷新(分钟)"让新模型更快出现。
功能说明
- 会话请求头:每次请求包含 Harness User-Agent 和
x-opencode-session。同一会话保持相同 ID,无会话 ID 的请求使用独立随机值。 - 流式与历史:支持流式输出、工具调用及历史回放,协议请求由 pi-ai 执行。
- 图片输入:支持目录中声明图片能力的模型,需要 DSH attachment 服务。
- 提示与缓存:插件不增加隐藏系统提示;会话 ID 用于网关路由。
卸载
从对应 profile 移除插件,再重启应用:
dsh plugin --profile web remove dsh-opencode-go-plus
# 或
dsh plugin --profile headless remove dsh-opencode-go-plus
更新日志
0.4.7
- 为所有 Harness peer 和
dsh-brand增加>=0.2.0-rc.1 <0.3.0-0范围,保留0.1.6/0.1.7支持。 - 修复 Harness
0.2.0-rc.1将插件判定为incompatible-version的问题,无需修改宿主或添加豁免。 - 增加真实启动器版本校验、LLM 路由生命周期和设置表单回归测试;具体验证范围见
docs/verification.md。
0.4.4
修复 OpenCode Go 模型加载时报 Cannot read properties of undefined (reading 'filter')。
预编译协议模块在冷启动时可能遗漏思考档位列表的初始化,导致 V4.1 Flash 等支持思考的模型 无法加载或发起请求。现在从固定版本的模型实现直接构建所需工具,确保首次使用前完成初始化。 新增独立进程回归测试,覆盖尚未加载任何协议模块时读取思考档位的场景。
已通过 29 项协议、连接及宿主测试,并通过插件实测 deepseek-v4.1-flash 返回回复。
桌面版更新后请完全退出并重新打开 Harness,然后在 OpenCode Go 分组下选择模型。
0.4.3
- 修复卡片一直停在“正在读取状态…”且密钥粘贴不进输入框的问题:输入框原先在 还没拿到状态时被禁用,首次状态读取一失败就永远禁着。现在只有凭据只读或正在保存时 才禁用,状态读取带 15 秒超时和退避重试,且只在从未拿到过状态时重试。
- 修复卡片无法折叠的问题并重排视觉:改为可折叠标题行(已配置默认收起), 状态行按语义着色,并去掉与标题行重复的状态块。
- 状态字段缺失、凭据库读不到时不再整块白掉卡片,而是给出可操作的状态。
0.4.2
- 修复 0.1.7-rc.2 中 OpenCode Go 通用编辑区只有提示、没有密钥输入框的问题:
通过官方
settings.models.provider-card扩展槽在原模型卡片内提供配置入口。 - 新增“保存并检查”和“刷新状态”,区分凭据存在与认证成功;官网登录不会被误报为已配置。
- 手动刷新同步路由并绕过模型目录缓存,凭据变更期间的旧验证结果会被丢弃。
- 修复用量指示器在
opencode-go-plus备用路由下不显示的问题。 - 保留 0.4.1 的无安装脚本依赖方案。新增界面针对本机 0.1.7-rc.2 验证;旧版没有 provider-card 扩展槽时不会注册此卡片,仍可使用原来的凭据配置方式。
0.4.1
- 修复桌面版安装时由完整
pi-ai依赖链引发的@google/genai/protobufjs脚本授权提示;仅预打包本插件使用的三种协议和 OpenCode Go 模型目录。 - 保留模型自动发现、流式响应以及 0.1.6 / 0.1.7 的宿主兼容逻辑。
pi-ai只作为公共 TypeScript 声明所用的可选 peer,运行时不再导入或安装它。 开发者若直接消费本包的类型,可在开发环境自行安装@earendil-works/pi-ai@0.85.1。- 增加离线流式协议回归测试、维护者重建入口和第三方许可清单。
0.4.0
适配 0.1.7 系列(含桌面版 0.1.7-rc.2)的新设置模型,同时在 0.1.6 上保持原行为。
0.3.0 只支持一列车,用精确钉版 peerDependencies 把话说死。0.1.7 换了设置服务,
钉版既匹配不上新版本、也不能表达"两列车都支持",所以这次把兼容性做成结构性的:
范围放宽 + 运行时探测 + 在真正变了的接口上分流。
| 层 | 改动 |
|---|---|
package.json |
版本 0.3.0 → 0.4.0;每个 @deepseek-ai/dsh* peer 拆成每列车一条 >=0.1.6-alpha.1 <0.2.0-0 || >=0.1.7-alpha.0 <0.2.0-0;schemastery 从依赖(精确 3.18.2)改为 peer;dsh-brand 从 peer 改为依赖 |
lib/index.js |
设置注入分两条路(installSection / configure);配置 schema 的 volatile 按设置模块判定;读配置统一走 .get() 投影;多处加能力探测 |
cordis.patch.yml |
bundle entry id 从 opencode-go-plus 改为 llm-opencode-go,与新设置模型的"按 entry id 取配置"对齐(旧模型下这个值本来就是命名空间,两个模型因此共用同一个字符串) |
docs/compatibility.md、scripts/compat-check.mjs |
新增:支持矩阵与判据记录、导入面审计脚本 |
为什么 peer 范围要拆成两段。 dsh 启动器用
semver.satisfies(runtime, range, { includePrerelease: true }) 求值,预发布参与匹配,
一段就够;但 npm / pnpm 自己的 peer 报告走常规 semver 规则 —— 带预发布标签的版本只有在
比较符同样带该 major.minor.patch 的预发布时才满足。>=0.1.6-alpha.1 <0.2.0 和 *
在常规规则下都匹配不上 0.1.7-rc.2,所以每列车各写一条,让两个读者都说真话。
上界用 <0.2.0-0:预发布放开后 <0.2.0 会放进 0.2.0-rc.1。
为什么 schemastery 变成 peer。 它原本是精确钉在 3.18.2 的依赖。依赖会在
harness 那份旁边再装一份,插件连到哪份就成了包管理器的性质,而不是运行中 harness 的
性质 —— 下面这个探测就会报告"那份副本"的能力,而不是宿主的。改成 peer 后它解析到
宿主自己的那份,探测的结论才真的关于宿主。
踩到的坑,记在这里免得下次再踩: volatile 字段的第一个版本是探
typeof schema.volatile === "function",理由是 volatile() 在 0.1.6 要的 3.18.2
之后才加。这个理由本身是错的 —— 0.1.6-alpha.2 和 0.1.7-rc.2 都解析到
schemastery@3.18.4,所以在 0.1.6 上探测也返回"有",字段被包成 volatile,
SettingsProvider.register() 随即拒绝它的 base
(ValidationError {"path":["enabled"]}),设置段静默消失而路由照常工作——很难发现。
现在判据是设置模块本身:它到 0.1.6 导出 SettingsProvider,从 0.1.7 起导出
SettingsForms。
实测(2026-09-26,两列车各起一次隔离 profile): 两边的设置命名空间、可配置
provider 目录行(opencode-go-plus<-llm-opencode-go[])、路由注册(都是 opencode-go
而非兜底的 opencode-go-plus)、模型数(43,同样的前三个 ID)与日志行全部一致。
compatibility.json 清空为 {} 后 0.1.7-rc.2 依然正常加载 —— 也就是说
0.3.0 时代那个必须手写的兼容性豁免,不再需要了。细节见
docs/verification.md § 0.4.0。
0.3.0
变更:配置入口从独立的"设置 → OpenCode Go"分区,迁到"设置 → 模型"里的 OpenCode Go 行。
此前插件的 Web 配置面是自己在设置侧边栏注册的一个分区,而"设置 → 模型"页面同时
又会从 llm-pi-ai 的 provider 目录里画出一行 OpenCode Go —— 同一个 provider 两个
入口,其中一个还管不了另一个。0.3.0 把这两处合并成一处:
| 层 | 改动 |
|---|---|
lib/index.js |
apply() 新增 ctx.llm.registerConfigurableProviders(...),把本路由登记进可配置 provider 目录 |
lib/client.js |
删除 settings.section 注册、喂它的 settings scope、以及刷新凭据徽标的 effect;会话输入区的额度 pill 保持不变 |
package.json |
dsh.client.inject 去掉 @deepseek-ai/dsh-client-ui-settings,该包也不再是 peer |
这一行登记在 opencode-go-plus 这个路由上,这是刻意的。 provider 目录拒绝重复
声明,而 opencode-go 已经被 @deepseek-ai/dsh-llm-pi-ai 声明了(它内置的
pi-ai 目录里就有同名路由)。在插件里再声明一次不是"这行不显示"这么轻 ——
registerConfigurableProviders 抛 DUPLICATE_DIRECTORY,异常从 apply() 里逸出,
后面所有语句都不再执行:路由不注册、设置段不安装,插件彻底失效。opencode-go-plus
在目录里是空的,而且它本来就是 opencode-go 被占用时本包实际服务的路由。
行内提供什么:显示名、路由、以及模型页自己的凭据绿点/红点(它读的是本段
apiKeyEnv,也就是插件真正在用的那把 key)。"编辑"卡片里是通用凭据字段,
llm-opencode-go 的其余字段(refreshMinutes、autoDiscover、图片预算、
catalogAdditions)按模型页的既定提示留在 settings.yaml 里手改,不做半吊子编辑。
0.2.1
修复:浏览器端插件加载失败 / 整个 Web 界面白屏。
0.2.0 的 lib/client.js 是从上游包 dsh-opencode-go 的源码编译的,包名改成
dsh-opencode-go-plus 后,脚本内硬编码的客户端模块注册 id 没有跟着改:
// 0.2.0(错)
window.__ModuleLoader__.load({ id: "dsh-opencode-go", factory: ... })
// 0.2.1(对)
window.__ModuleLoader__.load({ id: "dsh-opencode-go-plus", factory: ... })
dsh 的客户端模块系统按下发的启动图条目 id 校验注册结果
(dsh-client-modules 的 arrive():bundle loaded without registering "<id>"),
id 不匹配时宿主会重放该脚本兜底,脚本第二次执行撞上已注册的
@deepseek-ai/dsh-api-gateway,抛出
duplicate factory registration for "@deepseek-ai/dsh-api-gateway",
并连带报 dsh-opencode-go-plus: import failed —— 表现为启动后只看到
「Failed to load plugins」白屏。
影响范围:仅 0.2.0。服务端(lib/index.js)不受影响,本包在 dsh 插件树里的
装配一直是正常的。
未改动的部分:脚本内的 CSS 作用域符号(dsh-opencode-go/Section.module.css)
与跨进程用量查询的 typert 符号(dsh-opencode-go#GoUsage、
dsh-opencode-go#opencodeGoUsage/read)保持原值 —— 后者必须与服务端 lib/index.js
成对匹配,且沿用旧符号以兼容既有配置。
0.2.0
首个 dsh-opencode-go-plus 版本:从 Duskriver/dsh-opencode-go 派生,
在同族适配器已占用 opencode-go 路由时仍保持模型目录可达,
并支持目录中未见过的新模型族。
来源与许可
本包是 Duskriver/dsh-opencode-go 的分支,
其适配器、设置 UI 与 src/conversion/{context,stream,replay}.ts 派生自
DeepSeek Harness,均为 MIT。
上游版权归各自作者所有;本分支新增的改动见 docs/derivation.md。
反馈
本分支的问题请提到 https://github.com/HaydenSmith1121/dsh-plugins/issues。
许可证
评论
评论存放在 GitHub Discussions。用 GitHub 账号登录后可发表评论或点表情。