#380·inkos

短篇生成未安全处理模型输出上限,并允许近空章节进入最终稿

Author: locolyricCreated Aug 19, 2026Updated Aug 19, 2026

问题描述

当模型的实际单次输出上限小于 InkOS 短篇生产流程请求的输出规模时,短篇生成可能失败。

在 InkOS Studio 中,使用中文短篇配置“18 章、每章 1200 字”生成时,出现以下错误:

Stream interrupted after 9662 chars: Error: model reached the output limit (length)

致命错误发生在进度提示“Generating synopsis and cover prompt...”之后,销售包装和封面提示词均未生成。

同一次运行还在失败前写入了 final/ 草稿,但 18 章中有 12 章的单章文件小于 500 字节。因此,界面或目录中看起来像“最终稿”的文件,实际上并不可靠。

该问题是在 OpenAI 兼容接口下观察到的。任何实际输出上限小于短篇流程单次请求规模的后端,都可能触发类似问题。

复现步骤

  1. 在 Windows 原生环境启动 InkOS Studio。
  2. 配置一个 OpenAI 兼容的 LLM 接口,并使用实际单次输出上限较小的模型。
  3. 创建短篇小说任务,设置:
    • 语言:中文
    • 章节数:18
    • 每章字数:1200
  4. 确认执行提案并等待任务完成。
  5. 观察输出上限错误,并检查生成的 shorts/<story-id>/ 目录。

预期行为

  • 当服务返回 length 终止时,InkOS 应该采用安全分批生成,或从已生成的部分继续,而不是直接让整本任务失败。
  • 只有在每一章都通过有效的最低字数校验后,草稿才应写入或标记为最终稿。
  • 包装阶段应使用有界、精简的上下文;如果仍然失败,应保留清晰可恢复的生产状态。

实际行为

  • 写作和改稿流程可能在一次模型回复中请求整本短篇。对于 18 章、每章 1200 个中文字符,estimateShortFictionMaxTokens() 会计算出 51,616 个 token。
  • 当前流程只检查章节内容是否非空,因此只有标题或极短内容的章节也可能通过最终稿校验。
  • 包装调用会在一个请求中携带完整大纲和完整正文。本次运行在该流程中触发了模型输出上限错误,随后任务变为 failed,且没有生成包装文件。

相关代码位置

  • packages/core/src/agents/short-fiction.ts
    • ShortFictionWriterAgent.writeDraft()
    • ShortFictionDraftReviserAgent.reviseDraft()
    • estimateShortFictionMaxTokens()
    • validateShortFictionDraftForFinal()
    • ShortFictionPackagingAgent.generatePackage()
  • packages/core/src/pipeline/short-fiction-runner.ts

建议方向

  1. 按安全的输出预算分批生成和改写章节,也可以一次处理一章。
  2. 将服务返回的 length 终止视为可恢复的部分结果,而不是重复发送同一个过大的请求。
  3. 在写入 final/ 之前,按照目标字数的一定比例对每章进行可配置的最低长度校验。
  4. 包装阶段使用精简的大纲或摘要,不要直接嵌入完整正文。
  5. 增加针对输出长度终止、部分结果续写和近空章节拒绝的测试。

环境信息

  • InkOS:1.8.0
  • 操作系统:Windows 原生
  • 接口类型:OpenAI 兼容接口
  • 模型:DeepSeek 系列模型;其实际单次输出上限低于流程请求的单次预算