Releases: ddys9621/WenlanAI
Release list
v1.5.5
修复流式生成偶发「返回了空内容(finish_reason: None)」:网关掐流 / 夹带错误现在透出真实原因并自动重开
- 修复剧情线 / 章节等生成偶发报
模型 xxx 返回了空内容(finish_reason: None),请检查 API 配置或稍后重试且整个任务直接失败:模型正常结束(哪怕正文为空)一定会带 finish_reason,None只可能是流在模型完成前被上游 / 中转网关掐断——grok-4.x 这类推理模型思考期间几乎不吐思考内容,连接一静默就容易撞上网关空闲超时;也可能是网关以 HTTP 200 开了流,却在流里塞了data: {"error": …}或直接回了 JSON 错误体。原实现把这几种情形一律当成"空内容",网关给出的真实原因(upstream timeout / rate limit / 额度不足…)被整个丢掉,而且一次都不重试。现在:流里的错误事件 / 错误体原样透出(如网关在流式响应中返回错误(HTTP 504): upstream timeout);未收到 finish_reason 的零正文与 5xx/429 网关错误,在尚未收到任何正文时按 1s→2s 退避自动重开(最多 3 次);推理耗尽 Max Tokens、鉴权 / 参数错、finish_reason=stop 的空输出等确定性失败仍立即报错,不白等。 - 零正文错误消息带上现场信息:被中断时会写明「未收到 finish_reason、期间收到约 N 字符思考过程、收到 M 个 SSE 事件、非 SSE 正文预览」,一眼能区分是静默掐断还是网关回了别的东西,便于向网关方反馈。
- 兼容
data:冒号后不带空格的 SSE 网关:SSE 规范允许省略该空格,部分网关就是这么发的,此前这类网关的正文会被整个跳过而报空内容。
Full Changelog: v1.5.4...v1.5.5
v1.5.4
拆书抽取改走流式免疫中转网关超时(Cloudflare 524),修复同名角色 / 重复关系导致的生成中断
- 修复拆书抽取经中转站报
API返回错误 (524): <!DOCTYPE html>…并卡在第 1 批:拆书卡 / 情节单元 / 全书骨架 / 文风指纹 / LLM 切章原来走非流式请求,一批 10 章的输出动辄一两分钟,而挂在 Cloudflare 后面的中转站规定源站 100 秒内必须给出响应头,超时就掐断并返回 524 + 整页 HTML 错误页;编排器把它当整批失败对半拆,每次重试再白等 100 秒,1500 章的书 4 分钟还停在第 1/77 批。现在这几步全部改为流式累积:网关一收到流就回响应头,chunk 持续到达即重置计时,不再撞 100 秒上限;抽取弹窗里也能看到模型「思考中 N 字 / 已输出 N 字」的实时进度,而不是干等「等待模型响应」。 - 网关错误消息不再夹带整页 HTML:中转站返回 HTML 错误页时,进度条 / 弹窗 / 日志只显示页面标题(如
x666.me | 524: A timeout occurred),JSON 错误体折叠为一行并截断;Cloudflare 520-524 与 502/504 一样,在尚未收到任何内容时自动重试。 - 修复同名角色 / 重复关系 / 全局预设风格引发的
MultipleResultsFound:角色名没有唯一约束,同名角色、同一对角色间多条关系(手动建关系不查重)、一个全局预设风格被多个项目设为默认时,按名字 / 关系 / 风格查一条记录的地方用了「必须恰好一条」的取法,命中多行直接抛错——章节生成时结算 / 回滚关系事件、视角角色已知信息、向导与角色生成建关系 / 组织成员、新建章纲 / 世界规则 / 组织成员的查重、写作风格详情与删除都可能被打断。现在统一改为取第一条(关系取最早建的一条),不再因为数据里有重复而中断。
Full Changelog: v1.5.3...v1.5.4
v1.5.3
工程化桥段流水线:修复展开桥段时章纲-剧情线账本的唯一约束冲突
- 修复
UNIQUE constraint failed: chapter_outline_plot_line_links.chapter_outline_id, chapter_outline_plot_line_links.plot_line_id:「展开全部就绪桥段为章纲」跑到某个桥段时报这个错并终止批量,之后重试同一桥段必然再报。根因是槽位规划允许同一条支线的多个节点落进同一个桥段(未锚定支线的桥段边界正好切在两个相邻节点之间、或多个锚定节点挤进同一个主线节点的桥段),而展开时是按"副线任务"逐条往章纲-剧情线账本写记录,同一章纲对同一支线写了两行,第二行就撞唯一约束。现在展开前先按剧情线归并:每条支线只建一条账本记录,该桥段内的多个节点合进同一条记录的beats_covered,剧情线进度统计结果与原设计一致。 - 已规划好的桥段骨架无需重做:出错的桥段仍是「就绪」状态、事务已回滚没有写入半截数据,升级后重新点「展开全部就绪桥段为章纲」即可从出错的桥段继续。
Full Changelog: v1.5.2...v1.5.3
v1.5.2
拆书参考:修复多实例并发抽取导致的拆书卡唯一约束冲突
- 修复
UNIQUE constraint failed: book_dissect_chapter_facts.task_id, chapter_number:同一个数据目录被两个后端进程共用时(桌面版和终端里的开发服务同时开着、或应用被启动了两次),另一个进程看不到正在跑的抽取任务,点「停止」只改了数据库状态,再点「重新抽取」就会有两条流水线同时往同一任务写拆书卡,第一次落库就撞唯一约束。现在每个任务的抽取在运行期间持有一把跨进程运行锁(锁文件放在数据库旁边,进程退出自动释放):在另一个实例上「开始抽取 / 停止 / 删除」会明确提示「任务正在另一个后端进程中抽取」,不再互相踩数据;服务重启后残留的「运行中」任务仍可像以前一样点「停止」恢复。 - 修复写库出错后任务卡在「运行中」:抽取阶段落库抛异常(如上面的唯一约束冲突)时,任务此前会因为事务未回滚而写不进失败状态,一直显示「运行中」;现在会正确标为失败并给出原因,可直接重新抽取。
Full Changelog: v1.5.1...v1.5.2
v1.5.1
拆书 V5:情节单元识别不再固定 8 章一次请求
- 窗口随模型上下文 / Max Tokens 规划:拆书卡之后的「情节单元识别」原来每轮只喂 8 张拆书卡,600 章的书要调 75 次 LLM,占了后半段调用的绝大部分。现在按模型上下文(输入侧,每张压缩卡约 350 tokens)与 Max Tokens(输出侧,每个单元约 450 tokens、平均 4 章)取小值规划每轮卡数,夹在 8-60 之间:32k 模型约 44 章一轮,8000 Max Tokens 约 56 章一轮,600 章从 75 次降到 10-15 次;小模型 / 低 Max Tokens 仍退回 8 章一轮。
- 大窗口失败减半重试:几十张卡一轮时若输出被截断、JSON 坏掉或模型没识别出单元,窗口对半缩小重试(下限 12 章),不再把 12 章硬凑成一个"过渡情节"兜底单元;小窗口保留原来的扩窗 / 兜底逻辑,成功后窗口恢复。
- 启动前预估看得见大头:抽取弹窗把「聚合产物 N 次」拆成「情节单元 X 次(每轮约 W 章)+ 骨架 / 人物谱 / 文风 7 次」;任务进度里也会显示每轮章数与预计轮数。
Full Changelog: v1.5.0...v1.5.1
v1.5.0
拆书参考 V5:从"实体图谱"改为"拆书卡 → 情节单元 → 全书骨架"
拆书不再抽人物 / 地点 / 关系 / 事件图谱,改为按网文写作者真正会用的方式拆:先给每一章写一张拆书卡,再把相邻章节归并成情节单元(起承爽收),最后在情节单元之上反推全书骨架、写法手册、人物功能谱与文风指纹。产物直接就是"这本书怎么写的",而不是"这本书里有什么"。
抽取流水线
- 逐章拆书卡:每章一张卡——章纲、功能标签(开局立足 / 危机铺垫 / 爽点兑现 / 打脸 / 升级突破 / 转场换地图……)、节奏、张力 1-5、情绪基调、章末钩子类型与原文、爽点、亮点、出场人物、主角变化、新设定。沿用 1.4.1 的分批策略:按模型上下文一次请求多章,输出被截断或漏章自动拆半 / 补抽;分批间注入已知角色名与前文章纲,保证跨批一致。
- 情节单元划分:滚动窗口喂拆书卡,LLM 按"一个完整的铺垫—兑现"切出多章一组的情节单元,给出功能、结构、主角行动链、情绪曲线、爽点类型、金手指用法、伏笔与章内分工(起 / 承 / 爽 / 收 / 转);窗口尾部未闭合的单元自动延续到下一窗口,LLM 识别不出边界时按窗口范围兜底收束(记录张力峰值章)。
- 全书骨架:先按情节单元分块划出阶段(核心冲突 / 主角目标 / 关键升级 / 代表桥段 / 阶段末钩子),再汇总为一句话前提、主线矛盾、金手指运作与演化、成长 / 力量体系、全书最强爽点、长线伏笔、阅读承诺、开篇策略。
- 人物功能谱 / 写法手册:人物按"在故事里承担什么功能"记录(主角人设与成长轨迹、盟友功能位、对手层级与升级方式、可复用的功能位),写法手册保留金手指模式 / 开篇钩子 / 打脸节奏 / 升级路线 / 爽点密度五项。四步互相独立,某一步失败不影响其余维度。
- 文风指纹:先对全书正文做量化统计(句长分布、段落长度、对白占比、问句 / 感叹句比例等),再抽分层样本让 LLM 给定性描述与 prompt_content,例句库逐字核验必须是原书原文。
- 结构统计(不调 LLM):章末带钩率、节奏分布、全书十等分张力走势、钩子类型与功能标签分布、有爽点章占比、情节单元长度与爽点类型分布。
参考包与各生成场景
- 维度收敛为 7 维:全书骨架 / 桥段库 / 文风指纹 / 人物功能谱 / 写法手册 / 结构统计 / 拆书卡检索。原「角色塑造」「世界观建模」「实体分布」「关系频谱」「事件节奏」随实体图谱一并移除,各场景策略表、挂载默认维度、一键仿写与桥段规划的注入槽位同步更新。
- V5 专用压缩:新参考包各维度按轻 / 中 / 深三档用专用算法压缩(骨架按阶段取要点、桥段库挑典型单元、文风带指标与例句),一键仿写与桥段规划两条注入链路共用同一份文本。
- 拆书卡检索取代实体语料:「灵感语料」槽位改为按本次要写的内容(章纲 / 剧情卡 / 桥段目标与爽点)BM25 检索原书拆书卡,桥段所在位置对应的功能标签命中加权,命中不足按章序补齐。
- 老参考包只读兼容:1.4.x 及之前生成的参考包标记为旧版(pipeline_version=2),仍可挂载到项目并按原通用算法注入,但不再提供实体 / 章节浏览;详情页顶部提示重新上传原书按 V5 抽取。
界面
- 拆书任务页与参考包详情页统一为 5 个 tab:全书骨架(含写法手册、结构统计折叠)/ 桥段库(聚合分布 + 逐个情节单元展开)/ 逐章拆书表(按功能标签筛选,点击看整卡)/ 文风指纹(prompt_content 一键复制或导入项目写作风格库、量化指标、原书例句)/ 人物功能谱。
- 抽取中即可浏览:拆书卡按批写入,抽取进行中就能在「逐章拆书表」看到已完成章节;阶段文案改为 章节切分 → 逐章拆书卡 → 划分情节单元 → 全书骨架 / 写法手册 / 人物功能谱 → 文风指纹 → 生成参考包。
- 参考包列表与详情标注流水线版本;桥段填充溯源面板的拆书槽位名称同步更新。
移除
- 后端删除 V2-V4 抽取核心(实体扫描 / 字典分类 / 章节事实 / 长上下文一次抽取 / 校验聚合 / V3 五维生成器 / 桥段识别)与
/api/book-dissect/{id}/v2/*八个浏览接口;实体字典 / 实体 / 关系 / 事件四张表不再读写(历史数据保留在库中,删除任务时一并清理)。
Full Changelog: v1.4.1...v1.5.0
v1.4.1
拆书参考:分批抽取、只抽前 N 章、进度可见、随时停止
- 不再一章一次请求:抽取阶段按当前模型的上下文窗口与 Max Tokens 自动规划每次请求送多少章(默认「自动分批」)。大上下文模型的一本书不再被拆成几百次逐章调用;也可以自定义每批章数、逐章、整本一次。
- 自定义每批章数以你填的为准:模型不在内置上下文窗口表中时,之前会被按 32k 保守预算悄悄切成 2~3 章一批(填 60 章一批却跑出 233 批);现在按你指定的章数分批,真超出模型上下文由拆半重试兜底,告警文案也如实说明。
- 可以只抽前 N 章:启动抽取时可选「只抽前 N 章」,不必拆完整本;之后随时可「重新抽取」扩大范围。
- 启动前先看代价:抽取弹窗实时显示目标章数、分几批、预计 LLM 调用次数,并提示 Max Tokens 偏低、模型上下文未知等会影响分批的情况。
- 抽取进度实时可见:点「开始抽取」后直接打开通用 AI 任务弹窗,实时显示当前阶段与文案——章节切分 → 实体扫描 → 字典分类 → 「正在抽取第 3/10 批(第 121-180 章)· 已完成 120/581 章」→ 全书聚合 → 参考包维度生成 → 桥段识别 → 写入参考包;批次失败拆半重试、模型漏章补抽也会提示,过程面板里能看到每个阶段的耗时与明细。弹窗可最小化到顶栏 AI 任务托盘继续后台运行,任务页上的「查看任务」随时找回;抽取失败时任务明确标为失败并给出原因,不再显示为"完成"。
- 批次失败自动拆半重试:某一批 LLM 报错、返回非 JSON 或输出被 Max Tokens 截断时,自动对半拆分重试直到单章;LLM 漏给的章节会单独补抽,不再整批丢失。分批之间注入全书字典与前文摘要,保证人名跨批一致。
- 随时手动停止:抽取运行中可在弹窗、托盘或任务页点「停止」,已完成批次的章节事实保留,之后可重新抽取;删除运行中的任务也会先停止它。
- 修复:服务重启后拆书任务卡在「运行中」、无法重新抽取的问题(点「停止抽取」即可恢复)。
章节切分
- 识别带流水号的标题:
1.第1章 xxx、12、第十二章 xxx这类阅读器 / 网站导出格式现在能正确切分。此前这类标题会被整体漏掉,几百章并成一个巨型"前言",抽取时再被 LLM 兜底重切成另一套章数。 - 重复标题行只算一章:同一章连着两行标题(
347.第345章石头仙紧跟第345章石头仙,或阿拉伯数字 + 汉字数字双标题)不再把章数翻倍;LLM 兜底切分同样改为按整行取标题、正文从下一行起。 - 章数前后一致:抽取运行时若重新切分得到的章数与上传时不同,任务的章节数与章节列表会以实际结果更新,不再出现"章节数 581 / 章节抽取 0/2111"对不上的情况。
Full Changelog: v1.4.0...v1.4.1
v1.4.0
剧情线与桥段规划(更贴合网文写法)
- 剧情线按全书体量规划:生成主线时会把全书章数交给 AI,主线节点数随书长自动增加(大约每 20 章一个节点,最多 16 个),不再拿短篇的节奏去撑长篇;每个节点还会给出预计章数、主要舞台、对手层级和主角境界变化,后续规划桥段时全部可见。
- 开篇不再拖沓:开篇节点的篇幅有上限(约 12 章),前 30 章内必须进入第一个正式冲突。
- 长节点自动分阶段:跨 20 章以上的主线节点,填充桥段前会先拆成几个递进的「阶段」(每个阶段是一件完整的事,对手与赌注逐阶段抬高),再逐阶段填充,不再在同一节点里几十章原地打转。
- 非开篇桥段直接承接:从第 2 个桥段起,每个桥段的第一章不再强制写半章日常代入,而是直接接上一桥段留下的钩子。
- 节点收官与全书高潮桥段形态不同:每个节点的最后一个桥段会把整个节点积压的期待一次放完;全书最大高潮所在节点的收官桥段采用加密兑现(拉扯更短、兑现更密、回收前文伏笔)。
- 伴生支线不再“失踪”:感情线这类伴生支线在活跃区间内,两次主推之间的每个桥段都会自动带一句保温,不会几十章不出场。
- 支线篇幅用满预算:支线预算多于节点数时,最重要的支线节点会占两个连续桥段。
- 兑现方式去重:每个桥段会标注兑现方式(打脸 / 扮猪吃虎 / 收获机缘……),桥段列表里可见;后续填充会看到全书累计使用次数与上一桥段用法,避免长线套路重复。
- 兑现章末尾可选半钩:世界设定页新增「桥段兑现章(C3)末尾」选项:默认保持“不留钩子”(适合付费连载),可切换为“收束 + 半钩”(适合免费平台)。
- 实际章数明确提示:桥段按 4 章取整时,向导会直接告诉你实际规划了多少章。
AI 任务统一后台运行
- 角色、组织、剧情线、剧情卡、桥段填充与展开、正文生成 / 重写 / 批量生成、章节分析、场景生成、一键仿写、向导四步、灵感模式全部改为后台任务:关掉弹窗不中断、刷新页面可接管、随时可停止。
- 顶栏新增 AI 任务托盘,可查看所有进行中 / 已完成的任务;任务弹窗内可看到进度、思考计数以及阶段 / 工具 / 参考资料的过程面板。
章节与正文
- 章节管理并入「剧情分析」页:左侧章节列表(新建 / 编辑 / 生成 / 去 AI 味重写 / 场景 / 分析 / 删除),右侧阅读区(标注、叙事状态、实时生成进度就地显示);原章节管理页与沉浸式阅读页移除,旧地址自动跳转。
- 去 AI 味重写:重新生成改为“去 AI 味重写”——按项目维护一组去 AI 味提示词(可增删改、多选按顺序生效),AI 只拿提示词 + 本章原文重写,完成即覆盖原文并清除本章旧分析(不可回滚,重要章节请先备份)。
- 章节列表刷新不再加载全部正文,几百章的项目打开更快;选中未分析的章节不再弹“暂无分析结果”提示。
设置
- 思考强度:设置页新增思考 / 推理强度选项(关闭 / 低 / 中 / 高),支持相应模型的深度思考。
- 采样多样性:新增 Top P、频率惩罚、存在惩罚参数,用于降低正文的“AI 味”。
- 项目级模型覆盖:项目顶栏新增「模型」标签,可为单个项目单独指定模型与参数,保存后该项目内所有 AI 生成立即生效,不影响其他项目。
其他
- 前端首屏与剧情分析页体积明显缩小,加载更快;剧情线列表、生成前文上下文等多处查询合并,长篇项目响应更快。
Full Changelog: v1.3.0...v1.4.0
v1.3.0
新功能
- 公告弹窗可由管理员自定义:用户管理页新增「公告弹窗」卡片,可设置小标签、标题、正文(支持换行)、图片、按钮文字、可选链接;图片支持直接上传(≤2MB,jpg/png/gif/webp)或填地址。
- 显示频率与时间窗:只弹一次(内容改了会再弹一次)/ 每天一次 / 每次打开,可选开始与结束时间,到期自动停止显示;卡片内可「预览当前填写效果」,保存即生效。
- 弹窗改为登录后才弹出,登录页不再出现;默认内容仍是原来的交流群二维码,升级后无需重新配置。
权限调整
- 检查更新与一键升级仅管理员可用:普通用户的「关于」只显示当前版本与运行方式,不再联网检查、不再显示新版本提示;后端对应接口同步限制为管理员。
其他
- 登录方式设置与公告弹窗设置共用同一套系统设置存储实现。
Full Changelog: v1.2.0...v1.3.0
v1.2.0
新功能
- 检查更新与一键升级:设置页新增「检查更新」面板,启动时自动检查;侧栏常驻显示当前版本与运行方式,有新版本时整行红色提示、点击进入更新。安装包用户直接下载新版并弹出安装向导;源码用户一键
git pull+ 安装依赖 + 构建前端;容器用户给出宿主机命令。 - 登录方式后台开关:用户管理页新增「登录方式设置」卡片,可分别开关 Linux.do 登录 / 注册、邮箱登录 / 注册;Linux.do Client ID / Secret 与 SMTP 参数在后台填写保存(秘密字段不回传前端),附「发送测试邮件」校验。邮箱注册使用 6 位验证码:10 分钟有效、60 秒冷却、5 次尝试上限。
- 登录页按后台开关展示账号 / 邮箱 / Linux.do 入口,登录失败直接显示后端原因。
安装包升级改进
- 升级前整目录替换
_internal,旧版本残留的库文件与前端产物不再遗留。 - 向量模型目录移到安装目录根
{app}\embedding;升级时自动把旧版_internal\embedding里的模型挪过去,不需要重新下载。 - 源码模式若本地有未推送的分叉提交,一键更新会禁用并提示先 rebase,避免覆盖本地改动。
修复
- AI 生成组织时若 MCP 搜索返回了参考资料,会因日志处引用未定义变量而生成失败(NameError),已修复。
- 旧数据库升级到新版时自动补齐 V4 拆书参考包 / 桥段章纲的新列,不再需要手工执行迁移脚本。
性能
- 记忆服务与世界规则服务共用同一份 embedding 模型与向量库客户端:实测少占约 300MB 内存,启动快约 1.6 秒。
- 章纲、剧情卡、组织列表接口消除 N+1 查询(100 章从约 200 条 SQL 降到 4 条以内)。
- 章节 / 章纲 / 剧情线 / 剧情卡 / 角色 / 故事大纲等热表补上
project_id索引,旧库启动时自动补建。
清理
- 删除约 7600 行无引用代码:21 条前端从不调用的接口(含后端「批量生成」旧实现、MCP 调试接口、admin 日志接口)、PostgreSQL 时代遗留的迁移脚本、从未使用的
langgraph/langchain依赖与 7 个前端依赖。
注意:如果你有外部脚本直接调用过以下接口,本版已移除:
/api/chapters/.../batch-generate*、/api/characters/generate-stream、/api/organizations/generate-stream、/api/mcp/plugins/{metrics,cache/stats,cache/clear,call}、/api/admin/logs*、/api/relationships/graph/...、/api/memories/.../analyze-chapter/...、/api/memories/.../analysis/...。页面功能不受影响。
Full Changelog: v1.1.0...v1.2.0