这是目前唯一的原创剧本引擎:一句点子(或一张故事卡)从进入生产到写出每一集正文,中间经过哪些环节 —— 尤其是「每一个场景的戏,究竟从哪里开始写」。选题台 与 故事台卡 只是它的两个入口,脖子以下共用同一条主干。
很多人以为「写场景」是一步。其实在本系统里,一场戏的诞生分成两层,中间隔着一次交接:
① 分场·逐场蓝图层(planOneEpisode 出场卡 → directEpisodeScenes 整集收紧):把「本集」拆成若干「场」,每一场先写出一段逐拍蓝图(summary)——这一场逐拍发生什么、谁对谁做成什么、落定动作是什么;再由 F2.5 分场导演从整集视角合并/补场。这是场戏第一次成形,但还是「设计稿」,不是剧本文字。
② 逐场写正文层(renderOriginal → renderScene → 写手):拿着上一步每一场的蓝图,一场一次 LLM 调用,把蓝图展开成真正的剧本正文——【场次头】、△动作、角色(语气):台词。这才是「写每一个场景的戏」的那一步。
→ 我们最近调的「短剧投稿格式 / 台词是主食 / △ 动作纪律 / 去外貌padding」,全部作用在 第 ②层(写手 v2-format-locked)。而「一场里发生什么事、几个节拍」,主要由 第 ①层(分场蓝图)决定。想换思路,先想清楚要动哪一层。
本引擎有两个入口,差别只在「故事前提 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 走升级圣经,不出百科)。至此一次性前置环节结束,进入逐集循环。
从「已写正文 + 状态账」派生本集规划:3秒钩子 / 主打情绪 / 集尾卡点 / 本集节拍 / 三引擎升级 / 反转类型 / 欲望按钮 / 脊梁证明 / 因果骨架(causalLedger)/ 必演场。这一步决定「本集发生什么」,还没到「场」。
把本集拆成若干「场」(场数由内容定)。每场用一次 LLM 产出一段 逐拍蓝图 summary + eventAnchor(本场唯一事件)、irreversibleAction(落定动作)、lastImage(最后画面)、sceneShape、欲望按钮、反转类型…
这一步还会注入:人性招式 / 场景炸药包 / 各种透镜(量级 · 亲密 · 喜剧 · 动作价值)/ 媒介档 scriptProfile;并做「猩猩测试」机器修 + 连续性责编去重(防后场把前场再演一遍)。分场风险信号只做顾问、不阻断。
拿到本集全部场卡后,从整集视角一把改写(同构进出:同一种场卡数组,只是更结实)。逐场去重看不见的病,它能看见——几场其实是同一个戏剧单元(同一次出发/谈判/营救被拆散)就并成一场。三种活按大致比例:约六成跨场收紧(3→1 / 3→2,判据=一场必须自带一次不可逆动作,纯准备/表态/告别并进兑现场)、约两成原样放行、约两成补场补事件把潦草处做实。
默认走强模型(doubao-seed-2-1-pro),成本可忽略(吃紧凑场卡、每集仅一次)。只改写、绝不打回;返回非法就退回去重后的场卡(绝不更差、不阻断)。
拿着 F2 每一场的蓝图 summary,一场一次 LLM 调用,写成真正的剧本正文。这里选择写手版本(v1-current 冻结基线 / v2-format-locked 短剧投稿标准格式),落地【场次头】+ △动作 + 角色(语气):台词,媒介档与各透镜也在此落到文字。
→ 「台词是主食 / △ 动作纪律 / 连招浓缩 / 去外貌padding / 开场提速」都是这一层的写手指令。换写手 = 换这一步的 builder,蓝图(F2)不动。
正文健康度异常则重写一次;清洗「集/剧本/编剧/观众」等元语汇泄漏。仍是机器修,不打回。
责编只出顾问信号写进 review.json(不阻断);状态吸收把本集发生的不可逆事实 / 关系变化 / 未了钩子写回状态账,供下一集的 F1 读走——这就是「增量」的闭环。
本集正文写入标准项目布局,自动出现在剧本工厂 #/screenplay。循环回到 F1 写下一集。
v1-current 冻结、永为默认;v2-format-locked 为并存新分支,靠 writerVersion flag 选择。调旋钮改坏了,把 flag 切回 v1 即可,不必 git revert。作用点= F3。
short-drama / tv-series / film。影响 F2 的场景颗粒与 F3 的台词/非台词配比。不传=与历史行为一致。作用点= F2 + F3。
「一场发生什么事」(F2 蓝图)与「这场戏怎么写成字」(F3 正文)是两个问题。分开后可以只换写手不动剧情,也可以只改分场不换写手 —— 换思路时先定位到底要动哪一层。
分场风险、责编复盘、健康检查全是顾问/机器修,不打回、不阻断(播放器必须出声)。唯一「硬」的是写手版本与格式契约。