# 设计说明 [English](./design.md) | **简体中文** 这份文档解释鲸歌工坊为什么长成现在这个样子:最初的那些零散想法是怎样被归并的,每个关键决定在取舍什么。读完它,你应该能判断一个新需求该落在哪一层,而不必先读完代码。 ## 一、从十三条想法到五个问题 最初的想法大致是这样一张清单:编排器与写手分离;全文修改 / 大纲推演 / 局部修改 / 世界观修改 / 人物修改;从已有稿件一键生成大纲与人物;群像与角色生命周期;世界观与人格系统;RAG 与长上下文;文风;管理人物与剧情、看梗概、翻阅查找、圈定修改的界面;阅读模式与章节;插图;有声小说;有声漫;可以临时下场的角色扮演,甚至实时 Galgame。 逐条实现会得到十三个互不相识的功能。把它们按"在回答什么问题"重新归类,只有五个: | 问题 | 对应的想法 | 落到设计里 | |---|---|---| | **谁来写?** | 编排器与写手分离 | 五个角色:总编、写手、架构、分析、导演 | | **写的时候记得什么?** | 世界观、人格、群像的履历、RAG / 长上下文、文风 | 一个正史 + 分层记忆 + 上下文打包器 | | **怎么改?** | 五种修改模式、一键导入 | 同一套"提案"机制下的五种粒度;导入是"反向"的收录 | | **怎么看、怎么动手?** | 管理界面、阅读模式、章节、圈定修改 | 工坊:既是全局页面,也是会话旁的标签页 | | **写完还能变成什么?** | 插图、有声小说、有声漫、角色扮演 / Galgame | "演出":以有声脚本为枢纽的一组流水线 | 结论是:那些想法**不是多个创作工具,而是同一个正史上的多种工作模式**。模式只改变总编此刻的关注点和可以动什么,数据永远只有一份。 ## 二、谁来写:一个剧组 一本书由一个小班子来做:和你对话的**总编**,执笔的**写手**,以及四个各管一摊的角色——**场记**(收录记忆、审校、整理导入的书稿)、**策划**(推演大纲与节拍、起草设定、假设分支、查资料)、**导演**(有声脚本、分镜、幕间)、**后期**(把配音、音效和分镜画面剪成视频)。 **总编就是会话里的 Agent。** 没有另起一个"编排服务":DSH(DeepSeek Harness)的 Agent 已经有规划、工具调用、上下文压缩、待办、提问这些能力,再造一遍没有意义。插件提供一个预设(小说家 Novelist),给它总编的人格说明、`novel_*` 工具和随对话携带的项目摘要。 **写手是一个模型角色,不是一个 Agent。** 写正文不需要工具循环,需要的是一份为这一次调用精心准备的上下文和一个稳定的系统提示。所以写手是"流水线里的一次模型调用":总编(或你在界面上)给出简报,流水线打包上下文、调用写手模型、清洗输出、保存、收录记忆。 ### 其余四个角色都是 DSH 的 agent "一问一答"适合一个问题一个答案的活。可是场记、策划、导演、后期的活大多不是这样:审一章要对照前后章和人物卡,推演大纲要翻已经写下的东西、有时还要上网查资料,找一份扒来的书稿的章节要一边看一边试,剪一段视频要写脚本、跑、看结果、再改。规则和单次提示只能猜;agent 可以去查证。 所以这四个角色**不是四段提示词,而是四个 agent**。一个角色和另一个角色的区别,恰好是这张清单,机制上别无不同: | | 是什么 | 例子 | |---|---|---| | 提示词 | 一份人设(它是谁)和一份守则(它在剧组里怎么干活) | 场记"只依据书里实际写了什么来记录和判断" | | skill | 用到时才加载的做法,随包发布在 `crew/<角色>/skills/` 里,只有这个角色的目录里有 | 后期的 `novel-video-editing`、策划的 `novel-trend-research` | | 工具 | 工坊给它的:查书的 `book_read` / `book_search`,这件活的交回工具;以及对话里的工具中它的活用得上的那几样 | 策划有 `web_search` / `web_fetch`,后期有 `bash`、读写文件 | | 权限 | 继承发起它的那场对话的权限模式,需要批准的操作一律拒绝;书稿本身只能通过工坊的工具改 | 后期只能往它的工作目录里写 | | 模型 | 每个角色单独指定,或跟随对话模型 | 后期选写代码最稳的 | 它们跑在 **DSH 自己的 agent loop** 上,而且走的是 DSH 官方的委派接缝:一次角色运行是一个 **subagent**,通过 `ctx.subagents` 在发起它的那场对话之下启动,provider 由本插件注册。于是 DSH 为每个子 agent 做的事,对角色也一样做了:加入父对话的组合(作者自己的工具、skill、指令因此都在它够得着的地方)、继承父对话的权限并把"需要批准"钉成"拒绝"、计入委派深度、**登记在父对话的子智能体目录里**——在对话标题栏点开就能看到每一次运行的每一步,token 和用时都在。provider 只补上让它成为"这个角色"的东西:人设与守则、工坊给的工具、它的 skill,以及对话里的工具它能看到哪些。循环需要的其余一切——模型请求与重试、工具调用与参数校验、持久的会话日志、token 计量、取消——都是 DSH 的,工坊没有第二份实现。 **把活交给角色有两种形状。** - *有交付物的活*(收录一章、审一章、推演五章、编一段脚本、切一段分镜……):角色拿到任务和材料、查书的工具、它能用的对话工具,和**一个交回工具**。交上来的东西当场校验,不合格的原因作为工具的失败返回给它,它改了再交;交回即结束这一轮——所以材料齐全时,一次 agent 运行就是一次请求,不比单次调用贵。原来流水线里"向模型要一个 JSON"的地方,现在全部走这条路。 - *用话说的活*:总编用 `novel_crew` 把一件事交给某个角色("查一查民国上海的邮政,给第四章想两个桥段"),角色自己查书、查资料,最后用一段话汇报。它不改书——采纳什么、怎么落到书里,由总编和作者决定。 **材料全在手上的活,一问一答。** agent 的用处是它能自己去书里查。有些活用不着查:把一章正文切成有声脚本、收录一章、照脚本排分镜、把一段提示词压到模型读得下的长度、整理作者随手写的想法、把逐章的记载写成一段履历、从范文里提炼文风、修订之后核对审校意见、给一本新书打地基、照各章摘要分卷——它们要的全在交给它的那一段里。这些活不管角色设成什么,都是一次普通调用(`Assignment.plain`):给它一整套工具和十几步,只是让每次请求多带一堆它用不上的东西,还给了它东拉西扯的余地。要去读正文、查设定的活——审校、归并人物、理关系、找名场面、读成长、推演——照旧是 agent。 **不走 agent 的时候要说出来。** 每个角色可以在"设置 → 班底"里改成"普通调用"(一问一答,快而省,但看不到书里别处);agent 没交回结果、或者根本跑不起来时,同一件活会退回一次普通调用——这两种情况都写在这次任务的记录里(谁、以哪种方式、几步、为什么),不会悄悄发生。 **给多少工具由作者定。** 默认每个角色只有自己的工具,加上它的活用得上的那几样对话工具。在"设置 → 班底"里可以给某个角色打开"DSH 的全部工具"——对话里装了什么它就有什么(命令行、文件、联网、MCP……),只是永远拿不到总编自己的 `novel_*` 工具和需要人在场的工具(提问、目标、再委派)。这些设置可以对所有的书生效,也可以只跟着某一本书。 **外援。** 后期剪视频时如果自己做不好,可以把活交给另一个会写代码的 agent。这不是工坊自己造的轮子,而是 DSH 官方的子智能体:装上 `@deepseek-ai/dsh-subagent-claude-code` 或 `@deepseek-ai/dsh-subagent-codex`,预设里已经挂好的 `@deepseek-ai/dsh-tool-subagent` 就会把 `subagent_claude_code` / `subagent_codex` 变成可用的工具——没装的时候,这两行什么也不做。 护栏在工具里,因为工具能检查提示词只能请求的事。收录书稿时:会删掉全书五分之一的清理模式被拒绝;无限回溯的正则三秒后被掐断;读起来像句子的"标题"会按编号分成两种,报告里附上可以直接照抄的修正;步数用尽的场记会留下它最好的一版切分。剪视频时:成片要过检查才收——有画面、有声音、不是静音、时长对得上讲述、没有大段黑屏;工作目录之外的路径交不上来。每个角色每次运行有步数上限,到了只剩交回工具还能用。 为什么文字模型只用 DSH 里配的?因为 agent loop 只认 DSH 的模型。让工坊自己再接一遍别家的文字接口,得到的是一批当不了 agent 的角色,和两处要各配一遍的模型。所以文字模型一律来自 DSH 的"设置 → 模型",想用哪家就去那里接;工坊自己配的只有它特有的那几样:画图的、配音的、做检索的。(早先版本保存过"直连接口"的角色照常能用,只是只能普通调用,设置页会提示。) 为什么角色的模型要分开选?因为它们对模型的要求互相矛盾: - **策划**要推理和发散(推演大纲、完善设定),温度偏高; - **场记**要快、稳、读得细(收录、审校),输出是结构化的,温度很低; - **导演**要快、守得住格式(脚本、分镜,幕间里你每动一下都在等它); - **后期**要写代码稳。 每个角色可以单独指定模型;不指定时,策划回落到写手,导演回落到写手或场记,都没配置就跟随会话模型。这样"只配一个模型也能用"和"每个环节都用最合适的模型"是同一套设置的两端。 还不是 agent 的:写手(有意如此,见上);幕间的每一个回合仍是导演的一次调用——你每动一下都在等它,而且一场幕间本身就是一段连续的对话,更合适的形态是"一场幕间一个常驻的导演 agent",这是下一步;插图的提示词、文风样段这类一句话进一句话出的小活。 总编被明确告知**不要自己"写"正文**:绕开写手流水线的正文,也就绕开了设定、人物此刻的状态和文风。但对话里有大量改动并不是"写"——作者口述了一句话、贴来自己写的一段、想把一个名字改对——让一个会重写的模型去做这些,慢、花钱、还不精确。所以总编有自己的一双手专门做这类事(`novel_edit`:替换、插入、追加、删除、整章换入),在三种情况下用:话是作者给的;改动是机械的;作者明确说"你来写"。 ### 改书只有一条路 第一版用"禁令"划清总编和书的界线:用工具,别碰文件。真用起来有两个问题:总编能直接做的事太少;而它的工具不合手时,没有任何东西拦着它拿文件工具直接改——改完没有版本,记忆还在描述旧稿。用作者的话说,是主 Agent"偷偷暗改,但是和记忆、人设什么都不同步"。 解法不是更多禁令,而是一条足够宽的路: - **每一种改动都有工具**,而且每个工具自己把账记全:旧稿存成版本,这一章的记忆重新收录,检索重建索引,结果里告诉总编这次改动牵到哪里——提到的人物的卡、后面已经写好的章节。记忆记错了可以直接改对(`novel_memory`),而不是指望再收录一遍能读对。 - **绕路的口子温和地关上。** 冲着一本书自己的文件去的 `write`、`edit`(或 shell 重定向)会被拒绝,并被告知该用哪个工具。这是作者的设置,不是总编的,可以放宽成"每次问我"或"放行"。 - **真绕过去了也看得见。** 工坊靠文件的实际状态(而不是时间差)分辨"自己写的"和"别人改的";被编辑器、脚本或放行的工具改过的章节会记进改动记录、重新收录记忆,总编的上下文里也会写明发生过这件事。 - **没有任何改动是看不见的。** 总览页上有这本书的改动记录——总编用工具做了什么、在其他设备上做了什么、工坊之外改了什么——改过正文的可以一键撤销。 "Agent native"在这里落到实处就是:对话能做到屏幕能做的一切,而且它做的事和手在屏幕上做的一样看得见、一样能撤回。 ## 三、写的时候记得什么 ### 3.1 一本书就是一个目录 所有东西都落成文件:人写的是 Markdown(人物、世界观、文风、正文),结构和机器记忆是 JSON。理由有三个:作者应该能用任何编辑器打开自己的书;应该能用 git 管理;Agent 的文件工具在需要时也能读到它。代价是并发写入要小心——所有写入都经过同一个带锁的项目对象,并且监听目录变化,所以外部编辑也会实时反映到界面上。 ### 3.2 人格系统 人物卡在小传之外有一块结构化的"人格":带强度的特质、按优先级排列的价值观、说话习惯、绝不会做的事、压力下的反应。它存在的理由很具体——群像里人物"说话都一个味儿"几乎总是因为卡片只写了性格形容词。写手拿到的是可执行的约束("她生气时话会变少"),而不是"她很内敛"。 同一张卡还带着人物的外貌、人设图和配音设置。**形象和声音的一致性不靠模型记忆,靠每次调用都重复同一段外貌、带上同一张参考图(或同一段参考音)**——这是演出部分一切一致性的来源(见后文"全书一个样子")。 ### 3.3 群像:履历,不是标签 人物卡上**没有**"活跃 / 暂离 / 已死亡"这样的状态。最早是有的——一个词说完一个人在全书里的处境——后来去掉了,因为一本书不是一条直线:它有分出去的剧情线,也有写完后面再回头重写的前面。"已死亡"只对某一条线上某一章之后成立;写在卡片上,它在别的线上、在更早的章节里就是错的,而且它只强调"故事推进到了哪里"。 一个人在书里的处境是一份**履历**:哪一章登场,哪几章在场,哪里暂离,哪里回来,哪里离开或者死去。这份履历不需要另外保存——各章的收录里已经记着这一章有谁、他经历了什么、章末什么状态、是不是登场 / 离开 / 回归 / 死亡;沿着一条剧情线把它们排开,就是他的履历,因此永远和正文一致。沿着另一条线排开,是另一份履历:一个人在这条线上死了,在更早分出去的那条线上还活着。人物卡上另有一段"履历(一段话)",由场记照着收录写、作者可以改。 收录会漏、会错,也有收录根本看不到的事(故事开始之前就已经去世的人)。所以作者可以**亲手记一笔**:"在第 N 章登场 / 回归 / 离开 / 死亡",或者"故事开始之前就已故 / 已离开"。它仍然不是标签:它是履历里的一件事,带着章节——在这一章所在的每条线上算数,不在的线上不算——并且盖过收录对那一章的说法。作者记下的死亡或离开,后面的章节里再提到这个人只算被提起;要让他回来,再记一笔"回归"。 写手每次看到什么,由它决定——按**正在写的这一章**、沿**这一章自己的那条线**: - 所有人的卡片,哪一章都一样(这样请求的开头不随章节变,缓存才命中):主角、配角是整张,其余一行; - 本场人物(章纲列出的,加上从简报和上文里识别出的):上一次出场结束时的状态 + 一两句原文台词; - 一份"到这里为止,已经不在故事里的人":已死亡的(可以被提起,不能再以活人身份出场)、已离开的(章纲没有安排就不要让他们回来)——只算**这一章之前**的章节。第十六章才死的人,对重写第五章的写手来说还活着。 出场记录同样来自收录,因此"谁已经十章没露面了"是算出来的,不是记出来的。界面上,所有人的履历排在一张表里(人物 → 履历表):一行一个人,一列一章,沿选中的那条线读。 **人会长大:时期。** 履历说的是一个人在哪几章、遭遇了什么;它没说的是他那时多大、长什么样。人物卡上只写一个年龄、一副长相,等于哪一章都没说准——宝玉第三回是个孩子,第二十三回搬进园子时已是少年。所以卡上另有一组"时期":从第几章起、多大、这里变成了什么样;样子和为人只在和之前不同时才写;每个时期可以有自己的样子、人设图和立绘——时期里只写了一句"这时不一样的地方"的,仍然照人物卡的人设图画,不同处用文字说;写成了一副完整样子的,才用它自己的人设图。一个人有没有人设图,看的是他的卡,不看某一章读到的他:已经有的,绝不因为别人的图里有他而再画一遍。画里有他的图——段落配图、章节插图、分镜、别人名场面里的陪衬——照着的永远是一张人设图:这个时期自己的,没有就是人物卡的,这个时期的样子另用文字写出来。时期的立绘是那个时期的一幅画(常常是一幕名场面,带着场景和别的人),不拿来当别的图的参考;只有一张人设图都没有的人,才照立绘。时期由策划去书里找——它读的是"这个人在哪里变成了另一个样子"(年龄段、身份、长相),不是情节:一件事再有名也不是一个时期,多数人全书只有一到三个。写某一章时,写手拿到的是那一章时的他;画某一章的图,画的是那一章时的他。时期的人设图和主人设图一样只照文字画(时期的样子写得短,就接在人物卡的外貌后面;写全了就用它自己的——所以文字上是同一个人)。 **谁值得一张卡,由策划看过再说。** 收录一章会记下这一章里所有的人——门子和主角的对头一样被记下。最早是每个新名字各提一条"新人物"建议,一部长书收录下来就是上百条,真正该建卡的人埋在龙套里。现在收录**不再提"新人物"**:没有卡的名字都在"人物 → 龙套"那份名单里(它本来就是从各章收录读出来的,一个不丢);一批章节收录完之后,策划把名单里**还没看过的名字**放在一起看一遍,对着全书逐个说它是哪一种——**值得建卡**(进"设定建议",带它的理由和建议的分量)、**是别名**(建议并入某张已有的卡)、**龙套**(留在名单里,旁边写着为什么)。判断交给策划,不设"出场几次以上才算"这样的门槛;它拿不准一个只露过一面的人时留作龙套,这个人再出场(出现的章数比上次看时多了)会再问到它。什么都不替作者做:建卡、并入都是建议,等作者点;被留作龙套的人随时可以手动立卡。以前逐章提出来、积在那里的"新人物",同一遍筛里一起处理。可以在设置里关掉自动的那一遍,手动的按钮还在。 ### 3.4 分层记忆与"收录" "收录"是整个长篇能力的基础。每章写完,分析模型产出: - 一句话梗概和几百字摘要; - 硬事实(状态、关系、谁知道了什么、物品去向、世界规则、事件); - 每个在场人物的章末状态、所在地、情绪、学到了什么、一句有代表性的台词; - 正文里新出现、设定里还没有的人物 / 地点 / 物品 / 势力 / 名词; - 线索的埋设、推进与回收;读者此刻的疑问。 每十章再汇总成一段"篇章摘要"。于是远处的故事是粗粒度的,近处是细粒度的,最近几页是原文——这和人回忆一本书的方式一致。 记忆带着正文的哈希:正文一改,记忆即过期,界面和总编都会看到"未收录"的提示。 **收录一遍,后面就不用再读。** 场记读一章时,连同每个人在这一章里"看上去什么样、为人如何"、每处地方和物件"长什么样"、称得上名场面的一幕,一并记下。之后的人物卡、设定条目、成长、关系,都从这些记载里写——每样一批一次请求、几批并排发出去——不再为每张卡派一个 agent 把书重读一遍。 **建议由策划审定,不逐条等作者。** 收录发现的新地点、物件、组织、名词、线索,和策划筛出来值得立卡的人,不再一条条排队等批准:策划放在一起看,值得的收进设定,是别名的并入,其余不收——每条写明理由。作者看到的是"收进了什么"(能打开改、能撤回)和"没收什么"(能补收)。只有一种不这样办:改动别人已经写下的内容,那仍然等作者点头。 **纯净重新收录。** 把从正文读出来的一切清掉——收录、人物卡、设定、关系、线索、建议——只留正文,再整本读一遍。清掉的卡片和条目都留着历史(名字还在的进它的历史版本,不在的进"最近删除");图片和声音不是从正文读出来的,留着,同名的新卡把图接回去。 **一章的记忆说的是那一稿,不是这一章。** 收录一章,除了那份记忆本身,还在书里留下三样东西:章纲里空着的栏被填上(这一稿在哪、什么时候、谁出场、牵动哪几条线);线索上记一笔"埋于 / 推进于这一章",没见过的线索新立一条;发现的新地点、物件提成建议。这些都是"这一稿写成了什么",不是"这一章本来要写什么"。所以: - **从头重新起草,不带这一章自己的旧记忆。** 起草一章——第一次,或盖掉已有的正文——交给写手的章纲是"当初定下的样子":收录填上的栏不算(填的时候做了记号 `fromText`;更早填的,梗概、地点、时间和收录给出的一字不差的,也认作收录填的),线索上这一章自己留的记号不算,只有这一章的收录提过、没人确认的线索不算。策划备料时同样看不到:给它的清单里这一章是"未写",它用工具去读这一章的正文、记忆,去搜,都读不到旧稿的东西。按规则拼的那条路上,同一章起草两次,发给写手的请求一字不差——两稿的差别只剩温度。续写、修改、审校照旧按这一章现在的样子来。 - **再收录一次,先把上一次留下的收回。** 以前线索上的记号只增不减:旧稿推进过的线,新稿没碰,它还写着"推进于这一章"。现在重新收录时,先把上一份记忆留下的记号、填的栏、提的建议收回,再照新正文记。作者后来亲手改过的栏是作者的,不再算收录填的。 - **可以清除,而且看得见有没有。** 写作页右侧"记忆"里、大纲页这一章的菜单里有"清除记忆":那份记忆连同它留下的三样一起去掉,这一章回到"没收录",正文不动,再点收录就回来。写作页和大纲页的章节列表上,每一章写着"有记忆 / 记忆过期 / 无记忆"。 - 分不出来的不动:更早的版本里收录填进章纲的"出场人物""线索"两栏没有记号,和作者自己定的分不开——它们留着;收录建议里已经被采纳进设定的条目也留着(那是设定了,有自己的历史)。 ### 3.5 上下文打包:前情梗概 + 窗口里塞原文 写一章之前,模型读到的"此前的故事"分两层: - **原文**:离这一章最近的若干**整章**,一字不差,按顺序排好。预算默认是所用模型上下文窗口的一半(一百万窗口的模型就是 50 万 token),也可以在设置里填一个数;按整章取,一章不会被从中间截断,放不下就不放。 - **梗概**:更早的章节,每章一行摘要(很早的章节十章并成一段"篇章摘要")。没有收录过的章节用章纲里的梗概顶上——写过的章节不会有哪一章在上下文里毫无踪影。 这不是"装得下给全文、装不下就全换成检索"的二选一:稿子装得下时,梗概这一层是空的,就是全文;装不下时,近处是原文、远处是梗概,检索只负责从远处的章节里再捞几段相关的原文。窗口来自角色上自己填的值、DSH、接口,或一张常用模型族的对照表;谁都说不清的模型按 20 万算。 **下文也给。** 重写或修订中间的章节时,它后面已经写好的章节也一并给进去——由近及远、整章为单位,放不下的用梗概——并且明说:这一章必须接得上它们,不得与下文矛盾,也不要把下文的事提前写掉。前文的预算优先,下文至少保有三成。 **排列是为模型服务端的前缀缓存设计的。** 一次请求分成两段: 1. 不随章节变化的:作品信息 → 核心世界观 → 全书人物(主要人物全卡,其余一行)→ 前情梗概 → 前文原文。写下一章时,这一段只在**末尾**多出刚写完的那一章,前面的每一个字都不变。 2. 只属于这一次的:下文、本章人物此刻的状态、未回收的线索、相关设定、检索到的旧段落、下一章预告、本章已有正文、本章章纲、对这次写作的要求和篇幅。 为了让第一段真的稳定,做了三件事:写手的系统提示里不再带"这一章多少字""是不是续写"(挪到了第二段的末尾);原文窗口的标题只写起点、不写终点;窗口**不逐章滑动**——它守着同一个起点直到放不下,然后一次放掉最老的四分之一,再守到下一次。所以连续写作时,绝大多数章节的请求都是"上一章的请求 + 一章新原文",缓存命中的是几十万 token 里的绝大部分。模型服务端报告的缓存命中量记在用量账本里,写作结果里也会说这一次命中了多少。 检索本身是混合的:对中文按二元切分的 BM25,可选的向量检索,两者用倒数排名融合。不配置向量模型也能用。"只用检索"(最省)和"用满窗口"两种策略仍然可以在设置里强制。 ### 写之前先备料:策划看这一次要什么,写手只读交给它的 上面那套"按规则拼"的上下文有一个改不掉的毛病:它不知道这一次要写什么。近处的章节整章带上、名字在附近出现过的人物带上、检索捞到的旧段落带上——大半和这件活无关,真正要紧的那一句却未必在里面。写手一次写完、没有工具,书里它知道的只有交给它的那一份。 所以作者要一段文字的时候——写一章、续写、改写选中的一段、整章重写——**先由策划看一眼**(`materialBy: planner`——全局设,或者只给一本书设;都没设时按规则拼,那样快): - 告诉它这件活是什么(作者的原话、这一章的章纲、当初推演时定下的思路、要改的那一段或这一章现在的正文),给它一份"书里有什么"的清单(各章的章号、字数和一句梗概,人物、设定、线索的名字)。 - 它作为 agent 自己去读(`book_read` / `book_search`),读到这件活够用为止,然后交回一份**材料**:用它自己的话写的任务要求、故事此刻的情况、不能写错的事实、书写格式、文风上这一次要把握的;再按名字点出——谁的人物卡整张带上、哪些设定、哪些线索、哪几章带原文、哪几章只带梗概、哪几段原文(从正文里逐字圈出起止)。 - 交回来当场核对:名字对不上人物卡的、章号不在这条线上的、圈的原文在那一章里找不到的、加起来超过预算的,逐条退回。 - 工坊把它挑的和"不管谁备都要带的"拼在一起交给写手:作品信息、标了核心的设定、这一章的章纲和推演思路、要接的上一章结尾、正在改的那段或那一章、参考摘记、作者给的参考图。写手读到的第一段就是策划写的任务和情况,最后才是章纲。 **书小的时候,整条线直接摆在它面前。** 一条线的正文、人物卡、设定加起来不超过一个数(`context.plannerWholeTokens`,默认 32,000)时,这些全文就在交给策划的那一次请求里,它一次答完,不走 agent 的循环——一本几千字的书上,agent 会把四章、四张卡各读一遍,十四次请求、三十几万 token(大多是缓存)换来的和一次请求一样。更大的书它才自己去读。 **原来的拼法没有删。** `materialBy: rules` 就是它;写作页要求框下面那一行、改写按钮旁的小三角都能当场切。策划请不动、或者它交的怎么都不合格时,这一次自动退回按规则拼,并在结果里写明原因——不会因为备料失败而写不成。 **两种可以并排比。** 写作页"对比…"里"交给写手的材料"两个都勾上,每个模型就各写两稿;每一稿标着是哪种备料、材料多大,"看材料"打开的是这一稿的写手读到的全文(存在这一稿的版本旁边,版本删掉时一起删)。平常写的那一稿,它读到的材料留在这一章上(`.novel/material/<章>.json`,只留最近一次),要求框下面"看"。 如实的账:策划备料是多一趟模型调用。一本八十回的书上写第 41 回,按规则拼交给写手的是 43.6 万 token;策划备的是 2.9 万——但策划自己走了 23 步、15 次请求,输入合计 72 万(其中 65 万是缓存命中)。省下来的不是钱,是写手读到的东西和这件活对得上。 ### 3.6 文风 文风是独立于人物和世界的一份档案:视角、时态、基调、用词、节奏、意象、对白、必须做到的规则、禁用清单、范文。其中最有用的是禁用清单——"不要什么"比"要什么"更能约束模型。文风可以从范文里提炼,可以先试写一段再决定保存,一本书可以有多套并随时切换。 **语体排第一。** 一份文风最先要说的是"它是用哪种语言写的":文言、明清章回体的古白话、民国白话、现代白话……连同标志它的词。它是档案的第一栏(`register`),也是交给写手的文风里的第一行。判断语体看原文的字面,不看故事发生在哪个年代,也不因为读得懂就算作现代白话——《红楼梦》读得懂,但它不是现代白话。提炼时从全书三处各取一段(开头,三分之一和三分之二处某一章的中段),一个场面的腔调不等于全书的。 ### 3.7 篇幅:可以给预算,也可以不给 一章可以有一个"建议字数"——章纲里填,或者给全书填一个默认值。它是建议,不是硬指标:写手被告知"约 N 字,上下浮动 15%"。 **不填,就由写手自己判断。** 这时它拿到的话是"没有规定字数:章纲里的每个节拍都写足、写透,不注水也不赶进度",外加一句参考——这本书已经写好的章节平均多长。新建的书不再被悄悄盖上"每章 3000 字";老书上那个没人选过的 3000(英文 2500)也不再算数。总编被明确告知:篇幅是作者的事,作者没说就不要自己编一个数。 **有节拍的章,按节拍分几次写。** 让模型一次写一万字,它写到五千字就把这一章收了尾,自己停下——不是被截断,是它觉得写完了。一次写完还有一个毛病:九个节拍挤在一次回复里,哪个都写不足。所以章纲有节拍的章,默认就按节拍分几次写(`partBeats`,默认每次 3 个节拍;设置第一页能改,填 0 回到"一次写完,只有字数一次写不下才分"):每一次带着同一份材料和已经写出来的正文(请求打头的那一大段不变,服务端缓存接着用),并被告知"这一次只写第几到第几个节拍、写到哪停、不要收尾",只有最后一次才收尾。要了字数的,各段按节拍分到字数,前面写短了的摊到后面;没要字数的,每段多长由写手判断。这样每个节拍都写得足,一章也会比一次写完的长——这是这种写法的代价,不想要就把那一项填 0。章纲没有节拍的分不了段。**写出来比要的少了一成半以上,就说出来**——写作页提示一句,总编也被告知。 **三种写法。** 写一章(或续写)有三种方式。**默认哪一种在设置里定**(默认是按规则拼——作者 2026-10-14:“应该规则设置为默认”;之前 10-13 到 10-14 的几版默认是策划备料);**一本书可以有自己的**(设置页“这本书”里“这本书写作、改写前谁来备料”,存在书的 `novel.json` 里,对这本书顶替全局的那一项);**写作页要求框下面那一行可以当场选别的**——那里选的只管从这一页发起的写作,页面开着的时候一直有效,旁边写明"这里选的;设置里默认是……",不改设置;"对比"里可以几种各写一稿并排看: - **按规则拼**:工坊照固定的规则拼上下文——最近的章节原文、提到的人物、检索到的片段——写手一次写完。最快,也最容易带上不相干的东西。 - **策划备料**:策划先看这一章要什么,读书、挑出用得上的,连同任务要求、格式、文风交给写手;写手一次写完。 - **写手自己读、自己写**:没有人备料。写手作为 agent,拿到的只有这件活和它立足的东西(章纲、当初的思路、作品信息、核心设定、和上一章的衔接处),别的自己用工具去书里读;写好了用工具把正文**交上来**,交上来之后正文就是它手里的稿子——再看一遍,改几处,或者整章重交,改几次都行,满意了才**交稿**。没交稿就停了的,留它最后交上来的样子,并说明。要了字数的,工具会告诉它现在多少字、差多少。写手的模型当不了 agent(工坊直连的接口),或者这一趟什么都没交上来,这一章也不会空着:改成照备好的材料一次写完,并说明原因。 **在写手旁边干活的,不往正在写的这一章上写。** 策划备料时一步步读书(`book_read chapter …`)、写之前查参考文献、写完之后场记收录——这些都发生在写作任务里,而这个任务的输出流就是页面上"正在写的这一章"。它们干了什么只显示在进度那一行;以前策划的每一步、收录的回复都会冒到正文那一块上。 **收录不是写手那一次调用的一部分。** 写完一章之后的收录是场记的另一次调用,只带这一章的正文和名单;它的回复不显示在正在写的这一章上(以前会:收录的输出流盖掉了写作任务的输出流,看上去像正文后面全是记忆)。收录没成,正文照样存着,但会说出来。 ### 3.8 剧情图:故事可以不止一条路 大纲里的分卷就是**主线**:这本书被阅读、导出、配音、搬上舞台的样子。主线之外可以有别的**剧情线**——策划推演出的另一种走向、幕间里演出来的一段、大纲被重写之前的旧安排。一条线从某一章之后**分出**,可以带着一句"分叉处的抉择",走完自己的章节后可以**汇入**另一条线的某一章——于是剧情是一张图,而不是一根线。 - **重写大纲时,问的是"原来的怎么办"。** 推演章节可以指定从哪一章之后开始,并在三种做法里选一种:接着往后(追加)、**替换**那之后的大纲、或者**另开一条线**让两种走向并存。替换不会丢稿:被换下来的章节只要有一章写了正文,就整段留成一条"搁置"的线,随时能找回、能设回主线;一个字没写的才会被删掉。 - **线是可以摆弄的。** 在"大纲 → 剧情图"里:改名、写上抉择、让它汇入另一条线、搁置、删除,或者**设为主线**——它经过的章节成为正文的顺序,主线上被它替换的那一段自动变成一条线,分出和汇入的位置都对得上。 - **写下一章时选线。** 写作页一次列出一条线上的章节(它和别的线共有的部分变灰),可以切换;写完一章、故事在这里分了岔,页面会问"接下来写哪条线"。总编遇到同样的情况会先问作者。 - **线上的章节和别的章节一样。** 一样写、一样收录、一样审校、一样搬上舞台;它的"前文"是它自己这条线读下来的顺序,而不是主线。只有一点不同:**线上发生的事留在线上**——在一条支线里死掉的人,在书里并没有死;人物卡和主线的线索只跟着主线走。线被设为主线时,它的章节记忆才补记进设定。 - **幕间可以开成一条线。** 一场幕间除了"写成一章"接进主线,也可以"开成一条剧情线":从它分出的那一章之后起一条新线,这一场是第一章,玩家的第一步就是那句抉择。 - **剧情是一张图,图可以手动改接。** 一章——或连着的几章——可以挪到这条线的别处、挪到另一条线、或者单独开成一条线(起个名字,定它从哪一章之后分出;不分出就是从头独立的另一个故事):导入时混在主线里的番外就是这样分出去的。做这件事只有一个对话框,剧情图、大纲页、写作页三处都打开它。章节是按编号找的,挪到哪里,正文和由它做出来的东西都跟着;从它分出去、或汇入它的线也跟着它走。会把线打成死结的挪法(一条线从自己的章节分出去、绕成一圈)整个不做,对话框里也不给选。一条线从哪一章分出,在它自己的对话框里随时能改。 - **一条线只读它自己。** 一本书里可以有几条从头就各讲各的故事线,共用一个世界(九州那样的玩法)。所以谁在一条线上干活——写它的章节的写手,给它推演、审校、配脚本的角色——拿到的、以及自己用工具能读到的,只有**这条线**:它的正文和各章记载、它的人物、它的线索,外加几条线共用的世界观。别的线对这件活来说是别的故事,不会自己进来。具体地:认人也看是哪个故事:从别的线分出去的线讲的是同一个故事,从头独立的线是另一个故事;一章里的名字先对这个故事的人。叙述者的"我"在每个故事里都是另一个人;正经名字碰上别的故事的同名卡,由收录的场记当场判断是走过来的同一个人还是重名——不是同一个人的,名字后面带上故事线的名字。**一章收录里记的"某个人"是哪张卡,只有一处说了算**(`Project.castResolver` 的 `whose`),各条线的名单、履历、龙套名单、给章纲补出场人物、归并之后的回填都问它:收录当场认定的(记在那一条上:`by`)算数;更早的收录只留了一个编号——而编号就是名字——它只在这张卡自己的故事里算数,到了别的故事里按名字重新认。一张卡是哪个故事的,看不靠名字的东西:作者归的线、它最初出场的那一章、还没收录的章纲里安排了它。所以早先被"全书只比名字"记到同一张卡上的两个故事里的"我""妈妈""老板",**读的时候就分开了**,不必把书重新收录一遍;被分出去的那一个在它自己的故事里是没立卡的龙套。设定页选了一条线:上面是归在它名下的,然后是"几条线共用的"(它的故事写到的、或哪里都还没写到的),最后折着一组"只在别的线出现、没归线的"——多半就是那几条线自己的,旁边一键照正文归过去。 - **章号各数各的。** 每条线从自己的第一章数起(分出去的线接着分叉点往下数)。角色读"第 3 章"读到的是这条线的第 3 章;大纲、任务、审校页上的章号也是。 - **人物归谁,不用逐个去标。** 卡上写明了属于哪几条线的,照写的;没写的,看他出现在哪——哪条线的章节里有他(收录里记着,或者章纲安排了他),他就是哪条线的;哪里都还没出现的卡,每条线都能用。 - **设定条目:共用,直到归了线。** 地点、家族、物品、世界观的条目没归线时是几条线共用的世界——不按"哪条线的正文恰好写到它"来猜(全书都靠它的一条设定,可能只有一条线逐字写到)。归线有三条路:**收录时场记顺手判断**——书里有不止一条线时,告诉它这一章在哪条线上,它对每一条新设定说出是"这条故事线独有的"还是"这个世界本身的";独有的,采纳后归到读这一章的那几条线(这一章自己的线,加上之后才从它分出去的线——如果那就是全部的线,就不归),不塞给别的线;场记没说的(以前的收录),主线以外发现的算那条线的、主线上发现的算共用的;作者一次选一批归到某几条线;或者让工坊"照正文出现在哪条线来归"(每条线都有、或都还没写到的不动)。"设定"各页按手上这条线列:这条线的在上,共用的单独一组,还能只看没归线的。 - **线索也分线。** 一条线索是它被埋下、推进过的那些线的;在主线上已经回收、而分叉在那之前的线上,它仍然悬着。 - **书的"故事核"是主线的。** 给一条从头独立的线干活时,换成这条线自己的名字和"这条线讲的是什么"。 - **想跨线,说出来。** 章纲里点了名的人、作者(或总编)在要求里点了名的人,不管是哪条线的都会带上;要参考另一条线上发生的事,由总编去读了转述——它不受这条限制,能按线读整本书。 - **手上只有一条线。** 整个工坊共用一个"当前故事线"(每本书各记各的,记在这台设备上):大纲列的、推演的、写作页的章节、观看的正文和画册、人物名单、一键制作、全书修订,都是这一条。在任何一页换了线,别的页都跟着;从别处点开一章——搜索、任务、链接——而它不在手上这条线上时,工坊整个换到它那条线。不需要每到一页再选一次。 - **读的时候也能选。** 阅读页同样按线阅读;读到分叉的那一章结尾,下面不是"下一章",而是几条路——每条路上写的正是分叉处的抉择。这是把故事做成"可以选的"的那一步:图、抉择、每条路上的章节,都已经在数据里。 ## 四、怎么改:同一套提案机制的五种粒度 | 作者心里的模式 | 实际发生的事 | |---|---| | 大纲推演 | 架构模型读记忆与线索,给出后续章纲 / 节拍 / 假设分支;先看方案,再决定是否写入大纲 | | 局部修改 | 选中一段 → 写手只重写这一段(带着前后文),生成提案 | | 整章修改 | **在原稿上一处处改,不重出整章**:写手作为 agent 读这一章,用“找原文 → 换成什么”的工具改要求说到的那几处(想好的几处一次交上来),没碰的句子根本不重新输出,也就不会走样;改完用一两句话说改了哪几处、怎么取舍的。出来的不是“改好的一章”,而是**变了的那几处**——每处一条小提案,逐条采纳 / 放弃,或一起。写手的模型当不了 agent 时,同一件事一次请求问出一份改动清单,由工坊照着改。要求是通篇的(换文风、换视角、重排结构)才用“整章重写”——那是菜单里另一项,写手也会在办不到时自己说 | | 全文修改 | **也按处修**:策划定下这条要求碰到的那几处(逐字引原文,一处一两句),写手只改这几处,每一处一条小提案,归为一批。要求本身是通篇的(文风、语气、视角)或一章里要动的句子连成片时,策划才把那一章列为整章重写。作者点名了章节,策划就只看、只动这几章 | | 世界观修改 / 人物修改 | 先改设定,再用"把这条变更同步到正文"发起一次全文修改 | | 修审校出的问题 | **按处修,不整章重出**:问题引了原文的,写手只改引文那一处;没引原文的(矛盾、缺一句交代、节奏),策划定改哪一处——一个问题往往不止一处可以下手,挑改得最少的那一处,可以不在发现问题的那一章——写手只改那一处。一批:勾选若干问题(可以跨章)、各写一句意见,策划把它们放在一起看,定下改哪几处、各怎么改——包括没被点名但写到同一件事的章——每一处是一条自己的小提案;也可以"从某个级别起"一键全交。整章重写只在作者点名时做(问题卡片的"⋯"),或策划说明几处改解决不了时。提案采纳之后,审校把还开着的问题对照新的正文再看一遍:修好了的标掉,说法变了的更新。**修复任务不互相挡着**:一个在做的时候照样可以再交一个,按钮旁的小三角定它怎么排——**排队**(默认)等前面的做完、接着它们留下的修改改,前后一个说法;**分别**马上开始、各改各的,给互不相干的修复用(另一条线、隔得远的情节) | 几条共同的规则: - **改动先是提案。** 提案带差异对比,采纳才生效。界面发起的修订总是提案;总编发起的默认直接生效(它在对话里向你汇报),也可以在设置里改成"先作为提案"。 - **生效前先存快照。** AI 写作、修订、恢复之前都会给旧稿留一份版本,可以对比和恢复。 - **提案会过期。** 片段提案记录的是"被替换的原文";原文后来被改过,提案就无法应用,只能放弃重来——宁可这样,也不要把改写贴错地方。 - **改多少是一项设置,默认“主动”**(`mendReach`;作者 2026-10-12:“现在审校-提案经常改的范围很保守,我希望能更主动一点”)。按处修改最初的规矩全是往小里收的——“改动越少越好”“一处能解决的不改两处”“只圈非改不可的那一两句”“只修这个问题本身”——出来的提案就常常只换一句话:比喻太密的一段只换掉被引的那一个比喻,一段像在念设定的对白只在两句之间插一句。现在两档:**主动**(没设过就是它)——把问题改到位:它露出来的每一处都改,矛盾的两头该改哪头改哪头,一处改了之后因此要跟着变的句子(后面的呼应、别人的反应、同一件事的再次提起)也各列一处;一处**圈够**——要一起动才通顺的几句、要重写的一整段,整个圈进来;修它要新写一小段交代、一个动作、两三句对白时就写。问题引了原文、直接在引文处改的(文风、语言、节奏),交给改写的是**引文所在的那一段**(很短的一行对白连同它前后各一段;不跨图片行;占了大半章就还是只给引文),并说明问题露在哪一句、这一段里别的句子可以跟着动。**保守**——原来的做法。它管所有按处的修改:修审校问题、照引导审校(“修改一章”)、全书修订、照要求改一章。在设置第一页“修改改多少”,修复按钮旁的小三角、问题卡片的“⋯”、写作页“修改一章”的三角里都能切;总编的 `novel_revise` 只在作者对这一次说了“小一点 / 再大胆些”时才带 `reach`。 **主动不等于放开**——三样不变:① 机械的那几道验收照旧(引的原文逐字照抄、在这一章里只对得上一处、两处不重叠、不把大半章圈成一处、图片行不动),提案照旧收紧到真正变了的那几句,所以圈得再大,没变的句子也不会出现在对比里;② 情节的走向不借机改,和这个问题无关的毛病不动;③ **原文交代过的事改完一条都还在,新写的句子不另起设定和前文里没有的名字、年份、来历、死因**——这一条是实测逼出来的:头两遍“主动”把一段来历重排成问答时,模型顺手编了一个年号、一个姓,还丢了一句交代;把它单列成一条规矩(并让它交回前拿原文逐条对一遍)之后,第三遍策划在说明里逐条报了“都还在”。它是写在交代里的话,不是保证——所以每一处仍然是带红绿对比的提案。 - **一处就是一处:圈定、唯一、不外扩。** 策划交回的每一处,引的原文就是写手能动的全部范围——“保守”时要它只圈非改不可的那一两句,“主动”时要它圈够;这段原文在这一章里必须只对得上一处,重复出现的("她点头。")当场退回,让它连前后的半句一起引。写手被告知"能动的只有这一处里的字"(保守:改法没提到的字句照原样交回;主动:这一处里为了通顺而要跟着动的字句可以改)。交回来之后,提案再收紧到**真正变了的那几句**(整句为单位;只是加了一句或删了一句的,留相邻的一句作落脚点;收紧后要仍然只对得上一处,不然往外扩一句)。提案记着这段原文当时在第几个字(`at`):同一句话在一章里有两处时,采纳替换的是它指的那一处,不是头一处。 - **照正文更新章纲,是重新读一遍,不是核对一遍。** 第一版给场记看原来的节拍,并让它“还对得上的原样留着、一个字不改”——模型于是把旧章纲原样交回,正文后来多写的一场(一章结尾的敲门声)就一直没有节拍。现在:原来的节拍**根本不给它看**,让它把正文从头到尾走一遍,一场一个节拍,开头和结尾都要有;梗概、**这一章的作用**(照正文实际做到的写,参照前后章的梗概)、地点、时间、视角、出场人物也照正文重写,原来的只作对照。交回来和原来一字不差的节拍保留编号。给写手的备注和线索不动;原来的章纲在历史版本里。 - **正文改了,章纲可能落在后面。** 章纲(梗概、地点、时间、视角、出场人物、节拍)是动笔之前排的;正文写得和计划不一样、作者自己改过、修订采纳之后,它说的就不再是正文了——而之后重写这一章的写手、排分镜的导演、往下推演的策划读的是它。所以写了的章节有"**照正文更新章纲**"(旁边"只更新节拍"):场记拿着正文和现有的章纲,一次普通调用——和正文仍然对得上的节拍原样留着(连编号),对不上的照正文改,正文没交代的地点 / 时间照原计划留着;"这一章的作用"、给写手的备注、牵动的线索不归它管。原来的章纲在历史版本里。它是一个按钮,不是自动的:章纲也可能是作者有意写在正文前面的。 - **只读会话要先问。** 会话处于只读权限时,所有会写文件或花钱的工具调用都会先征求同意。 ### 改写一段:带它用得上的,不带整本书 作者 2026-10-12:"现在选定文本按照要求改写功能几乎不太起效,我不知道是不是上下文排布的问题"。是。量出来的:在一本八十回、四十九万字的测试书里改第三十回的一段 159 个字,发出去的请求是 **43 万 token**——改一段用的是写一章的那份材料:窗口的一半装前面二十九回的正文,后面五十回的正文也整章带上("本章必须接得上下文")。作者那句修改要求是这四十三万 token 最末尾的一行;系统规则里还写着"要求之外的内容尽量保留""不得违背设定与前文事实"。合起来的结果就是:原句照抄,添三四个短语。 - **材料按这件活的大小给**(`context.passageTokens`,默认 24,000,高级选项里可改、可随书):设定核心、人物、这一章前后的故事——最近的章节放得下就带原文,其余用梗概——加上**这一章自己**在那一段前面 4000 字、后面 2000 字。改一段不是写一章。 - **要求放在读得到的地方**:修改要求先于那一段出现一次,结尾再说一遍。 - **谁让谁**:修改要求是这次改稿要做到的事——它要变的(事情、态度、语气、详略、写法)就真的变,该重写的句子重写,不是在原句上添几个词;它和设定、章纲、前后文不一致时,以它为准——那是作者要改的。它没说到的,照旧不违背设定和前文。 - 实测同一段、同一句"把他写得不耐烦,脚步重,看见丫头们打盹还有点恼"、同一个模型:43.3 万 → 1.9 万输入 token,18 秒 → 4 秒;原文 21 个分句里逐字留下的从 19 个降到 13 个,句子是重写过的。 教训:**一份材料合不合适,要看它是给哪件活的。** "前文大纲 + 窗口里塞前文"是为写一章定的;我把它原样用在了改一段上,只因为那样可以共用缓存。给一件小活一整本书,不是更稳,是把那句要求淹掉。 ### 改一章:带相邻的几章,不带整本书;被改的这一章永远整章给 作者 2026-10-12 接着问:"现在问题修复是不是也塞了过多的上下文?"把修问题的每一条路发出去的请求量了一遍(八十回、四十九万字的测试书,窗口一百万的模型,改第四十一回): | 哪条路 | 发出去的 | 说明 | |---|---|---| | 整章重写 | **43.6 万**(实际计数) | 写一章的那份材料:前四十回、后三十九回的正文几乎全在 | | 改这一章(agent 一处处改) | 同一份,**每一步重发一次** | 七步就是三百万 | | 审校一章 | 约 29 万 / 步 | 前面四十回的正文(到最后一回是五十万) | | 修这个问题 / 全局修复 / 一起修(策划定在哪几处改) | 3–3.8 万 / 步 | 其中 2.3 万是全线每章一段摘要,6 千是出问题那一章的正文 | | 照引导审校 | 一章 0.8 万 / 步,全线 2.5 万 / 步 | | | 只改引文这一处 | 2.2 万,一次 | 上一节改过的 | | 采纳后核对 | 0.6 万,一次 | | 所以:**策划定位的那几条路不大;大的是把整章交出去的两条。** 带着 43.6 万 token 的那次整章重写,要求是"结尾改掉:她没有醉倒在宝玉的床上",67 秒后交回来的整章和原文**一字不差**。 - **改一章有自己的大小**(`context.chapterTokens`,默认 60,000,高级选项里可改、可随书):整章重写、改这一章都用它——前后相邻的几章带原文(七千字一章的书大约前二后二),再远的用梗概;人物、线索、设定照这一章用得上的给。**这一章自己的正文另算,整章给。** - **被改、被审的这一章永远整章给**(`ownsChapter`)。以前"本章已有正文"是从旁支预算里挤位置的,挤不下就只留结尾——那是给"续写"定的规矩(接着写只要看结尾)。预算一小(窗口小的模型,或者像这次这样把上下文收到合适的大小),整章重写、审校拿到的就只是这一章的最后三千字。现在改和审的时候它不参加挤:窗口真不够时,让的是别的章节的正文。 - 实测同一章、同一句要求、同一个模型:43.6 万 → 5.4 万输入 token,67 秒 → 51 秒;前 5807 个字一字没动,结尾照要求重写了。"改这一章"一次真跑:7 步、每步 5.6–6.1 万(共 41 万,其中 35 万命中缓存)、34 秒、7 条小提案。 - **审校没有动**:它查的是"和前文对不对得上",带着前文的原文是有用的;要不要也收,留给作者定。策划那几条路里的"全线每章一段摘要"随书变长(八十回 2.3 万;一千章就是三十万),现在没有上限,同样留着没动。 中途踩的一脚:第一版只给了上限,没想到"本章正文"是最后才分位置的——真跑出来的提案把一章从 5456 字改成了 2395 字(前半章没了)。量具里看每一节的大小才发现。**给一份材料换预算,要把每一节实际拿到多少打出来看,不能只看总数。** ### 改一章:像改文件一样改,不像重写一样改 作者对一章写一句要求(“把柳先生写得更不耐烦”“结尾压短”)。以前的做法是把整章交给写手、让它把整章重新写出来:一千字里其实只有七八句该动,另外九百多字也被重新生成了一遍——慢,贵在输出上,而且没该动的句子会悄悄走样。 现在写手拿到的是这一章和三样工具:`chapter_edit`(find → replace,find 必须在这一章里只对得上一处;一个词通篇替换用 `all`;几处想好了放进 `edits` 一次交上来)、`chapter_read`(看这一章现在的样子)、`submit_revision`(交回,说改了哪几处)。它改的是一份工作副本;工坊在每一步当场验收——找不到原文、对得上不止一处、一条圈了大半章、往正文里添图,都退回去并说明该怎么办。正文里的图片行不许进圈,被圈到的原样留着。 交回之后,工坊把工作副本和原文**按句子对一遍**,每一段不一样的句子是一处;只加了一句 / 只删了一句的,带上相邻的一句作落脚点;一处在这一章里对得上不止一次的,往外扩一句直到唯一。所以提案比写手的改动还细:它一条改动里夹着一句没变的话,出来就是两条提案。每条提案带着写手给这一处的理由。 写手的模型当不了 agent(工坊直连的接口)、或者 agent 这次没跑成而且一处都没改:改成一次请求,写手交回 `{"edits": [...], "note"}`,工坊用同一套规则照着改;照做不了的那几条说回去让它重交一次,仍然不行的留在结果里点名。agent 中途断了但已经改了几处:那几处算数,结果里说明可能没改完。 **为什么不是“策划圈地方、写手改”**(修问题、全书修订的做法):那是两个角色、每处一次写手调用,适合“要先查清全书哪里受牵连”的活。改一章不用查——地方就在眼前这一章里,圈和改是同一个人的事,一个 agent 一趟做完。 ### 任务发出去的请求,从任务那一行看 作者 2026-10-13:“照引导审校为什么只能看思考结果不能看发出去的request?我希望在任务那里各类任务都可以看发出去的request”。 - **原因**:调用记录(`.novel/calls`)原来只记工坊自己直接调文字模型的那些;角色作为 agent 干活时,请求是 DSH 的 agent 循环发的,不经过工坊那一层,没记。它那场对话本来能点开看——可书没有对话时它是独立跑的,点不开,于是只剩“思考”。 - **现在每一步都记**(`CallLog.keepStep`;`src/host/roles.ts` 在每个请求发出去的那一刻,从 DSH 的会话里读它这一次带了什么):系统提示、给它的工具(名字、说明、参数)、前面各步已经发过的、这一步新发的(第一步是任务,之后是它上一步说的话、调的工具和工具的回答)、模型的回复(含它接着要调的工具);token、缓存、用时、怎么结束的和别的调用一样。 - **不重复存**:一步只存它新发的那一段,记下上一步是哪一条;“前面各步已经发过的”是读的时候顺着往回拼出来的。前面的步被清掉了(记录满了先去最早的,或者手动删了),后面的步会写明“更早的请求已经不在记录里”。 - **入口在任务上**:“任务”里这本书的每一行都有“请求 N”,点开只看这件任务发的,新的在上;点一行看全文,勾两条看差在哪。单次请求的任务(写作、收录……)是一条,agent 的任务一步一条。底下那个“调用记录…”还是整本书的。 - 画图、配音这类不调文字模型的任务,点开会说明没有文字模型的请求(图的提示词在那张图自己的“记录”里)。 ### 审校和修订:一个入口,叫一个名字 作者 2026-10-13:“页面就叫审校和修订。然后策划自行判断我的要求,无要求情况下默认是审校。然后也同步到写书的里面的全局修改一类的,相关大量类似功能的用相同的名字和相同的逻辑来。” 原来“审校问题”页顶上的“照引导审校”和“全书修订”页是同一条后台路径(`reviseBook`)的两个入口:表单几乎一样,差别只在把作者那句话当“毛病”还是当“要求”——而这条界线对作者是糊的,却要先选对页。现在是**一栏、一个名字、一套逻辑**(`ReviseBar`,`src/client/Issues.tsx`): - **什么都不写:审校。** 场记逐章读、列问题;找到的问题默认接着交给策划修订(下一节)。按钮上写着这一下会审校什么(“审校未审的 N 章”“全部重审”“审校选中的 N 章”“审校这一章 / 重新审校”)。 - **写一句话:修订,是什么由策划判断**(`mendTask` 的 `lead`)。是作者发现的一个毛病——找出它露出来的每一处,记成那一章的审校问题(标“你提的”),再修订,改动在各条问题下面;是一条要照着改的要求——不记问题,直接定下它碰到的每一处,改动在“修订提案”里成一批。两样都沾的当毛病办、照作者说的改法改。策划在给作者的话里说明它当成了哪一种。“只找出来”两种都不改:毛病列出来,要求碰到的地方也列出来。 - **同一栏在哪都是它**:审校页“审校和修订”(一条线,或挑几章;带参考图;“同步一条世界观变更 / 一次人物变更”替作者把那句话填好)、写作页右栏“问题”、观看页(都只管那一章)。写作页要求框旁的按钮也是它:框空着是“审校”,写了字是“修订”,小三角里是“只找出来”和“整章重写”;选中一段后的“审校和修订…”是从那一段查起的同一件事。 - **叫法统一成“修订”**:对已经有的问题下手的那几个按钮是“修订这个问题 / 全书修订 / 一起修订选中的 N 个 / 修订重大问题”,改动叫“N 处修订”,设置里是“修订由谁写”“修订改多少”。选中一段的“润色 / 扩写 / 精简 / 按要求改”和“整章重写”是写手重写一段文字,不在这一族里,名字没动。 - 不再有的:“全书修订”页签(并进来了);写作页小三角里的“改这一章:策划照要求一处处改”(写一句点“修订”就是它;那条在原稿上逐处改的路还在,总编的 `novel_revise scope=chapter` 用的是它)。 下面几节里提到的旧名字,对应现在的:“照引导审校”“找出来并修”→“审校和修订”里写一句点“修订”;“修改一章”→ 写作页的“修订”;“全局修复”→ 问题卡片上的“全书修订”;“自动修复重大问题”→“修订重大问题”;“审校 → 审校问题”→“审校 → 审校和修订”。 ### 审校和修订的上下文:四层,稳的在前;凭证据说话;在案的不再重来 作者 2026-10-14:“设计既减少上下文浪费,增加缓存率,又能让模型得到更多的信息,可以减少写作审查的幻觉,执行作者的意图的审校/上下文机制”“同时解决提案时不知道其他提案的问题”。 **开头给什么。** 审校一章、策划定在哪改,都照同一个顺序拿到四层,越稳的越在前: 1. **书的底本**(`bookBase`):作品是什么、设定的文风和作者给写手另加的要求、作者的总备注;人物、设定各一行的名单;全书章纲;还没收的线索。只在改设定、改大纲时变——这本书每一趟的开头都是它。 2. **前情梗概**(`storyLedger`):第 1…N-1 章各一条梗概,只往末尾加。审第 N 章时它是审第 N+1 章那一份的开头。它是地图不是原文:要说哪里对不上,回原文去核。没收录的章用章纲顶上并且写明。 3. **手上这一章**(`chapterInHand`):章纲、出场人物此前的状态(各取最近一次记忆)、上一章结尾、这一章全文。 4. **这一次的事**:作者的原话、在案清单、交稿格式——每次都不同,所以放最后。 原来审校开头塞的是前文原文(按模型窗口的一半装)。在《红楼梦》84 回的副本上量过(不调模型):审第 41 回,原来开头 33.3 万 token,现在 5.3 万;第 84 回 50.3 万对 7.4 万。前后两章共用的开头,两种做法都在八九成——差别在大小,而且书长到装不下时原来那一包会整包滑动。 **取证。** 凡说“和前文 / 人物卡 / 设定对不上”(连贯、时间线、设定、人物四类),要写出对不上的是哪里的哪句话(`against`),程序到原处去找(`checkEvidence`):找不到就退回重写;退回两次还找不到的不收;根本没写出处的收下,标“没附出处”。前情梗概只用来找地方,结论要落在原文上。工具里多了一个“全书精确查找”(`book_find`),一个词在哪些章出现过一次查全。读多少有上限(`context.readTokens`,默认 4 万 token,全局、随书都能设),读满了工具就叫它照已经查到的交稿。 **在案的不再重来。** 审校和策划开头都会看到“已经在案的”(`onFile`):这一章还开着的问题、等着确认的提案(原文 → 改成,为哪条问题)、作者放弃过的改法。规矩:在案的不重报;作者放弃过的改法不再提;等着的提案圈住的句子不再圈。重审时,在案的问题默认都留着,审校说“现在的正文已经没有了”的(`gone`)或者它引的那句话正文里已经没了,才标为已处理;同一个问题再报一遍(同一句引文,或没有引文时同类、同一出处),沿用原来那条的编号和它名下的提案。程序上再加一条硬规矩(`proposeSpan`):**一处正文只留一条活着的提案**——改法一样的不再出一条,改法不一样的取代先前那条(先前的进归档;放弃新的,旧的回来)。 **审校当场了结。** 审校之后接着修订时(`reviewMends`),审校交回的每条问题三选一(`ReviewIssue.fix` / `wider`):改几个字就能了结的,它直接写出改法,这就是提案(标“场记审校时写的”),不再调模型;这一章里要成段写的,它说清怎么改、要守住什么,交给写手——写手只拿到这一处、前后文和这段交代,不再另拼一包;要动别的章节的,交给策划去查该改哪一头(策划拿到的是那几章全文和问题的出处);该作者拿主意的,只记下。两条问题不圈同一处。 **采纳之后。** 提案名下的问题直接标“按采纳的修订提案改了”,不调模型;同一章里别的问题,只有引文被这次改动碰到的才再核对一次。 **问题卡片。** 一个“修订”按钮:审校写好了改法的直接出提案;牵连别章的交策划查;其余照原来的分法。“全书修订”“只改引文(另写一遍)”“整章重写”在旁边的菜单里。卡片上写出处,没附出处的标出来。 ### 审校之后接着出修订提案 作者 2026-10-13:“现在的提意见-修改一章是带自动填的,反而审校那里重审不带,有点奇怪,应该审校那里也有(作为默认行为)”。 - 〔10-14 起审校自己先了结能了结的,见上一节;下面说的“交给策划修”只剩牵连别章的那几条。〕**默认:审校完,找到的问题接着交给策划修**(`reviewMends`,没设过就是开)。审校一章(审校页的“审校 / 重审”、写作页“问题”栏、观看页)结束时,这一章还开着、还没交出去过的问题一起交给策划——就是勾上问题点“一起修”的那条路(`mendReviewed` → `fixIssues`),由谁写、改多少照“按处修改由谁写”“改多少”两项设置。 - **它是一个单独的任务**(“修审校找到的问题”),审校一结束就开始:问题先能看;每条问题下面写着“交给策划在改…”;可以单独停;在修复里排队。结束时说一句:几处修改在等、在哪。 - **批量审校**(“一键审校未审的 N 章”“全部重审”、批量任务里勾了审校):整批结束后一趟修复,把这一批找到的放在一起看。“多轮迭代”本来就自己修,照旧。 - **改动都是提案**,出现在各条问题下面,采纳了才进正文——所以问题列表上有“全部采纳 / 全部放弃”:写作页侧栏“问题”、观看页、审校页“审校问题”的每一章和整页。跨了章的一批,采纳前先问一句。 - **关掉**:设置第一页“自动做的事”,或审校按钮旁的小三角(“审校之后:出修改提案 / 只列问题”)。关掉之后审校只列问题,和原来一样。 - 总编自己调 `novel_review` 时不自动接着修(怎么办由它定),要的话传 `mend`。 ### 照引导审校:作者说一句,策划去找出来,再修 审校原来只有一种:场记把一章从头读一遍,列出它看到的问题。可作者读自己的书时,常常**已经知道**哪里不对——“柳先生的眼镜一会儿有一会儿没有”“第 3 章到第 4 章的时间对不上”——这时再让谁把整章泛泛地审一遍,是绕远路。 所以审校可以由作者领着:写一句话(“审校 → 审校问题”最上面那一栏;写作页“问题”栏和观看页批注栏里是只管这一章的同一栏),策划拿着这句话进书里—— - **先找出来**:它在哪几处露出来,每一处逐字引原文、说清是什么问题、和哪里对不上。引文当场核对(正文里找不到的退回重引)。每一处记成那一章的一条审校问题,标着“**你提的**”,鼠标停上去是您当时那句话。只记有毛病的那一头:拿来对照、本身没写错的句子不记。 - **再修**(“找出来并修”):同一趟里定下改哪几处,每一处的修改是一条小提案,出现在它对应的那条问题下面;改在别处(矛盾的另一头)的,折在“这次修复还改了别的…”里。设定该改的作为设定建议。 - **只找**(“只找出来”):记成问题,什么都不改——之后和别的审校问题一样勾选、写意见、一起修。 - **没找到也说**:书里其实没有这个问题时,不记任何问题,把策划“查了哪里、为什么认为没有”告诉作者。 几条规矩: - **在书里现在的正文里找。** 作者发现的问题,是在他手上的正文里发现的,审校问题引的也是这份正文——所以不像别的修复那样先把“还没采纳的修改”算进去(那样找到的句子可能只存在于一条还在等的提案里,记不到任何一句正文上)。 - **只有这种问题的章节不算“审校过”。** 一章从没审校过、只是照引导记了几条问题:它在审校页仍然标“未审”,“一键审校未审的”照样会审它(`unread`)。 - **重新审校不冲掉作者提的。** 一章重审时,上一次审校的问题整份换新;还开着的“你提的”那几条留着。 - **一趟做完,给了的不再读。** 找和定改法是策划的同一次运行。范围里各章的正文放得下时直接随任务给它,并明说“不用再用工具把它们读一遍”——agent 每多调一次工具,就要把整份任务再发一遍。实测一章的范围:1–2 步、十几秒;第一版没说这句话时,它把给过的四章又各读一遍,27 步。 - **总编走的是同一个函数**(`novel_revise scope=lead`)。 - **改这一章的地方就有它。** 写作页上,它不只在右边“问题”栏里:**选中一段 →“这里有问题…”**,写一句这一段哪里不对(回车就是“找出来并修”,旁边“只记下”);要求框旁边的“**修改一章**”就是它——把框里那句话当作您发现的问题交出去;按钮右边的小三角里是别的改法:原来的“改这一章”(照一句要求在原稿上一处处改)、“只找出问题,先不改”、“整章重写”。改问题走它,是作者用下来定的(2026-10-12):照一句要求通篇去改,改什么由干活的模型自己判断;这条路先把毛病找出来、记下来,再只动有毛病的那几句,所以它是按钮本身,另一种收在三角里。选中的那一段随那句话一起交给策划——“作者是指着这一段说的:问题在这里露出来,它牵连到的别处也要找”——记在问题上的仍是您那句话本身。比起“按要求改写这一段”,这条路先把毛病定下来(记成问题、引了原文),改动才跟在后面,而且不限于选中的那几句:矛盾的另一头在这一章别处时,一并找到。 ### 按处修改由谁写:策划一处处判断 两个模型,两个价钱:编排模型读、定;写手模型写成段的文字,通常更贵——而且每交给它一处,那一处的前后文就要再发一遍。所以没另设的时候(`mendBy: auto`;作者 2026-10-14 的话:“改一两个字那种就别让文字模型干了,自己顺手干了,而觉得需要较多生成的交给文字模型”),每一处由策划自己判断: - **小改动**——换一个词、改一个名字或数字、删半句、补一两句交代——它在交回“改哪几处”的同一次里直接写出改好的全文(`replace`),这就是提案; - **要成段新写或重写的**——一段叙述、一场对白、一个场面——它只说清怎么改(`how`),交给写手模型。 这是判断,所以交给 agent 判断:代码里没有“多少字以内算小改动”的硬杠子,分界写在交给它的任务里(一两句对一整段),结果里写明几处是它写的、几处交给了写手。“只修这一处”(一条问题、就在它引的那句上)也先问策划,而且是一问一答、不带工具——让 agent 一步步去读,每一步都把这一章重发一遍,比要修的东西还贵。 原来的两种做法还在,是设置里的另外两个选项: “按处修”原来是两个模型的活:策划定下改哪几处、各怎么改,**写手**把每一处改写出来——为的是成稿仍出自写手的模型。可一个适合写整章的模型,未必做得好“只在圈定的这一两句里改、别的一个字不动”这种小活。 所以这是一项设置(`mendBy`;设置第一页“写作与修订的做法 → 修订由谁写”,修订按钮旁边的小三角里也能切)。除了上面说的“策划判断”,另外两个选项: - **编排模型**(2026-10-12 到 10-14 是默认):策划在交回“改哪几处”的同一次里,把每一处**改好之后的全文**直接写出来(`replace`,连同一句理由),这就是提案——不再经过写手。为此它被告知这本书的文风;它写的和原文一样(没有改动)、或者只说了怎么改没写出成稿的,当场退回。 - **写手模型**:策划定地方,写手把每一处改写出来(原来的做法)。 它管的是所有“按处”的修改:修审校问题(修一处 / 全局修复 / 一起修 / 自动修复重大问题)、照引导审校(写作页的“修改一章”)、全书修订,以及照要求改一章(“修改一章”旁三角里的“改这一章”:那位在原稿上一处处改的 agent 换成策划);问题卡片上“只改引文这一处”也跟着它。结果里写明是谁写的。 **改写一段、整章重写是另一项**(`rewriteBy`;设置第一页“改写一段、整章重写由谁写”,写作页“按要求改… / 改写”旁边的小三角,修复按钮的小三角里也有): - **写手模型**(默认):选中一段去润色 / 扩写 / 精简 / 按要求改、把一章整章重写(包括一次修复里策划说“这一章零碎改不了、得整章重写”的那几章),都是写手的活——那是写作。 - **编排模型**:这些也交给编排模型的那位策划写。给“写手模型照要求改不好”的作者用。 两项分开,是因为它们是两种活:一处一两句、钉死了范围的修改,要的是准;一段、一章的改写,要的是文笔。默认各归各的;作者可以两样都交给同一个模型。起草、续写始终是写手。 顺带的两处: - **工具读到的,就是被核对的。** 一次“接着还没采纳的修改往下改”的修复,策划引的原文要对得上“把那些修改算进去之后”的正文。它用工具读这一章时,读到的也必须是这一份——原来工具给的是没算进去的原文,它照着抄、被退回、再读、再被退回,一趟空转了三十多步。 - **段落照这一章的分法。** 这一章的段落之间空一行、别处不换行时,模型交回的文字里单个的换行就是它写的“分段”:补成空一行。 ### 放弃的提案留着,可以放回 放弃一条提案只是把它标成“已放弃”,它一直在书里(最近处理过的 500 条)。“审校 → 归档”按时间列出放弃过的(另一半是采纳过的,备查),同一轮的排在一起;写作页提案栏下面折着这一章放弃过的。每条可以**放回**(回到待处理)或直接**采纳**;一轮可以一起放回——“全部放弃”点错了,一下回来。它要改的句子已经不在正文里的,如实说放回去也采纳不了。被后来的提案“接着改”而收进去的那些不在归档里:没有人放弃过它们。 ### 翻译:先定译名,再逐章译 一本几十万字的书交给模型一章章翻,最先坏掉的不是文笔,是**名字**:同一个人在第三章叫 Shen Heng,第四十章成了 Shen Hang;一样东西前后两个译法。模型记不住,所以不靠它记—— - **译名表是翻译的依据**(`bible/glossary.json`,一种目标语言一份):人名和各种称呼、地名、家族与组织、器物、这本书自己的说法,各一个译法。 - **先定,后译。** 书里有人物卡和设定条目的,场记照着卡片定——**这个人是谁,决定了名字和称呼怎么译**(是男是女、是绰号还是本名);还没有卡片的书(刚导入的外文稿),就从正文里把专名找出来定。已经定下的不再动:每一遍只补没有的。 - **译的时候带上用得到的那几条**:一章里出现了哪些词,就把这些词的译法连同"它是什么"一起交给译者(写手模型)——不是把整张表塞进去。译者遇到表里没有的专名,自己定一个并交回来,加进表里,后面的章节照它。 - **译完,卡片学会译名**:译名作为别名记到对应的人物卡、设定条目上。收录、正文里的人名标记、下一章的上下文都是按卡片上的名字认人的——这样译文里的 Shen Heng 还是沈蘅。 - **作者说了算**:译名表在翻译对话框里就能看、能改;您改过的标成您定的,之后哪一遍都不会覆盖。名字译错了改表,不是改某一章。 - **译文替换正文,原文留着**:每章的原文存成这一章的一个版本("翻译之前"),章节标题旁边标着"译自…",菜单里"恢复原文"连标题一起放回去。正文里的图片路径不许动。 - **两个入口**:写作页一章的菜单里"翻译…"(这一章,或这条线上所有写了的章;长章分段译,每段接着上一段的口吻;多章同时译);导入页"书稿的语言"——外文书稿导入时直接译成正文语言,之后的收录、人物、大纲都从译文读。 - 全书写了的章都成了目标语言之后,它就是这本书的正文语言(原来的语言记着)。 ### 改过的都留着:每样东西的历史版本 正文一直有版本;人物卡、设定条目、文风、章纲、线索、作品信息以前没有——总编改了一张卡、导演重写了一段外貌、自己手滑删了一栏,原来的样子就没了。现在它们用同一套办法: - **版本是"改之前的样子"**,按时间和"是谁改的"命名:你、总编、哪一项任务("写外貌"修改之前)、一次恢复、一次删除。只在**说的内容**真的变了时才存——图片换了不算,工坊自己维护的东西(首次 / 最近出场、章节状态)变了不算,点了保存却什么都没改不算。 - **你自己连着改,一次只留一版**:留的是这一阵修改开始之前的样子,不是每按一次保存一份。别人(总编、任务)中途改过的那一下照样留。 - **图片不在版本里。** 画出来的图只要没人删就一直在;恢复一个旧版本,卡片上的图还是现在的图。版本管的是字。 - **看的是差别,恢复可以只恢复一栏。** 打开"历史版本":左边是各个版本,右边是这个版本和现在不一样的每一栏,红绿对比;可以整份恢复,也可以只把某一栏放回去。恢复之前,现在的样子先存成一版——恢复本身可以撤回。 - **删掉的找得回。** 删除一张人物卡、一个条目、一个文风之前先存一版;列表最下面"最近删除的…"里点恢复,和删除前一样。真不要了,在那里彻底删除。 - **一个控件,哪里都一样**:人物、设定条目、文风、画风、章纲、线索、作品信息旁边是同一个按钮、同一个对话框;总编用同一份记录(`novel_manage action=history / restore_history`)。 **导入**是"反向的收录":拆章 → 逐章收录 → 把收录到的人物片段归并成人物卡、把实体归并成世界观条目 → 由章节摘要重建大纲和线索 → 从正文提炼文风。它复用的就是平时写作后那套记忆流水线,所以导入的书和从零写的书在工坊里没有区别。 ## 五、怎么看、怎么动手:工坊 界面有两个入口,是同一棵组件树: - **左侧栏的页面**:全局的书架和书,不需要会话; - **会话右侧栏的标签页**:绑定这个会话,书和对话并排。 第二种形态是"深度融合"的关键:总编调用写手时,章节会流式出现在旁边的编辑器里;你在正文里选中一段,可以直接让写手改,也可以"和总编讨论"——选区会带着章节信息落进对话输入框。对话里每一次 `novel_*` 调用都显示成一行"让哪个模型做了什么",点一下就跳到工坊对应的位置。 八个视图各管一件事:总览(下一步该做什么)、人物(人物卡连同履历表、关系、龙套——和人有关的只有这一页)、设定(世界观、文风、画风)、大纲、写作、阅读、审校、演出。几条贯穿的原则: - **先告诉作者下一步。** 总览页不是仪表盘,是待办:哪章没收录、下一章能不能写、有多少提案在等。 - **圈定即操作。** 修改的入口是"选中文字",而不是先进入某个模式再找位置。 - **AI 的产出默认是建议。** 设定建议、修订提案、推演方案,都要经过你点头。 - **长任务可见、可停。** 写作、导入、合成都是后台任务,有进度和流式文本,能随时停止;停止一次写作会保留已经写出的部分(前提是它没有覆盖别的东西)。 - **窄处也能用。** 标签页常常只有四五百像素宽,布局按容器宽度而不是窗口宽度切换。 ### 看的页面,按"一款很美的游戏"来做 这个东西说是创作工具,更多的是让创作者**欣赏**自己作品的东西:很多人的爱好就是翻人物设定、翻世界设定。所以"好看"在这里是功能要求,不是点缀。凡是用来看的页面——阅读、听、有声漫、人物、地点与物品、世界观、主页——以"一款很美的游戏"为标准:画面大、有图就把图放在最显眼的地方、能点进去逛(从一座城到一户人家到一个人)、转场和动效恰到好处,而不是表格和表单。编辑功能一个不少,但收在"编辑 / 制作"后面:平常看到的是成品,要动手时再打开工具。同一样东西的"看"和"改"是一个地址的两面,从哪一面都能一步到另一面。 **"观看"是一个应用,三处用。** 读者看到的东西——正文(读 / 听 / 看有声漫)、人物、世界——是一套页面(`client/reader/`),吃的是后台同一处产出的回答(`core/reader.ts`)。它出现在三个地方:工坊导航里的"观看"、发给手机的阅读页、发布出去的网站。所以不存在"工坊里一个样、发出去另一个样"。三处只有两点不同:作者自己的"观看"里也有正文还没写到的人和地方(那是计划,不给读者);作者那边每一页右上角多一个"编辑",一步到这样东西的编辑页,编辑页上的"观看"一步回来。给读者的人物页只带设定集会印的东西;动机、缺陷、弧光、秘密、备注和"怎么写 / 怎么画 / 怎么配音"留在作者这边。 **图的标准大小是文字的宽度,读的人可以调小、调大;点开就是最大。** 正文和脚本里的图,不调就是**和文字一样宽**——插图、名场面、脚本里的图都是,不再各有各的上限。阅读设置里"图片"一行是一个步进:− [标准] +——往小是文字宽度的 80%、65%、50%;往大是 125%、150%,图从文字那一栏两边伸出去,最宽到读它的那块屏幕("满屏")。**按在眼前这一页上有没有变化来走**:窗口窄(手机上文字几乎就是屏幕那么宽)时,125%、150% 和满屏画出来是一样的,"+"一步就到满屏,不让人连按几下没有反应;中间那个字点一下回到标准。(作者 2026-10-11:"图片的标准大小应该是和文字等宽,然后可以增加或许减小"——上一版把"和文字等宽"做成了五档里最大的一档,标准反倒是受限的。)记在设备上,和字号一样;发布成网站时随作者的阅读设置带出去;以前存的"小 / 中 / 大 / 满栏"读成最近的一档。任何一张文内的图——插图、名场面、脚本里的图、画册里的图——点一下就铺满窗口(保持比例,小图也放大),再点或按 Esc 收起;全屏时 Esc 先收起图,不退出全屏。放大的那一层直接挂在窗口最上面(全屏时挂在全屏那一层里),不挂在页面里:按自己宽度排版的页面是一个"盒子",盒子里的"固定定位"是对着盒子的,会和页面一样高。 ### 界面上的话:说它是什么,然后停 一句提示只回答作者此刻的问题:这是什么,点了会怎样。它不讲后面怎么运转,不重复旁边按钮已经说了的,不在括号里补一句。提示最多一句短话,能不写就不写;悬停提示是一个短语;确认框只说会发生什么、能不能撤回。真要了解机制,有文档。写新界面时照这个量:一段说明如果删掉之后作者照样会用,它就不该在那里。 ### 回车提交,不认输入法选字的那一下 中文、日文、韩文是用输入法打的:按回车是在候选里选字,输入框却把它当成一次普通的回车。凡是"回车就提交"的输入框(照着这张改、给写手的要求、这段要怎么改、新建人物……)都只认真正的回车(`plainEnter`)——不然作者一句话打到一半,半句就发出去了。新加这类输入框时用同一个判断。 ### 发布不该让开着的页面消失 DSH 在工坊发布新版本时就地换掉界面的代码,拿新代码在旧页面的状态上重画。新旧两版里同一个页面用的 hook 不一样时,这一次重画会抛错("这次渲染的 hook 比上次多"),DSH 于是把整个工坊从屏幕上撤掉——一块空白。工坊自己在最外层接住这类错误:把里面的页面重新挂一遍(同一本书、同一页——位置记在控制器里,不随页面重挂丢失);几秒之内连着出错两次以上才交还给 DSH,那是代码自己的毛病。 ### 在手机上操作:盖住 DSH,借它的网页 工坊不另做一套手机版的操作界面,手机上用的就是 DSH 自己的网页。差两样,都是 DSH 的网页在小屏幕上自己做好之后就该拆掉的: - **铺满**:工坊的整页可以盖住 DSH 的边栏和顶栏,整块屏幕都是工坊;页头上一个"DSH"按钮把它露出来(对话在那里)。小屏幕上、以及从下面那个入口进来时默认铺满;能按的东西按手指的大小排。 - **入口**:DSH 的网页只答应从本机回环地址来的请求,手机直接打不开。工坊在局域网上开一个小小的反向代理:凭链接里的随机令牌放行,把请求照这台电脑上的浏览器会发的样子转给 DSH(主机名和来源改回回环地址,带上打开入口的那个浏览器的登录),DSH 的登录凭据不出这台电脑。它转过去的是整个 DSH,不只是工坊——所以是作者自己打开、对话框里明说的东西。桌面版没有网页可转,要用 `dsh web`。 - **入口不被工坊自己关掉,也不藏起来**(作者 2026-10-11:"保留给手机的完全控制页面不见了?加回来")。工坊更新后点的那个"重启"换的只是工坊自己的后台——入口开着的话,把它原样交给接上来的后台:同一个端口、同一个链接、同一段时间(只放在这个进程的内存里,不落盘);以前每发一版就把手机关在门外一次。入口的按钮(页头的手机图标、主页的"手机上用")工坊显示在哪里它就在哪里,不只在整页里——作者平时用的是对话旁边的那一栏。地址列表里带 `.local` 的那个是这台电脑的名字,路由器给它换了地址也还能用,对话框里说明。 - **开了就一直开着;每次重启 DSH,链接换一个**(作者 2026-10-11:"每次重启app改变token")。入口不再自己到点关——以前十二小时一到,躺着用到一半的手机就被关在门外——到作者点"关闭入口"为止。令牌只在进程的内存里:DSH 一重启就是新的,旧链接和手机上存着的旧 cookie 都不再放行,回的那句话说明原因、去哪拿新的。落盘的只有一件事——"作者要它开着"(工坊设置目录里的 `phone-door.json`,里面没有令牌)。DSH 重启后入口不能由后台自己打开(它要这台电脑上那个浏览器的登录,才能替手机转请求),所以由电脑上的工坊页面在打开时去开一次,并留一句停得久一些的提示:入口又开了、链接换了。不想让它重启后自己再开,对话框里有一个勾选框;"关闭入口"连这个意愿一起收回。页头的手机图标在入口开着时是亮的。 ### 批量写作:顺序,或者并发 一批章节默认**顺序**写:写完一章、收录,再写下一章——后一章读得到前一章的正文和它定下的事,一串章节前后是一个整体。这慢:十章就是十次写作一个接一个。所以开始按钮旁边有个小三角,可以改成**并发**:这一批同时写,同时几章由设置里的并发数定。并发时每一章拿到的是它自己的章纲、这一批开始之前已有的正文,以及**排在它前面、还没写出来的各章的章纲**(并且被告知"它们的正文还没有,接在它们章纲写的结果之后,不要重写它们的内容")——章与章靠章纲衔接,所以章纲要先排细(节拍),写完值得审校一遍。选了哪一种会记住。总编默认也是顺序,作者要快才用并发。 ### 一键与批量 一件事对一章做一次是按钮,对五十章做五十次就是折磨。所以凡是"对很多章 / 很多人 / 很多地方做同样的事",都是**一个任务**: - **演出 → 一键制作**:一张表列出每一章的进度(脚本、配音、声音、分镜、画面、成片),勾上要做的步骤和章节,点一次。每一章的脚本排好之后,它的配音、声音和分镜同时进行,分镜出来再画画面,都齐了才剪成片;几章同时在流水线上走,先开始的先做完。 - **写作 → 批量写作**:一章接一章地写——没有节拍的先推演节拍,写完一章收录一章,下一章才动笔,所以每一章都读过上一章刚写下的东西。不写作时,节拍、收录、审校可以对很多章同时做。 - **插图 → 批量绘制**:人设图和场景设定图先画,立绘、章节插图和封面等它们画完再照着画;每个人的专属声线也可以一起做。 - 单章的页面上也有一键:听书页的"一键生成有声版"是脚本 + 配音 + 声音,有声漫页的"一键制作这一章"是全套。 批量任务有三条规矩。**只补缺的**:每一步动手前先看还有没有要做的,所以中途停下、或者有几步失败,再点一次只做剩下的。**失败只坏自己**:某一章的某一步失败,这一章后面依赖它的步骤不再开始,别的章照常;任务结束时逐条列出没做成的和原因。**都看得见**:每一章每一步的状态在一张表里实时更新,角色 agent 的运行照常挂在对话的子智能体列表里。总编用 `novel_batch` 做同样的事。 **并发是另一回事,而且只有一处。** 同时发出多少个请求,不由某个任务决定,而由四道"闸门"决定:语音、图片、声音、文字各一道,不管是哪一章、哪个任务在用都算在一起。默认 8,最多 256,在设置里改。服务回答"太快了"时,闸门自己降速(减半、停一停),把被拒的请求重发而不是丢掉,通顺之后一步步升回去,期间界面上明说"语音服务在限流:8 → 4"。所以数字可以放心往大了填——真正的上限是账号在那个服务上的限额,它是撞出来的,不是猜出来的。 ### 对话优先:页面是给人看和细调的 这是一个 agent 原生的应用,所以最直接的用法不是点页面,而是在会话里和总编说话。为此定了三条: - **页面能做的,对话里都能做。** 每个页面背后的操作都有对应的工具,包括设置(`novel_settings`:查看与修改模型分工、一键配置某个服务、改作品信息)和那些零碎的手工调整(`novel_manage`:恢复历史版本、改一句台词、改一格分镜、处理审校问题……)。页面不是功能的唯一入口,而是**让人看见、核对、细调**的地方。 - **总编可以把页面打开给你看。** `novel_show` 让总编在作者的窗口里打开某个页面、某一章、演出页的某个标签——"打开大纲给我看"就真的打开了,而不是告诉你去哪里点。工坊在总编第一次开工时自己出现在对话右侧;之后要不要留着由作者决定。 - **全屏用宿主自己的。** 右侧栏本来就有全屏模式,工坊只是在自己的顶栏放了同一个开关,离作者的视线近一点。不另做一套覆盖层,状态也就不会有两份。 - **右边的图,左边看得见。** 作者在工坊里点开一张大图,"引用到对话"把它的称呼和路径放进对话的输入框(`〔图:立绘 · 沈蘅|assets/images/….png〕`;工坊不在对话旁边时改为复制)。总编照这个路径用 `novel_look` 看图:图是经工坊读出来的,作为图片块随工具结果交给模型(DSH 自己的 `read_image` 就是这么做的)——所以**加密的书、私密书架上的书也看得到**,那里磁盘上的文件是密文,拷不出来,文件工具也打不开。对话用的模型看不了图时,由"看图的模型"把每张图说成文字。要记住的一点:看过的图由 DSH 的附件库留着(和任何贴进对话的图一样,不加密);这场对话本身随书上锁,那份副本不随。 - **对话框先等作者说完。** 打开一个要作者填方向、填数量的对话框,不在打开的那一刻就替他开始——写作页的"推演后续章节"曾经一打开就推演,方向还没来得及填。 - **先看再定的东西,不住在窗口里。** 推演出来"先给作者看"的章纲,原来只在那个对话框的内存里:策划还在推的时候把它关掉,或者看完忘了点加入,这一版就没了。现在它**存在书里**(`.novel/derived.json`),直到加入大纲或放弃:再打开推演(大纲页的面板、写作页的对话框是同一个)就在;还在推的那一次,哪个窗口开着哪个接着显示;打开它的按钮上写着"N 章待看";任务列表里做完的那一次推演有一行"看推演出的 N 章",点了回到推演页。**不替作者加进大纲**——他没看过。 - **对一版推演说一句,是接着说,不是另起。** 待看的那一版下面有"修改意见"。策划照意见调整这一版:意见说到的改,没说到的章节和节拍原样交回。它是**上一次推演的那位策划**,在它推演的那场对话里接着做——它读过的正文、查过的设定都还在上下文里:工坊把这位 agent 留着(半小时;这一版加入大纲或放弃时放掉),把"你上次交的(JSON)、作者的修改意见、改完再交一次"作为下一条消息说给它。它已经不在了(过了太久、重启过),才另起一位,把上一版和意见整份交给它——结果里说明是哪一种。这是角色运行器的一个通用能力(`keep` / `resume`),别的"交出来给作者看、作者可能有话说"的活以后可以照用。 - **章纲是作者的设计:正文不自己变成章纲。** 作者 2026-10-12:"除非手动点,否则不要擅自梗概跟上内容,这样会造成AI写的东西变成了大纲,可能脱离人工设计"。第 105 版我把"照正文更新章纲"做成了自动的(一章收录过之后又变了,场记就照正文把它的章纲重读一遍)——理由是"章纲落在正文后面,正是没人记得去点的时候"。这个理由只看了一头:章纲和正文对不上时,错的未必是章纲。正文是模型写的,它写偏了,自动跟上就等于把写偏的东西认成了设计,后面的推演、节拍、写作都照它走,书就一章一章离开作者定的样子。所以现在是:**不点不改**——"照正文更新章纲 / 只更新节拍"、大纲多选里的"照正文更新章纲"照旧在;自动的那一条默认关着,在设置"自动做的事"里(`plansFollow`),由作者自己打开。旧的开关 `planFollowsText` 作废、不再读:它没设时算"开",而且设置页每次保存都把它明写成 `true`,只改默认值到不了作者那里。总编同样:不在自己的主意下照正文改章纲,正文和章纲对不上时说出来,问哪一头让。打开自动的那一条时,做法没变:几章攒成一个任务,原来的章纲在历史版本里,做完说一句改了什么;第一次收录不做;已经照这份正文读过的不重读。 - **节拍可以只动一个。** 推演节拍、照正文更新节拍都是整份重排——作者只想加一场、或者把第三场改一下,却连满意的那几个也一起被换掉(作者 2026-10-12:“要有根据一句话生成一条节拍,或者修改一条或者多条节拍的能力,现在一改就去全改了”)。所以节拍上方多一行:写一句话,**不勾任何节拍就是加一个**(位置可以指定——最前、第几个之后——不指定就由策划照这一章里事情的先后放),**勾了几个就是照这句话只改这几个**(照这句话某一个该并掉、去掉的,它可以去掉)。策划一次普通调用:整份节拍都给它看,但它交回的只有新加的那一个、或者被点到的那几个;别的节拍连编号一个字不动,交回了没被点到的也不收。大纲页每个节拍前有勾选框,写作页右栏“章纲”里同样;总编用 `novel_derive kind=beat`。原来的章纲在历史版本里。 - **总编那边推演的,和页面上推演的是同一版。** 总编用 `novel_derive apply=false` 推演出来先看的章纲,同样存在书里、留着推演它的那位策划;作者对它说的话,总编用 `feedback` 交给**那一位**去调,而不是从头另推。加入大纲、丢掉也各是一句(`waiting=add / discard`)。页面和总编走的是后台同一个函数。 - **工坊自己接着做的事,在作者最先看的地方就能关——关了就是关了。** 写完自动收录、策划筛新名字、审定设定建议、章纲跟上正文、采纳后核对审校意见:每一样都是没人点按钮的模型调用,所以每一样在设置第一页的"自动做的事"里各有一个开关(自动收录那个原来藏在"高级选项"里)。关了的在哪里都是关的:批量写作不再强制勾着"收录"(不收录时,每章照前面的正文写;多轮迭代只重审、不重收);总览页和写作页的记忆栏写明"自动收录关着"并带去开关;总编不再被告知"改完去收录"——作者选的节省,不由 agent 替他花掉。还会收录的只有作者要的:按钮、勾上的那一步、导入。 - **被换下的后台什么都不再打开。** 工坊的"重启"是把后台换成新的一份;旧的那一份如果当时正有请求在路上,会在自己被关掉之后把书重新打开——连同一个再没有人关的文件监视,它把新后台写的每个文件都当成"工坊之外的改动"。关掉的后台现在拒绝再打开任何一本书;页面遇到这种回答就向新后台再问一次。 唯一不走对话的是密钥:总编不接收也不复述任何密钥,需要时把设置页打开,让作者自己贴进去。 ### 一场对话,一本当前的书 一个工作区里可以有好几本书。对话和旁边的工坊不能各自以为"说的是哪一本",所以只有一个事实——**这场会话当前的书**——两边都读它、都写它。 - **在工坊里换书,对话跟着换。** 另一种做法是让面板可以看 A、总编却在 B 上干活,那样每一句"接着写下一章"都有歧义。所以"看哪本"就是"换到哪本",换的时候工坊会明说。 - **总编必须被明确、持久地告知。** Harness 会把变化了的运行时上下文作为一条消息写进对话自己的历史,所以换书这件事就记在之前那些对话旁边:现在是哪本、之前谈的是哪本、上一本没做完的事要点名去做而不是带过来。它随每次摘要重述,压缩上下文之后也还在。 - **一次调用作用于"模型最后被告知的那本书"**,而不是执行那一瞬间恰好在用的那本。作者在总编干到一半时换了书,并没有改变它已经决定要做的那几步;下一步它会被告知,再重新决定。 - **替对话干活的 agent,站在它干的那本书上**——而不是它所在的文件夹恰好是哪本书。角色的一次运行、总编派出去的子智能体,都是一场新的对话,文件夹是从上级对话那里继承来的;而一个文件夹可以自己是一本书、里面又放着别的书(在空工作区里建的第一本书就是文件夹本身,后来的书放在它里面)。所以对子对话,文件夹排在最后问:先看它的任务点名的那本书,再看它为之干活的那场对话的书。先问文件夹的话,停在场记旁边的工坊会打开外面那本书,派出去的帮手也会被告知错的书。 - **一场对话操作多本书仍然可以**——靠点名,不靠猜。每个工具都可以带 `book`;对话里的工具行会标出来;一场对话换过书之后,每条结果都写明是哪本书的。总编主动去改会话工作区之外的书,要先问一句。 ### 不许静悄悄地失败 大多数按钮只是发起一个任务就返回。没人等着的任务失败了,也得让作者知道——尤其不能在"根本没配置"的时候一声不吭。两条规则:凡是这个工坊亲眼看着启动的任务,结束时都要有交代;意味着"还没配置"的失败——没有语音模型、缺密钥、订阅没登录——不显示成一条报错,而是一个带出路的提示:一键配置,或者直接打开设置里对应的那一节。长任务要说清自己在干什么:合成一章语音时,显示已完成几句、正在念哪一句、已用多久、大约还要多久。 半秒钟的事也一样。按下去的按钮在活干完之前一直写着它正在做什么;工坊底部有一条"进行中",列出这本书此刻在跑的每一件事——Host 还没回话的请求,和不管谁发起的任务——各自在做什么、做了多久、怎么停。"点了没反应"就是缺陷,不管背后的代码当时在忙什么。 打了折扣的结果也一样。某一步没能把活干好、退而求其次了——比如模型的回复被截断,有声脚本的某一段只好按规则切——就把这件事连同原因写进它产出的东西里,页面上照实显示。工坊也不再给模型的回复长度设自己的上限:会思考的模型,思考和回答花的是同一份额度,按"回答该有多长"定的上限会把回答悄悄截掉。就是这一个错,造出过认不出说话人的脚本和只有两格的分镜,而且看起来都像做完了。 ### 接上模型:一键与逐项 配置同时照顾两种人。**不想研究的**:第一次打开工坊,如果什么都没配过,会先到"先把模型接上"这一页——选一个服务、贴一个 key、点一下,写作、插图、配音、检索按推荐配好;密钥先向服务验证,验证不过就什么都不改。**想自己定的**:每一项(四个角色、插图、配音、检索)都能单独指定服务、接口地址、密钥、模型和思考强度;文本角色既可以用 Harness 里配好的模型,也可以直接指向任何 OpenAI 兼容接口。 密钥按**接口域名**保存,一个域名一条记录,存在 Harness 的凭据库里。这样同一家服务的几项能力填一次就够;密钥也只会发给它所属的那个域名——把某一项的地址改到别处,密钥不会跟过去。 **推荐什么是数据,而且是发布出来的。**模型更新得比代码发版快:一家服务用哪个图像模型最合适、模型栏旁边值得列出哪些候选、一个模型族的窗口有多大,都是按月过时的东西。这些一个都不写在代码里,而是 `recommended.json`——带期号和日期,随每个版本一起发布。作者的设置跟不跟它走,由作者定:仍然是上一期推荐值的设置换成新一期的推荐,作者自己选的一概不动;换了什么都会说清楚——旧值、新值,以及一个"改回去"。不跟随的作者只会被告知这一期会改什么,什么都不改。一个模型被取代这件事,从不悄悄发生。 **设置页一开始是短的。**只选两个模型——写手的,和班底共用的——插图、配音、声音、检索各占一行。一个角色除了模型之外能被交代的一切,都在"高级选项"里这个角色自己的那一块上:它怎么干活、能用什么工具、最多几步,不再是页面另一处的第二张表。 ChatGPT 订阅是个特例:它能写、能画,但没有 API key。工坊不为它另做登录,而是借用已经存在的登录。DSH 自己就能登录 ChatGPT——它的模型适配器给 `openai-codex` 这条路由带了登录流程——只是 DSH 的页面里没有地方点开它,于是由引导页上的 ChatGPT 卡片来点:登录是 DSH 的,走 DSH 的授权接口,凭据存进 DSH 的凭据库,工坊只负责把要打开的页面和要粘贴的输入框摆出来。登录一次,卡片就把这条路由加进 DSH 的模型设置、给各角色配上它的模型、插图也走它——写作和画图用同一个登录,这才是订阅用户期待的样子。Codex Connect 插件暴露的出图服务、本机已经登录的 Codex CLI,仍然是画图的另外两条路。订阅里没有向量和语音接口,这两项如实标注为"需要别的服务"。 ## 六、写完还能变成什么:演出 五件事共用一个数据模型,枢纽是**有声脚本**: ``` 正文 ──导演──▶ 有声脚本(逐句:旁白/对白/心声、说话人、表演提示;逐场:环境音) │ ├──语音合成──▶ 有声剧(每句一段音频,按人物固定音色) │ └──导演──▶ 分镜 ──绘图──▶ 有声漫(每格画面对应若干句台词 + 镜头运动) │ 配音 + 音效 + 画面 ──后期──▶ 成片(一个 MP4) ``` - **有声剧。** 说话人的声音按固定顺序决定:人物卡指定的音色 → 为他设计的专属声线 → 按性别年龄选角。选出来的声音写进这本书的**声音表**,以后都从表里读,所以选角不再取决于"这一章谁先开口",没有人物卡的路人也有一个固定的声音。每句的合成结果按"服务 + 音色 + 表演提示 + 文本"的哈希缓存,所以改三句台词只重新合成三句。语音服务是可插拔的接口。 - **不靠耳朵的"听检"。** 生成式语音模型并不总是照做:一句话回来换了个嗓子、只念了一半、或者比上一句响一倍——而且越短的句子越不稳。所以管线对每一次合成都量一量:时长配不配得上字数、音量多大、音高的中位数和这个声音的参考音(或它自己的长句)差多远;不合格就重念,留下最好的一次,仍然突出的标出来,最后把所有留下的句子拉到同一个音量。脚本那边也配合:旁白整段成行,不切成碎片;表演提示不必每句翻新。这一切不需要再调一个模型,也不声称量不出来的东西:一两个字的句子,音高说明的是声调而不是说话的人,所以极短的句子不按音高判。 - **环境音。** 不调用任何模型,由浏览器用 Web Audio 实时合成:滤波噪声做底,慢速调制做"呼吸",再加上定时的一次性声音(雷、柴火噼啪、水滴、虫鸣)。脚本里只需要标"这一场是雨夜",零成本、零素材。 - **有声漫。** 脚本先切成"镜头单位"——短句整句算一个,长句按句子拆——分镜导演把单位编成一格格画面,所以半分钟的旁白中途也能换画面。切多少格由作者定(用"一张图停多久"来表达的密度,或者交给导演,再加一个永远算数的上限),因为每一格都是一张要花钱画的图。整章分窗口交给导演;导演中途停了,就把剩下的再问一遍,而不是让最后一格盖住后面所有的内容。提示词里自动带上出场人物的外貌和全书的画风,并把出场人物的人设图当参考图。播放时按台词推进,画面做缓慢的推拉摇移。 - **成片。** 有声漫是工坊边放边拼出来的;成片是一个文件,而它**不是按规则拼的**。这一章已经做好的东西——每一句的配音、声音提示、每一格的画面——都只是素材:工坊把它们排在一条时间线上(每句的起止秒数、每格画面的起止、每处声音的落点),连同命令行顺手的几种形式(一条已经对齐的整轨配音、按句切好的字幕、分镜表、一份能直接跑出朴素第一版的基础脚本)交给**后期 agent**。怎么剪是它的事:读素材、看这台电脑的 ffmpeg 能做什么、写自己的脚本、跑、检查、再改;做不好就叫外援。工坊留给自己的只有验收:有画面、有声音、不是静音、时长对得上讲述、没有大段黑屏、观众看得到台词,过了才收。字幕正好说明这条线划在哪里:工坊给出切好、对好时间的台词,说明“观众必须看得到”,检查它们确实在画面里或作为字幕轨带在文件里——但不自己写工具去放。第一次剪回来的成片只带了一条字幕轨(这台电脑的 ffmpeg 画不了字),最顺手的修法是工坊自带一个画字的本机小程序。作者从两点否了它,这两点现在是规矩:**agent 能干的活,不用确定性的小工具替它干**——素材、说清楚要什么、验收是工坊的事,用什么命令是 agent 的事;**插件不绑定任何系统,而 agent 不受任何限制**——插件要跑在 DSH 跑的每一种系统上,所以不带只属于某个系统的代码;干活的 agent 面对的只有眼前这一台电脑,这台电脑上有什么它都可以用。 - **幕间。** 见下一节。 ### 读和听是同一页 有声剧原先是"演出"里的一个标签页,和阅读器分开。但听就是用耳朵读:还是那一章,听的人想在屏幕上看到的是正文,不是一张逐句的录音表。所以听就在阅读器里——有声漫也是同一章、同一份脚本,所以看也在这里。阅读器有三种版面(文字、逐句的脚本、有声漫),前两种底下是同一个播放条:"听"不是一种模式而是一个按钮,无论开着哪种版面,这一章都停在同一处。在正文上听的时候:脚本的每一句在正文里定位(脚本不管分段,对白也没了引号,所以匹配时不看空白,找不到原样就按这句话怎么开头、怎么结尾来定位),正在念的那句亮起来,点任何一句就从那里开始播。作者的工具——生成、听检并补合成、导出、逐句的脚本——放在同一页的上方,而不是另一个页面。 手机上看到的也是这一页。给别的设备用的阅读器不能是 Harness 本身(它留在这台机器上,守着自己的认证),所以插件为它另起一个很小的服务:不开就不存在,逐本开启;从构造上就是只读的(没有任何能写、能碰到模型、密钥或未分享的书的路由);地址里带一段可以更换的随机口令。它用的就是工坊阅读器的那些组件,所以两边不会各走各的。 ### 全书一个样子,而且不藏着 一张图一条提示词地去配图,会出两种毛病。一是词在绘图模型那里是另一个意思——书里的"教会"被画成欧式教堂,"白甲"被画成十字军;二是模型没见过这个人,每次都画一个新的人。而常见的补救往往是藏起来的:一句悄悄接在提示词末尾的风格短语,决定了全书的视觉基调,却从不给作者看。 所以一本书的样子由作者读得到的几个部分组成,每张图都记着自己用了哪些: - 每本书一份**画风**,而且只属于书:民国悬疑和太空歌剧不该是同一种画法,所以画风是这本书“设定”里的一页,不是工坊的一项设置。它由导演按这本书自己来定——时代与地域、文字的气质、主要人物——导入书稿、起草设定时各定一次,作者随时可以让他重定。以前的书如果还没有自己的画风,从内置默认(或以前填过的全局画风)起步,并且第一张图就把这段文字写进书的 `novel.json`,连同来源一起显示出来,随时可改。会决定一切的默认值,必须落在明处; - **"不要出现"清单**——工坊、作品、人物、单次调用四层——写这个世界里没有的东西。它既作为负面提示词发给绘图模型,也交给写画面描述的模型,后者还被要求把带歧义的专有名词换成它在故事里实际的样子; - 每个人物一段**外貌**——只有这一段。写手照它写这个人,每张有此人的图也照它画;以前另有一段专给绘图模型的"视觉锚点",两段说的是同一件事、迟早对不上,所以去掉了(老卡上还留着的,画图仍照它,直到并进外貌——导演写成一段话,说法不一样的地方以它为准——或作者改了外貌、点了"丢掉")。外貌用书的语言写成一段通顺的话,只写看得见的;他站在哪、身后有什么不是外貌,写进去就会出现在他的每一张图里。导演写它的时候手里拿着画风。画风能说的不止"怎么画"——"服饰、建筑是明制"——而它接在画面内容后面,只能给已经写明的东西上色:外貌照原文写了"总编一根大辫",换什么画风画出来都是辫子。所以作者定下的年代和形制要写**进外貌里**,写它的人也要被告知:形制以画风为准,压过原文——是换掉,不是两样都留;这个人自己的东西(颜色、纹样、材质、随身的物件)带到新的款式上; - **人设图**:同一个人的正面、侧面、背面,之后每张有此人的图都把它当参考图。多套服饰是"造型",各自的人设图从主人设图衍生——同一张脸换一身衣服;常去的地点也有自己的场景设定图。 顺序很重要,工坊也会这样提示:先定画风和禁画清单,再写外貌、画人设图,最后才配图。 **立绘不只是证件照。** 一个人的立绘是一对:一张素底定妆,是他的脸;一张名场面,是读者一想到这个人就想起的那一幕(见"立绘在正文里")。后一张画的是哪一幕——而"是哪一幕"算不出来,它是对这本书的一个判断,所以由导演去读正文、自己挑,挑好了写在人物卡上,作者可以推翻。工坊管的是这个判断外面的框:立绘是什么(这个人是主体、一个定格的瞬间),挑了哪一幕要说出来、留下来,书里还什么都没有的时候不去挑。既然是判断,就有两条跟着来。作者对一张立绘的要求——亮一点、要失火那一夜——是**给做判断的人的引导**,不是把判断换掉:导演照着它去挑合得上的那一幕。哪一类场面能不能画,也不该由工坊按类别替作者定:一本书里的基督就在十字架上,它的将军就在乱军之中;这本书不画什么,由作者写在"不要出现"里,或者写在这一张的要求里。(第一版列过一串"永远不挑"的类别。它拦住了一个少年的情事,也一并拦住了十字架。) **名场面是一张看得见的清单,不是一次悄悄的决定。** 导演从书里找出的不是一幕而是一组,按分量排在人物卡上:哪一幕、第几章、画面、为什么是它的。作者在画之前就看得到、改得了、选得了——所以不需要“画之前先停下来问一句”。 **文字在前,图在后。** 参考图是一条提示词里分量最重的东西:告诉绘图模型"要和它一致",它就把参考图原样还回来。所以参考图往哪个方向传,是要定下来的事,而且只有一个方向——从文字到人设图,从人设图到其他所有图。主人设图只照外貌和画风画,永远不照这个人的任何旧图:照着上一张人设图去画人设图,它就永远变不了,不管作者改了什么,而且屏幕上没有任何地方说明为什么。立绘、插图、分镜画面照人设图画;造型照主人设图画,并且在提示词里写明参考图是用来干什么的(要的是脸,不是那身衣服)。想让一个人变样:改文字,重画人设图——之后,照着旧人设图画出来的那些图会自己说明。提示词里只在真有图发出去的时候才提参考图。一个绘图服务收几张,由它自己说——作者自己的服务器写在模型清单里(`reference_images.max_count`),OpenRouter 写在它的清单里,ComfyUI 看有没有带参考图的工作流——工坊绝不凭模型的名字去猜:服务器是会学会收图的,"它不收"这个猜测会比它成立的那一天活得久。服务说了的,提示词就按那个张数写,没带上的记在这张图的来历里;哪里都没说的,就把图发过去,对方不收,再只照文字要一次——提示词重新拼,一个字不提参考图——它当时的回答记在来历里。背后没有图的"必须与参考图一致"是一句没有对象的话,还占着提示词本来就不多的地方。**服务没收参考图这件事,在图画出来之后、和图一起说,不在画之前当作警告说**:一小时前对某个服务成立的事不该拿来提醒作者,这张图上实际发生了什么才该说。一个人的两张图谁为准由作者选(`image.lead`):人设图为准(文字 → 人设图 → 立绘和别的图),立绘为准(文字 → 立绘 → 人设图 → 别的图;这时立绘绝不照着人设图画),或者各画各的。这是长期的选择;人物页那两个按钮旁边,每张图另有自己的一个——"立绘照着:人设图 / 只照文字""人设图照着:现在的立绘 / 只照文字"——一开始就是设置定的那样,改了就对这一页画的图算数(请求里的 `from`)。从一张喜欢的立绘到一张对得上的人设图,于是就在图的旁边、一步之内,不管设置里以哪张为准。不管哪一种,方向都只有一个;它照着的那张变了,已经画好的图也不会被悄悄重画——页面上说明哪张落后了,由作者去重画。 **人设图是一组,不是一张。** 重画不把旧的丢掉:一个人的人设图都留在卡上,各有各的用途——**主人设图**(之后画这个人都照着它)、**某个时期的人设图**(画那个时期的章节时照着它)、**留着没启用的**(以前的、试画的)。用途是作者说的:在人物页上点"设为主人设图",或在"用于"里选一个时期;一张图只有一个用途。主人设图只因为三件事换:作者选了另一张;没选定过,又新画了一张(新画的顶上);它被删掉或标给了某个时期(排在它后面的那张顶上——通常就是它照着改出来的那一张的原图)。选定过的主人设图,之后再画多少张新的都不换,新的先不启用,画完当场说明。"只画正面"还是"三视图"跟着图走,不跟着用途走。 **设定图也是一组。** 地点、家族与组织、物品的设定图和人设图是同一个道理:再画一张不丢旧的,都留在条目上——一张是**主设定图**(画到它的图照着这张,列表和观看页里代表它的也是这张),其余留着不启用;对比时画了没采纳的、以前被顶掉还在图库里的,也列在条目页那一排里。哪张是主由作者说("设为主设定图");选定之后再画的先不启用,没选定时新画的就是主;主的那张被删了,排在它后面的顶上。 **照一张人设图改出来的,顶替它的位置。** "文字在前,图在后"说的是自动的重画;作者明说"照这张改"(把这张图和一句话发给绘图模型)是另一回事——给它加一道疤、把年纪改小几岁,改出来的那张接替原图的用途,原图留在它后面、不启用。要的是另一个年纪的样子,就改完把它标给那个时期,主人设图自动回到原图。 **写的地方看得见这一章的图。** 写作页旁边有一栏"图":这一章正文里插着的每一张,按先后排着,带它前面那一句话;可以上移下移、移到光标所在的那一段后面、取下(图还在图库里),也可以从图库里再插一张。它改的就是正文里那一行,和手打的修改一样存、一样有版本。照规矩出现的立绘(名场面、第一次出场)不在这里——它们不在正文里,在"立绘 N/M"里管。 **图在写的地方就是图。** 正文是纯文字,一张图在里面是一行标记——在一个文本框里看,它只是一串路径。所以写作页把一章按先后排开:文字是一个个随字数长高的文本框,图的那一行就显示成这张图,下面是它的说明。在那里点开它,和别处点开一张图是同一个面板(来历、改提示词重画、照着这张改、对比);从那里画出来的新图,就是正文里的这一张。换成书里的另一张、改说明、上移下移、取下,都在图的下面;文件已经不在书里的,直说,并留着取下那一行的办法。章节文件没有变:还是一份纯文字,位置、查找、选中的那一段、编辑器的按键都跨着这些文本框算;方向键走到一段的头尾,就越过图到下一段。一处选不到:选区不跨图。 **一张图就是一张图,不管是哪个页面画的。** 有声漫的分镜画面和立绘、插图一样留记录、进图库、用同一个大图面板(来历、改提示词重画、照着这张改、删除);书里任何一张图都能插到正文的任何一段之后(从图上点"插入正文…",或在写作页选中一段后"插入已有的图…")——不重画,只改正文那一处。 **人设图作参考时只带正面那一个身影。** 三视图整张交出去,绘图模型就照着画出三个人,文字说不动它(真试过);所以除了画人设图本身,别的图带的都是从人设图里裁出来的正面身影。 **分镜的提示词分两半。** 导演写这一格里发生什么(谁在哪、做什么、什么光)并点出这一格有谁、穿哪一身、有哪些物件;每个人的样子、地点和物件的样子,由工坊在画的时候从设定里原样接上——始终是现在的设定,不会因为导演写得简略而走样。 **每张图的提示词是同一种排法。** 以前各类图各拼各的,一句话连到底:画面埋在中间,谁的头发是谁的,读得松的模型分不清。现在不管画什么,都是一份排好的说明——一行一段,行首是这一段的名字,次序只有一种:画面 → 构图 → 人物(主体在前,陪衬在后)→ 地点 → 物件 → 这一张的要求 → 画风 → 参考图(按"图1、图2"点名各是谁)→ 不要出现。**说明里只有画面里有的东西**(作者 2026-10-12 删掉的两句都是这一条):① 第一行"用途:小说人物立绘:「某某」的名场面"——立绘、章节配图、分镜、自由创作的说明不再有这一行,它说的没有一样是画得出来的;只有名字本身就是版式的那几类(人物设定图(三视图 / 正面全身)、场景 / 家族与组织 / 关键物品设定图、封面)还以"用途"开头。素底定妆照的"只画这一个人"是画面的事,写在"构图"里。② "参考图"那一行后面讲"脸和体型照图,衣着另写了的照文字……不要重新设计"的那句——哪里照图,上面的行已经用"见图1"点了;哪里不照,上面的行已经用文字写了。这一行只说哪张图是谁。只有对这几张图**确有一句非说不可的话**时才接在后面:照立绘补人设图时"参考图里的背景、姿势、手里拿的东西不要带过来",一处地方在另一个时候"荒废的不要画成完好的",作者给的参考图"括号里说了要它什么",照着一张改时"只改图1"。旧图的记录里这两句照当时发的原样留着;但对旧图点"改提示词重画"、换个服务对比时,交出去的说明里已经没有它们。这是两家最常用的绘图模型的官方文档都要的写法(先场景,再主体和细节,最后是限制;参考图按编号说),强模型弱模型都读得了,所以**只有这一种,不按服务分策略**。说明原样发出去;只有放不下(模型读的 token 有限)时才由导演改写,作者也可以让每张都先由导演写一遍(`image.promptWrite`)——那是一次普通调用,材料全在说明里。服务有单独的负面栏时,"不要出现"走那一栏,不进正文:写进提示词,反而是在点那些东西的名。 **这一张的要求是改进提示词里去的,不是接在后面的一行。** 画人设图、画素底立绘时作者另说了一句("右手拄杖""雪夜,没戴眼镜"),以前是作为"这一张的要求:……"接在说明里——上面写着"两手垂在身侧",下面写着"右手拄杖",两种说法各说各的。现在由写提示词的导演把它改进去(一次普通调用):它说到哪一段就改哪一段——姿势改画面(人设图没有这一段,改构图里说姿势的那半句),天气光线改环境,穿戴改"此刻"那一行,和它对不上的原有写法改掉;指着参考图的人被要求改了一处,就在他那一行写明这一处照文字不照图。别的段不动。名场面的立绘不走这一步——作者的话已经用在挑那一幕、整理那一格上了。设置里"提示词谁来写"选了"照工坊排好的原样发"的,这一步也不做,照旧是一行。 **作者给一张图当参考:说了要它什么的,那几句话让给图。** 画人设图、画地点 / 家族 / 物品的设定图时,作者可以给几张图——从本书的图里选,或从电脑上带进来(存在 `assets/guides/`)——每张可以说一句要它的什么("旗袍的款式和发髻照这张""只要盖子上的纹样")。图排在工坊自己要照的图(立绘为准时的立绘、造型照着的主人设图)后面,标成"作者给的参考图"。第一次真画就看出一件事:**只在说明里加一行"照图"是不管用的**——旁边那段样子写得越细,绘图模型越照字画,图只剩下轮廓和视角。所以分两种:说了要它什么的,由写提示词的导演(一次普通调用;它看不到图)把文字里说同一样东西的话拿掉、原处写"照图N",并把拿掉的原话逐条交回来——交回来的提示词里还留着这些话的,退回去;拿掉了哪几句,记在这张图的记录里。什么都没说的,就是"整个样子照它":这个人、这件东西的那一行直接指给图("见图N"),那段文字不发、只记在记录里(`image.looks` 选了"样子也写一遍"的照旧写出来)。导演请不动时,要求作为一行照原话发,并在记录里明说。 **给的是别人的人设图,就是"像一家人"。** 画一个人的人设图时给另一个人的人设图(人物页那一行有"照别人的人设图…",直接选人;从本书的图里选到的也一样认),工坊认得出那是谁的图,在提示词里照实说:"另一个人「某某」(和他的关系,卡上记着的)的人设图"。没说要它什么时,要的不是"整个样子照它"——那画出来就是同一个人——而是相貌:脸型和五官像,看得出是一家人,年纪、头发、体型、衣着照这张卡上写的。发出去的也只是那张人设图**正面身影的头肩**:整个身影发过去,衣服连袖口的花样都被带过来;整张三视图发过去,侧面那个身影梳的还是对方的发髻(都是真画出来才看到的)。作者另写了要它什么("只要这身衣服的款式"),就照那句话,发正面那一个身影。 **带着图的人,指一下就够了。** 人设图跟着提示词一起发出去的人,说明里只写"见图1",不再把他的样子抄一遍——名场面里他穿的是另一身时,旁边那段平常的样子会把图拉回平常的样子。**带着图,就不再把人的特点说第二遍,没有例外**(作者 2026-10-11 又说了一次:原先留的几个例外——外貌在人设图之后改过、处在一个写了样子的成长时期、刚用随手写的想法改过外貌——都会把整段外貌再抄出来,而这几样在一本写了一阵的书里是常态)。指针后面只补**那张图上没有的**,而且只补那一样、只用几个字:这个时期不一样的地方(“见图1;这时(病愈):气色好了,腰间多了一块玉”)、没有自己人设图的那身造型(“;这一身:…”)、作者刚说的那几点(“;刚说的:…”)。**带着图,也不细写这个人的状态**(作者 2026-10-11 接着说的):时期里把样子写全了的(四十字以上),那一整段**不跟在指针后面**——只点时期的名字和年纪(“见图2;这时:病后(十九岁)”),那段话记在图的记录里、不发,记录上写明"这个时期的样子没有另写进提示词;要画成这时的样子,给这个时期画一张人设图"。导演写的东西同理:名场面那一格的"此刻"一行只点出和平常不一样的那一样(“浑身淋透,红头绳歪在一边”,不超过二十字,没有不一样就没有这一行),"画面"里写谁在哪、在做什么,神情几个字,不写谁的长相、头发和衣着;段落配图、分镜、封面的画面也是这样写。外貌的文字在人设图之后改过时,照的仍是图——这张图的记录上写明这一点;要让改动进画面,重画人设图。只有绘图服务没收图时才把人写出来。想每次都写,是一项设置(`image.looks`)。指给图看的那段话并没有丢:它不发出去,但记在这张图的记录里——换到不收参考图的服务上重画时,人还是那个人。 **照一段正文画图,先由导演认人。** 在写的地方、读的地方选中一段,要它的画:这段话里的"她"是谁、在哪、手里是什么,得读了前文和设定才知道——这是 agent 的活。导演认出人、地方和物件,写出画面;工坊照它点的名把每个人的样子和人设图、地点和物件的样子和设定图接上。它怎么认的,记在图的来历里。 **名场面先成一格画面,再去画。** 卡上的名场面是一段叙述——"她把信稿投进炭盆"——拿它直接去画,绘图模型不知道她此刻穿什么、周围是什么,叙述里的来龙去脉又都是画不出来的字。所以画之前导演(agent)去读讲这一幕的那几段正文,把它整理成一格:一句简短的动作、她**此刻和平常不一样**的穿戴(照上下文;书里没另外交代就留空——平常那一身由人设图和人物那一行给出,不在这里再写一遍)、周围的环境、同场的人和物。这一格记在那一幕上,那一幕的文字没变就一直用它;立绘的说明于是是 画面(那句动作)→ 环境 → 构图 → 人物(见图1)→ 此刻(只有和平常不一样时才有这一行)。说明里只有画面里有的东西——"谁在做什么照画面写的来"这类对模型说的话不写。导演请不动时照那一幕的原话画,并说明。 **凡是画图的按钮,旁边都能"多个模型各画一张"。** 立绘、人设图、设定图、封面、段落配图、分镜画面、图库里新画一张、批量绘制、一键制作——同一个小按钮、同一个对话框:选几个绘图服务(或同一个服务的几个模型),各画一张,并排着看,采纳哪张哪张才算数——采纳的那张落在平常画出来会落的地方(挂到人物卡、设定条目、那一格分镜、正文那一段后面)。一次画很多张的(一章的分镜、一批立绘)是"一轮":可以整轮采纳某一个服务画的,也可以在"演出 → 插图 → 待采纳的对比图"里一张张采纳。 **选中的那一段,在说完要拿它怎么办之前一直看得见。** 写作页的正文是文本框,而文本框只在光标在它里面时才画选区——作者选了一段、去点"按要求改…"写一句话的那一刻,正文里那一段的底色就没了,像是什么都没选,点了"改写"也不回来。所以光标一离开正文,工坊就在文本框底下把这一段标出来(同样的字、同样的排法,文本框本身透明):点按钮、写要求、开对话框、等写手改完,它都在;作者回到正文另选一处,或者正文变了,它才没有。 **对比画出来的,一张都不丢,什么时候回来选都行。** 画一张图要十几秒到几分钟,没有人会守着对话框等。所以:对话框关掉,任务照画;画出来的每一张都留着,并且自己记着"采纳了去哪"(挂到谁的卡上、哪个条目、哪一格、正文哪一段后面;把一张已有的图换几个服务重画的,记的是"顶替那一张")。找回来有三处,说的是同一批图:页头的"待采纳 N"(有才出现,哪一页都在)、"演出 → 插图"顶上的"待采纳的对比图"、以及**重新打开同一个对比对话框**——之前画的、还没采纳的就在里面,还在画的接着显示,一次画很多张的那一轮照旧可以整轮采纳。任务画完时对话框关着,工坊说一句画好了、在哪。采纳一张,其余的照旧留着(要删得勾选);同一次对比里再采纳另一张,它顶替的是前一张采纳的——那个位置现在是它的。 **图也可以从外面拿进来。** 哪里能画一张图,哪里就能换成作者自己的一个文件——照片、自己画的、别的工具做的。立绘和人设图(人物的、某个时期的、某身造型的、某一幕名场面的)、地点 / 家族与组织 / 物品的设定图(连同它某件轨迹"这时的样子")、封面,画图按钮旁边都有"导入":这张图和画出来的一样挂上去、一样留记录(记着它是导入的——没有提示词,所以没有"改提示词重画"),守的也是同一套规矩——是留着的那一组里多出来的一张,没选定过别的就用它。**从书里的图里选一张**的地方——插进正文、顶替正文里的一张——选图框里有同一条路:导入进来,它就是这本书的图,并且当场被选中。图库则可以一次导入很多张,先说它们是什么:哪里都不挂的图,某个条目的设定图,或者某个人的人设图、立绘。导入的人设图是三视图还是只有正面,按形状认;照片常常是横幅的单人,所以这一点可以在那张人设图上直接改。 **一张图用作什么,随时可以改,哪一张都行。** 一张图是作为什么画的(或带进来的),不等于它只能是什么:一张场景插图恰好是某个人最好的一张像,成批导入图库的照片里有一张是某处的设定图。点开任何一张大图,底下有"用作…":说它是谁的什么——某个人的立绘(可以指明是哪一幕名场面的)、某个人的人设图、某个地点 / 家族与组织 / 物品的设定图、某一章的图、或者哪里都不挂——以及是不是这本书的封面。说了之后,它从原来挂着的卡片或条目上取下,挂到新的地方,在图库里也归到那一类;守的仍是那一组的规矩(没选定过主图就用它,选定过就先不启用)。正文里插着它的地方、分镜里用着它的那一格、它是不是封面,都不因此变。这里画出来的图改了用途,记录上留着它"原来是作为什么画的"——提示词和参考图是那时的,不拿来和现在的主人对照。一张图"现在挂在哪"读的是卡片和条目,不是记录上的那个词。 **一张图可以用手摆正:裁切、旋转、镜像——原图留着。**(作者 2026-10-11:"图库里应该允许一些基本的修改,比如裁切,旋转一类的,但是保留原图。")绘图模型画歪了一点、照片横着进来、一张合影只想留一个人:这些不值得再问一次模型。点开任何一张大图,底下"裁切 · 旋转…":向左 / 向右转 90°、左右 / 上下镜像、拖一个框裁切(可以锁成原比例或常见的几种比例)。存下来的是**一张新图**,它站到原图站着的每一个地方(代表立绘、主人设图、主设定图、名场面、分镜的那一格、封面——和"照着这张改"出来的图同一条规矩),原图留在它后面。图的文件一旦写下就不再改,是全工坊的规矩(按内容命名、缓存、发布出去的网站都靠它),所以不做"原地改"。新图的记录是原图记录的一份,外加一句"它是照哪一张、怎么摆出来的"(`edited`:镜像、转了几个 90°、留下的那一块);提示词、参考图、当初要的尺寸都还是原图的。**再改一次是从原图接着改**:打开的是整张原图,上次的框和方向摆在原处——裁小了能再放大,裁两次不丢两次像素;改出来的顶替上一次改的,上一次那张从书里删掉(它的一切都在原图和那三个数里),除非某一章的正文还插着它。把一切复位再存,就是"恢复原图"。三视图的人设图裁成只剩一个身影,它就按"只有正面"算。画在页面上(浏览器的画布),后台只管收下、记下;和导入图片、改图片用途一样,这是作者在页面上做的事,总编和各角色没有这个工具。原图被删掉之后,照它改出来的那张就是一张独立的图。 **正文里的图是作者摆的,改文字的人不许把它改没。**(作者 2026-10-11:"现在修改文字的时候总在去掉我们的图片注释……提醒他不要这么干"。)图在正文里是单独的一行 `![说明](路径)`。让模型改文字——改写一段、改整章、修问题、全书修订——它常常把这一行丢掉。两道:① **告诉它**这一行是什么,要原样交回原处;② **交回来的和原文对一遍**:漏掉的放回去(跟在"原来那一段改写后的样子"后面;全新的一稿、译文这种对不上的,按原来的远近),路径被改坏的改回来,它自己添的(书里没有这张图)拿掉,说明照作者的。重写一章,原来的图带进新稿;总编亲手换掉一段文字,那一段里的图留着——要取下一张图,只能点名删它那一行。给写手的前文只带文字,不带图片行,它也就不会学着自己写。凡是放回了、拿掉了,提案上和结果里都说。 **导入的和这里画的分得开。** 图库和选图框里另有一排"来源":这里画的 / 导入的,和类型、对象的筛选叠着用;图库里导入的图角上有个小标记。 **这两件事是作者在页面上做的,不是总编的。** 把这台电脑上的文件带进书里、改一张图的用途,总编和各角色都没有这个工具(作者 2026-10-11 定的;有一条测试看着,免得以后被加进去)。 **重画时可以换参考图。** "改提示词重画"的两栏下面列着这张图当时带的参考图:可以去掉、可以从本书的图里或电脑上再加;提示词里"见图N"的编号和"参考图"那一行跟着改,被去掉参考图的人换成文字写出来。 **展示一张图的地方只有一种控件。** 点开大图——图库里、人物页上、设定条目上——旁边是它的来历,底下是对一张图能做的事,哪里都一样:下载、**改提示词重画**(发给绘图模型的全部提示词都在眼前——整段提示词一栏,连同画风和说参考图的那几句;"不要出现"另一栏——改完发出去的就是这两栏,工坊不再另加什么;它原来带的参考图照旧带上)、**照着这张改**(发给绘图模型的只有这张图和作者写的那句"改哪一处"——图自己已经说明了画面、画风和不该有什么,再用文字说一遍只是把提示词撑长;画幅照原图。绘图服务不收图时,才用这张图的文字描述顶替它,后面接上要改的那一处,画完说明原图没带上。这张图"用文字怎么说"另记在它的来历里,不发,留给以后"改提示词重画"用)、删除。重画完面板不关:它留在原处、换成刚画出来的那一张(作者要改就是为了看它,多半还要再改);画的过程中输入框留着不动。重画出来的新图换到旧图挂着的每一个地方(人设图、造型、时期、名场面的立绘、设定图、封面),旧图留在图库里;立绘是并排留着的——新画的排第一,是他在列表里的脸,其余的作者自己排、自己删。删除一张图,同样从所有挂着它的地方取下。家族与组织和地点、物品一样可以有设定图:画的是代表它的一幅画面(门庭、徽记旗号,或它的人聚在一处)。 **一张图是怎么来的,重画就从那里来。** 照文字画出来的图,"改提示词重画"改的是那段文字。照着另一张图改出来的图,当时发出去的只有两样——原图和一句话——它的"改提示词重画"打开的就是这两样:那句话可以改,原图摆在旁边;发出去的是原图和改过的那句话,画出来的顶替改出来的那一张。不拿一段事后拼出来的文字去整张重画:那段文字从来没有画出过这张图。(想照文字整张重画,旁边有一个链接;原图已经删掉的,只剩这条路,页面上说明。)换几个服务来比也是同一个道理:同一张原图,同一句话。 **照着一张图改,可以带上别的图。** 一句话说不清"换成哪一身、哪支笔、谁的发式"的时候,把那样东西的图一起给它:原图是图 1,带上的从图 2 排起,每张可以说一句要它的什么,那句修改的话里用"图 2""图 3"指它们。这时句子后面多一行——哪张是要改的、只改它、别的图只取说到的那一样;不带别的图时,发出去的仍然只有原图和那句话。带上的图记在改出来的那张图上:再改一次,它们照旧跟着,除非作者换掉。 **每张图都追得到来历。** "每张图都记着自己用了哪些"值多少,要看图画歪了的时候作者能拿它做什么。点开一张图,旁边就是它的记录:提示词按发出去的先后拆成的每一部分、各自在哪里改;随提示词一起发出去的参考图——每一张都能再点开看它自己的记录,一个长相可以顺着图一张张追回去;发给绘图模型的原话,一字不差;以及这一切和现在的书对照起来怎么样(外貌或画风在这之后改过;立绘是照着一张已经重画过的人设图画的)。于是一条没人要的辫子,要么是外貌里的一个词,要么是一张被带上的图,要么是模型自己的习惯——作者不用问任何人就分得清。 ### 花了多少 演出是花钱的地方,一百万上下文的写手模型也不便宜。工坊给自己发出的每一次模型调用记账——各角色的 token、图片张数、语音秒数——按模型、分工、作品、日期汇总。它只计数,不猜价格:作者填了单价的模型才显示金额,用作者填的货币;没填的如实标"未定价"。对话里总编自己的那部分由 Harness 统计,账本会明说这一项不在其中。 ### 每次调用发了什么、回了什么 用量账本只记数。可一段文字写得不对,或者同一章两次写出来差得很远,要看的不是数,是那一次模型到底拿到了什么——它只照交给它的东西写,别的一概不知道。 所以工坊把自己对文字模型的每一次调用都留下来:这个角色的守则和文风、排在最前面那段不变的前文、这一次的材料和要求、模型交回来的原文,连同用的是哪个模型、思考档位、温度、输出上限、服务端数的 token、用了多久、怎么结束的(失败的记原因,被停掉的记它写到哪)。一条记录挂在它所属的任务、章节和批量步骤下面。 - **记在书里**(`.novel/calls/`),不记在 DSH 的目录里:加密的书,记录跟着一起加密;除了书自己的目录,哪里都不留一份明文。 - **重复发送的大段只存一份**:连着写几章、一章被截断后续写、几个模型对比同一章,发出去的守则和前文是同一段,按内容存一次,各条记录指过去。 - **留多少是作者的一项设置**(`callsMb`,默认每本书 200 MB,满了先去掉最早的,填 0 不记),能逐条删、能整份清掉。 - **在哪看**:写作页右侧面板的"调用"是这一章的;"任务"和"用量"里的"调用记录"是全书的。点一行读那一次的全文,按发送的顺序一段段排开;勾两条"看差在哪"——先是两次各怎么设的(模型、档位、温度),再逐段说这一段两次是一字不差,还是差在哪几处;勾几条就并排看(用的是对比稿那同一个并排控件)。 - **角色自己一步步干的活不在里面**:策划、场记作为 agent 跑的那一趟是 DSH 的一场对话,照旧从任务里点开看。这里记的是工坊自己发出去的那种一问一答——写手写一章,就是这种。 两次写得不一样,原因只有三种:交给它的东西不一样,设置不一样,或者都一样——同一份请求在写手默认的 0.85 温度下答两次,本来就是两篇文字。有了这份记录,三种一眼能分开。 ### 幕间:为什么不做成"酒馆" 角色扮演工具的核心是"和角色聊天",故事是聊天的副产品。这里反过来:**故事是主体,扮演是探查故事的一种手段**——在写一场对峙之前先下场演一遍,看看人物会怎么反应;或者试一个"如果当时她没走"的岔路。 所以幕间被设计成正史上的一个"岔口": - 它锚定在某一章之后,导演模型只知道到那一章为止的正史; - 你可以扮演其中一个人物,也可以只当导演,发出"门外有人敲门"这样的场面指令; - 导演每回合给出旁白、各人物的台词与动作、可选的选项、场景变化(地点、时间、氛围、环境音)和它在跟踪的变量; - 界面按视觉小说的方式呈现:背景、立绘、对话框、选项、配音、环境音——图像和语音都是按需生成的,所以它确实是一部"现场生成的 Galgame"; - 结束时有三种去向:作废(不算数)、留作番外、或者让写手按本书文风把它**改写成一章**并入正史。只有最后一种会改变正史,而且之后同样要收录。 ## 七、与 Harness 的融合方式 - **一个 npm 包,三个入口。** 宿主端(项目、流水线、任务、接口)、Agent 端(工具、提示词、指令,挂在预设里)、浏览器端(工坊)。包自带一份配置补丁,安装即生效。 - **只走官方接缝。** 文字模型调用走 DSH 的模型运行时,"设置 → 模型"里配置的每条线路都可用;角色作为 agent 运行走 `ctx.subagents`(插件注册自己的 provider);外援走 DSH 自己的 `dsh-tool-subagent`;密钥走凭据库;界面通过槽位注册到左侧栏、右侧栏和工具行;浏览器与宿主之间走 DSH 自己的连接(一条带鉴权的接口),所以 Web 和桌面版行为一致。 - **Harness 给自家 agent 的,插件自己的调用拿不到。** 失败请求的重试由 `dsh-llm-retry` 挂在 agent loop 上;通过 `ctx.llm.stream` 发出的调用,第一次失败就是最终失败。所以工坊对仍然是"调用"的那些调用自己执行供应商的重试策略,并把不止是一次调用的工作搬到 agent loop 上——在那里这些都不需要第二份实现。 - **提示词分两层。** 一段不变的分工说明进入系统提示(可以被前缀缓存);项目摘要和当前工作模式作为动态上下文,只有变化时才重新发送。 - **工作模式是会话状态。** 构思 / 设定 / 大纲 / 写作 / 修订 / 审校 / 演出 / 幕间,可以在工坊右上角切换,也可以让总编切换;它改变的只是总编此刻的规则。 ### 加密的书 书是普通文件,所以谁都能读;加密的书,是作者不想让任何东西读到的书——备份、云盘同步、随手打开这个文件夹的人。只加密"正文"是不够的:一张立绘、一句配好的台词、一份记忆摘要、一个人物文件的文件名,透露的并不比正文少。所以加密做在所有东西的下面:对一本书的每一次读写都经过同一个很小的接口,加密的书在这个接口里把内容和文件名一起加密,其余代码既不知道也不关心。 **关于这本书的对话也要锁。** DSH 把每一段对话存成磁盘上的一份日志,谁能读磁盘谁就能读;而和总编聊这本书的对话里就有这本书——它读过的章节、作者口述的情节、各个角色查到的东西。DSH 没有加密或删除一段对话的接口,所以工坊在书上锁时把这些对话从 DSH 手里**拿走**:每一份日志加密后放进工坊自己的目录,明文从 DSH 的会话库里删掉(连同 DSH 从中算出来的标题、摘要缓存);书解锁时原样放回,对话可以接着聊。哪些对话算"关于这本书":绑定到它的对话、总编的工具碰过它的对话、各个角色为它跑的记录,以及这些对话的所有子对话。为了在书**锁着**的时候也能把对话收进去(比如上锁那一刻还开着的对话,要等它关闭),加密书的 `novel.json` 里带一把只进不出的公钥:谁都能往里放,只有书的钥匙能取出来。正在使用的对话不会被强行拿走,它在被释放后、最晚在下次启动 DSH 时加密;明文只有在加密副本落盘(钥匙在手时还要解开比对一遍)之后才删除。 **给模型看过的图也要锁。** 一张图要给模型看,得先交给 DSH 的附件服务,而它给每一张都留一份——明文、长期、没有删除的接口。加密的书的图,只要给模型看过一次(总编用 `novel_look` 看过、作参考图用过、由"看图的模型"读过),就有一份躺在书的封存之外。所以**图跟着对话走**:工坊记下它让 DSH 留了哪几份(只记内容的哈希,不记文件名——文件名里可能有人名),对话收进封存时再从它的记录里认出它握着哪几张;书上锁时,这几份从附件库里取出来、加密放进工坊自己的目录,明文删掉,DSH 按请求尺寸缩放出来的缓存也清掉(分不出哪份是这本书的,所以整个清——用到时它会再算)。先后有讲究:没有对话握着的当场收走;对话里出现过的,要等这本书的对话都收进去了才收——一场还开着的对话必须还找得到它的图。解锁时先把图放回去,再放回对话。和对话一样,明文只在加密的那一份写好、(钥匙在手时)重新解开比对过之后才删。分不开的一点照实说:附件库按内容存,同一张图在别的书、别的对话里也用过的话,这本书锁着的时候那里也看不到它。 书的钥匙是随机的,未包裹的形态只存在于运行中的 Harness 的内存里。落在磁盘上的,是按"每一种开锁方式"各包一份的钥匙——密码、这台电脑的系统解锁、输过一次密码的设备——存在唯一保持可读的那个文件里。"是不是本人"交给操作系统去问(触控 ID、Windows Hello、电脑密码):通过系统自带的脚本宿主——Mac 上是 `osascript`,Windows 上是 PowerShell——用几行脚本去问,它只回答是或否,手里没有任何秘密;它守着的那份秘密放在系统账户的凭据库里。为此不编译、也不随包带任何本机程序:DSH 跑在哪里,插件都是同一份文件;系统没有这种确认的地方(目前是 Linux),书就只用密码打开。DSH 自己没有可供插件调用的"机主确认"——桌面版的外壳没有开放,外壳里的网页也用不了 WebAuthn(浏览器只允许 https 和 localhost)——否则工坊会直接用它。总编被设计在这一切之外:它能把书锁上,永远不能解锁,密码也永远不在对话里输入。 **私密书架。** 加密的书锁着时,书架上仍然有它的名字。有些书连名字都不该在那里:私密书架上的书,在书架没打开之前不出现在任何列表里——没有书名,没有封面。书架有自己的密码;书架上的书可以"开了书架就能读"(书的钥匙另包一份给书架),也可以再留一个自己的密码(二次加密:书架只管藏,开书还要它自己的密码)。加密的书在打开的书架上也不显示封面——封面是书里的一张图。书架的密码不经过对话:总编没有开书架的工具。 ### 设置:全局一份,书可以有自己的;换走的服务记着 模型、绘图、配音、检索、上下文预算、并发,全局定一份,每本书可以另有自己的——写进这本书的 `novel.json`,书到哪跟到哪。书点名了一个绘图服务,就是这个服务的**整套**配置归这本书(地址、模型、尺寸……),不和全局的掺在一起;没点名的照旧沿用全局。密钥从不进书:按接口地址用本机存着的那一把。设置页在"这本书"下说的"能不能用""各角色跑在哪个模型上",是按这本书算的;书里指定的模型 DSH 现在没有了,页面直接说,并给出退路。 从一个服务换到另一个时,换走的那一个的配置记着(`image.kept` / `tts.kept`),换回来还在。记着的这些也就是"对比"时可以一起拿来比的。 **检索、上下文、并发也能随书。** 检索是整套(这本书的段落用哪个接口、哪个模型建索引;换了模型,索引在下次检索时重建);上下文预算是逐项(书里写了哪一项,哪一项归这本书);并发是逐类(文字、语音、图片、声音)。并发的"随书"是**单独计数**:一本书给某一类填了数,它这一类的请求就走它自己的闸门,只数它自己的——不是"全工坊的活少于这个数时才轮到它"(那样一本想慢一点的书会被别的书饿死),也不受全局那个数的限制(那样想快一点的书快不了)。没填的那几类照旧和别的书一起数。 **选模型的地方是同一个控件。** 一个服务的模型,不管在设置页里选,还是在对比的对话框里选,都是同一个下拉:能随手填,列表里是推荐的和这个接口自己列出来的全部(带它对每个模型说的话:最大画多大、收几张参考图),旁边一个按钮重新读。接口说了算,不靠工坊记。 ### 对比:同一件活,几家各做一遍 哪个绘图服务适合这本书、哪个配音服务像这个人、哪个模型写得好、哪个推演得好——让作者自己看:同一张立绘(或任何一张已有的图)几个服务各画一张,同一句话几个配音服务各念一遍,同一章几个模型各写一稿,同一段大纲几个模型各推一版,并排着看、听。规矩只有一条:**对比做出来的东西不替换任何东西,采纳了才算**——图放在图库里、不进正文;配音只是试听的片段,不选角、不记进声音表;稿子存成这一章的版本;大纲只是预览。后台是同一个机制("试用":这一件活临时换一个服务或模型做),几处界面是同一个对话框的几种样子。 配音的"采纳"是换服务,不是留下那一句:这本书从此用它(成为这本书自己的配音服务),或者所有的书都用它(原来那套照"换走的服务记着"留着)。在某一行里点名了音色、念的又是某个人的话,采纳时这个音色记到那个人的卡上。 ### 参考图:用几张图引导推演、写作和修改 作者脑子里先有的常常是画面:一个结尾的镜头、一张脸、一处地方的光。所以推演后续章节、假设推演、写一章、全书修订、改写选中的一段的时候,都可以给几张图——从这本书已有的图里选,或者从电脑上带进来(存进书的 `assets/guides/`),每张可以说一句"这是哪一幕、要它的什么"。 - **图跟着章走。** 写作页上给的图记在这一章的章纲上(`guides`),这一章的每一次写作——起草、续写、对比、批量——和它的节拍推演都照着;推演时给的图交给策划,它说哪一章是照哪张图来的,那一章就带着那张图,写的时候不用再给一遍。 - **一次性的图跟着那一次。** 假设推演、全书修订、改写选中的一段,图是给这一次的:假设推演的每条走向都把它们算进去;全书修订时策划划范围要看,被划进去的每一章重写时也看;改写一段只用当场给的图,不带这一章存着的那几张(那是给整章的)。整章的重写(修这一章的审校问题)没另给图时,照这一章存着的图。 - **谁来看。** 最好是干活的模型自己看:DSH 的模型清单里写着每个模型收不收图,收的就把图连同任务一起给它——走的是 DSH 自己带图的路(附件服务 + 各家接口的适配),工坊不另接一套。干活的模型说自己看不了图时,由设置里"看图的模型"先把每张图看成一段文字,文字进任务;**没配这个模型,就只用图的标题**——它在书里是什么("立绘 · 阿棠 · 雨中急刊")、作者对它说了什么——并且明说"你看不到图本身,也没有人替你看,图里别的细节不要编";活照常做,结果里写明"只把图的标题交给了它",没有标题也没写说明的那几张如实计数(等于没带)。(起初这种情况是整件活拒绝;作者 2026-10-12 定:默认只用标题。)模型没声明能不能看图的:配了"看图的模型"就让它看,没配就照发,并在结果里明说"它没有声明"。 - **看过的不重看。** "看图的模型"对一张图说的话记在书里;同一张图再用、几个模型同时对比,都只看一次。 - **图是引导,不是剧本。** 任务里写明:图里和设定、前文对不上的地方,以设定和前文为准。书自己的图(立绘、设定图)还会带上书里对它的记录——是谁的、哪一幕。 "看图的模型"和各角色的模型一样是 DSH 里的模型(全局一个,书可以另设),但它不是一个角色:不配就是没有,不会退回到对话模型。 ### 立绘在正文里:名场面的在名场面处,素底定妆在出场处 规矩是作者定的:**名场面的立绘出现在讲到那一幕的段落后面;代表这个人的那一张——默认是素底定妆——出现在他第一次出场的地方;两处是同一个位置、或者近到读者一眼两张都看得见时,只出名场面那一张。**"近"是按正文量的:两处之间隔着不到四百字(同一段当然算)。隔得远的,同一章里各出各的——那是两张图:他长什么样,和他做了什么。同一张图在一章里不出两次。成长时期的立绘同理,出在那个时期开始的那一章。 **一个人的立绘默认是一对。** 什么都没交代地点"画立绘",画的是两张:一张**素底定妆**(面向镜头、素净背景——这个人的脸),一张**名场面**(他在书里被记住的那一幕)。前一张代表他:列表里、头像上、舞台上、正文里第一次出场处;后一张站在那一幕被讲到的地方。只要其中一张,在按钮下面选;这本书只画其中一种,在设置里说(`image.portraits`)。批量补的时候缺哪张补哪张。 **代表立绘是选出来的,不是"最新的那一张"。** 作者在他的页面上选定了哪一张(`visual.face`),就是哪一张,之后再画多少张新的都不换。没选过的:最新的素底定妆;一张素底的都没有,才是最新的那一张——页面上写明它是照规矩来的,一点就定下来。被选中的可以是任何一张立绘,名场面的那张也行:那它在书里有两个位置,各自可以单独隐藏。 **一幕名场面的图也是选出来的。** 一幕可以画不止一次——重画、改提示词、换一家服务来比。这一幕画过的每一张都列在名场面面板里那一幕的下面;哪一张代表这一幕(面板里、正文里讲到它的地方)由作者说,没说的是最后画的那一张。**一张图是哪一幕的,看这张图自己的记录**(它记着画的是哪一幕、第几章,照的是哪一段话),不看人物卡上那一幕旁边有没有记一笔——那一笔会丢:这一章重新收录过,场记记下的名场面换了编号;这张图是对比时画的;人物卡是早先的格式。所以"画了,面板上却说没画"不该出现;画过的一幕也不会因为后来的收录更看重别的而从清单上掉下去。 不是代表的其余立绘默认不出现,但都列着、写着为什么("这一幕另有一张""不是代表立绘""紧挨着名场面"),可以逐张打开;默认出现的也可以逐张隐藏——在读的地方、写的地方、这个人自己的页面上都能说。书里只记作者说的和规矩不一样的那几张(`figures-hidden.json` 关掉的,`figures-shown.json` 打开的),所以没人碰过的图一直跟着规矩走。 ### 参考文献:照着别的书写,由角色自己去查 一本书可以照着别的书写——它们的世界观、设定、文风、剧情,乃至文字——并且由作者说清楚怎么照。参考文献有两种:**书架上的一本书**,照它在书架上整理好的样子查(设定、人物、大纲与各章的记载、文风、正文),哪几样开放由作者逐本定;**专为这本书导入的一份书稿**,只当文字读和搜。想先整理再参考的书稿,应当导入成书架上的一本书——参考文献页上这么说,并给出去处:不在这里另做一套"半整理"。 几条规矩: - **不整本塞进上下文。** 参考文献是拿来查的。策划、场记、导演各有两样工具(读、搜),只够得着作者开放的那几样;每本旁边是作者那句"怎么参考"。查什么、查多少,是干活的那个角色自己的判断。 - **怎么参考,由作者用自己的话定,定在两层。** 一句**总的要求**管这本书的全部参考、全部角色——世界观照哪本、文风学哪本、人物能不能借——写在参考文献页最上面;**每一本**下面再有它自己的一句("只学它章回体的口吻,不要用它的人物")。两句都算数,对不上时那一本照它自己的。写一次,对之后每一件活都算数——不用每次在要求里重说。 - **查不查,不留给角色去猜。** 角色手上有工具不等于它会去用:"沾边时先查"这句话交给模型,沾不沾边就成了它的判断,它觉得用不上便一次都不查。所以三种活是**先查再动手**的:写作(策划先为这一章查,见下一条)、推演(章节、节拍、假设推演)、审校。推演和审校的角色被明说"先查",没读过、没搜过就交回的,交回的东西不收、退回去查(最多退两次,免得一个不肯查的角色永远交不了差);它查了什么,是从它调了哪些工具数出来的,不听它自己说,并且写在结果里。每一种可以各自关掉——关掉就回到"它觉得用得上才查"。角色是一问一答、没有工具的时候,查不了,结果里照实说。审校还会拿到写这一章时交给写手的那份摘记,对不上参考的地方记成问题。 - **写手不查,它拿到的是摘记。** 写手是一问一答、没有工具的;所以写一章之前,策划(作为 agent)先替这一章去查,把"要守的 / 可以借的 / 要避开的"连同出处记在这一章的章纲上。摘记作者看得到、改得了,之后这一章的每一次写作都带着它;查过而一无所得也算查过,不会每次再查一遍。策划当不了 agent 时,这一步明说做不了,而不是凭空编一份摘记。 总编不受这些限制:它能列、能读、能搜、能替作者加减参考文献、能让策划现在就为某一章去查(`novel_reference`)。 ### 随笔:没想好的,先记着 作者 2026-10-12:“加一个随笔记录功能,可能是没想好的大纲,或者没想好的设定,默认被其他agent检索(用户可以单个或者全局指定不检索)”。大纲和设定集装的是定下来的东西;一个“也许让他晚一章出场”“后院也许该有一口井”的念头,写进去太早,不写又会丢。随笔就是放它们的地方:存在书里(`jottings/index.json`,随书加密),在“设定 → 随笔”页上写,或者从页头的引号按钮在任何一页随手记一笔。每条有类别(剧情 / 大纲、设定、其他)、可以有标题;删掉的在页底“最近删除的随笔”里放得回。 几条规矩: - **默认找得到。** 随笔是检索的一种来源(`jotting`):各角色的 `book_search`、总编的 `novel_search`、搜索面板都搜得到;`book_read what=jottings` 列出它们、带 `ref` 读一条。作为 agent 干活的角色(场记、策划、导演)在规则里被告知“这本书有 N 条作者的随笔”,以及怎么读。 - **沾边的跟着走。** 推演或写一章时,和这一章沾边的随笔(照同一次检索,并且要和这一章的梗概 / 节拍 / 人物有三个以上共同的词)最多三条,作为一节放进交给它的材料——所以一问一答、没有工具的写手也看得到。审校、修订不带:那是拿正文对定论,随笔不是定论。 - **它是想法,不是设定。** 每一处给出随笔的地方都这么写着:和设定集、已经写下的正文对不上时,以设定和正文为准;照哪一条做了什么,交回时说一句。实测里策划照一条“码头 · 旧红伞”的随笔排了一个节拍,随笔里“还没想好伞是怎么到他手里的”它也照样留着没定。 - **作者可以不让找到——单条,或全部。** 每条随笔上一个“可检索 / 不检索”;页顶一个“让各角色检索到随笔”。不让找到的随笔**根本不进索引**,也不在任何 agent 读得到的清单里——包括总编:它改不了、也看不见作者收起来的那几条。作者自己在页面上永远全看得到。 - **定下来了,就不再是随笔。** 总编被告知:作者把一个想法定了,就把它放到该去的地方(大纲、设定),再问一句那条随笔还留不留。它可以替作者记一笔(`novel_jot`:作者说“先记着”、或者在对话里想到一半的时候,用作者的原话记,不替作者把没想好的整理成决定),但“让不让检索”只有页面上能改。 - **别的书查不到它。** 一本书被当作参考文献时,开放的是它的世界观、人物、文风、剧情、正文;它的随笔不在其中。 ### 推演记录:这几章当初是怎么想的,留着,并且交到写的人手里 作者 2026-10-12:“大纲生成,推演的记录可查,避免生成的原始思路忘掉”;“文字生成的时候……应该带上(推演的原始思路),并且明确指出这部分文字生成覆盖到哪里,这样我们定的剧情基调(欢乐?阴暗?)才能更好的被理解”。查出来的现状是两头都没有:方向和策划的说明只在“待看的那一版”里存着,一加入大纲就删;写手拿到的是章纲、前文、设定,推演时说的话一个字不带。 一份大纲说的是**发生什么**;它**想写成什么样**——往哪走、轻还是重、谁的戏——是推演时作者那句方向和策划那段说明里说的。大纲之后会被改、被挪、照正文重读;那两段话不留,就只剩结果,没有来由。所以: - **每次推演留一条记录**(书里的 `derivations/index.json`,随书加密):推演章节、推演节拍、照一句话加 / 改节拍、假设推演、新书起头的那个想法。记的是作者给的原话、每一次交回的内容和策划对它的说明(照意见调整过几次就有几次)、它成了大纲里的哪几章、还在等看 / 进了大纲 / 放弃了。放弃的也留着——那也是想过的。 - **哪里查**:大纲页“推演记录”;每一章的章纲上、写作页的要求框下面各有一行,说这一章写的时候带不带、带的是管哪几章的那一次。总编和各角色用读书的工具读(`what=derivations`)。 - **写的人拿得到,并且知道它管到哪**:排一章的节拍、写这一章、改这一章时,这一章所属的那次推演作为一节放进材料——“这一段思路管第 6–10 章,共 5 章。现在这一章是第 7 章——这一段里的第 2 章”,下面一章一行(哪章写了、哪章是现在这一章),然后是作者给的方向、看过之后要改的、策划的说明、作者后来补的。写手另外拿到排这一章节拍时作者说的话。接着往下推演的策划,拿到这条线最近几次推演的思路。 - **谁管什么,写明白**:发生什么照章纲(章纲会改,事情以它为准);基调照这段思路——它和全书文风里的气氛、和节拍上标的情绪不一样时,这几章照它。写手的任务最后一行再点一次。策划说明里“没有采用的别的走法”标明不算数。 - **没有记录的章节可以补**:这一版之前排的章节没有记录。作者可以自己写一条(“补记一条”:从第几章到第几章、当初想写成什么样),之后和推演留下的一样带上。 - **作者说了算**:每条可以加一句补充(一并带上)、可以设成“不带”、可以删(删了放得回)。记录里推演时的原话不让改——那是记录;作者自己记的那种可以改。 实测里的两件事要记住。一是**调子主要是在章纲和节拍里定的**:照“欢乐”的方向推演出来的那一章,带不带这条记录写出来都是闹剧;而一章节拍排得很冷、事后补一句“要欢乐”,写手(Flash)三次都没有换调子——它照着节拍写。所以这段思路最该起作用的地方是排节拍那一步(实测里策划的说明第一句就是“这一章按作者给的方向走轻”),不是指望它在写作时翻盘。二是推演时要**说清接在哪一章之后**:大纲末尾有一章排好了还没写,策划把“接下来的两章”当成从最后一章写了的之后算起,把那一章又讲了一遍——现在任务里写明“接在大纲现有的最后一章之后,已有的章节不重排”。 ## 八、有意没做的事 - **不做协作编辑。** 一本书一个作者;多人同时改同一章不在目标内。 - **手机阅读不做传输加密。** 它是局域网里的明文 HTTP,界面上也照实说——一张手机肯信任的证书,不是一个插件变得出来的。 - **不内置任何模型或密钥。** 一切模型能力来自你在 Harness 里的配置。 - **不调用视频生成模型。** 成片是后期 agent 用已经做好的配音和画面剪出来的;有声漫是"会动的分镜"。让画面自己动起来的模型不在这一版里。 - **正文编辑器保持朴素。** 它是文本框而不是富文本编辑器:章节文件必须是你在任何地方都能打开的纯文本。图的那一行显示成图,是写作页怎么摆这份文字,不是文件里多了什么。