短篇生成未安全处理模型输出上限,并允许近空章节进入最终稿
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 兼容接口下观察到的。任何实际输出上限小于短篇流程单次请求规模的后端,都可能触发类似问题。
复现步骤
- 在 Windows 原生环境启动 InkOS Studio。
- 配置一个 OpenAI 兼容的 LLM 接口,并使用实际单次输出上限较小的模型。
- 创建短篇小说任务,设置:
- 语言:中文
- 章节数:18
- 每章字数:1200
- 确认执行提案并等待任务完成。
- 观察输出上限错误,并检查生成的
shorts/<story-id>/目录。
预期行为
- 当服务返回
length终止时,InkOS 应该采用安全分批生成,或从已生成的部分继续,而不是直接让整本任务失败。 - 只有在每一章都通过有效的最低字数校验后,草稿才应写入或标记为最终稿。
- 包装阶段应使用有界、精简的上下文;如果仍然失败,应保留清晰可恢复的生产状态。
实际行为
- 写作和改稿流程可能在一次模型回复中请求整本短篇。对于 18 章、每章 1200 个中文字符,
estimateShortFictionMaxTokens()会计算出 51,616 个 token。 - 当前流程只检查章节内容是否非空,因此只有标题或极短内容的章节也可能通过最终稿校验。
- 包装调用会在一个请求中携带完整大纲和完整正文。本次运行在该流程中触发了模型输出上限错误,随后任务变为
failed,且没有生成包装文件。
相关代码位置
packages/core/src/agents/short-fiction.tsShortFictionWriterAgent.writeDraft()ShortFictionDraftReviserAgent.reviseDraft()estimateShortFictionMaxTokens()validateShortFictionDraftForFinal()ShortFictionPackagingAgent.generatePackage()
packages/core/src/pipeline/short-fiction-runner.ts
建议方向
- 按安全的输出预算分批生成和改写章节,也可以一次处理一章。
- 将服务返回的
length终止视为可恢复的部分结果,而不是重复发送同一个过大的请求。 - 在写入
final/之前,按照目标字数的一定比例对每章进行可配置的最低长度校验。 - 包装阶段使用精简的大纲或摘要,不要直接嵌入完整正文。
- 增加针对输出长度终止、部分结果续写和近空章节拒绝的测试。
环境信息
- InkOS:1.8.0
- 操作系统:Windows 原生
- 接口类型:OpenAI 兼容接口
- 模型:DeepSeek 系列模型;其实际单次输出上限低于流程请求的单次预算
Source: Narcooo/inkos