dsh-router-qoder

DSH PLUGIN工具与能力

仓库 CARVIN94/dsh-router-qoder

工具与能力 L5 · 运行验证通过 安全审查:低风险 可信度:金 可安装插件
安装这个插件

为 dsh-router 提供 Qoder(阿里 AI 编码平台)的

一句话选型结论

按资料字段整理

dsh-router-qoder 是工具与能力类的 DSH 可安装插件,验证等级 L5 · 运行验证通过,安全审查为低风险,有可直接复制的安装命令。验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么;涉及密钥或系统权限的,建议先在隔离环境试装。

分类工具与能力 收录类型可安装插件 验证等级L5 · 运行验证通过 安全审查低风险
验证等级 L5 L5 · 运行验证通过
GitHub 星标 1 复刻 0 · 未关闭 issue 0
最近更新 2026-10-30 创建于 2026-10-28
README 16.5 KB 正文体量,越大说明说明书写得越细

安装

可安装插件
在 DSH 里执行,装完用 dsh plugin list 确认已挂上;标了 L4 / L5 的命令已在沙盒里真实跑通
dsh plugin --profile web add github:CARVIN94/dsh-router-qoder
  1. 1
    确认版本与运行环境

    仓库没有标注兼容版本与 Node.js 要求,先确认你的 DSH 版本能装,再继续。

  2. 2
    执行安装命令

    在 DSH 里执行上面的命令;多包仓库要注意区分具体子包名,别装错包。

  3. 3
    确认已挂载

    用 dsh plugin list 查看列表里是否出现这个插件,出现即挂载成功。

  4. 4
    试跑并检查权限

    加载后跑一个最小用例,确认它能正常工作;同时看它申请了哪些文件、命令或网络权限。

兼容 DSH 版本未标注版本不匹配时安装会报错
Node.js 要求未标注来自仓库 package.json 的 engines 字段
前置依赖无需要同时安装的同级依赖
npm 包名未发布到 npm可用 npm view 查看包信息

能做什么

工具与能力
字段来自项目仓库与公开索引,中文说明由本站标注

上游标签

dshdsh-plugindsh-routerqoder

验证等级与安全审查

L5 · 运行验证通过
自动化流程结论,不是人工审核
验证等级L5 · 运行验证通过在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来
安全审查低风险静态分析结论,未标注不代表已通过审查
仓库健康度活跃按仓库活跃度与最近更新时间给出
可信度金综合仓库活跃度与验证结果

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 验证等级 L5:安装和运行都在沙盒里跑通过,装完能直接用的概率高。
  • 静态安全审查为低风险,没有发现明显可疑行为。
  • 有可直接复制的安装命令,不用自己翻文档找入口。

先想清楚的地方

  • 没有声明 Node.js 版本要求,版本不匹配可能装不上。
  • 验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么。

更适合

  • 需要在工具与能力场景里给 DSH 补能力的人。
  • 想装完就能用、不想自己排依赖的人。
  • 能接受在本地装依赖、愿意自己确认权限的人。

不太适合

  • 只使用 DSH 官方内置能力、不接受第三方插件的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
插件验证等级安全审查星标兼容版本安装命令
dsh-router-qoder当前 L5 · 运行验证通过 低风险 1 未标注 有
loopx 未做沙盒验证 未标注 6,233 未标注 无
dsh-startup-screen 未做沙盒验证 未标注 633 未标注 有
minara-skills L4 · 沙盒安装通过 中风险 360 未标注 有
dsh-blender-plugin 未做沙盒验证 未标注 211 未标注 无
tokenledger L5 · 运行验证通过 低风险 204 0.2.0-rc.2 等 11 个 有

仓库档案

工具与能力
字段来自项目仓库与公开索引,中文说明由本站标注
作者 / 维护方CARVIN94仓库 dsh-router-qoder · 默认分支 main
分类工具与能力本站分类
收录类型可安装插件声明了 dsh.bundle、可用 dsh plugin add 安装的条目
开发语言未标注仓库主语言
许可证MIT商用或二次分发前请确认条款原文
星标 / 复刻 / issue1 / 0 / 0收录时的数值,非实时
创建 / 更新2026-10-28 · 2026-10-30最后推送 2026-10-28
本站收录2026-10-30首次进入本站目录的时间

README 全文

16.5 KB
作者原文,中文版优先;只做安全转义,不改内容

dsh-router-qoder

dsh-router 的 Qoder 族供应商插件(国内版 + 国际版)

快速安装 ·
两个供应商 ·
取 PAT ·
能力 ·
dsh-router 核心

为 dsh-router 提供 Qoder(阿里 AI 编码平台)的
两个供应商(PAT 认证,cosy 签名网关)。单独装它没用——它只是向核心注册供应商,
面板、账号池、组合回退、模型管理都在核心里。

两个供应商

供应商 id 面板名 网关 openapi uid 前缀
qoder Qoder gateway.qoder.com.cn openapi.qoder.com.cn qd
qoder-global Qoder Global api1.qoder.sh openapi.qoder.sh qdg

两个区域同协议同契约(cosy 签名、jobToken 交换、同一套 chat/models 端点),
所以共用同一份实现(src/core.ts),差异只在 src/cn.ts / src/global.ts 的
profile 与 QODER_REGIONS 的主机表。

两个 id 同时是凭证与配置的存储键(credentials.sqlite 的 supplier 列、
supplier-config.json 的键)——改 id = 已添加的账号全部消失。

src/
core.ts       共享实现 —— 供应商契约、账号/积分缓存、chatOnce、签到、addApiKey
cosy.ts       cosy 协议原语 —— 自定义 base64、请求签名、RSA/AES 会话、设备指纹
messages.ts   OpenAI 请求 → Qoder 请求体(模板 + 消息/工具转换)
upstream.ts   Qoder HTTP 客户端 —— jobToken 交换、模型目录、SSE 聊天、用量、活动/领取
sse.ts        Qoder SSE → OpenAI SSE(核心只接受 OpenAI 格式的字节)
cn.ts         qoder profile(区域、图标、uid 前缀、弹窗提示文案)
global.ts     qoder-global profile
icon.ts       内联 SVG data URI(面板图标不依赖另一个服务活着)
index.ts      插件入口(host 半,一次注册两个供应商)
contract.ts   供应商契约(自含,与 dsh-router 契约同步,含 addApiKey/apiKeyHint)
types.ts      通用类型
cordis.patch.yml  bundle patch,把插件插入 DSH cordis bundle stack

与 CodeBuddy 族的两处不同

  1. 认证是 PAT,不是 OAuth。 粘贴一个 pt-… 就完事,没有浏览器登录、没有回调、
    没有 refresh token。所以本插件实现的是契约里的 addApiKey 那条路,不是
    generateLoginUrl/completeLogin。添加时会真的交换一次 jobToken 校验——
    打错一个字符的 PAT 不会存进去。
  2. 上游不是 OpenAI 兼容端点。 Qoder 官方没有 OpenAI 兼容接口,chat 直连它的
    agent_chat_generation:请求体是私有模板 + cosy 编码加密,响应是「信封套一层
    OpenAI 形状」的 SSE。sse.ts 把这层拆开重新包成 OpenAI SSE 交给核心。

快速安装

需要 DSH 0.2.0 及以上。先装核心,再装本插件,然后重启 dsh web:

dsh plugin --profile web add dsh-router-core
dsh plugin --profile web add dsh-router-qoder

dsh plugin add 会在 profile 里 pnpm add,并自动把声明了 dsh.bundle.patch
的包加入 dsh.profile.bundles(本插件即声明了,即 cordis.patch.yml)。

> 本地开发版:不用 npm,直接 dependencies 加
> "dsh-router-qoder": "link:/path/to/dsh-router-qoder" 指向本地仓库
> (本机 profile 就是这么装的,改完 pnpm build 再重启 dsh web 即生效)。

重启后本插件以 cordis service router.suppliers 向 dsh-router 注册两个供应商,
面板「供应商」出现 Qoder 与 Qoder Global 两张卡片。

能力

能力 说明
添加账号(PAT) 弹窗粘贴 pt-…。先交换 jobToken 校验,成功才落盘,昵称取上游下发的账号名;同一 PAT 不会重复建号。粘贴时带 Bearer 前缀也能识别(会被剥掉)。
模型列表 「获取模型」从 GET /algo/api/v2/model/list 实时拉取。面板显示上游的 display_name、请求仍用上游 key(对照表见使用)。上游的 auto 不列出来:它是该区的默认路由(请求时才决定解析成哪个模型),不是可描述的模型。没有 PAT 时列表为空——这是正确状态,不是故障。
对话 直连 cosy 网关:请求体走 Qoder 私有模板(chat_context/model_config/business/session_id),body 经自定义 base64 加密后参与签名;响应 SSE 转成 OpenAI SSE(含 reasoning_content、tool_calls、usage、[DONE])。usage 里的 prompt_tokens_details.cached_tokens 原样透传,宿主的缓存命中率因此是真实读数。
图文输入 请求里出现 image_url / input_image 时把 model_config.is_vl 置真,否则置假——图片能力按这次请求决定,不靠一张静态能力表。
思考强度 核心给的推理等级按上游约定的两处同时写(顶层 reasoningEffort + parameters.reasoning_effort)——官方客户端如此,只写一个可能被某个区域忽略。auto/空/none/off 一律不下发,用模型自己的默认档。
积分显示 面板账号积分 = sash/api/v2/me/usage 的剩余量(基础包 userQuota + 加量包 addOnQuota + 企业包 orgResourcePackage 的 remaining 求和),内存缓存 10 分钟。读不到报 -1(不是 0),核心据此保留上次持久化的值。
每日签到 走活动接口(/sash/api/v1/me/campaigns → …/{id}/claim),路径里没有「签到」二字。CLAIMED 与 409 都算「今日已领」(幂等,不是失败);上游今日没下发可领活动时如实说明。
多账号池 核心按池顺序/策略选号回退,本插件只报单个账号的成败与语义状态。

取 PAT

本插件只认 PAT(Personal Access Token,pt- 开头)。两个区域各签发一份、互不通用:

用哪个卡片 控制台 入口
Qoder(国内版) qoder.cn(同 qoder.com.cn) 设置 → 个人访问令牌(旧页面/旧文档写作「API 令牌」)→ 创建令牌
Qoder Global(国际版) qoder.com Settings → Personal Access Tokens → Create token

创建时填名称(只是给你自己看的备注),有效期按需选;完整令牌只在创建那一刻显示一次,
当场复制。漏了就只能删掉重建。

官方原文(令牌格式与作用域说明):

  • 国内版:docs.qoder.cn · 认证
  • 国际版:docs.qoder.com · Authentication

三件容易踩的事:

  • 国际版的控制台不是 qoder.sh。那只是网关与开放 API 的主机名(api1.qoder.sh /
    openapi.qoder.sh),没有网页控制台,域名本身也不解析。发 PAT 的是 qoder.com。
  • 区域对不上一定被拒:国内版的 pt-… 贴进国际版卡片(或反之)交换 jobToken 就失败,
    这不是插件坏了、也不是令牌过期。
  • 别把令牌提交进仓库或贴进 issue:它等价于你的账号权限,谁拿到都能以你的身份调接口。

使用

  1. 重启 dsh web
  2. 面板 → 供应商 → Qoder / Qoder Global 卡片 → 添加 API key → 粘贴 PAT
    (从哪个入口拿见上一节)
  3. 点「获取模型」从上游拉目录,勾选要用的模型
  4. 请求模型可写 qmodel_38max,或带别名前缀 qoder/qmodel_38max(插件自动剥前缀)

> 模型名:显示用名字,请求用 key。 上游的 key 是内部标识(qmodel_38max、
> kmodel_latest),人读的是它同时下发的 display_name(Qwen3.8-Max、
> Kimi-K3.1-Pro)。插件把两者都报给核心:面板、搜索、组合挑选显示可读名,
> 组合里存的与请求里发的仍是 key
——拿显示名去请求上游只会 404。
> 面板每行的 key 以小号淡字跟在名字后面,hover 也有完整说明。

2026-10-28 国内版实测快照(会随上游变,以面板为准):

面板显示 上游 key(请求/组合用) 上下文 倍率
Qwen3.8-Max qmodel_38max 180K 0.5×
Qwen3.8-Flash qfmodel 180K 免费
DeepSeek-V4-Pro dmodel 96K 0.5×
DeepSeek-Flash dfmodel 180K 免费
GLM-5.3 gmodel 180K 0.8×
GLM-5.3-Flash gfmodel 1000K 0.1×
Kimi-K3.1-Pro kmodel_latest 180K 1×
Kimi-K2.8-Preview kmodel 180K 0.8×
MiniMax-M3.1-Flash mmodel 180K 0.1×

命名规律只是巧合(q=Qwen、d=DeepSeek、g=GLM、k=Kimi、m=MiniMax,f 后缀
=Flash、_latest=同族较新),不要照规律猜 key——猜错就是 404。

上游

国内版(https://gateway.qoder.com.cn + https://openapi.qoder.com.cn):

  • chat:POST /algo/api/v2/service/pro/sse/agent_chat_generation?FetchKeys=llm_model_result&AgentId=agent_common&Encode=1
  • 模型:GET /algo/api/v2/model/list?Encode=1 → chat[](key / display_name / max_input_tokens / price_factor / thinking_config.efforts)
  • jobToken:POST /algo/api/v3/user/jobToken?Encode=1(旧式签名:date + signature;body 整体 cosy 编码,personalToken 与 refreshToken 二选一)
  • sash 令牌:POST {openapi}/api/v1/jobToken/exchange({personal_token} → token)
  • 用量:GET /sash/api/v2/me/usage(sash 面,Bearer)
  • 签到:GET /sash/api/v1/me/campaigns?forceRefresh=true → POST …/{campaignId}/claim
  • 凭证:核心的 credentials.sqlite,supplier='qoder',blob 为 {nickname, pat, userId?}

国际版(https://api1.qoder.sh + https://openapi.qoder.sh)—— 路径逐字相同,
差异只有一个:sash 面(积分/签到)需要设备风控头(见「已知限制」)。
凭证存在同一张表,supplier='qoder-global'。

与核心的分工

本插件只管对单个账号调通上游:PAT 校验、cosy 会话、chat、模型目录、积分、签到。

策略全在核心(AccountPool):选号、冷却、禁用、连续错误累计、遍历回退、
响应写入。所以:

  • chatOnce(uid, lv, req) 一次只服务一个账号,不遍历账号、不维护冷却表、不写响应
  • 失败时返回语义状态(rate_limit / quota / session_dead / unavailable /
    transport / unknown / no_such_model / bad_request),由核心决定冷却多久、
    是否禁用、要不要换号
  • status() 只报「现在状态」(凭证 + 积分),冷却/禁用由核心叠加后给面板
  • 积分只报值,不落盘(持久化归核心 supplier-config.json):拿不到时报 -1
    (不是 0),核心保留上次持久化的值
  • 非流式请求也走同一条路:本插件只产出 OpenAI SSE,客户端要 JSON 时由核心
    聚合成整包(协议错配由核心吸收,插件不做第二套出口)

完整契约见 dsh-router 的 docs/suppliers.md。

错误分类(一个重要细节)

业务码优先于 HTTP 状态。Qoder 对「当日用量用尽」回的是
HTTP 403 {"code":"110","Billing daily count exceeded"} —— 只看状态会判成
「凭据被拒」,于是「今天用满、明天自愈」的号会被要求换 PAT。所以:

上游信号 归类 后果
code 110/113/115/116/117/118/119/122/402/6004(额度族) quota 不判账号死,等周期重置或补额度
code 105 / HTTP 401 / HTTP 403(无业务码) session_dead 凭据失效,需要换 PAT
HTTP 429 rate_limit 短冷换号
code 406 / 内容审核标记 bad_request 请求级(同一请求对每个号都一样),不惩罚账号
code 416/430/80411/80412 / HTTP 400 bad_request 请求形态问题(范围/能力/过长/媒体过多)
code 500/10408/10500/10605 rate_limit 瞬时(失败/超时/模型内部错/排队),换号确实管用

失败帧会层层套(外层 403 + 内层 10605),所以取码是沿 message 下钻到最深
一层认识的码
,只剥一层会把「排队一分钟」判成「凭据被拒」。认不出的码继续往里找,
最终回落 HTTP 状态分类。

流已经写出字节之后上游才报错(HTTP 200 信封里带业务码)时,插件发一条 OpenAI 形状
的 error 帧 + [DONE],并通过 onLateFailure 把「这个号额度用尽」报给核心——
后续请求才会避开它。

已知限制

  • 国际版的积分与签到需要本机 Qoder 客户端的设备风控组件(Cosy-Machine* 三件套,
    由 UMID 组件生成)。本插件不伪造它:拿不到时如实报「该区域需要设备组件」,
    而不是显示「今天没有活动」。国际版的聊天与模型列表不受影响(走 cosy 面)。
  • 国内版已用真实 PAT 端到端跑通(2026-10-28 实测):模型目录 9 条全部带可读名、
    对话出字(含 reasoning_content 与 usage)、积分读到 400(300 基础 + 100 加量)、
    活动列表读到当日已领。国际版尚未用真实 PAT 联调——chat 与模型列表与国内版同协议,
    但设备风控那条只能在你本机试。
  • 协议来自社区实测记录(见「致谢」)。单测覆盖编码/签名/请求构造/SSE 转换/错误分类/
    签到状态机;第一次失败建议看 dsh web 日志里 qoder 前缀那几行——它会带上游原文。

架构

通过 cordis service router.suppliers 的共享聚合表向 dsh-router 注册两个供应商工厂:

dsh web (cordis)
├─ dsh-router-core        先 provide 空的 router.suppliers 表
└─ dsh-router-qoder       ctx.inject(['router.suppliers']) 等表出现
├─ 往表里追加 qoder / qoder-global 两个工厂(已存在则跳过,幂等)
└─ ctx.emit('internal/service') 让核心重扫 → 面板出现两张卡片

cordis 每个 service name 只允许一个插件 provide,所以这里不能各自 provide,
只能等核心先提供表再往里追加;inject + 广播的写法与加载顺序无关,先装谁都能工作。

开发

pnpm install
pnpm build        # lib/index.js
pnpm typecheck
pnpm test         # 行为回归闸门(node --test,Node 原生 TS 类型剥离)

src/core.test.ts 锁的是协议事实,不是实现细节——那些字节每一个都直接决定网关
认不认请求,改错不报编译错、只会得到 401 Signature invalid:

  1. cosy 编码/解码可逆、字母表与签名格式逐字固定;
  2. 设备指纹对同一凭据稳定、换凭据就变;
  3. 添加账号先验一次 jobToken(打错的 PAT 不落盘),重复 PAT 不重复建号;
  4. chat 请求是cosy 编码后的密文、带 Bearer COSY.* 与 cosy 头;
  5. 上游 SSE 信封被转成 OpenAI SSE(含 role/content/usage/[DONE]);
  6. 错误分类:403+code110 是额度耗尽(不是凭据被拒),401 才是凭证失效;
  7. 积分读 sash(jt- 令牌)、模型目录过滤上游的 auto 且带上 display_name;
  8. 签到走活动接口,CLAIMED 与 409 幂等算成功。

致谢

cosy 协议的实现来自以下 MIT 项目的实测记录(本仓库的 src/cosy.ts /
src/messages.ts 移植自第一项,并按本项目风格重写、加注):

  • dingminhua/dsh-connect-qoder(MIT)
  • fengyinxia/qoder2api(MIT)—— PAT→jobToken、cosy 签名、自定义 base64、RSA/AES 会话
  • x_Zhengyuuuui/qoder2api(Go,MIT)—— 同一协议 + 指纹派生 + 双区域端点
  • @qoder-ai/qoder-agent-sdk 的 .d.ts —— 模型/用量字段的官方命名

许可证

MIT

免责声明

本项目仅用于学习与技术研究,请勿用于商业用途。

常见问题

6 问
答案由本站依据条目字段整理,不引用上游原文
dsh-router-qoder 怎么安装?

在 DSH 里执行 `dsh plugin --profile web add github:CARVIN94/dsh-router-qoder` 即可。

dsh-router-qoder 的验证等级是什么意思?

L5 · 运行验证通过。在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来

dsh-router-qoder 安全吗?

低风险。

dsh-router-qoder 装之前要先确认什么?

先看它会读写哪些文件、执行哪些命令、连接哪些网络地址;验证等级只说明装得上、跑得起来,不等于安全。涉及密钥或系统权限的,建议先在隔离环境试装。

dsh-router-qoder 用的是什么许可证?

上游标注为 MIT。商用或二次分发前请到仓库确认许可证原文。

这条记录的数据可靠吗?

本站按仓库名去重后合并整理,字段以作者仓库与 npm 元数据为准;安装命令、仓库地址与 README 保持原文,带 L4 / L5 标记的安装命令已在隔离沙盒里真实跑通。

工具与能力
按星标排序,可作替代方案

loopx

loopx

LoopX 是面向长周期 Agent 的本地优先控制平面,作为 DSH plugin 为 DeepSeek Harness 提供持久目标、证

未标注验证等级 6,233 星

dsh-startup-screen

dsh-startup-screen

DeepSeek Harness 的启动界面与启动动画插件。

未标注验证等级 633 星

dsh-blender-plugin

dsh-blender-plugin

让 AI 模型通过直连 TCP 通道实时驱动 Blender 的 DSH plugin:15 个工具覆盖视口取帧、任意角度渲染、内循环搜索、

未标注验证等级 211 星

tokenledger

TokenLedger

TokenLedger 为 DeepSeek Harness 提供零配置的 Token 用量记账,自动归属到实际服务请求的中转站,无需凭据即

L5 · 运行验证通过 204 星

deepseek-harness-jev

deepseek-harness-jev

把 TypeSafe Jev 接入 DeepSeek Harness 作为 System One 决策层,为技能与文件选择、任务监督、纠偏和

未标注验证等级 203 星

CARVIN94 的其它插件

3 个

插件的元信息来自作者仓库;分类、验证等级与安全结论的中文说明为中文整理,最近核验 —。