dsh-error-doctor:一条命令顶一下已安装 DSH 的 403 额度判序

前言

DSH 的适配器把 403 并进了鉴权那一支,排在额度判定之前。于是”免费额度用完即停”这类失败在界面上只说密钥有问题,原始原因看不见。这类失败不能靠重启、换密钥或者看日志解决,得先知道你这台机器上装的产物到底把 403 判成了什么。

下面介绍 mengge237 维护的插件 dsh-error-doctor(分类:客户端,0 星,MIT,个人项目,与上游 DSH 无关)。它只回答一个问题:你现在的产物判成了什么。它不替你改代码。

这是什么

一句话定位:对已安装的 DSH 做只读体检,判断 403 的额度类回包会被判成 QUOTA 还是 AUTH,用退出码给结论。

它修补的是诊断方式,不是 DSH 本身。上游 0.1.7-rc.1 的产物里 403 仍排在额度判定之前,同一形状在上游被报过 #3222 / #5715 / #3073 / #1127 / #1631。社区里已有的做法是”读源码看 403 与额度判定谁先出现”,这个插件的作者第一版就是这么写的,实测连错三次(下面一节说明原因)。

核心功能

判断逻辑不是静态扫源码,而是把已安装产物里的 classifyPiAiError、httpErrorCode(0.1.7 线叫 providerError,会把判定链抠进同名壳子)连同 isQuotaExceededError 一起抠出来,喂一条真实的 403 额度报文,看它返回 QUOTA 还是 AUTH。不认注释、不认行号、不认版本,别人打的补丁照样认得出。

全程只读:不写文件、不发网络请求、不碰会话存档、不读密钥。

判不出的形状一律退出码 2 并说明原因,不给绿色结论。实证过的形状:0.1.5-rc.2 的 httpErrorCode、0.1.7-alpha.2 与 0.1.7-rc.1 的 providerError。上游再改形状它会拒绝判断,而不是给一个假结论。

安装与启用

当插件装,也就是给 agent 一个工具面:

dsh plugin --profile web add dsh-error-doctor      # 装完要完全重启 dsh web
dsh plugin --profile web remove dsh-error-doctor

工具名 dsh_error_doctor,参数只有可选的 root。

当库用:

import { findRoot, probeInstall } from "dsh-error-doctor";
import { toolConfig } from "dsh-error-doctor/plugin-config";

plugin-config 不 import 任何宿主包,所以能在没有 DSH 的机器上测。

依赖方面有两点来自作者实测的记录:宿主包 @deepseek-ai/dsh-tools 只能从 profile 树内解析到,所以 lib/index.js 走动态 import 且失败即降级——解析不到就留一条 warn、不注册工具、CLI 照常可用。要工具面就用包安装,别用 link: 把仓库原地链进插件树,静态 import 会把整棵插件树带崩(cordis include 那类失败法)。

典型用法

跑 CLI,它自己从 PATH 找 DSH 安装目录:

node bin/dsh-error-doctor.mjs

机器可读输出加 --json:

node bin/dsh-error-doctor.mjs --json

输出顺序是:先报 DSH 安装路径与版本,再逐个站点给出 403 额度报文被判成 QUOTA 还是 AUTH,最后一行给结论。退出码就是判据:

码 意思
0 两处都已修(额度判定在前)
1 两处都还是出厂形状——多半是升级把补丁静默冲掉了
2 读不出来或两边不一致:别硬打补丁,先核对版本

跑测试不需要装 DSH,夹具由 test/make-tree.mjs 在临时目录合成(两种形状的假装机树),仓库里不放上游产物副本:

npm test        # 9 例:体检 4 例 + 插件面 5 例

其中两例值得留意:一例专门钉”跑完探针之后产物字节不变”,一例钉”读不出来必须报错、不给绿色结论”。

判据为什么不看源码

这一节是这个插件最值钱的部分,也是它区别于”自己 grep 一下”的地方。作者按”源码里 403 与额度判定谁先出现”写的第一版,实测连错三次:

  1. 补丁自己的注释里写着 …then 403,静态扫字符串把已修的产物读成没修;
  2. 有一类正确修法是把额度判定放进 403 分支内部,if (status === 403) { if (isQuota(...)) return QUOTA; … } —— 文字上 403 在前,语义上已经修好;
  3. 同一个产物文件里还有另一处 status === 401 || status === 403,那是 Files API 的错误构造器,与分类无关;”取文件里第一个匹配”会直接改错地方(造对照夹具时真踩了)。

所以现在还有用运行期探针喂真实报文的做法,而不是文本匹配。

适用场景与注意

适合已经在用 DSH、遇到过”密钥无效”提示但不确定是密钥问题还是额度问题的开发者。也适合给 agent 挂一个体检工具,让它自己判断环境状态。

注意事项:

  • 插件以当前 dsh 进程权限运行,安装前应检查源码与许可证(MIT)。
  • DSH 升级会覆盖安装目录,补丁消失是不打日志、不报错的。所以”最近还能用”不算证据,跑一次这条命令才算。
  • 不要跳过退出码 2 的情况直接打补丁,先核对版本;读不出来时降噪结论本身就是错的。
  • 这是个人项目,与上游无关,上游 issue 里报的问题不等于它已经解决。

结尾

这个插件的价值不在于提供又一条诊断命令,而在于它选择的判断方式:不读源码文本,喂真实报文看返回。对”升级会静默覆盖安装目录”这个前提,它把”最近还能用”这种弱证据换成可复现的退出码,代价是跑一条命令。目录:https://www.skillhub.cn/plugins/mengge237/dsh-error-doctor ,源码:https://github.com/mengge237/dsh-error-doctor 。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜