@eghrhegpe/dsh-connect-qoder

modeltested: passnpmMIT

Registers Qoder CN and international language models into DSH, fetching each model's rate automatically as it shifts with off-peak hours. It also provides a daily check-in, a usage pill and a credit lookup. Needs the Qoder login state on this machine, or one browser login.

下载量 / Downloads
3,590
依赖体积 / node_modules
103.49 MB
测试时间 / Tested
2026-11-06
DSH 版本 / Version
0.2.2-rc.1

Install

dsh plugin --profile web add @eghrhegpe/dsh-connect-qoder

Sandbox test results

StageResult
1 install✓
2 list✓
3 mount✓
4 boot—

Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).

README

<h1 align="center">dsh-connect-qoder</h1>

<p align="center"><b>把本机已登录的 Qoder 模型(国内版 / 国际版)接入 DeepSeek Harness,零配置用你的账号额度。</b></p>

<p align="center">

<a href="#安装">安装</a> ·

<a href="#工作原理">工作原理</a> ·

<a href="CHANGELOG.md">更新日志</a> ·

<a href="https://github.com/eghrhegpe/dsh-connect-qoder/issues">问题反馈</a>

</p>

<p align="center">

<a href="https://www.npmjs.com/package/@eghrhegpe/dsh-connect-qoder"><img src="https://img.shields.io/npm/v/@eghrhegpe/dsh-connect-qoder?style=flat-square&label=npm&color=cb3837" alt="npm version"></a>

<a href="https://www.npmjs.com/package/@eghrhegpe/dsh-connect-qoder"><img src="https://img.shields.io/npm/d18m/@eghrhegpe/dsh-connect-qoder?style=flat-square&label=downloads&color=cb3837" alt="npm downloads"></a>

<a href="https://github.com/eghrhegpe/dsh-connect-qoder/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/eghrhegpe/dsh-connect-qoder/ci.yml?branch=main&style=flat-square&label=tests" alt="test status"></a>

<a href="LICENSE"><img src="https://img.shields.io/github/license/eghrhegpe/dsh-connect-qoder?style=flat-square" alt="MIT license"></a>

<a href="https://github.com/eghrhegpe/dsh-connect-qoder/stargazers"><img src="https://img.shields.io/github/stars/eghrhegpe/dsh-connect-qoder?style=flat-square" alt="GitHub stars"></a>

<a href="https://dshfind.com/plugins/eghrhegpe/dsh-connect-qoder"><img src="https://dshfind.com/api/badge/eghrhegpe/dsh-connect-qoder" alt="dshfind plugin"></a>

</p>

把本机已登录的 Qoder 模型接入 DeepSeek Harness,

零配置即可在 DSH 的模型选择器里使用你的 Qoder 账号额度。

国内版 Qoder CN 与国际版 Qoder 是两个并行的 provider(qoder-cn / qoder),

装哪个就出现哪一组模型,两个都装就两组并存,各自使用自己的账号与额度。

输入框旁的用量胶囊:工具栏上的 Qoder CN · 2,222 是区域前缀加主额度剩余 Credits,

点开就是同一份用量面板——套餐内额度与剩余、今日经本客户端的请求数与 token 消耗(含缓存命中)、

7 天用量趋势,以及今日签到状态——与 Plugins 页卡片同款(同一套读数与阈值)。

名册里出现了本机此前没记过的模型时,胶囊会多出第三段 · 3 新模型(没有就不画,宽度与从前

一致),点开面板能看到名字。这个「新」的口径是本机第一次见到,不是上游的上架时间:目录里

没有这个字段,插件能证明的只有「本机上次记下的名册里没有它」。所以首次运行只播种不宣布,

只列最近 7 天内首见的,见 docs/issues/25。

工作原理

DSH PiAiAdapter(每个区域一套)
  -> 安全 loopback shim(随机端口 + 进程内随机 secret)
  -> COSY 签名 + 自定义 base64 编码
  -> 国内版 https://gateway.qoder.com.cn/
  -> 国际版 https://api3.qoder.sh/
  -> Qoder 双层包装 SSE
  -> OpenAI SSE
  -> DSH 本地执行工具并回传结果

Qoder 不是 OpenAI 兼容端点,所以需要三样东西:

1. COSY 签名头 —— 每个网关请求都带 Cosy-* 头与 Authorization: Bearer COSY.<payload>.<sig>,

签名是对 base64 负载、RSA 包装的 AES 密钥、时间戳、请求体与签名路径做 MD5。

2. 置换 base64 请求体 —— 查询串里的 Encode=1 表示 JSON 体要先 base64、再按换过的字母表

逐字符替换、最后按三分之一旋转。

3. 双层 SSE —— 每个 data: 帧是一个信封对象,它的 body 字段本身又是 JSON 字符串,

里面才是 OpenAI 风格的 chunk。

凭据来源

插件有三个凭据来源,按优先级依次尝试(桌面应用优先):

1. Qoder 桌面应用自己的登录状态(下面几段描述的解密过程)。只要它在且没过期,用的就是它:

应用运行时自己保持登录新鲜,本机没有比它更新的凭据。

2. 插件自己的设备登录。在浏览器里批准一个码,插件把换回来的可刷新令牌存进

$DSH_HOME/.qoder-auth.<region>.json。这是没装桌面端(或不想装)的机器零配置登录的路径 ——

详见 [凭据安全](#凭据安全) 与 docs/issues/21-device-login-credential-source.md。

3. 环境变量 PAT(QODERCN_PAT 等)。最后的兜底,需要用户自己到后台造一个长期令牌。

桌面端那条过期了就不算数(2026-10-20):过期的 access token 什么都干不了——每个带它签名的

请求都会被拒,这个版本本身也不会被注册(region-gate 直接按"登录已过期"跳过发布)。所以它

不再压住后面两条:插件会继续往设备登录、再往 PAT 找一条还能用的凭据。只有三条都拿不出

东西时,那条过期的桌面端登录才作为"本机真实发生过的事"被报出去,而不是被一句含糊的"没登录"

盖过去。

无论走哪一条,都不写入应用的文件:桌面端的凭据文件始终以只读方式打开。

卡片按"真正在服务这个版本的是谁"说话(2026-10-20):宿主把桌面端登录与插件自有登录并列

上报(两条凭据两种寿命,不合并),但账号卡要回答的其实只有一个问题——"这个版本登录了吗"。

所以当插件自有凭据在服务、而桌面端那条不在服务(过期、读不到、或只是环境变量 PAT 在服务)时,

这个版本读作"已登录",并配一句"当前用的是插件自有登录(浏览器登录)——不需要桌面端

客户端";此时那条"本地登录信息读不到"的红字不再出现——它描述的是桌面端,不是这个版本能不能用。

只签浏览器登录的用户也因此第一次有了「在线校验登录」按钮可点(以前按钮只在 source 有值时

出现,而插件自有登录在账号行里没有 source)。

Qoder 把登录信息放在 Chromium OSCrypt 格式的凭据文件里(v10 + nonce + 密文 + tag,AES-256-GCM)。

新版(0.3.x)的凭据直接保存在 <userData>/auth.v1.dat,旧版(0.2.x 及更早)则放在

VS Code 风格的 state.vscdb SQLite 数据库里。两种布局都支持,新版优先尝试。

密文用的密钥保存在应用的 Local State 中,由操作系统 keystore 包裹 —— Windows 上是当前用户

作用域的 DPAPI,因此同一用户下的进程都能解开它。

Node 没有内置 DPAPI 绑定,这一步交给 PowerShell,并通过临时文件交换结果(不使用管道),

这样在禁止管道 stdio 的沙箱里同样可用。

没有桌面应用登录时,可以用官方文档的 PAT 兜底:设置 QODERCN_PAT(国内版)或

QODER_PAT(国际版),插件会用它换取 job token。

平台边界:读桌面端登录态那条路径只在 Windows 成立。 解密链路是 PowerShell + DPAPI

(Crypt32.dll),src/host/ 里没有任何 macOS / Linux 解包分支——在其它平台上应用目录

找得到(应用数据根目录已按平台解析,见下),但凭据读不出来(loadCredential 返回

undefined)。非 Windows 上的失败说的是真话:runUnwrap 在 spawn 之前就判平台,

记下的是"这个版本只在 Windows 上读得到登录",而不是一条在 Mac 上显示的 Windows 路径;

账号面板的提示也随之改为指向在哪个平台都成立的路子(先「浏览器登录」,再 PAT),

而不是让一个已经装了客户端的用户去确认"客户端在不在"。

但那些平台已经不再只有 PAT 一条路:插件自己的设备登录(上面「凭据来源」的第 2 条)

不读桌面端任何东西——在浏览器里批准一次,凭据就落在本机,平台无关。所以第 1 项 keystore

从"必须补"变成"可选"。诚实的限定:设备登录这条路径只在 Windows 上真机跑过(两区各

一次授权闭环,见 [probe/qoder-device-login.mjs](probe/qoder-device-login.mjs)),它用到的

都是跨平台 API,但"在 macOS / Linux 上也确实能用"仍属下面第 2 项那类实机验证。

这不是"没有跨平台客户端",而是客户端已跨平台、插件尚未跟上:Qoder 桌面版在

macOS 12+ / Linux (.deb/.rpm) / HarmonyOS 上都有下载(qoder.com.cn/download),

但 src/host/ 只实现了 Windows 这一条解密链。缺口在两处,全部登记在

[docs/KNOWN_GAPS.md 第 6 条(跨平台凭据链未实现)](docs/KNOWN_GAPS.md):

1. OS keystore 封装(含 key 派生):Windows 走 DPAPI;macOS 需 Keychain(security),

且 Chromium 在 macOS 上对 encrypted_key 还要做 PBKDF2-HMAC-SHA1 派生("peanuts" 常量 +

1003 次迭代)——与 DPAPI 直解是两种算法,不是换个命令;Linux 需 libsecret(secret-tool)

或 Chromium 在 Linux 上的 peanuts 硬编码 key 兜底。

2. 跨平台 CI 与实机验证:GitHub Actions 的 macos / ubuntu runner 可以编译并跑单测,但

Keychain 弹窗、签名打包、secret-tool 的 D-Bus session 都得在实机或 runner 上验。

已修的两项(原缺口共四处):应用数据根目录现在按平台解析(Windows %APPDATA、

macOS ~/Library/Application Support、Linux $XDG_CONFIG_HOME/~/.config)——此前直接读

process.env.APPDATA,而该变量在 macOS 上不存在,于是探测得到空串、把"应用装着但读不出密钥"

谎报成"您没登录";MACHINE_OS 也补上了 darwin 档(本机实测过网

…(truncated)

Rendered from the README published on npm. Formatted only, not edited.

Versions

Published on npm::15,最后更新 2026-10-23

Links

GitHub · Homepage · npm

Same category