Qoder 免费模型接入 baldovinmarques391-design/dsh-qoder-provider
DeepSeek Harness把 Qoder CN 免费模型接入模型选择器直接调用
30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/17 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add baldovinmarques391-design/dsh-qoder-provider该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
是什么
dsh 原生插件 · model
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 14 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件
查看扫描证据(共 17 处,展示前 17 条)
- 读取本地文件index.js:54
const QODER_ROOT = QODER_ROOTS.find((dir) => existsSync(join(dir, 'Qoder CN.exe'))) ?? QODER_ROOTS[0] - 执行外部命令来自配置/变量index.js:425
const child = spawn(this.opts.exe, args, { - 读取本地文件index.js:711
files = readdirSync(opts.logDir) - 读取本地文件index.js:723
text = readFileSync(join(opts.logDir, f), 'utf8') - 写入本地文件index.js:804
mkdirSync(opts.logDir, { recursive: true }) - 写入本地文件index.js:805
writeFileSync(join(opts.logDir, 'META-PROBE.json'), JSON.stringify(out, null, 2), 'utf8') - 写入本地文件index.js:833
mkdirSync(opts.logDir, { recursive: true }) - 写入本地文件index.js:834
writeFileSync(join(opts.logDir, 'META-PROBE-BUNDLES.json'), JSON.stringify(result, null, 2), 'utf8') - 写入本地文件store.js:13
mkdirSync(opts.logDir, { recursive: true }) - 写入本地文件store.js:15
writeFileSync(join(opts.logDir, `${stamp}.jsonl`), rawLines.join('\n') + '\n', 'utf8') - 写入本地文件store.js:18
writeFileSync( - 读取本地文件store.js:23
const files = readdirSync(opts.logDir) - 删除本地文件store.js:28
unlinkSync(join(opts.logDir, old)) - 写入本地文件store.js:33
appendFileSync( - 写入本地文件store.js:48
writeFileSync(join(tmpdir(), 'dsh-qoder-provider-log-failure.txt'), detail + '\n', 'utf8') - 执行外部命令来自配置/变量warm.js:67
const child = spawn(this.opts.exe, args, { - 执行外部命令固定命令proc.js:20
const r = spawnSync('taskkill', ['/PID', String(pid), '/T', '/F'], {
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-llm给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
把 Qoder CN 的免费模型接进 DSH(qoder / Qwen3.8-Flash)。
README
由 DeepSeek 最新模型翻译生成Qoder 免费模型(qoder-provider)
把 Qoder CN 的免费模型接成 DSH 的一等 LLM 提供方:provider = qoder。
装上之后,DSH 的模型选择器里会直接出现 qoder / Qwen3.8-Flash 这一组,选它就是白嫖(实测 total_credits = 0)。
它做了什么
宿主插件向 ctx.llm.registerAdapter(['qoder'], adapter) 注册一个 LlmAdapter:
| 成员 | 行为 |
| providerInfo('qoder') | 显示名「Qoder CN(免费模型)」 |
| listModels('qoder') | 已验证免费的模型表(默认只有 Qwen3.8-Flash) |
| resolveModel | 返回 id / 名称 / 说明 |
| stream(options) | 起 Qoder worker 子进程,把 NDJSON 事件流翻译成 DSH 的 StreamChunk |
另有自检工具 qoder_selftest:在会话里直接跑一次「DSH → qoder → 回答」,用来确认这条路通。
展开完整文档(README 剩余 1 节)
Qoder 免费模型(qoder-provider)
把 Qoder CN 的免费模型接成 DSH 的一等 LLM 提供方:provider = qoder。
装上之后,DSH 的模型选择器里会直接出现 qoder / Qwen3.8-Flash 这一组,选它就是白嫖(实测 total_credits = 0)。
它做了什么
宿主插件向 ctx.llm.registerAdapter(['qoder'], adapter) 注册一个 LlmAdapter:
| 成员 | 行为 |
| providerInfo('qoder') | 显示名「Qoder CN(免费模型)」 |
| listModels('qoder') | 已验证免费的模型表(默认只有 Qwen3.8-Flash) |
| resolveModel | 返回 id / 名称 / 说明 |
| stream(options) | 起 Qoder worker 子进程,把 NDJSON 事件流翻译成 DSH 的 StreamChunk |
另有自检工具 qoder_selftest:在会话里直接跑一次「DSH → qoder → 回答」,用来确认这条路通。
走线(实测事实,不是推测)
Qoder CN.exe resources\app.asar.unpacked\...\dist\_worker\qoder-worker-runtime.obf.mjs
环境 ELECTRON_RUN_AS_NODE=1 参数 -p <提示词> --output-format stream-json --include-partial-messages --model <id> --tools "" --permission-mode dont_ask --no-session-persistence
事件是 Anthropic 式信封:
- {type:'system',subtype:'init',session_id,model,permissionMode,tools,cwd,...}
- {type:'stream_event',event:{type:'message_start'|'content_block_start'|'content_block_delta'|'content_block_stop'|'message_delta'|'message_stop',...}}
- 增量:delta:{type:'thinking_delta',thinking} 与 delta:{type:'text_delta',text}
- {type:'assistant',message:{content:[...]}} —— 每个块一份重复快照(流式模式下必须忽略,否则内容翻倍)
- {type:'result',subtype:'success',result,stop_reason,total_credits,usage,modelUsage,...}
三个必须记住的坑(都有实测依据)
1. 块类型只认结构化字段(delta.type / content_block.type),绝不按 <think> 之类子串嗅探。
Qoder 自己的渲染器就是靠子串匹配把输出搞坏的(../qoder-think-leak.md,WorkBuddy 调查报告复现过)。
我们绕开它的渲染器直接读 NDJSON,所以不对文本做任何改写——改写文本正是那类 bug 的成因。
2. assistant 快照会重复投喂:--include-partial-messages 下增量和快照同时来,快照只当兜底(一个增量都没有时才用),否则回答会变成两份。
3. 用量是假的 0:Qoder 免费路线把 input_tokens / output_tokens / modelUsage.* 一律报 0,所以合计为 0 时不发 usage 块,免得 DSH 把「上下文用量 0」当真。
两种模式(mode)—— 2026-10-16 晚的重要改动
| 值 | 谁执行工具 | 长相 / 权限 | 代价 |
| drive(默认) | DSH 真执行,Qwen 只决定"调哪个工具、传什么参数" | 会话/权限/沙箱/diff/工具输出全部是 DSH 原生的,和标准模式一模一样;某一步失败不会把之前做完的事从界面上抹掉 | 每一步重新拉起一次 Qoder 进程(约 +7–10 秒) |
| display(旧做法) | Qwen 在自己进程里执行,DSH 只把它的工具卡照搬显示 | 需要 qwen-display 那 33 个同名影子工具 | 一个请求里 Qwen 自跑一整轮循环 ⇒ DSH 只能当"一条消息",思考/正文/工具行交替堆叠;最后一步失败会把整条消息(含已发生的真实改动)丢掉 |
drive 是这么做到的(都有实测依据):
1. Qoder 在 message_delta{stop_reason:'tool_use'} 那一刻还没有执行任何工具 (实测 tool_result 永远出现在这之后),我们在这里收手。
2. 收手后立刻掐掉 Qoder 进程的整棵进程树(taskkill /T /F,见 proc.js),否则占了 stdout 的子进程会让这一轮永远等下去。
3. 同时用 --permission-mode dont_ask + 对任何 can_use_tool 一律回 cancel 兜底:万一它抢跑,也只会拿到一句拒绝,绝不会真改磁盘。
4. 交给 DSH 的 tool-call 块用Dsh 真工具名(pwsh/read/write/edit/…),参数补齐真工具必需的字段(例如 DSH 的 pwsh 强制 description 非空,缺了会直接抛 invalid description)。
5. Qwen 独有的工具名(Agent/TaskCreate/…)drive 模式不生成任何真调用,只在正文里出一行显性提示("DSH 侧没有对应工具,这一调用没有执行")。
落盘取证
每次调用把原始 NDJSON 写到 runs\<时间戳>.jsonl(只保留最近 50 个),旁挂一份 <时间戳>.meta.json:mode / halted / toolCalls / unmappedCalls / controlRequests / credits / usd / diag。出问题时先看这两个文件——事件流是权威事实,界面渲染不是。
端到端验收另有 ..\_verify-e2e.mjs(读会话记录 + run 记录,逐条判定)。
配置(cordis.patch.yml)
| 字段 | 默认 | 说明 |
| mode | drive | drive = DSH 真执行工具(见上表);display = 旧做法 |
| permissionMode | bypass_permissions | 只在 display 模式生效;drive 模式固定 dont_ask(一个都不许真跑) |
| toolNote | 一段中文说明 | drive 模式附在系统提示后面的一句"本机哪些工具名有效",省得它去调本机没有的工具 |
| timeoutMs | 300000 | 空闲超时(一直在吐事件就续命)⇒ 掐整棵进程树并报错 |
| allowUnlisted | false | 是否放行不在免费表里的模型。默认一路拦死:未实测的模型可能直接花钱 |
| selftest | true | 是否注册 qoder_selftest / qoder_cost_report 工具 |
| warm | false | 常驻进程池,只服务 display 模式(drive 每轮都要掐进程,常驻没有意义) |
| localTitles | true | 会话标题本地生成,不为几个字起一个 Qoder 进程 |
| warmIdleMs | 60000 | 常驻进程空闲多久后回收 |
| exe / worker | Qoder CN 安装路径 | Qoder 升级后若挪了目录,改这里 |
| logDir | ...\qoder-provider\runs | 原始事件落盘目录 |
权限询问必须应答(旧代码在这里卡死 300 秒)
Qoder 在自己的权限层要审批时,会往 stdout 发 control_request{subtype:'can_use_tool', request_id, …},然后等 stdin 上的应答。旧代码根本不应答 ⇒ 进程干等到空闲超时,用户看到的是「本轮运行失败 qoder:常驻进程 300000ms 一直没输出(卡在工具审批之类的地方)」。
应答形状是从 Qoder worker 自己的校验代码里挖出来的(不是猜的):
{"type":"control_response","response":{"subtype":"success","request_id":"<id>","response":{"outcome":"cancel"}}}
outcome ∈ proceed_once | proceed_always | proceed_always_and_save | modify_with_editor | cancel。
drive 模式一律 cancel;display 模式一律 proceed_once(那边就是要它自己干活)。
实测:收到询问 → 回 cancel → worker 不报 malformed → 整轮 10.6 秒收场。
常驻进程池(只对 display 模式有意义)
冷热实测(同一进程连答三轮):
| | 一轮耗时 |
| 每轮起一个新进程(旧行为) | 约 9–15 秒,其中 约 7 秒是 Qoder 自己启动(安全 hook + 初始化) |
| 一个进程连答第 2、3 轮 | 1.7 秒 / 1.8 秒(纯模型时间) |
机制是 -p --input-format stream-json:进程从 stdin 连续接收 NDJSON 用户消息。五条设计规则:
1. 按会话隔离:一个 DSH 会话一个进程(key = sessionId);没有 sessionId 退回一次性进程。
2. 只发增量 + 逐条比对记忆:DSH 每轮发完整历史,而常驻进程自己也有记忆,所以只发最新那一轮;发之前必须确认"进程记忆 == 这次历史的前缀",对不上就重开并重发完整记录。
(踩过的坑:用"前缀指纹"比对是错的——助手自己的回复会进入下一轮前缀,那样每轮都会误判成不一致。)
3. purpose 调用不进池:压缩这类调用会污染会话记忆,走一次性进程;标题见下一节。
4. 串行:同一进程同一时刻只允许一轮(带排队),否则输出会交错。
5. 空闲回收:warmIdleMs 到了就杀,不留孤儿进程。
标题不再冷启动
实测发现一次「你好」会打出两次 Qoder 调用:正文一次、会话标题生成一次(日志里能看到 result 为「简单问候开场」的那一次),等于每轮付两次约 7 秒冷启动。
现在 purpose === 'session-title' 的请求直接本地生成标题(取第一条用户消息、去首尾标点、限 16 字),不启进程、不花钱、瞬时返回;正文完全不受影响。要换回模型生成,把 localTitles 设为 false。
测试
本包不带测试脚本;验收方式是装好后在会话里选 qoder / Qwen3.8-Flash 跑一轮,看界面是否出现正常的流式正文与工具卡。
免费名单只认实测(2026-10-16 的教训)
Qoder 不告诉你哪个模型免费:--list-models 只列名字(连 Auto / Fast 都在里面)。
我一开始按「Flash / Preview 档看着像免费」推测,一次塞进 4 个未实测的模型,被用户当场指出—— 只有 Qwen3.8-Flash 是免费的。这类猜测会直接花掉真钱。
所以现在的规则是:
1. 默认名单里只有实测确认免费的 Qwen3.8-Flash。
2. 其它任何模型一律拒绝,除非显式打开 allowUnlisted(明确表示我知道它可能花钱)。
3. 想给某个模型"转正",先跑 ..\_verify-models.mjs --yes <模型> 实测一次,读 result 事件里的 total_credits / total_cost_usd;确认是 0,才写进 VERIFIED_FREE_MODELS。实测记录落在 ..\_model-verification.jsonl 账本里,可复查。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
baldovinmarques391-design/dsh-qoder-provider
把 Qoder CN 免费模型接入模型选择器直接调用
相关插件 · 模型接入
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