qoder CLI 1.0.45 本地小说生成工作流搭建:Feature Gate 配置与长文本断连排查
上周想搭一套完全离线的小说生成工作流:不依赖任何云 API,没写完的稿子也不想传到第三方服务器。挑了刚升到 1.0.45 的 qoder CLI,配上之前攒的 qoder-novel 模板开干,项目目录放在 ~/projects/qoder-novel。第一次跑就碰了一堆摸不着头脑的日志,功能时好时坏,长文本生成到一半就断连,前后花了快两个小时才把链路跑通。下面把排查过程和最终配置记下来,给也想用 qoder 搭本地文本流的人避坑。
为什么选 qoder CLI
qoder-novel 的需求很明确:完全离线、支持长文本流式生成、能对接本地微调的小说模型,不走第三方云。比对几个本地 AI 编码工具后选它,主要三个原因:默认用 Bun 运行时,启动和文本处理比 Node.js 快 30% 以上,适合大量文本生成;原生支持 stream-json 输入输出,生成内容能直接喂给后续的格式化、角色一致性校验脚本,不用做格式转换;1.0.45 刚好新增了 SSE 流式输出诊断,对长文本稳定性帮助明显。
当时启动参数很朴素:Auto 模型自动挑本地推理模型,--print 直接输出,没动任何默认配置——结果第一跑就出问题。
Feature Gate 配置和实际生效对不上
第一次启动后先吐了一堆 config-service 的 debug 日志,我以为是正常加载,直到企业插件功能用不了、HTTPDNS 也没走本地解析,才意识到问题在 Feature Gate。日志里这几行很关键:
2026-07-22T22:13:17.842+08:00 INFO debug.message [config-service] enterprise_plugins feature gate value received { enabled: true }
2026-07-22T22:13:17.842+08:00 INFO debug.message [config-service] httpdns feature gate value received { enabled: true }
2026-07-22T22:13:17.843+08:00 INFO debug.message [config-service] model_server_transport feature gate value received { enabled: false, protocol: undefined, logRequestResponse: false }
按日志,企业插件和 HTTPDNS 都是开的,模型服务传输是关的,可实际完全对不上:调自定义小说模板接口报权限不足,模型请求还是走公网 DNS。查了半个多小时才搞清:qoder 的 Feature Gate 是动态从云端拉配置的,本地没显式声明的话,云端配置会覆盖本地默认值——我的本地配置没开 enterprise_plugins 的白名单,所以虽然云端回了 enabled: true,本地其实没放行权限。
长文本生成到 3 万字就断连
插件权限修好,立刻跑了个 10 万字玄幻任务,结果每次到 3 万字左右就自动断连。翻日志看到一行没截全的调试信息:
2026-07-22T22:13:17.843+08:00 INFO debug.message [config-service] sse_body_null_diagnostics feature gate value received { enabled: true, compression: 'zstd', chunkSizeChars:
一开始当成报错,后来翻 1.0.45 的更新日志才明白,这是新增的 SSE 响应体诊断,默认 chunkSizeChars 是 2048 字符,对长文本太小了——生成到 3 万字缓冲区占满,触发断连保护。我在本地配置把 chunkSizeChars 改成 8192,再跑长文本就没再断过。
最终落地的配置
踩完这两个坑,启动参数和本地配置都调过,工作流就稳了。调整后的启动命令和核心配置如下:
启动命令:
bun /$bunfs/root/index.js \
--print \
--output-format stream-json \
--input-format stream-json \
--model Auto \
--tools "novel_template,character_check" \
--setting-sources '~/projects/qoder-novel/config/local.yaml'
本地配置文件 local.yaml 核心片段:
feature_gate:
enterprise_plugins:
enabled: true
whitelist:
- novel_template
- character_check
httpdns:
enabled: true
model_server_transport:
enabled: true
protocol: local
sse_body_null_diagnostics:
enabled: true
compression: zstd
chunkSizeChars: 8192
几个值得记的调试习惯
这次最大的收获是摸清了 qoder CLI 的 Feature Gate 逻辑。三个习惯值得记:跑 qoder 前别关 debug 日志,config-service 打出的 Feature Gate 状态比翻文档查默认值靠谱;本地配置优先级高于动态 Feature Gate,要稳定用某个功能就在本地显式声明,别依赖云端动态拉取,否则就会出现"日志显示开了但实际没生效";长文本流式场景一定要调 SSE 配置,1.0.45+ 默认 chunkSizeChars 是 2048,只适合短文本,长文本建议改 4096 或更高,免得缓冲区满断连。

浙公网安备 33010602011771号