Repository navigation
Releases
dsh-model-surplus v0.4.6 — 文档重构
dsh-model-surplus v0.4.5
审计收尾:把上一轮列出的剩余项处理掉。
修的内容
- dsh-keys-setting:共享
<style>不再由实例的 disposer 移除(第二个实例会跳过注入,第一个实例的
disposer 却把它删掉 → 行样式丢失到下次刷新);把「settings.yaml 是文档化配置路径」的过时注释改对;
引擎默认值改用宿主返回的defaults(此前state.defaults写了没人读,UI 用的是另一份硬编码常量,
两边会漂移)。 - dsh-model-surplus:
toIsoOrNull真正支持秒级时间戳(文档早就这么写,代码没实现 → 一旦上游改用
秒,所有重置时间会显示成 1970 且没有任何报错);删掉limitTooltip里两个分支完全相同的三元;
UA 不再写死版本号(此前写 0.3.1,包已经是 0.4.x);给「pending 占位」补上说明它为何存在。 - dsh-gateway-models:
debugFile允许列表按引擎的方式解析 home(非空$DSH_HOME,否则~/.dsh)
—— 之前只读环境变量,而引擎从不设置它,于是文档化的<home>/logs/...被拒、<cwd>/logs/...反被接受;
重复了两次的 header-source 表达式抽成一个函数;补上「路由级 api/baseURL 会盖过每个模型自己的值」这个
事实的说明(这条是刻意保留的行为,见下)。 - 测试完整性:两个插件测试里未
await的check(...)补上(汇总数字此前少算,且未来异步断言会丢)。
一条我改了又改回去的(重要)
审计建议把 planRouteUpdate 写 baseURL 的条件收紧到「列表里所有模型都不在目录中」。我照做后发现
本插件自己的 V4.1 条目不带 baseUrl,而引擎只从目录条目解析 base?.baseUrl —— 目录里没有的模型
就只剩「路由级 baseURL」这一个来源。收紧后,混合路由上的 V4.1 模型会被引擎静默丢弃,正是这个插件
存在的意义。所以恢复原判据,并把取舍写进注释:路由级 api/baseURL 会盖过目录里各模型自己的值,
这在引擎提供不了「按模型」开关的前提下无法两全 —— 不写就丢模型,写了就改协议。
(引擎侧优先级已在源码核实:baseUrl = request.baseURL ?? base?.baseUrl ?? providerBaseUrl,
api = request.api ?? base?.api ?? routeApi,其中 request 是路由层。)
dsh-model-surplus v0.4.4 — 审计修复
审计修复版。详见 GUI 仓库同批次提交(含逐条证据)。
要点:Command Code 半边此前因未定义标识符整条死掉;V4.1 守卫读错层,会给从没配置过该路由的
用户写入 30 条模型列表;会话头补丁在认不出目标主机时失败开放;未设 \ 时把缓存写进
当前工作目录。
dsh-model-surplus v0.4.3 — 让「未配置密钥」的修复真正生效
修的是「上一版没真正生效」这件事
上一版(0.4.1)修了 Command Code 余量显示「未配置密钥」的问题:让插件跟着路由自己声明的
apiKeyEnv 找密钥,而不是用写死的名字。
但那条修复读配置用的是 settings.get('llm-pi-ai') —— 而引擎 0.2.0-rc.2 已经把 settings
服务换成了 SettingsForms,get() / section() / register() 全部移除。这个调用抛 TypeError,
又正好包在 try/catch 里,于是静默退回写死的名字:
也就是说:在 0.2.0 上,「未配置密钥」的修复并没有生效,而且没有任何报错。
修法
改为从 settings.describe() 取该 entry 的 value(引擎解析后的配置 = base + user),
并把这段查找抽成纯函数 credentialRoutesFrom() 加以测试 —— 形状一变就该测试红,
而不是让余量显示悄悄退化。
环境要求
- DSH ≥ 0.2.0-rc.2
- Node ≥ 20
- 零运行时依赖
安装 / 升级
dsh plugin --profile web add github:itchenshi/dsh-model-surplus或本 Release 的 tarball(dsh-model-surplus-0.4.3.tgz)。
用 DSH Ready GUI:随包版本已抬高到 0.4.3,下次启动 GUI 会自动换过来。
验证
- 本仓库
npm test:34 项通过(新增credentialRoutesFrom用例,含各种异常形状
必须返回 null 而不是抛错) - GUI 侧
verify:builtin:/model-usage仍为 401(插件本身一直在正常运行,
受影响的是它内部读密钥名的那一步)
dsh-model-surplus v0.4.2 — DSH 兼容性声明(范围 + 在跑的引擎版本)
只改清单元数据:把 DSH 兼容性声明补成「范围 + 在跑的引擎版本」
DSH STORE 的固定 commit 自动检查对同类插件报过一条
「DSH compatibility is not explicitly declared」。查下来原因是清单里只写了:
"dshReleases": { "0.1.5-rc.2": "compatible" }而本插件实际跑的引擎是 0.2.0-rc.2 —— 也就是说,清单里没有任何一条声明对应
「正在被审查的那个引擎版本」。
现在改为:
"compatibility": {
"node": ">=20",
"dsh": ">=0.1.5-rc.2",
"dshReleases": { "0.1.5-rc.2": "compatible", "0.2.0-rc.2": "compatible" }
}dsh是范围(商城建议的写法):>=0.1.5-rc.2语义上覆盖 0.2.0-rc.2 及之后;dshReleases是逐版本证据,两端都有实测:0.1.5-rc.2 是此前长期在跑的引擎,
0.2.0-rc.2 是现在在跑的(verify:builtin第 4 幕就是在它上面启动引擎、四个插件
都在 bundle 列表里、ALL CHECKS PASSED)。不是猜的。
运行时代码一行没动,行为与前一版完全一致。版本号照常抬高,是为了让「声明的兼容范围」
能对应到一个确定的版本 —— 同版本改内容会让这个声明无从归属。
本插件的能力边界(便于静态审查)
- 运行时依赖:无(
dependencies为空)。 - 凭据 / 命令 / 原生制品 / 生命周期脚本:无。
- 详见 README 的「权限与边界」一节。
安装
dsh plugin --profile web add github:itchenshi/dsh-model-surplus或本 Release 的 tarball(dsh-model-surplus-0.4.2.tgz)。
dsh-model-surplus v0.4.1 — 跟着路由解析密钥(修「未配置密钥」)
修一个会让人以为「插件没装好」的 bug
症状:切到另一个数据目录(例如把数据目录改成「跟随系统」)后,即使卸载再重装本插件,
会话标题旁也不显示 Command Code 的余量,而是显示 「未配置密钥」。
原因:插件找密钥用的是写死的名字 COMMANDCODE_GOAT_API_KEY(当年那条路由叫
commandcode-goat)。而引擎是按路由自己声明的 apiKeyEnv 取密钥的 —— 换了数据目录之后,
路由名变成了 commandcode(这正是本插件自己的补丁声明的名字),GUI 给这个路由推导出的密钥名是
COMMANDCODE_API_KEY。
于是同一个密钥:聊天完全正常(引擎按路由取到了),余量却报「未配置密钥」(插件按写死的
名字去找,找不到)。重装插件没用 —— 那个名字在插件默认值里,不在你的配置里。
修法:插件现在跟着路由走 —— 先读该路由自己声明的 apiKeyEnv,找不到才回退到插件里那个
默认名。这样它和引擎用的是同一个名字,不可能再出现「聊天能用、余量说没密钥」的分歧。
三个分区(OpenCode Go / Command Code / DeepSeek)都受益:任何路由只要自己声明了
apiKeyEnv,插件就会照着用。找不到密钥时的诊断也更准了 —— 现在会列出它找过的所有名字。
实测(真实 ~/.dsh 数据):
路由: commandcode apiKeyEnv=COMMANDCODE_API_KEY (默认模型就是它)
查找顺序: HIT COMMANDCODE_API_KEY → miss COMMANDCODE_GOAT_API_KEY
额度接口: HTTP 200 credits=63.10 windows=yes
安装
# 推荐:直接从 GitHub 装(记进 profile,之后可跟着更新)
dsh plugin --profile web add github:itchenshi/dsh-model-surplus
# 备选:本 Release 的 tarball(git 协议走不通、但 HTTPS 能通时用这条)
dsh plugin --profile web add https://github.com/itchenshi/dsh-model-surplus/releases/download/v0.4.1/dsh-model-surplus-0.4.1.tar.gz升级
- 用 DSH Ready GUI:随包版本已抬高到 0.4.1,下次启动 GUI 时会自动重装,不需要手动操作。
- 自己装的:按上面任一命令重装即可。
验证
npm test:33 项通过(新增 credentialRefsFor 的用例,覆盖「路由名优先、默认名兜底、
多个候选去重、没有 settings 服务时的回退」等)。
dsh-model-surplus v0.4.0 — 新增 Command Code 用量
新增:Command Code 用量
在会话标题右侧显示 Command Code 的 5 小时 / 周窗口百分比 + 剩余额度,用 Command Code 模型时自动出现。
- 查的是额度接口(
/alpha/billing/credits),不是聊天接口。你baseUrl里若还带着聊天地址的
/provider/v1,插件会自动剥掉再查。 - 响应体形状按实测校正:
credits与windowLimits在返回体上是平级的,不是嵌套。
此前照第三方实现的内部包装结构写成了嵌套,实际会让解析拿到 null、界面静默显示「用量不可用」
—— 这个错误是用真实 key 打接口验证时才抓到的。 - 不显示「月度百分比」:接口给的是它实际执行的两个窗口(5 小时、周)的已用 / 上限,以及剩余额度;
它没有给出套餐的月度总额度。要有月度百分比就得内置一张档位表去猜,所以不做。 - 密钥全程只在宿主端通过
ctx.credentials读取,不下发到浏览器。
其它
- README 安装段的兜底说明原先写「网络受限连不上 github.com 时用这条」,但链接本身就在 github.com 上,
自相矛盾;改为「git 协议走不通、但 HTTPS 能通时用这条」。
安装
# 推荐:直接从 GitHub 装(记进 profile,之后可跟着更新)
dsh plugin --profile web add github:itchenshi/dsh-model-surplus
# 备选:本 Release 的 tarball(git 协议走不通、但 HTTPS 能通时用这条)
dsh plugin --profile web add https://github.com/itchenshi/dsh-model-surplus/releases/download/v0.4.0/dsh-model-surplus-0.4.0.tar.gz兼容
三个分区(OpenCode Go / Command Code / DeepSeek)各自独立上报结果:只配了其中一个密钥,
另外两半照样能用,缺的那半显示一条原因(no-key / unauthorized / network / timeout /
bad-payload),而不是把整个小组件藏起来。
验证
npm test:32 项通过(含真实响应体形状、嵌套兜底、聊天路径剥离、公开目录不带凭据)。
dsh-model-surplus v0.3.2
Shows the active model's usage and remaining balance in the session header.
- OpenCode Go models: plan usage (rolling / weekly / monthly) with the selected model's monthly cap
- DeepSeek models: account balance (total / granted / topped-up)
- Switches automatically with the active model selection
- API keys are read server-side only and never reach the browser
Note: the OpenCode Go usage endpoint reports per account and ignores per-model parameters, while the documented per-model monthly cap has no API. The plugin parses the public docs page and caches it, falling back to a built-in table.
Install: dsh plugin --profile web add github:itchenshi/dsh-model-surplus