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 或更高,免得缓冲区满断连。

posted @ 2026-09-11 07:04  钱栈up  阅读(9)  评论(0)    收藏  举报