dsh-opencode-go 要解决的不是「怎么连上 OpenCode Go」——DSH 原生就支持。它解决的是连上之后额度突然没了怎么办。原生模式只有一个账号、一条通道:5 小时窗口打满、遇到 429、或者 Key 被网关判为失效,这一轮对话就断在那里,你得手动去设置页换一个 Key,再把请求重发一遍。插件把这套动作挪进了请求执行层,位置在「你已经按下发送」和「你看到第一个字」之间。
这个位置很窄,窄到只有几百毫秒,但恰好够做一次失败判定和一次账号替换。
四类失败共用一条判定链
插件把网关侧能返回的错误归成四类,处理方式不同,但都走同一个适配器入口:
| 失败类型 | 典型触发 | 插件的动作 |
|---|---|---|
| 401 / 403 | Key 失效、被网关拒绝 | 出词前切下一个账号 |
| 429 | 短时请求过密被限流 | 切下一个账号,被拒 Key 进冷却 |
| Quota 耗尽 | 5 小时滚动、周、月窗口任一打满 | 切下一个账号 |
| 流空闲超时 | 长连接挂死、迟迟不来数据 | 由 idleWatchdog 判定并中断当前流 |
判定顺序是有讲究的:先看这一轮有没有产生任何可见输出或计费痕迹,再看账号池里有没有可用备选,最后才决定切不切。顺序颠倒就会出现「已经吐了半句话,突然换成另一个模型接着说」的情况——那比直接失败更难排查。
两个不许切换的时刻
README 里写得很明确:模型已经开始吐字,或者已经产生计费,插件不会切换。理由是避免拼接乱码和重复扣费。
这条约束决定了插件的定位:它做的是降低中断概率,不是保证请求成功。如果某次对话已经跑了两千字,主账号突然没额度,插件不会偷偷把后半段交给备用账号,而是让这一轮按原样结束。这个取舍偏保守,但对需要保留完整上下文的场景是对的——两段来自不同账号的续写,读起来可能通顺,实际推理链已经断了。
被拒的 Key 进五分钟冷宫
账号池最多 20 个,列表顺序就是优先级:第一项是当前主账号,拖拽左侧手柄调整顺序,也就是调整备用尝试的次序。切换成功的那一个会自动移到首位,成为新的主账号,同时在会话面板给一条切换提示。
被网关拒绝的 Key 会进入一个 5 分钟的内存冷却名单。作用很直接:某个账号已经明确失效,后面五分钟内不必再拿它试一遍。名单放在内存而不是落盘,是刻意的——重启即清空,避免把一次临时 429 记成永久失效,也避免了「昨天限流、今天还躲着它」这种过度保守。
凭据本身不走插件的存储:Key 直接写进 DSH 底层的凭据系统,前端界面永远不会回显明文。
一个请求头,换掉首字延迟
这是这个插件技术上最值得看的一处。OpenCode Go 网关具备会话粘性路由与上下文缓存共享能力,插件把 DSH 的对话 ID 做单向哈希(保留可读字符,必要时转为安全散列),以稳定形式放进 x-opencode-session 请求头。
结果是两件事同时发生:多轮对话始终落在同一个推理节点上;同一会话的历史前缀能持续命中网关的 Prompt Cache。缓存命中省下的不是几个 token 的钱,是首字延迟——上下文越长,差别越明显。
哈希而不是直接用原始 ID,是为了不让会话标识以明文形式出现在网关日志里。稳定性和隐私在这里是一对矛盾,单向哈希是常见的折中。
额度面板与本地账本,是两套东西
会话输入框旁边的「用量胶囊」读的是网关:5 小时滚动、每周、每月三个窗口的百分比和重置倒计时,默认每分钟静默刷新一次,页面切到后台或浏览器最小化时自动暂停轮询。它回答的是「还能用多久」。
点开胶囊底部的用量统计,看到的是本地账本:调用宿主 sessionQuery 扫描本地会话历史,按模型与峰谷时段统计 Token 与估算开销。它回答的是「这个月花在哪了」。
两者不要混为一谈。本地看板的价格元数据来自 models.dev 联网刷新,金额是按公开价格估算的,不是账单原文;峰谷双倍费率只覆盖 README 明示的时段(UTC 周一至周五 01:00–04:00、06:00–10:00)。会话正文不会为统计上传,但插件也不是完全不联网——额度查询要访问网关,价格刷新要访问 models.dev。
工程上还有两处细节
请求执行器里有一个 ImagePayloadLease,本质是图片尺寸预算池:并发请求带图时按预算排队,防止几个大图同时进来把进程内存打满。另一个是 idleWatchdog,给流式响应设空闲阈值,超过就判定挂死并中断,否则一个静默的长连接会一直占着会话。
这类细节不进功能列表,但决定了插件在真实负载下会不会莫名其妙卡住。
谁该装,谁装了会后悔
如果你的 OpenCode Go 只有一个账号、平时用量离额度上限很远、也不关心首字延迟,那么这个插件给你增加的是一个需要维护的配置面:一次安装、一次填 Key、一次重启、一个可能永远用不上的切换逻辑。原生接入已经够了。
反过来,把 OpenCode Go 当作日常主力通道、账号不止一个、或者经常在长会话里被 5 小时窗口打断的人,切换逻辑的价值是立刻能感知的——它换掉的不是成功率,是你在关键时刻手动改配置的那两分钟。
总结
这个插件的技术重心在「出词前」这三个字:失败判定、账号替换、冷却名单全部压缩在用户不可见的一小段时间里,并且明确划出了不切换的红线。它依赖 OpenCode Go 的网关协议与配额窗口,账号体系或额度策略变化时需要跟随更新(0.1.16 及更早版本就因 Provider ID 规范化让旧会话找不到模型)。同类插件的中文清单与安装形态,可以对照 DeepSeek Harness Hub 插件清单 一起看。
适合与不适合
适合:OpenCode Go 多账号用户;把该订阅当主力、常被 5 小时窗口打断的人;需要按模型核算本地开销的团队;对首字延迟敏感的长上下文对话。
不适合:不用 OpenCode Go 的人(装了等于空转);只有一个账号且用量远低于额度的人;要求请求成功率绝对兜底、不能接受「这一轮就失败」的场景;不接受金额只是估算值、必须对账到账单原文的财务流程。
标签:dsh-opencode-go、DeepSeek Harness、多账号容灾、Prompt Cache、配额监控
本文由 DeepSeek Harness Hub 自动整理,数据来源于插件详情页。