feat: add NovelPage component with bookshelf, open book, and reading views

This commit is contained in:
2026-06-02 08:19:38 +08:00
parent 54e17c9795
commit 81b0d0ea1f
39 changed files with 8057 additions and 64 deletions

View File

@@ -0,0 +1,6 @@
{
"persona": "主角表面温文尔雅、恪守使者礼节,实则杀伐果断、胸怀大格局。受辱时隐忍记账,关键节点一击致命。拥有超越时代的信息差与历史推演金手指,善于借势与布局,从单枪匹马到建立西域都护府权威。",
"highlight": "1. 身份反差所有人都当他是落魄流民直到汉节与国书亮相震惊全场。2. 文明降维打击用冶铁、造纸、兵法碾压西域各方势力。3. 外交爽文舌战群胡、以一人退一国之兵。4. 势力养成:收服三十六国,在异域复刻大汉盛世。",
"experience": "第三人称有限视角跟随主角,初期通过旁观者的鄙夷积蓄压抑,中后期在亮身份、展实力时拉远镜头,放大旁观者的跪服与匈奴使者的恐惧,形成反复打脸爽感。每场外交冲突都按铺垫→加压→以汉威逆转的结构推进。",
"forbiddenZones": "禁止主角长期忍气吞声无所作为、禁止汉使身份被长期误解不开封、禁止面对胡人欺辱时以德报怨挫折控制在1章内且必须立刻给出明确反击预期。"
}

View File

@@ -0,0 +1,11 @@
{
"id": "我是汉使-谁敢不敬",
"title": "我是汉使,谁敢不敬",
"allowedFlowIds": [
"power-reveal",
"face-slap-rise",
"alliance-dominate"
],
"createdAt": "2026-06-01T10:36:45.755451",
"updatedAt": "2026-06-01T10:56:58.330409"
}

View File

@@ -0,0 +1,120 @@
{
"coarseOutline": {
"events": [
{
"id": "evt-1",
"title": "流落楼兰,身份的蛰伏",
"summary": "主角衣衫褴褛抵达楼兰城外,被守城胡兵当成逃难流民肆意驱赶羞辱。主角冷眼观察局势,暗中记录下所有侮辱,等待时机。入城后被安置在最低贱的商贾聚集区。",
"order": 1
},
{
"id": "evt-2",
"title": "匈奴使团嚣张登场,压抑升级",
"summary": "匈奴特使率领百骑使团入城,楼兰王卑躬屈膝迎接。匈奴使者在市集当众嘲笑汉人弱如羔羊,主角被推搡却不动声色,只展露些许冶铁知识换取铁匠铺收留,埋下反击伏笔。",
"order": 2
},
{
"id": "evt-3",
"title": "纸刀初试,小胜立威",
"summary": "匈奴人再次当众侮辱主角,逼其钻胯。主角以“教你们写汉字”为赌约,用刚造出的粗糙纸张和断笔,当众写下檄文,暗讽匈奴无文。贵族们对纸惊为神物,主角赢得楼兰大商人的庇护,匈奴使吃瘪离去。",
"order": 3
},
{
"id": "evt-4",
"title": "王宫夜宴亮汉节,身份反转",
"summary": "楼兰王宴请匈奴使,主角被大商贾带入宴席。匈奴使阁楼内强迫楼兰王交出“汉人奸细”处死,主角缓步出列,手捧封尘汉节,展开黄绫国书,朗声道:“大汉使臣张明,持节出使西域三十六国,谁敢不敬?”全场死寂,匈奴使脸色煞白。",
"order": 4
},
{
"id": "evt-5",
"title": "斩杀匈奴使,楼兰臣服",
"summary": "匈奴使强辩汉节是伪造,命令护卫拿下主角。主角喝破楼兰王昔日杀汉使将招致灭国之祸,并当场宣读大汉讨罪檄文。在楼兰王犹豫之际,主角以迅雷之势拔出随从暗藏环首刀,亲手斩杀匈奴正使,威震大殿。楼兰王跪伏,愿为汉属。",
"order": 5
},
{
"id": "evt-6",
"title": "以寡敌众,冶铁骑兵显威",
"summary": "匈奴副使逃出带领城外百骑反扑,主角早有准备,调遣楼兰城卫,并用改良的冶铁马蹄铁和简易马镫装备了二十人骑兵小队,正面冲垮毫无防备的匈奴骑兵。一战斩首七十,俘虏三十,彻底打垮楼兰境内匈奴势力。",
"order": 6
},
{
"id": "evt-7",
"title": "楼兰盟约,都护雏形",
"summary": "主角与楼兰王歃血为盟,设立汉使常驻衙门,推行简易汉律保护商路。同时放出流言:大汉西域都护府即将设立,归附者可得冶铁、造纸之术。周边小国开始遣使试探。",
"order": 7
},
{
"id": "evt-8",
"title": "车师设局,舌战降服",
"summary": "车师国受匈奴蛊惑扣押汉商队,主角仅带十骑赴会。在王庭之上,车师王列甲士恐吓,主角从容陈说匈奴败亡之势,并以楼兰之变震慑,允诺开放贸易和冶铁秘法。车师贵族分裂,最终斩杀亲匈奴大臣,迎汉使入驻。",
"order": 8
},
{
"id": "evt-9",
"title": "三十六国初盟,匈奴单于震怒",
"summary": "半年间,主角借商业和文明技术输出,接连与十余国结盟。一次盟会上,主角正式打出“大汉西域都护府”旗号,诸国共尊汉使为都护。消息传到漠北,匈奴单于怒极,下令三万铁骑西征,誓要血洗西域汉势力。",
"order": 9
},
{
"id": "evt-10",
"title": "大漠烽烟,以少胜多",
"summary": "主角利用信息差,提前获知匈奴行军路线,以兵法“围点打援”诱敌深入。集结诸国联军八千,在干涸河床设伏,用改良的硬弩和连环马阵正面击溃匈奴前锋,再以火攻断其辎重。匈奴单于亲率的中军溃败,折损过半,仓皇东逃。",
"order": 10
},
{
"id": "evt-11",
"title": "丝路重开,万邦来朝",
"summary": "主角将缴获的匈奴单于金箭与捷报一同传往长安。汉武帝大喜,正式册封主角为西域都护,授权统管西域。丝绸之路全线贯通,大汉商队、工匠、文人涌入西域,诸国争相效仿汉制。主角立于都护府高台,俯瞰一片繁华,当年那些羞辱过他的人早已化为尘埃。",
"order": 11
}
],
"version": 1
},
"events": {
"evt-1": {
"emotionFlowId": "alliance-dominate",
"flowStepsPlan": {
"起": "主角孤身抵达楼兰城外,衣着破烂,人脉与资源为零。被守城胡兵当作流民百般羞辱驱赶,主角隐忍观察,暗中记录所有折辱者面孔与背景,最终被丢到最低贱的商贾聚集区。此时主角处于绝对弱势,积蓄着对胡人傲慢的认识与反击的渴望。",
"承": "在商贾区,主角利用超越时代的知识小露锋芒,比如用古法提纯井盐、鉴别劣质铁器。这些举动引起了几类人的注意:落魄的本地护卫、被排挤的西域小商贩,以及楼兰城中一名失势贵族管家。主角刻意展示出自己‘虽落魄却有秘术’的价值,为后续结盟埋下伏笔。",
"转": "楼兰城中某个小权贵欲吞占商贾区,设局陷害聚集区商户。主角在暗中洞悉阴谋,指使刚结交的护卫提前揭露,并在众人面前以智谋反制,让权贵当众出丑。此事令那失势贵族管家背后的小主子意识到主角不凡,主动邀约,主角以‘各取所需’的姿态赢得其暂时效忠,完成第一次关键人收服。",
"合": "主角以这失势贵族为跳板,在商贾区建立初步的情报网络,收服了第一批追随者——护卫担任贴身力量,小商贩负责打探消息,失势贵族提供身份掩护。虽然依旧隐藏汉使身份,但一个以他为核心的微型势力雏形已在楼兰底层成型,为后续朝堂亮相、收服三十六国埋下暗线。"
},
"chapterPlan": [
{
"seq": 1,
"phaseKey": "起",
"phaseSlice": "全",
"brief": "主角衣衫褴褛到楼兰城下,被胡兵当难民拖拽驱赶、吐口水羞辱,他一言不发冷眼观察。城门口,一名胡商因货物被刁难,主角用简单西域话帮其解围,展露冷静思维。最终被丢入最混乱的商贾区,在破棚里用手刻下第一个仇人名字。爽点:冷静隐忍与记账的伏笔,通过旁人对‘这个乞丐居然会西域话’的诧异铺垫反差。",
"status": "planned"
},
{
"seq": 2,
"phaseKey": "承",
"phaseSlice": "全",
"brief": "主角以替人写书信、鉴别货物真伪在商贾区站稳脚跟,用提纯粗盐的方法让一名小贩获利三倍,引发小轰动。落魄护卫昆图目睹后主动试探,主角故意露一手卸骨擒拿术震慑对方。同时引起失势贵族之管家注意。爽点:文明降维打击——人人当他是流民,他却随手点石成金,周围人从轻蔑转为巴结。",
"status": "planned"
},
{
"seq": 3,
"phaseKey": "转",
"phaseSlice": "全",
"brief": "小权贵古尔贡欲用‘盗窃军马’罪名强占商贾区,抓走两名商贩。主角让昆图护住证人,自己通过管家带话给失势贵族,以三句话点破古尔贡布局的漏洞。在古尔贡带兵来封市时,主角当众拆穿伪造证据,并反手指控其勾结马贼,围观胡人从嘲弄变为惊惧。古尔贡被当街打脸,失势贵族公开表态庇护商圈。爽点:以一介贱民之身,翻手间让权贵灰头土脸,旁观者倒戈,首次展示翻云覆雨的智谋。",
"status": "planned"
},
{
"seq": 4,
"phaseKey": "合",
"phaseSlice": "全",
"brief": "事后失势贵族幼主密邀主角,试探其来历。主角只展露汉节一角却不宣明身份,提出互利之约:贵族借主角之智复起,主角借贵族之便铺开暗棋。昆图宣誓效忠,小贩们主动成为眼线。主角在商贾区租下一处院落,挂上破损卦幡,以此为据点开始收集三十六国情报。爽点:收服班底、势力雏形确立,身份依旧成谜但威势已成,为下一阶段亮明汉使身份蓄满张力。",
"status": "planned"
}
]
}
},
"progress": {
"currentChapterSeq": 0,
"charOffset": 0,
"ttsPaused": false,
"genPaused": false
}
}

View File

@@ -0,0 +1,11 @@
{
"status": "error",
"pipelineStage": "event_plan",
"stage": "error",
"message": "事件纲要生成失败",
"progress": {
"done": 0,
"total": 11
},
"updatedAt": "2026-06-01T11:56:27.977792"
}

View File

@@ -0,0 +1,13 @@
{
"prompts": {
"openBook": "你是爽文开书优化助手。根据用户提供的创作灵感,输出结构化的开书方案。\n\n要求\n1. 提炼并优化用户灵感,使其更适合网文爽文节奏。\n2. 生成 guide 世界书草稿persona主角人设、highlight核心爽点、experience读者体验/视角策略、forbiddenZones创作禁区。\n3. 从提供的情绪流 catalog 中挑选 14 个最匹配的 flow id 写入 allowedFlowIds。\n4. 建议一个简洁有力的书名。\n\n只输出 JSON不要 markdown 代码块外的文字:\n{\n \"title\": \"书名\",\n \"optimizedIntro\": \"优化后的开书灵感\",\n \"guide\": {\n \"persona\": \"...\",\n \"highlight\": \"...\",\n \"experience\": \"...\",\n \"forbiddenZones\": \"...\"\n },\n \"allowedFlowIds\": [\"flow-id\"]\n}",
"coarseOutline": "你是爽文大纲助手。根据当前书籍设定与进度,生成/修订粗纲(事件链级别,非细章)。\n\n输出 JSON\n{\n \"events\": [\n { \"id\": \"evt-1\", \"title\": \"事件标题\", \"summary\": \"事件概要\", \"emotionFlowId\": \"可选\" }\n ],\n \"version\": 1\n}",
"eventPlan": "你是爽文事件规划助手。将粗纲中的某个事件展开为可执行的章节级计划。\n\n输出 JSON包含章节序号建议、每章核心冲突与爽点类型。",
"chapter": "你是爽文章节写作助手。根据当前事件计划、guide 设定与上文,撰写本章正文。\n\n要求节奏明快、对话推动冲突、每章末尾留钩子。输出 JSON\n{ \"title\": \"章标题\", \"body\": \"正文(可分段)\" }",
"nudge": "你是爽文创作教练。根据当前进度与读者体验目标,给出 13 条简短的下一步写作建议(不直接写正文)。"
},
"reader": {
"contextWindowChars": 2000,
"prefetchRemainingWords": 300
}
}

View File

@@ -0,0 +1,59 @@
{
"flows": [
{
"id": "face-slap-rise",
"intro": "经典打脸逆袭:先抑后扬,让读者在主角翻盘点获得强烈爽感。",
"tags": ["打脸", "逆袭", "装逼"],
"steps": [
{ "key": "起", "text": "主角被轻视、被嘲讽,处境处于低谷,埋下伏笔。" },
{ "key": "承", "text": "矛盾升级,对手步步紧逼,读者情绪被压抑到极点。" },
{ "key": "转", "text": "主角展露真实实力或底牌,局势开始逆转。" },
{ "key": "合", "text": "当众打脸,对手颜面尽失,主角收获声望与资源。" }
]
},
{
"id": "treasure-upgrade",
"intro": "奇遇升级流:获得宝物/传承后实力跃迁,节奏明快。",
"tags": ["奇遇", "升级", "宝物"],
"steps": [
{ "key": "起", "text": "主角陷入险境或瓶颈,看似无路可走。" },
{ "key": "承", "text": "意外触发隐藏机缘,获得线索或残缺传承。" },
{ "key": "转", "text": "完成试炼或解开封印,实力/境界突破。" },
{ "key": "合", "text": "以新力量解决眼前危机,并留下更大悬念。" }
]
},
{
"id": "power-reveal",
"intro": "扮猪吃虎:隐藏身份或实力,在关键时刻一鸣惊人。",
"tags": ["扮猪吃虎", "身份", "震惊"],
"steps": [
{ "key": "起", "text": "主角以弱者/凡人形象出现,被各方忽视。" },
{ "key": "承", "text": "敌人或路人持续挑衅,形成对比张力。" },
{ "key": "转", "text": "危机时刻主角不再隐藏,展露真实层次。" },
{ "key": "合", "text": "全场震惊,先前嘲讽者态度一百八十度转变。" }
]
},
{
"id": "alliance-dominate",
"intro": "势力扩张:收服强者、建立势力,格局由小变大。",
"tags": ["势力", "收服", "格局"],
"steps": [
{ "key": "起", "text": "主角孤身或小团队,资源与人脉有限。" },
{ "key": "承", "text": "展现价值或魅力,引起潜在盟友/强者的注意。" },
{ "key": "转", "text": "通过实力或智谋赢得关键人物认可。" },
{ "key": "合", "text": "势力雏形确立,为下一阶段大事件铺垫。" }
]
},
{
"id": "revenge-climax",
"intro": "复仇清算:旧怨新仇一并了结,情绪释放型高潮。",
"tags": ["复仇", "清算", "高潮"],
"steps": [
{ "key": "起", "text": "回忆旧怨,明确复仇对象与动机。" },
{ "key": "承", "text": "对手仍嚣张或以为主角不足为惧。" },
{ "key": "转", "text": "主角布局收网,切断对手退路。" },
{ "key": "合", "text": "当众清算,恩怨了结,读者情绪得到释放。" }
]
}
]
}

View File

@@ -0,0 +1,44 @@
{
"entries": [
{
"layer": "L0",
"title": "爽文基本节奏",
"content": "每章需有明确的情绪推进:铺垫→加压→释放。避免长时间无爽点的水文;小爽点每 8001500 字,大爽点每 35 章。"
},
{
"layer": "L0",
"title": "读者预期管理",
"content": "开书前 3 章必须建立核心卖点(金手指/身份差/仇恨对象)。让读者知道「这本书承诺给我什么爽感」。"
},
{
"layer": "L1",
"title": "主角行为准则",
"content": "主角可以低调但不能窝囊;遇辱必报、有仇必记,但报复需有层次(先小胜再大胜)。避免圣母式原谅削弱爽感。"
},
{
"layer": "L1",
"title": "对手设计",
"content": "反派/对手需有足够嚣张资本与明确动机;被打脸前要让读者足够讨厌他们。避免脸谱化到无法代入。"
},
{
"layer": "L2",
"title": "信息投放",
"content": "世界观与力量体系采用「冰山法则」:每次只揭示与当前冲突相关的信息。悬念优于说明书式设定堆砌。"
},
{
"layer": "L2",
"title": "对话与描写比例",
"content": "冲突场景多用短句对话推进;升级/打脸瞬间可加入 12 句环境或旁观者反应放大爽感,但避免冗长旁白。"
},
{
"layer": "L3",
"title": "用户体验(视角/人称)",
"content": "默认第三人称有限视角跟随主角;关键爽点可短暂拉远至旁观者视角以放大震惊效果。人称切换需有明确叙事目的,避免混乱。"
},
{
"layer": "L3",
"title": "禁区与雷点",
"content": "避免 NTR、主角长期受虐无反击、重要角色无理由降智。若需挫折控制在 12 章内并给出明确反击预期。"
}
]
}

View File

@@ -0,0 +1,15 @@
{
"id": "c529576bd6de40969648cf80a3780db9",
"template_id": "builtin.chat",
"binding": {
"role_name": "帝国骑士维尔",
"chat_name": "默认聊天",
"template_id": "builtin.chat"
},
"status": "failed",
"started_at": "2026-05-30T18:20:55.872092",
"finished_at": "2026-05-30T18:21:31.857209",
"current_state": "regex_apply_ai_output",
"result_content": "",
"error": "'<' not supported between instances of 'int' and 'NoneType'"
}

View File

@@ -0,0 +1,10 @@
{
"id": "test-r1-72cd5b4b",
"name": "test-r1-72cd5b4b",
"description": "从创建绑定到世界书条目的默认三步流水线,可在工作流编辑页复制并修改。",
"templateId": "builtin.studio.example",
"characterId": "b0992d14-cb7c-4d81-b0af-7f7434710903",
"worldbookId": "e26e5d15-5b87-4693-aa47-f3021fbdc3d7",
"createdAt": "2026-05-31T14:58:54.635290",
"updatedAt": "2026-05-31T14:58:54.656107"
}

View File

@@ -0,0 +1,118 @@
{
"workflowGoal": "设计一个单人角色:先绑定角色卡与世界书,再迭代整体美学与具体人设,写入世界书条目。",
"nodes": [
{
"id": "init",
"skillId": "studio.init_bind",
"displayName": "创建并绑定",
"enabled": true,
"config": {},
"displayParams": [
{
"key": "characterName",
"label": "角色卡名称",
"type": "text",
"required": true,
"placeholder": ""
},
{
"key": "worldbookName",
"label": "世界书名称",
"type": "text",
"required": true,
"placeholder": ""
}
],
"inputs": []
},
{
"id": "aesthetic",
"skillId": "studio.worldbook_entry",
"displayName": "整体美学",
"niche": "aesthetic_tone",
"enabled": true,
"loopUntilSatisfied": true,
"config": {
"stepGoal": "产出角色的整体美学设定:视觉风格、氛围、叙事基调,供后续人设步骤引用。",
"thinkingPrompt": "",
"insertion": {
"position": 1,
"activationType": "permanent",
"key": "整体美学",
"comment": "Studio · 整体美学"
},
"scoring": {
"enabled": true,
"dimensions": [
{
"id": "authenticity",
"name": "真实性",
"criteria": "美学设定是否自洽、可感知,而非空泛形容词堆砌。"
},
{
"id": "fit",
"name": "贴合度",
"criteria": "是否覆盖色调/材质/氛围/叙事基调;是否可与后续人设衔接;表述是否简洁可注入世界书。"
}
]
}
},
"displayParams": [],
"inputs": [
{
"ref": "workflow.goal",
"label": "工作流目标文本"
}
]
},
{
"id": "persona",
"skillId": "studio.worldbook_entry",
"displayName": "具体人设",
"niche": "persona_detail",
"enabled": true,
"loopUntilSatisfied": true,
"config": {
"stepGoal": "在整体美学基础上,写出可扮演的人设:性格、动机、口癖、关系与行为模式。",
"thinkingPrompt": "",
"insertion": {
"position": 1,
"activationType": "keyword",
"key": "具体人设",
"comment": "Studio · 具体人设"
},
"scoring": {
"enabled": true,
"dimensions": [
{
"id": "authenticity",
"name": "真实性",
"criteria": "人设细节是否具体、可扮演,动机与行为是否一致。"
},
{
"id": "fit",
"name": "贴合度",
"criteria": "是否与人设目标一致;是否与整体美学一致;是否避免与已有条目冲突。"
}
]
}
},
"displayParams": [],
"inputs": [
{
"ref": "workflow.goal",
"label": "工作流目标文本"
},
{
"ref": "aesthetic.output",
"label": "整体美学 · 上轮产物"
},
{
"ref": "persona.output",
"label": "具体人设 · 上轮产物",
"optional": true
}
]
}
]
}

View File

@@ -0,0 +1,10 @@
{
"id": "新项目",
"name": "新项目",
"description": "从创建绑定到世界书条目的默认三步流水线,可在工作流编辑页复制并修改。",
"templateId": "builtin.studio.example",
"characterId": null,
"worldbookId": null,
"createdAt": "2026-05-30T19:57:24.114210",
"updatedAt": "2026-05-30T19:57:24.114210"
}

View File

@@ -0,0 +1,83 @@
{
"workflowGoal": "设计一个单人角色:先绑定角色卡与世界书,再迭代整体美学与具体人设,写入世界书条目。",
"nodes": [
{
"id": "init",
"skillId": "studio.init_bind",
"displayName": "创建并绑定",
"enabled": true,
"config": {},
"displayParams": [
{
"key": "characterName",
"label": "角色卡名称",
"type": "text",
"required": true,
"placeholder": ""
},
{
"key": "worldbookName",
"label": "世界书名称",
"type": "text",
"required": true,
"placeholder": ""
}
],
"inputs": []
},
{
"id": "aesthetic",
"skillId": "studio.worldbook_entry",
"displayName": "整体美学",
"niche": "aesthetic_tone",
"enabled": true,
"loopUntilSatisfied": true,
"config": {
"stepGoal": "产出角色的整体美学设定:视觉风格、氛围、叙事基调,供后续人设步骤引用。",
"insertion": {
"position": 4,
"activationType": "normal",
"key": "整体美学",
"comment": "Studio · 整体美学"
},
"scoring": {
"enabled": true,
"rubric": "是否覆盖色调/材质/氛围/叙事基调;是否可与后续人设衔接;表述是否简洁可注入世界书。"
}
},
"displayParams": [],
"inputs": []
},
{
"id": "persona",
"skillId": "studio.worldbook_entry",
"displayName": "具体人设",
"niche": "persona_detail",
"enabled": true,
"loopUntilSatisfied": true,
"config": {
"stepGoal": "在整体美学基础上,写出可扮演的人设:性格、动机、口癖、关系与行为模式。",
"insertion": {
"position": 4,
"activationType": "normal",
"key": "具体人设",
"comment": "Studio · 具体人设"
},
"scoring": {
"enabled": true,
"rubric": "是否与人设目标一致;是否与整体美学一致;是否具备可扮演细节;是否避免与已有条目冲突。"
}
},
"displayParams": [],
"inputs": [
{
"ref": "aesthetic.output"
},
{
"ref": "persona.output",
"optional": true
}
]
}
]
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,161 @@
{
"id": "6f4d68e5-f2cf-470d-a9f0-740c1403495f",
"projectId": "test-r1-72cd5b4b",
"status": "running",
"pipelineSnapshot": {
"workflowGoal": "设计一个单人角色:先绑定角色卡与世界书,再迭代整体美学与具体人设,写入世界书条目。",
"nodes": [
{
"id": "init",
"skillId": "studio.init_bind",
"displayName": "创建并绑定",
"enabled": true,
"niche": null,
"loopUntilSatisfied": false,
"config": {},
"displayParams": [
{
"key": "characterName",
"label": "角色卡名称",
"type": "text",
"required": true,
"placeholder": ""
},
{
"key": "worldbookName",
"label": "世界书名称",
"type": "text",
"required": true,
"placeholder": ""
}
],
"inputs": []
},
{
"id": "aesthetic",
"skillId": "studio.worldbook_entry",
"displayName": "整体美学",
"enabled": true,
"niche": "aesthetic_tone",
"loopUntilSatisfied": true,
"config": {
"stepGoal": "产出角色的整体美学设定:视觉风格、氛围、叙事基调,供后续人设步骤引用。",
"thinkingPrompt": "",
"insertion": {
"position": 1,
"activationType": "permanent",
"key": "整体美学",
"comment": "Studio · 整体美学"
},
"scoring": {
"enabled": true,
"dimensions": [
{
"id": "authenticity",
"name": "真实性",
"criteria": "美学设定是否自洽、可感知,而非空泛形容词堆砌。"
},
{
"id": "fit",
"name": "贴合度",
"criteria": "是否覆盖色调/材质/氛围/叙事基调;是否可与后续人设衔接;表述是否简洁可注入世界书。"
}
]
}
},
"displayParams": [],
"inputs": [
{
"ref": "workflow.goal",
"label": "工作流目标文本",
"optional": false
}
]
},
{
"id": "persona",
"skillId": "studio.worldbook_entry",
"displayName": "具体人设",
"enabled": true,
"niche": "persona_detail",
"loopUntilSatisfied": true,
"config": {
"stepGoal": "在整体美学基础上,写出可扮演的人设:性格、动机、口癖、关系与行为模式。",
"thinkingPrompt": "",
"insertion": {
"position": 1,
"activationType": "keyword",
"key": "具体人设",
"comment": "Studio · 具体人设"
},
"scoring": {
"enabled": true,
"dimensions": [
{
"id": "authenticity",
"name": "真实性",
"criteria": "人设细节是否具体、可扮演,动机与行为是否一致。"
},
{
"id": "fit",
"name": "贴合度",
"criteria": "是否与人设目标一致;是否与整体美学一致;是否避免与已有条目冲突。"
}
]
}
},
"displayParams": [],
"inputs": [
{
"ref": "workflow.goal",
"label": "工作流目标文本",
"optional": false
},
{
"ref": "aesthetic.output",
"label": "整体美学 · 上轮产物",
"optional": false
},
{
"ref": "persona.output",
"label": "具体人设 · 上轮产物",
"optional": true
}
]
}
]
},
"pipelineVersionNote": "2026-05-31T11:24:30.222456",
"currentNodeId": "init",
"nodeStates": [
{
"nodeId": "init",
"displayName": "创建并绑定",
"skillId": "studio.init_bind",
"status": "active",
"loopUntilSatisfied": false,
"lastDraft": null
},
{
"nodeId": "aesthetic",
"displayName": "整体美学",
"skillId": "studio.worldbook_entry",
"status": "pending",
"loopUntilSatisfied": true,
"lastDraft": null
},
{
"nodeId": "persona",
"displayName": "具体人设",
"skillId": "studio.worldbook_entry",
"status": "pending",
"loopUntilSatisfied": true,
"lastDraft": null
}
],
"workflowVariables": {
"workflow.goal": "设计一个单人角色:先绑定角色卡与世界书,再迭代整体美学与具体人设,写入世界书条目。"
},
"createdAt": "2026-05-31T11:24:30.222456",
"updatedAt": "2026-05-31T11:24:30.222456"
}

View File

@@ -0,0 +1,172 @@
{
"id": "c70b04fb-f793-4a5c-a687-56466aa95a4e",
"projectId": "test-r1-72cd5b4b",
"status": "running",
"pipelineSnapshot": {
"workflowGoal": "设计一个单人角色:先绑定角色卡与世界书,再迭代整体美学与具体人设,写入世界书条目。",
"nodes": [
{
"id": "init",
"skillId": "studio.init_bind",
"displayName": "创建并绑定",
"enabled": true,
"niche": null,
"loopUntilSatisfied": false,
"config": {},
"displayParams": [
{
"key": "characterName",
"label": "角色卡名称",
"type": "text",
"required": true,
"placeholder": ""
},
{
"key": "worldbookName",
"label": "世界书名称",
"type": "text",
"required": true,
"placeholder": ""
}
],
"inputs": []
},
{
"id": "aesthetic",
"skillId": "studio.worldbook_entry",
"displayName": "整体美学",
"enabled": true,
"niche": "aesthetic_tone",
"loopUntilSatisfied": true,
"config": {
"stepGoal": "产出角色的整体美学设定:视觉风格、氛围、叙事基调,供后续人设步骤引用。",
"thinkingPrompt": "",
"insertion": {
"position": 1,
"activationType": "permanent",
"key": "整体美学",
"comment": "Studio · 整体美学"
},
"scoring": {
"enabled": true,
"dimensions": [
{
"id": "authenticity",
"name": "真实性",
"criteria": "美学设定是否自洽、可感知,而非空泛形容词堆砌。"
},
{
"id": "fit",
"name": "贴合度",
"criteria": "是否覆盖色调/材质/氛围/叙事基调;是否可与后续人设衔接;表述是否简洁可注入世界书。"
}
]
}
},
"displayParams": [],
"inputs": [
{
"ref": "workflow.goal",
"label": "工作流目标文本",
"optional": false
}
]
},
{
"id": "persona",
"skillId": "studio.worldbook_entry",
"displayName": "具体人设",
"enabled": true,
"niche": "persona_detail",
"loopUntilSatisfied": true,
"config": {
"stepGoal": "在整体美学基础上,写出可扮演的人设:性格、动机、口癖、关系与行为模式。",
"thinkingPrompt": "",
"insertion": {
"position": 1,
"activationType": "keyword",
"key": "具体人设",
"comment": "Studio · 具体人设"
},
"scoring": {
"enabled": true,
"dimensions": [
{
"id": "authenticity",
"name": "真实性",
"criteria": "人设细节是否具体、可扮演,动机与行为是否一致。"
},
{
"id": "fit",
"name": "贴合度",
"criteria": "是否与人设目标一致;是否与整体美学一致;是否避免与已有条目冲突。"
}
]
}
},
"displayParams": [],
"inputs": [
{
"ref": "workflow.goal",
"label": "工作流目标文本",
"optional": false
},
{
"ref": "aesthetic.output",
"label": "整体美学 · 上轮产物",
"optional": false
},
{
"ref": "persona.output",
"label": "具体人设 · 上轮产物",
"optional": true
}
]
}
]
},
"pipelineVersionNote": "2026-05-31T14:58:54.643943",
"currentNodeId": "aesthetic",
"nodeStates": [
{
"nodeId": "init",
"displayName": "创建并绑定",
"skillId": "studio.init_bind",
"status": "completed",
"loopUntilSatisfied": false,
"lastDraft": {
"displayParams": {
"characterName": "测试角色6367da",
"worldbookName": "测试世界书8c09f9"
},
"characterId": "b0992d14-cb7c-4d81-b0af-7f7434710903",
"worldbookId": "e26e5d15-5b87-4693-aa47-f3021fbdc3d7",
"characterName": "测试角色6367da",
"worldbookName": "测试世界书8c09f9"
}
},
{
"nodeId": "aesthetic",
"displayName": "整体美学",
"skillId": "studio.worldbook_entry",
"status": "active",
"loopUntilSatisfied": true,
"lastDraft": null
},
{
"nodeId": "persona",
"displayName": "具体人设",
"skillId": "studio.worldbook_entry",
"status": "pending",
"loopUntilSatisfied": true,
"lastDraft": null
}
],
"workflowVariables": {
"workflow.goal": "设计一个单人角色:先绑定角色卡与世界书,再迭代整体美学与具体人设,写入世界书条目。",
"workflow.boundCharacter": "名称测试角色6367da\nIDb0992d14-cb7c-4d81-b0af-7f7434710903",
"workflow.boundWorldbook": "名称测试世界书8c09f9\nIDe26e5d15-5b87-4693-aa47-f3021fbdc3d7"
},
"createdAt": "2026-05-31T14:58:54.643943",
"updatedAt": "2026-05-31T14:58:54.659103"
}