这是目前唯一的原创剧本引擎:一句点子(或一张故事卡)从进入生产,到总导演滚动重排、再到每一集每一场写成正文。选题台与故事台卡只是两个入口,脖子以下共用同一条主干。
很多人以为「写场景」是一步。其实在本系统里,一场戏的诞生分成两层,中间隔着一次交接:
① 分场·逐场蓝图层(planOneEpisode 出场卡 → directEpisodeScenes 整集收紧):把「本集」拆成若干「场」,每一场先写出一段逐拍蓝图(summary)——这一场逐拍发生什么、谁对谁做成什么、落定动作是什么;再由 F2.5 分场导演从整集视角合并/补场。这是场戏第一次成形,但还是「设计稿」,不是剧本文字。
② 逐场写正文层(renderOriginal → renderScene → 写手):拿着上一步每一场的蓝图,一场一次 LLM 调用,把蓝图展开成真正的剧本正文——【场次头】、△动作、角色(语气):台词。这才是「写每一个场景的戏」的那一步。
→ 我们最近调的「短剧投稿格式 / 台词是主食 / △ 动作纪律 / 去外貌padding」,全部作用在 第 ②层(写手 v2-format-locked)。而「一场里发生什么事、几个节拍」,主要由 第 ①层(分场蓝图)决定。想换思路,先想清楚要动哪一层。
F2.5 横看一集内的所有场;新增的总导演横看未来一个局部弧的各集职责。它不替人物预写铁轨,也不否定已经落盘的正文;它把已写事实、开放承诺和人物资源重新排成更有引力的下一段路。
保留主角为何入局、观众买什么、远期能力/权限/关系从哪里来,以及可调整的终局跑道。
从实际正文出发,给未来 4 集不同职责、可见状态变化、前置与回收;已写内容是起点。
保留开放债和资源来路;最近集保留细节,更早内容按弧摘要,避免长剧上下文静默溢出。
它输出的是给 F1 的“本集职责切片”,属于正向创作引力:模型或解析失败时,主链沿已有增量创作继续,审计信息留给人读。
本引擎有两个入口,差别只在「故事前提 premise 怎么来」这一步;premise 一旦形成,两条路汇入同一条主干(下面 B→F 全部)。
一句点子 → 前提锦标赛(3 个人格方向候选,快模型评选出优胜)。全局百科里的「3 个候选中评选而出」就是它。
else 支 · synthesizePremiseTournament · premise-candidates.json
一句点子 → 抽 10 张卡 → 人选 1 张 → 从卡合成前提。选方向的动作前移到了抽卡阶段,引擎内部不再办锦标赛。
if (premiseOverride) 支 · synthesizePremiseFromCard · 无候选
→ 代码分叉只有 original-incremental-run.ts 里这一处 if/else。卡直出剧本不会出现三选一;若看到三选一,说明这个项目是裸点子入口(例如内部测试脚本直接塞了一句 idea)。
上面两个入口都在这里落成同一种 OriginalPremise:选题台走锦标赛评选出优胜前提;故事台卡走 premiseOverride(从选中的卡合成,不再评选)。从这一格往下,两条路共用完全相同的代码。
从前提解释型路由出主线脊梁(progression 升级 / reckoning 清算 / romance-approach 靠近 / survival-expedition 求生 / operations 经营 …)。脊梁决定这部戏的「节奏招式」与状态账。
主角 / 对手 / 配角,各自的人格原型、独门办法、可见限制、声口与关系。人物网是后面所有环节的「唯一人物正典」,姓名/性别/身份不许串换。
按脊梁与题材,预置可选覆盖层:动作/奇观场面卡(打斗题材)、战役阶梯(战争题材)、升级圣经(progression)。它们是给下游分场/写手的世界事实,不是硬闸门。
合成全局「轻锚专项账 / 百科」(progression 走升级圣经,不出百科)。至此一次性前置环节结束,进入逐集循环。
一次建立“全季仍值得守住什么”:开场三问、观众承诺、主脊梁与可自然生长的相邻方向、4 集一段的体验窗口、终局前需要有来路的能力/权限/关系。它不生产逐集细纲,留给后续正文依据实际人物选择滚动调整。
每到局部弧首(16 集示例为 1–4 / 5–8 / 9–12 / 13–16),从实际已写正文出发,重排未来一段:每集为何值得发生、承接哪个后果、人物主动做什么、落成何种不同的新状态、哪些前置可先取得。它只给未来建议,不回写或打回过去。
从「已写正文 + 状态账」派生本集规划:3秒钩子 / 主打情绪 / 集尾卡点 / 本集节拍 / 三引擎升级 / 反转类型 / 欲望按钮 / 脊梁证明 / 因果骨架(causalLedger)/ 必演场。同时接收 F0 切来的本集职责,让每集自然承接前集后果、避免把同一回合换地点重演。这一步决定「本集发生什么」,还没到「场」。
把本集拆成若干「场」(场数由内容定)。一次分场调用产出一组场卡;每张卡包含 逐拍蓝图 summary、eventAnchor(本场事件)、irreversibleAction(落定动作)、lastImage(最后画面)、sceneShape、欲望按钮、反转类型…
这一步还会注入:人性招式 / 场景炸药包 / 各种透镜(量级 · 亲密 · 喜剧 · 动作价值)/ 媒介档 scriptProfile;并做「猩猩测试」机器修 + 连续性责编去重(防后场把前场再演一遍)。分场风险信号只做顾问、不阻断。
拿到本集全部场卡后,从整集视角一把改写(同构进出:同一种场卡数组,只是更结实)。它优先把“决定去谈 → 走到门口 → 开始谈”这类被拆开的同一单元,收成“在门口顶住阻力并谈成条件”的完整场;场卡已各有不同结果时则原样保留;因果缺一环时补足动作或必要交代。
默认走强模型(doubao-seed-2-1-pro),每集一次;服务繁忙时沿用已有 F2 场卡继续写正文,结果与审计都保留给人读。
拿着 F2 每一场的蓝图 summary,一场一次 LLM 调用,写成真正的剧本正文。这里选择写手版本(v1-current 冻结基线 / v2-format-locked 短剧投稿标准格式),落地【场次头】+ △动作 + 角色(语气):台词,媒介档与各透镜也在此落到文字。
→ 「台词是主食 / △ 动作纪律 / 连招浓缩 / 去外貌padding / 开场提速」都是这一层的写手指令。换写手 = 换这一步的 builder,蓝图(F2)不动。
正文健康度异常则重写一次;清洗「集/剧本/编剧/观众」等元语汇泄漏。仍是机器修,不打回。
责编只出顾问信号写进 review.json(不阻断);状态吸收把本集发生的不可逆事实 / 关系变化 / 未了钩子写回状态账,供下一集的 F1读走,也供下一次 F0 总导演按弧压缩、滚动重排——这就是「增量」的闭环。
本集正文写入标准项目布局,自动出现在剧本工厂 #/screenplay。循环回到 F1 写下一集。
v2-format-locked 是原创生产默认:短剧投稿格式、场次头、△动作与角色台词在 F3 一次锁定;v1-current 冻结保留,供既有项目复现或明确对照时显式选择。作用点= F3。
short-drama / tv-series / film。影响 F2 的场景颗粒与 F3 的台词/非台词配比。不传=与历史行为一致。作用点= F2 + F3。
「一场发生什么事」(F2 蓝图)与「这场戏怎么写成字」(F3 正文)是两个问题。分开后可以只换写手不动剧情,也可以只改分场不换写手 —— 换思路时先定位到底要动哪一层。
F2.5 解决的是一集里几场功能重叠、因果跳跃;总导演解决的是几集之间同一回合反复上演、远期资源没有来路、脊梁被偶发事件带偏。它把全季看成合同,把下一弧看成可调整的集职责,不把故事锁成总大纲。
series-director-state.json 持久化来源、开放承诺、实际弧结果和上下文审计。总导演上下文优先保留最近两集与未关闭承诺,早期正文按弧压缩;上下文不够时仍继续生产,并留下压缩记录供复盘。
分场风险、责编复盘、健康检查全是顾问/机器修,不打回、不阻断(播放器必须出声)。唯一「硬」的是写手版本与格式契约。