把 Qoder 模型额度接进 DSH 直接对话
30.8/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/25 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Ianzhyh/qoder-to-dsh该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · model
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 6 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 68 处,展示前 52 条)
- 读取本地文件dsh-plugin/lib/index.js:38
return String(JSON.parse(readFileSync(resolve(PACKAGE_ROOT, 'package.json'), 'utf8')).version || ''); - 发起网络请求dsh-plugin/lib/client.js:46
const res = await fetch(path, { - 写入剪贴板dsh-plugin/lib/client.js:2362
try { await navigator.clipboard.writeText(text); showNotice('ok', `${label || '内容'}已复制`); } - 读取本地文件lib/qoder-api.mjs:27
const BASE_PROMPT = JSON.parse(readFileSync(new URL('./baseprompt.json', import.meta.url), 'utf8')); - 发起网络请求lib/qoder-api.mjs:99
const res = await fetch(url, { - 发起网络请求lib/qoder-api.mjs:119
const req = https.request(url, { method, headers: { ...headers, ...(body ? { 'content-length': Buffer.byteLength(body) } : {}) } }, (res) => { - 读取本地文件lib/qoder-api.mjs:334
if (existsSync(PATHS.auth)) { - 读取本地文件lib/qoder-api.mjs:1218
if (existsSync(machinePath)) { - 读取本地文件lib/qoder-api.mjs:1219
try { machineId = readFileSync(machinePath, 'utf8').trim(); } catch { } - 读取本地文件lib/desktop-auth.mjs:29
const state = JSON.parse(readFileSync(localState, 'utf8')); - 读取本地文件lib/desktop-auth.mjs:42
if (!existsSync(localState)) return null; - 读取本地文件lib/desktop-auth.mjs:43
const state = JSON.parse(readFileSync(localState, 'utf8')); - 读取本地文件lib/desktop-auth.mjs:77
if (!existsSync(join(appDir, 'Local State'))) return; - 读取本地文件lib/desktop-auth.mjs:115
exists: existsSync(authPath), - 读取本地文件lib/desktop-auth.mjs:137
return JSON.parse(decryptV10(readFileSync(authPath), key).toString('utf8')); - 写入本地文件lib/secret-store.mjs:15
mkdirSync(dirname(path), { recursive: true }); - 执行外部命令固定命令lib/secret-store.mjs:31
const result = spawnSync('powershell.exe', [ - 读取本地文件lib/secret-store.mjs:52
if (!existsSync(PATHS.key)) { - 写入本地文件lib/secret-store.mjs:53
writeFileSync(PATHS.key, randomBytes(32), { mode: 0o600 }); - 写入本地文件lib/secret-store.mjs:54
try { chmodSync(PATHS.key, 0o600); } catch { } - 读取本地文件lib/secret-store.mjs:56
const key = readFileSync(PATHS.key); - 写入本地文件lib/secret-store.mjs:113
await writeFileAsync(tmp, `${JSON.stringify(record, null, 2)}\n`, { mode: 0o600 }); - 写入本地文件lib/secret-store.mjs:114
await renameAsync(tmp, path); - 写入本地文件lib/secret-store.mjs:140
writeFileSync(path, `${JSON.stringify(encryptRecord(value), null, 2)}\n`, { mode: 0o600 }); - 读取本地文件lib/secret-store.mjs:144
if (!existsSync(path)) return null; - 读取本地文件lib/secret-store.mjs:145
const record = JSON.parse(readFileSync(path, 'utf8')); - 读取本地文件lib/secret-store.mjs:152
if (!existsSync(path)) return 'missing'; - 读取本地文件lib/secret-store.mjs:153
const record = JSON.parse(readFileSync(path, 'utf8')); - 发起网络请求lib/chat-transport.mjs:98
const req = transport.request(target, { method, headers: requestHeaders, agent }, (res) => { - 写入本地文件lib/state.mjs:10
mkdirSync(dirname(path), { recursive: true }); - 读取本地文件lib/state.mjs:15
if (!existsSync(path)) return fallback; - 读取本地文件lib/state.mjs:16
const raw = readFileSync(path, 'utf8'); - 写入本地文件lib/state.mjs:31
writeFileSync(tmp, `${JSON.stringify(value, null, 2)}\n`, { mode: 0o600 }); - 写入本地文件lib/state.mjs:32
renameSync(tmp, path); - 删除本地文件lib/state.mjs:36
try { rmSync(path, { force: true }); } catch { } - 写入本地文件lib/state.mjs:43
writeFileSync(probe, 'ok'); - 删除本地文件lib/state.mjs:44
rmSync(probe, { force: true }); - 读取本地文件lib/state.mjs:320
const stat = statSync(path); - 写入本地文件lib/state.mjs:348
writeFileSync(tmp, usageJson(records), { mode: 0o600 }); - 写入本地文件lib/state.mjs:349
renameSync(tmp, path); - 读取本地文件lib/state.mjs:367
if (!existsSync(dirname(state.path))) continue; - 读取本地文件lib/state.mjs:375
if (!existsSync(dirname(state.path))) continue; - 读取本地文件lib/state.mjs:555
if (!existsSync(dirname(state.path))) continue; - 删除本地文件lib/state.mjs:1036
rmSync(`${PATHS.log}.1`, { force: true }); - 发起网络请求lib/checkin.mjs:176
const res = await fetch(url, { - 读取本地文件lib/umid.mjs:28
for (const line of readFileSync(path, 'utf8').split(/ ? /)) { - 读取本地文件lib/umid.mjs:75
const versions = readdirSync(join(state.installDir, '.qoder-versions')) - 读取本地文件lib/umid.mjs:92
const versions = readdirSync(join(base, '.qoder-versions')).sort(compareVersionDesc); - 读取本地文件lib/umid.mjs:103
return runtimeCandidates(region).find((path) => existsSync(path)) || ''; - 读取本地文件lib/umid.mjs:111
try { return readFileSync(machineIdPath(region), 'utf8').trim(); } catch { return ''; } - 读取本地文件lib/umid.mjs:122
const manifest = JSON.parse(readFileSync(resolve(dirname(exe), '..', 'build-manifest.json'), 'utf8')); - 执行外部命令来自配置/变量lib/umid.mjs:129
const child = spawn(exe, ['--account-stdin'], {
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
把 Qoder 的模型额度原生接进 DeepSeek Harness 的纯 dsh 插件
README
由 DeepSeek 最新模型翻译生成qoder-to-dsh
把 Qoder 的模型额度原生接进 DeepSeek Harness (DSH)。当前版本 1.1.4。
这是一个纯 DSH 插件:没有本地桥进程,没有第二个端口,没有独立控制台。凭据读取、COSY 签名、模型目录、流式转发和设置面板都在 DSH 插件进程内完成。
非官方互操作性实现,只使用你自己合法授权的 Qoder 账号。上游协议可能随时变化。
设计
- 单进程:插件内直接完成认证、目录、请求与面板,不存在「桥在跑但插件连不上」「控制台和请求用的不是同一份令牌」这类状态分裂。
- 原生 provider:通过 ctx.llm.registerAdapter(['qoder'], adapter) 接入,模型直接出现在 DSH 选择器里。
- 同一份数据:面板、模型选择器和真实请求共享同一份目录、偏好和额度状态。
- 本地优先:凭据、偏好、用量和日志都保存在本机;面板只返回非敏感元数据。
- 数据驱动:上下文档位、思考档位、价格倍率来自 Qoder 模型目录;上游新增字段时优先使用上游值。
- 不挡首包:目录有缓存就先返回、过期后台刷新,并发调用合并成一次;模型准备阶段不再为了目录等上游往返。
- 启动不阻塞:已登录启动时不在主线程扫描本机账号;桌面端 DPAPI key 在后台子进程预热,首次签到或账号页再读取候选账号。
展开完整文档(README 剩余 1 节)
qoder-to-dsh
把 Qoder 的模型额度原生接进 DeepSeek Harness (DSH)。当前版本 1.1.4。
这是一个纯 DSH 插件:没有本地桥进程,没有第二个端口,没有独立控制台。凭据读取、COSY 签名、模型目录、流式转发和设置面板都在 DSH 插件进程内完成。
非官方互操作性实现,只使用你自己合法授权的 Qoder 账号。上游协议可能随时变化。
设计
- 单进程:插件内直接完成认证、目录、请求与面板,不存在「桥在跑但插件连不上」「控制台和请求用的不是同一份令牌」这类状态分裂。
- 原生 provider:通过 ctx.llm.registerAdapter(['qoder'], adapter) 接入,模型直接出现在 DSH 选择器里。
- 同一份数据:面板、模型选择器和真实请求共享同一份目录、偏好和额度状态。
- 本地优先:凭据、偏好、用量和日志都保存在本机;面板只返回非敏感元数据。
- 数据驱动:上下文档位、思考档位、价格倍率来自 Qoder 模型目录;上游新增字段时优先使用上游值。
- 不挡首包:目录有缓存就先返回、过期后台刷新,并发调用合并成一次;模型准备阶段不再为了目录等上游往返。
- 启动不阻塞:已登录启动时不在主线程扫描本机账号;桌面端 DPAPI key 在后台子进程预热,首次签到或账号页再读取候选账号。
- 低开销热路径:请求体签名编码走 Buffer 码表,流式帧只做必要翻译;聊天传输用 keep-alive 复用连接,用量记录合并异步落盘。
界面
截图使用离线演示数据,不含真实账号信息;主题和窄屏布局跟随 DSH。
概览:额度、签到、用量与路由状态在同一屏;明亮 / 深色主题一致。
模型参数:200K / 400K / 1M 上下文档位、自动输出 32K、温度与快捷值;右侧为窄屏签到。
签到逐账号领取;Credits 只计实际扣费,免费与折扣显示为「已省」。
已验证
在 DSH 0.2.1-rc.3 实测(desktop profile,真实账号):
- 插件正常加载,设置里出现 Qoder 页签;
- 自动只读导入本机 Qoder 桌面端登录态;
- 当前账号模型、上下文档位、思考档位和价格倍率正确显示;
- 真实对话返回 pong,reasoning-delta → text-delta → usage → finish(stop) 完整;
- 经 DSH 自己的 llm 服务以 provider=qoder 派发请求也返回 pong,模型选择器这条路径真实可用;
- 带 79 次工具调用的历史切换后仍能正常请求,不再触发 Messages with role 'tool'...;
- 目录按 context_config 显示 200K / 400K / 1M 档位,选中的值会写回请求的 model_config.max_input_tokens;
- 免费模型的 billable: false 请求不计入实扣,只显示为「已省」;
- 四个只读工具与 /qoder 命令注册成功,19 条面板数据路由挂载成功;
- 明亮 / 深色主题跟随 DSH 的 color-scheme;
- 每日活动已用真实账号验证:国际版读取到已领取状态,国内版成功领取 Credits;
- 多账号列表能同时看到国际版 / 国内版本机登录,签到结果按账号分别记录。
tests/live-adapter.mjs 是协议层实机回归;tests/verify-install.mjs(npm run verify)是安装面自检;tests/plugin-host.test.mjs 用假的 DSH 服务加载真实插件入口,覆盖路由、工具、命令、偏好持久化与未登录保护,不联网。开发时另用本地离线渲染 harness 逐页截图,检查明暗主题、窄屏、失败态、参数保存、试跑取消、键盘与触控。
快速开始
1. 安装
装包 ≠ 启用。 只写进 profile 的 dependencies 时,DSH 不会加载插件,也不会报错;必须同时出现在 dsh.profile.bundles 里。
三种安装形态,按使用场景选一种。
A. Release 的 tgz(多数人用这个)
从 Releases 下载 qoder-to-dsh-<version>.tgz,在下载目录执行:
dsh plugin --profile desktop add ./qoder-to-dsh-1.1.3.tgz
正文里带该资产的 SHA-256,可以先核对再装。也可以在 DSH 里让 agent 直接按 URL 装:
plugin_manager { action: "install_bundle", target: "https://github.com/Ianzhyh/qoder-to-dsh/releases/download/v1.1.3/qoder-to-dsh-1.1.3.tgz" }
B. GitHub 直装(不落地文件)
bash
dsh plugin --profile desktop add github:Ianzhyh/qoder-to-dsh
C. 本地目录 link(改代码时用) bash
dsh plugin --profile desktop add link:/absolute/path/to/qoder-to-dsh
或者在 DSH 里让智能体执行 plugin_manager 的 install_bundle,target 传包的绝对目录。
装完确认配置档的 package.json 里同时有依赖和 bundle 选择: json {
"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:,其余不变。
装完自检(只读,不会改动状态;需在仓库目录里执行): bash
npm run verify # 连运行中的 dsh 一起检查
npm run verify -- --offline # 只看文件和 profile 配置
它会检查「装包 ≠ 启用」、link: 是否指向本仓库、补丁里的 name 是否与包名一致、服务商是否注册、模型目录是否为空。任一项 FAIL 就退出码 1。
最后完全退出 DSH 再打开(托盘退出;插件在宿主启动时加载,只重开面板不会换掉已加载的代码)。
2. 登录
打开 设置 → Qoder。首次使用会自动只读扫描本机 Qoder 桌面端 / 命令行的登录态:
- 有桌面端登录:直接出现账号与模型,无需再次授权;
- 没有:点“浏览器授权”,在打开的 Qoder 页面选择账号;或展开“使用 PAT / 访问令牌”;
- 国内版 / 国际版都支持,可在账号页切换;
- 本机登录了多个账号时,概览右上角可以一键切换当前账号,签到页会列出所有本机账号并分别领取。
凭据保存到 <DSH_HOME>/qoder/auth.json:Windows 上用 DPAPI 加密;其他平台退回 AES-256-GCM + 本机 0600 密钥文件。
3. 使用
在 DSH 模型选择器里选择任意 Qoder 模型。默认服务商名是 qoder,模型 id 就是上游 key(例如 qmodel_38max、auto、dmodel)。
text
/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 的模型路由配置。
- 流式对话:思考内容、正文、工具调用、usage、AbortSignal 全链路透传;首包 45 秒 / 块间空闲 120 秒超时,超时以可见的 TIMEOUT 结束,不会无限挂起。
- 工具调用:DSH 声明的 function tools 原样进入 Qoder 请求;工具结果回灌时剔除孤儿消息与空助手轮。
- 图片:通过 DSH attachments.readImage 转 data URL,交给支持视觉的模型。
- 模型目录:动态读取 /algo/api/v2/model/list;有缓存先展示、过期后台刷新,显式刷新仍等待上游;解析 context_config、thinking_config、price_factor 与谷时折扣;面板显示 200K / 400K / 1M 上下文档位、输出默认值、促销与官方标记。
- 模型参数:每个模型可单独设置上下文窗口、默认思考档位、温度和最大输出,并提供自动 / 0 / 0.3 / 0.7 / 1 与 4K / 8K / 16K / 32K 快捷值。输出「自动」对齐 Qoder 官方命令行的 32K 默认;模型声明了输出上限时优先用上限。温度「自动」表示不传 temperature,由上游决定。保存后写进 prefs.json,DSH 下一次 listModels / stream 就使用新值,可一键恢复官方默认。
- 账号:桌面端自动导入、OAuth 设备授权、PAT 导入、令牌自动刷新(drt- / jrt- / PAT 交换)。
- 额度:读取上游 plan 与 quota,显示套餐、加量包、剩余 / 总量、已用比例和到期时间;概览首屏就是额度卡,额度用尽会标红。对话页顶部胶囊也显示当前账号额度,而不是次数 / tokens。
- 每日签到:读取本机 Qoder 客户端的 runtime-info 设备身份,查询 campaigns 并领取 CLAIM_BENEFIT;支持本机所有已登录账号、自动签到(默认开启)、手动逐账号领取,以及今日已领 / 未开放 / 无活动 / 未下发 / 缺设备 / 需登录等状态。活动每天 10:00(UTC+8)开放,DSH 运行期间对“未下发”和临时错误继续重试;缺设备或登录失效的账号当天不再空转,修好后可手动领取。非激活账号的令牌过期时会只读重读官方登录态,不拿刷新令牌去轮换官方凭据。可用 QODER_CHECKIN=0 彻底关闭自动签到。
- 多账号:账号页首屏直接列出本机桌面端 / 命令行的国际版、国内版账号,概览也可一键展开切换;每个账号显示来源、到期时间和今日签到状态。切换即生效,只改插件,不修改官方客户端登录态。
- 用量:本地记录请求数、tokens、缓存、推理 tokens、实际扣费 Credits、已省 Credits、首字 / 总耗时和客户端来源;面板支持最近 7 / 14 / 30 天、按模型聚合、成功 / 失败筛选与上游错误详情。只保留元数据,不记录对话内容。
- Credits 分析:近 12 个自然月的每日实际扣费热力图;按今天 / 7 天 / 30 天 / 月初至今 / 上个月切换,支持按全部、模型或客户端查看平滑趋势线、悬停明细和图例合计;免费模型不计入消耗,单独显示已省金额。图表支持键盘切换日期与点按查看明细。
- 试跑:在面板里选择模型、输入 prompt,走真实上游并显示思考过程、回复、usage、首字 / 生成耗时 / tok/s 与思考 tokens;默认使用模型支持的最低思考档位以缩短等待,可切回已保存档位,本次选择不保存。结果同时计入用量;等待中可随时取消,面板中断会通过 AbortSignal 传到宿主与上游,不再继续等待(上游可能已产生少量计费)。未登录时对话页胶囊可直接发起浏览器授权。
- 诊断:凭据、令牌、目录、原生路由、存储、偏好、额度、签到设备身份、最近错误与运行环境;日志自动脱敏。
- 面板:概览 / 签到 / 模型 / 试跑 / 用量 / 账号 / 诊断;低饱和森林绿配色、带水平滑动高亮块的胶囊页签、自绘下拉菜单、账号栏底块、响应式布局,明暗主题跟随 DSH;无渐变、无 emoji、数字等宽,页签切换统一淡入上浮过渡并保留试跑状态,尊重 prefers-reduced-motion。首屏不会在状态未返回时误报未登录,读取失败会给出就地重试而不是无限骨架;页签、下拉、分段控件和图表都有键盘路径。
- 斜杠命令 + 4 个只读工具:智能体可以自己回答「Qoder 现在能不能用、有哪些模型、今天花了多少」。
性能
- 本地准备:目录命中缓存时,prepareCall 只是内存查表;组包、COSY 签名和请求体编码走 Buffer 码表,典型请求的本地开销在毫秒级。
- 不挡首包:目录过期只触发后台刷新,显式刷新才等待上游;启动时不扫描本机账号,DPAPI key 在后台预热。
- 连接复用:聊天请求使用持久化 keep-alive Agent,不再受 Node fetch 默认 4 秒空闲回收的限制;服务端主动断开时仍会正常重连。
- 流式与落盘:SSE 帧到达即翻译并下发;用量记录内存合并后异步写入,不阻塞消息结束。
- 真正的大头:首包与首字时间主要来自上游排队与思考 tokens。面板「试跑」会显示首字、生成耗时、tok/s 和思考 tokens,方便判断是网络、排队还是思考开销。
数据与安全
| 文件 | 内容 |
| <DSH_HOME>/qoder/auth.json | 加密凭据(DPAPI / AES-GCM);面板永远不返回令牌 |
| <DSH_HOME>/qoder/prefs.json | 模型显示 / 默认 / 上下文 / 参数偏好 |
| <DSH_HOME>/qoder/checkin.json | 自动签到开关、各账号最近一次签到结果(不含令牌) |
| <DSH_HOME>/qoder/usage.json | 最多 5000 条请求元数据,保留近一年(不含 prompt / 回复;含实扣与已省 Credits) |
| <DSH_HOME>/qoder/catalog.json | 模型目录缓存 |
| <DSH_HOME>/qoder/qoder.log | 脱敏运行日志 |
安全约束:
- 只读扫描 Qoder 官方客户端文件,不修改官方登录态;
- 不把 access token / refresh token / machineToken 写进日志、面板响应或错误消息;
- 签到结果只保存账号标签、区域、状态和 Credits 数字,不保存任何令牌;
- 桌面端导入的凭据临近过期时,优先只读重读官方存储;只有读不到新令牌时才用 refresh token,避免同一个 drt- 的轮换影响官方客户端;
- 写接口要求 x-qoder-panel: 1(自定义头触发 CORS 预检,挡掉跨站简单请求);
- 不新增监听端口;所有面板数据走 DSH 自己的 loopback Web 载体;
- 不内置任何密钥、账号或额度;COSY 公钥来自 Qoder 公开客户端协议,仅用于互操作。
已知限制
- 非官方路径:Qoder 可能修改签名、模型 key 或上游 schema;失效时先看「诊断」页。
- 单激活账号:模型请求始终使用当前激活的一个账号;支持在本机已登录的国际版 / 国内版账号之间切换,并会对所有本机账号执行每日签到;不做多账号池化、负载均衡、代他人调用、转售或托管。
- 试跑会花额度:面板的试跑和 /qoder test 都是真实上游请求,会计入用量与 Credits;只是验证链路时用最小 prompt。取消会把中断传到上游并停止等待,但已经产生的 token 仍可能被上游计入。
- Credits 按上游实扣统计:以 usage.billable 为准。Qoder 对免费模型也会返回原价 credits(billable: false),这部分显示为“已省”,不计入消耗;折扣请求同样只记实扣。旧版本留下的免费模型记录会按当前目录的免费标记只读修正统计,不改写原始 usage 文件。
- 上下文档位以 Qoder 的 context_config 为准:DeepSeek-V4-Flash / Pro、Qwen3.8-Max 等模型提供 200K / 400K / 1M。旧版本误用 max_input_tokens 把档位砍成 180K / 96K,已修正;选择 1M 会写回请求的 model_config.max_input_tokens。上游仍可能按账号或网关策略截断,超长上下文请以诊断页和实际响应为准。
- 工具调用历史:assistant 的 tool_calls 统一带空字符串 content(Qoder 网关不接受 null,否则会误报 Messages with role 'tool'...);带工具调用的历史也能继续复用。
- 模型参数是本地偏好:上下文窗口 / 思考档位 / 温度 / 最大输出只影响本插件发给上游的请求与 DSH 选择器,不会修改 Qoder 官方客户端设置;上游仍可能按自己的模型上限拒绝或截断。输出「自动」是 32K(Qoder 官方 CLI 默认),可手动调高;温度没有公开的聊天默认值,插件不猜。
- 签到也是非官方接口:使用本机 Qoder 客户端 runtime-info 生成的设备身份,活动每天 10:00(UTC+8)后开放;平台可能调整活动或风控。自动签到默认开启,可在「签到」页关闭,或用 QODER_CHECKIN=0 禁用;DSH 没运行时不会签到。没有活动时会明确显示「无活动」或「未开放」,不会混进待领取或异常;缺设备 / 需登录的账号当天不自动重试。
- 超时由本地判定:首包默认 45 秒,块间空闲默认 120 秒;可通过插件配置 firstByteTimeoutMs / streamIdleTimeoutMs 调整(0 表示不限)。超时只停止本地等待,已经发出的上游请求仍可能产生少量 Credits。
- 用量写入是合并异步的:正常退出会同步补写;进程被强制结束时,最后一条记录可能还没落盘。只影响本地统计,对话内容仍然从不记录。
- 多账号只切换插件:账号来自本机官方客户端的只读扫描;切换只改插件当前使用的账号,不会写入或退出官方客户端。
- 协议:当前使用已实测的 COSY + agent_chat_generation 路径;更新版 Bearer 端点存在,但模型 id 体系不同,未作为默认路径。
- 设备授权 / PAT:协议流程已实现,离线回归覆盖 PAT、设备授权与过期令牌重试;本次实机验证主要走桌面端导入,欢迎用真实 PAT 补一次实机回归。
- 图片 / 工具调用:取决于上游模型与账号能力;失败会以可见错误结束,不会伪造成功。
- Windows 凭据导入依赖 PowerShell DPAPI;无 PowerShell 的精简环境会退回 AES 本地密钥模式(仍不落明文 token)。
更新记录
每个版本的完整变更见 CHANGELOG.md;发布说明(含升级步骤与资产 SHA-256)见 Releases。
当前版本 1.1.4 修「设置看起来生效、实际没生效」与账号切换竞态:温度现在真的写进上游参数、换号会清空模型目录、官方客户端的旧令牌不再覆盖插件刚刷新的令牌、目录响应中断不再变成未捕获异常、诊断不再被 20 秒客户端超时截断。1.1.3 修流结束、令牌刷新、换号与本地账本之间的竞态:截断的信封流不再被补成成功、并发刷新合并并隔离账号、无效 PAT 回滚、试跑取消会中止上游、目录缓存按账号隔离、清除用量不再被在途写盘复活。1.1.2 补齐面板在宿主刚启动、标签页在后台、账号刚切换时的行为。1.1.1 修掉三个「留到线上才暴露」的问题:断流被当成正常结束、不合法工具名导致整轮失败且不点名、面板请求没有超时。1.1.0 的要点是聊天 SSE 走持久连接、模型目录先返回后刷新、启动不再扫本机账号、凭据与用量异步落盘。详见 v1.1.4 发布说明、v1.1.3 发布说明、v1.1.2 发布说明、v1.1.1 发布说明 与 v1.1.0 发布说明。
开发 bash
npm test # 纯函数 / 流翻译 / 传输 keep-alive / 目录单飞与 SWR / 编码等价 / 用量合并写 / 登录 / 签到 / Credits / 宿主路由 / 客户端 404 与后台轮询
npm run check # 所有模块语法检查
npm run verify # 安装自检:文件 / profile / 运行态(只读)
npm run test:live # 实机回归:会真实调用一次 Qoder(消耗少量 Credits)
发版用的三个脚本: bash
npm run release:check # 发版门禁:语法 + 全部用例 + 安装自检(--offline)
npm run pack:release # 生成 qoder-to-dsh-<version>.tgz
npm run verify:release # 校验 tgz:产物新鲜度 / 文件清单 / 双份版本号 / patch 名 / sha256
verify:release 也可以传 Release 资产 URL,直接校验已发布的那一份(只在内存里解包,不写磁盘): bash
npm run verify:release -- https://github.com/Ianzhyh/qoder-to-dsh/releases/download/v1.1.3/qoder-to-dsh-1.1.3.tgz
第三方许可与归属信息见 NOTICE.md。
License
MIT。Qoder、DeepSeek Harness 及相关商标归各自所有者;本项目与官方无隶属关系。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Ianzhyh/qoder-to-dsh
把 Qoder 模型额度接进 DSH 直接对话
相关插件 · 模型接入
API 中继安全审计toby-bridges/api-relay-audit
面向 AI API 中转与 LLM 代理的本地安全审计。
★ 897已汉化DSH
69.4
免费搜索插件DDDMUC/dsh-free-search
DeepSeek Harness 免费搜索插件 —— 无需 API key,零成本,多引擎可切换。 一个给…
★ 761已汉化DSH
68.7
免费联网搜索liustack/modsearch
在官方 App 里模型能联网,切到 API 就不能了。ModSearch 把联网补回来:网页搜索、X…
★ 863已汉化DSH
68.5
OpenCode 免费模型FishBottle7/opencode2dsh
在 DSHDeepSeek Harness里原生使用 OpenCode Zen 的免费匿名模型。
★ 379已汉化DSH
67.8
AI 模型网关tingly-dev/tingly-box
Tingly Box Web UI 演示
★ 373已汉化DSH
67.4
WorkBuddy 账号池XDTrees/dsh-xdpool
把你能白嫖的模型额度接进 DSH 同一个池:WorkBuddy 多账号自动容错、十三家扫码登录、76…
★ 359已汉化DSH
67.1