dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
把 Qoder 的模型额度原生接进 DeepSeek Harness (DSH)。当前版本 1.3.0。
这是一个纯 DSH 插件:没有本地桥进程,没有第二个端口,没有独立控制台。凭据读取、COSY 签名、模型目录、流式转发和设置面板都在 DSH 插件进程内完成。
非官方互操作性实现,只使用你自己合法授权的 Qoder 账号。上游协议可能随时变化。
ctx.llm.registerAdapter(['qoder'], adapter) 接入,模型直接出现在 DSH 选择器里。截图使用离线演示数据,不含真实账号信息;主题和窄屏布局跟随 DSH。
在 DSH 0.2.1-rc.3 实测(desktop profile,真实账号):
pong,reasoning-delta → text-delta → usage → finish(stop) 完整;llm 服务以 provider=qoder 派发请求也返回 pong,模型选择器这条路径真实可用;Messages with role 'tool'...;context_config 显示 200K / 400K / 1M 档位,选中的值会写回请求的 model_config.max_input_tokens;billable: false 请求不计入实扣,只显示为“已省”;/qoder 命令注册成功,19 条面板数据路由挂载成功;color-scheme;tests/live-adapter.mjs 是协议层实机回归;tests/verify-install.mjs(npm run verify)是安装面自检;tests/plugin-host.test.mjs 用假的 DSH 服务加载真实插件入口,覆盖路由、工具、命令、偏好持久化与未登录保护,不联网。开发时另用本地离线渲染 harness 逐页截图,检查明暗主题、窄屏、失败态、参数保存、试跑取消、键盘与触控。
装包 ≠ 启用。 只写进 profile 的dependencies时,DSH 不会加载插件,也不会报错;必须同时出现在dsh.profile.bundles里。
三种安装形态,按使用场景选一种。
A. Release 的 tgz(多数人用这个)
从 Releases 下载 qoder-to-dsh-.tgz,在下载目录执行:
dsh plugin --profile desktop add ./qoder-to-dsh-1.3.0.tgz正文里带该资产的 SHA-256,可以先核对再装。也可以在 DSH 里让 agent 直接按 URL 装:
plugin_manager { action: "install_bundle", target: "https://github.com/Ianzhyh/qoder-to-dsh/releases/download/v1.3.0/qoder-to-dsh-1.3.0.tgz" }B. GitHub 直装(不落地文件)
dsh plugin --profile desktop add github:Ianzhyh/qoder-to-dshC. 本地目录 link(改代码时用)
dsh plugin --profile desktop add link:/absolute/path/to/qoder-to-dsh或在 DSH 里让 agent 执行 plugin_manager 的 install_bundle,target 传包的绝对目录。
装完确认 profile 的 package.json 里同时有依赖和 bundle 选择:
{
"dependencies": { "qoder-to-dsh": "link:/absolute/path/to/qoder-to-dsh" },
"dsh": {
"profile": {
"bundles": ["@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "qoder-to-dsh"]
}
}
}用 A / B 安装时,dependencies 的值是版本号或 github: 规格,不是 link:,其余不变。
装完自检(只读,不会改动状态;需在仓库目录里执行):
npm run verify # 连运行中的 dsh 一起检查
npm run verify -- --offline # 只看文件和 profile 配置它会检查「装包 ≠ 启用」、link: 是否指向本仓库、patch 里的 name 是否与包名一致、provider 是否注册、模型目录是否为空。任一项 FAIL 就退出码 1。
最后完全退出 DSH 再打开(托盘退出;插件在宿主启动时加载,只重开面板不会换掉已加载的代码)。
基线:dsh ≥ 0.2.1-rc.3(本项目实测与发版验证使用的版本)。更老的宿主可能没有registerAdapter或面板webServer.register。
/qoder,升级不会清空。/qoder 作为备份。qoder-to-dsh(或从 profile 的 dependencies / dsh.profile.bundles 删掉),然后完全退出 dsh。删除 /qoder 会同时清除本机凭据、偏好、签到与用量记录。打开 设置 → Qoder。首次使用会自动只读扫描本机 Qoder 桌面端 / CLI 的登录态:
凭据保存到 /qoder/auth.json:Windows 上用 DPAPI 加密;其他平台退回 AES-256-GCM + 本机 0600 密钥文件。
在 DSH 模型选择器里选择任意 Qoder 模型。默认 provider 名是 qoder,模型 id 就是上游 key(例如 qmodel_38max、auto、dmodel)。
/qoder status
/qoder models
/qoder usage
/qoder checkin [run]
/qoder diagnose
/qoder refresh
/qoder test [model]
/qoder login
/qoder logout模型选择器里可以直接看到每个模型的思考档位(low/medium/xhigh 等)、上下文、图片能力和价格倍率。
settings.yaml,不改 DSH 的模型路由配置。TIMEOUT 结束,不会无限挂起。attachments.readImage 转 data URL,交给支持视觉的模型。/algo/api/v2/model/list;有缓存先展示、过期后台刷新,显式刷新仍等待上游;解析 context_config、thinking_config、price_factor 与谷时折扣;面板显示 200K / 400K / 1M 上下文档位、输出默认值、促销与官方标记。temperature,由上游决定。保存后写进 prefs.json,DSH 下一次 listModels / stream 就使用新值,可一键恢复官方默认。drt- / jrt- / PAT 交换)。plan 与 quota,显示套餐、加量包、剩余 / 总量、已用比例和到期时间;概览首屏就是额度卡,额度用尽会标红。对话页顶部胶囊也显示当前账号额度,而不是次数 / tokens。runtime-info 设备身份,查询 campaigns 并领取 CLAIM_BENEFIT;支持本机所有已登录账号、自动签到(默认开启)、手动逐账号领取,以及今日已领 / 未开放 / 无活动 / 未下发 / 缺设备 / 需登录等状态。活动每天 10:00(UTC+8)开放,DSH 运行期间对“未下发”和临时错误继续重试;缺设备或登录失效的账号当天不再空转,修好后可手动领取。非激活账号的令牌过期时会只读重读官方登录态,不拿刷新令牌去轮换官方凭据。可用 QODER_CHECKIN=0 彻底关闭自动签到。AbortSignal 传到宿主与上游,不再继续等待(上游可能已产生少量计费)。未登录时对话页胶囊可直接发起浏览器授权。prefers-reduced-motion。首屏不会在状态未返回时误报未登录,读取失败会给出就地重试而不是无限骨架;页签、下拉、分段控件和图表都有键盘路径。prepareCall 只是内存查表;组包、COSY 签名和请求体编码走 Buffer 码表,典型请求的本地开销在毫秒级。fetch 默认 4 秒空闲回收的限制;服务端主动断开时仍会正常重连。文件 · 内容 /qoder/auth.json · 加密凭据(DPAPI / AES-GCM);面板永远不返回令牌 /qoder/prefs.json · 模型显示 / 默认 / 上下文 / 参数偏好 /qoder/checkin.json · 自动签到开关、各账号最近一次签到结果(不含令牌) /qoder/usage.json · 最多 5000 条请求明细(不含 prompt / 回复;含实扣与已省 Credits、账号尾号) /qoder/usage.daily.json · 每日用量汇总,覆盖近 12 个月热力图;只有计数与 Credits,不存模型名、prompt 或回复 /qoder/catalog.json · 模型目录缓存 /qoder/qoder.log · 脱敏运行日志;超过 2MB 轮转为 qoder.log.1,只保留一份旧日志
安全约束:
drt- 的轮换影响官方客户端;?rescan=1 / ?refresh=1 / 诊断刷新)要求 x-qoder-panel: 1(自定义头触发 CORS 预检,挡掉跨站简单请求);这只防跨站与误触,不替代 dsh 自身的访问控制;http(s) 地址,javascript: / data: / 协议相对链接会被丢弃;/qoder test 都是真实上游请求,会计入上游 Credits;本地账本把它标成 probe 并排除在常规请求 / 热力图统计之外,但记录仍保留在明细里。只是验证链路时用最小 prompt。取消会把中断传到上游并停止等待,但已经产生的 token 仍可能被上游计入。usage.billable 为准。Qoder 对免费模型也会返回原价 credits(billable: false),这部分显示为“已省”,不计入消耗;折扣请求同样只记实扣。旧版本留下的免费模型记录会按当前目录的免费标记只读修正统计,不改写原始 usage 文件。max_input_tokens 把档位砍成 180K / 96K,已修正;选择 1M 会写回请求的 model_config.max_input_tokens。上游仍可能按账号或网关策略截断,超长上下文请以诊断页和实际响应为准。tool_calls 统一带空字符串 content(Qoder 网关不接受 null,否则会误报 Messages with role 'tool'...);带工具调用的历史也能继续复用。runtime-info 生成的设备身份,活动每天 10:00(UTC+8)后开放;平台可能调整活动或风控。自动签到默认开启,可在「签到」页关闭,或用 QODER_CHECKIN=0 禁用;DSH 没运行时不会签到。没有活动时会明确显示「无活动」或「未开放」,不会混进待领取或异常;缺设备 / 需登录的账号当天不自动重试。retryAfter 自动等待(上限 60 秒);110 日限、112 额度、430 版本门、12153 / TOKEN_EXPIRE 会话失效、内容审核和 114 试用受限不会被盲目重试;普通 401 / 403 仍会刷新一次令牌。EMPTY_RESPONSE 结束;工具名为空/不合法或参数不是完整 JSON 时会拒绝写入会话并给出可见错误。—,诊断里缺失额度是 warn;目录、额度和用量都带更新时间,用量明细会标出试跑、账号尾号与“部分历史来自每日汇总”。版本漂移会在顶部提示,需完全退出 dsh 才能换代码。firstByteTimeoutMs / streamIdleTimeoutMs 调整(0 表示不限)。超时只会停止本地等待,已经发出的上游请求仍可能产生少量 Credits。agent_chat_generation 路径;更新版 Bearer 端点存在但模型 id 体系不同,未作为默认路径。现象 · 先做什么 设置页一直 404 / 插件像没装 · 确认 profile 的 dsh.profile.bundles 里有 qoder-to-dsh,再完全退出 dsh 重开;只重开面板不会重新加载代码 升级后行为没变 · 旧代码仍在宿主进程里。托盘退出 dsh 再启动;热重载不会替换已注册的 provider 模型选择器为空 · 设置 → Qoder → 账号确认已登录;点「刷新目录」;仍为空就看诊断页的目录错误 诊断显示「凭据恢复:corrupt」 · 本地 auth.json 无法解密。不会自动切到别的账号,请重新授权;必要时删除该文件再登录 凭据加密显示「本机密钥回退」 · 当前环境的 PowerShell / DPAPI 不可用,已退回 AES-256-GCM;功能不受影响,但请确保数据目录只有本机用户可读 回复半截 / 连接中断 · 检查网络或代理;诊断页看「最近错误」;TRANSPORT / TIMEOUT 可重试,换号导致的取消需要确认当前账号后重试 额度明细 / 升级链接不可点 · 上游返回的不是绝对 http(s) 地址,已被安全过滤;这不影响额度读取 热力图与最近列表对不上 · 明细只保留 5000 条,热力图优先用每日汇总;重度使用时热力图比“最近请求”列表更完整,属于预期行为 日志太大 · 超过 2MB 自动轮转为 qoder.log.1,只保留一份;可在诊断页查看最近日志
每个版本的完整变更见 CHANGELOG.md;发布说明(含升级步骤与资产 SHA-256)见 Releases。
当前版本 1.3.0 把上游错误与完成度做成可信语义:10605 模型排队会按 retryAfter 自动等待,110 日限/430 版本门/12153 会话失效不再盲重试;只有思考内容、没有正文或工具调用时以 EMPTY_RESPONSE 结束;空工具名/非法参数会被拦下;额度为 0 或缺失时不再假绿;面板会提示版本漂移、说明参数生效范围,并给用量明细加试跑/账号/汇总标签。1.2.1 收口「静默失败与取消传播」:后台目录刷新失败会同步到面板,不再只写日志;qoder_diagnose 与诊断面板会响应宿主取消,签到在插件卸载/热重载后停止继续账号并取消在途请求。1.2.0 修「看起来成功、实际失败」与账号/用量边界:提前取消的流不再记成功、429 响应体含 credits 仍按可重试限流处理;换号/退出会取消在途请求,损坏的本地凭据不再静默切换账号;用量新增 12 个月每日汇总并把试跑单独标记,插件卸载会同步落盘;有副作用的面板 GET 需要面板头,额度链接只允许 http(s)。1.1.4 修「设置看起来生效、实际没生效」与账号切换竞态:温度现在真的写进上游参数、换号会清空模型目录、官方客户端的旧令牌不再覆盖插件刚刷新的令牌、目录响应中断不再变成未捕获异常、诊断不再被 20 秒客户端超时截断。1.1.3 修流结束、令牌刷新、换号与本地账本之间的竞态:截断的信封流不再被补成成功、并发刷新合并并隔离账号、无效 PAT 回滚、试跑取消会中止上游、目录缓存按账号隔离、清除用量不再被在途写盘复活。1.1.2 补齐面板在宿主刚启动、标签页在后台、账号刚切换时的行为。1.1.1 修掉三个「留到线上才暴露」的问题:断流被当成正常结束、不合法工具名导致整轮失败且不点名、面板请求没有超时。1.1.0 的要点是聊天 SSE 走持久连接、模型目录先返回后刷新、启动不再扫本机账号、凭据与用量异步落盘。详见 v1.3.0 发布说明、v1.2.1 发布说明、v1.2.0 发布说明、v1.1.4 发布说明、v1.1.3 发布说明、v1.1.2 发布说明、v1.1.1 发布说明 与 v1.1.0 发布说明。
npm test # 纯函数 / 流翻译 / 传输 keep-alive / 目录单飞与 SWR / 编码等价 / 用量合并写 / 登录 / 签到 / Credits / 宿主路由 / 客户端 404 与后台轮询
npm run check # 所有模块语法检查
npm run verify # 安装自检:文件 / profile / 运行态(只读)
npm run test:live # 实机回归:会真实调用一次 Qoder(消耗少量 Credits)发版用的三个脚本:
npm run release:check # 发版门禁:语法 + 全部用例 + 安装自检(--offline)
npm run pack:release # 生成 qoder-to-dsh-<version>.tgz
npm run verify:release # 校验 tgz:产物新鲜度 / 文件清单 / 双份版本号 / patch 名 / exports / locale / 文档版本 / sha256verify:release 也可以传 Release 资产 URL,直接校验已发布的那一份(只在内存里解包,不写磁盘):
npm run verify:release -- https://github.com/Ianzhyh/qoder-to-dsh/releases/download/v1.3.0/qoder-to-dsh-1.3.0.tgz第三方许可与归属信息见 NOTICE.md。
MIT。Qoder、DeepSeek Harness 及相关商标归各自所有者;本项目与官方无隶属关系。