gwe-engine 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +265 -0
  2. package/README_EN.md +126 -0
  3. package/dist/cli.js +10444 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/index.d.ts +847 -0
  6. package/dist/index.js +10569 -0
  7. package/dist/index.js.map +1 -0
  8. package/package.json +1 -0
  9. package/src/kb/base-fillers.json +35 -0
  10. package/src/kb/base-prompt.ts +151 -0
  11. package/src/kb/base-vocab.json +87 -0
  12. package/src/kb/nodes/node_ai_continue_length/opt_ai_long.kb.json +36 -0
  13. package/src/kb/nodes/node_ai_continue_length/opt_ai_medium.kb.json +30 -0
  14. package/src/kb/nodes/node_ai_continue_length/opt_ai_short.kb.json +34 -0
  15. package/src/kb/nodes/node_ai_continue_length/opt_ai_xtra_long.kb.json +37 -0
  16. package/src/kb/nodes/node_ai_creativity/opt_ai_adventurous.kb.json +31 -0
  17. package/src/kb/nodes/node_ai_creativity/opt_ai_balanced.kb.json +31 -0
  18. package/src/kb/nodes/node_ai_creativity/opt_ai_conservative.kb.json +31 -0
  19. package/src/kb/nodes/node_anchor_density/opt_anchor_dense.kb.json +36 -0
  20. package/src/kb/nodes/node_anchor_density/opt_anchor_extreme.kb.json +37 -0
  21. package/src/kb/nodes/node_anchor_density/opt_anchor_sparse.kb.json +34 -0
  22. package/src/kb/nodes/node_anchor_density/opt_anchor_standard.kb.json +34 -0
  23. package/src/kb/nodes/node_battle_style/opt_battle_atmosphere.kb.json +32 -0
  24. package/src/kb/nodes/node_battle_style/opt_battle_detail.kb.json +36 -0
  25. package/src/kb/nodes/node_battle_style/opt_battle_psychological.kb.json +36 -0
  26. package/src/kb/nodes/node_battle_style/opt_battle_result.kb.json +37 -0
  27. package/src/kb/nodes/node_description_style/opt_desc_clinical.kb.json +36 -0
  28. package/src/kb/nodes/node_description_style/opt_desc_minimal.kb.json +37 -0
  29. package/src/kb/nodes/node_description_style/opt_desc_poetic.kb.json +35 -0
  30. package/src/kb/nodes/node_description_style/opt_desc_sensory.kb.json +39 -0
  31. package/src/kb/nodes/node_dialogue_style/opt_dialogue_concise.kb.json +34 -0
  32. package/src/kb/nodes/node_dialogue_style/opt_dialogue_natural.kb.json +32 -0
  33. package/src/kb/nodes/node_dialogue_style/opt_dialogue_stylized.kb.json +33 -0
  34. package/src/kb/nodes/node_dialogue_style/opt_dialogue_verbose.kb.json +34 -0
  35. package/src/kb/nodes/node_emotion_style/opt_emotion_both.kb.json +40 -0
  36. package/src/kb/nodes/node_emotion_style/opt_emotion_show.kb.json +41 -0
  37. package/src/kb/nodes/node_emotion_style/opt_emotion_tell.kb.json +40 -0
  38. package/src/kb/nodes/node_ending_hook/opt_hook_break.kb.json +54 -0
  39. package/src/kb/nodes/node_ending_hook/opt_hook_soft.kb.json +29 -0
  40. package/src/kb/nodes/node_ending_hook/opt_hook_suspense.kb.json +30 -0
  41. package/src/kb/nodes/node_info_density/opt_info_balanced.kb.json +37 -0
  42. package/src/kb/nodes/node_info_density/opt_info_fast.kb.json +37 -0
  43. package/src/kb/nodes/node_info_density/opt_info_leisurely.kb.json +41 -0
  44. package/src/kb/nodes/node_opening_impact/opt_opening_medium.kb.json +30 -0
  45. package/src/kb/nodes/node_opening_impact/opt_opening_strong.kb.json +46 -0
  46. package/src/kb/nodes/node_opening_impact/opt_opening_weak.kb.json +29 -0
  47. package/src/kb/nodes/node_paragraph_density/opt_dense_high.kb.json +36 -0
  48. package/src/kb/nodes/node_paragraph_density/opt_dense_low.kb.json +37 -0
  49. package/src/kb/nodes/node_paragraph_density/opt_dense_medium.kb.json +28 -0
  50. package/src/kb/nodes/node_payoff_frequency/opt_payoff_every_3.kb.json +31 -0
  51. package/src/kb/nodes/node_payoff_frequency/opt_payoff_every_chapter.kb.json +35 -0
  52. package/src/kb/nodes/node_payoff_frequency/opt_payoff_sparse.kb.json +37 -0
  53. package/src/kb/nodes/node_platform/opt_platform_feilu.kb.json +44 -0
  54. package/src/kb/nodes/node_platform/opt_platform_generic.kb.json +31 -0
  55. package/src/kb/nodes/node_platform/opt_platform_jinjiang.kb.json +42 -0
  56. package/src/kb/nodes/node_platform/opt_platform_newmedia.kb.json +43 -0
  57. package/src/kb/nodes/node_platform/opt_platform_qidian.kb.json +39 -0
  58. package/src/kb/nodes/node_platform/opt_platform_qimao.kb.json +43 -0
  59. package/src/kb/nodes/node_platform/opt_platform_tomato.kb.json +51 -0
  60. package/src/kb/nodes/node_pov/opt_pov_first_past.kb.json +34 -0
  61. package/src/kb/nodes/node_pov/opt_pov_first_present.kb.json +37 -0
  62. package/src/kb/nodes/node_pov/opt_pov_limited_third_past.kb.json +31 -0
  63. package/src/kb/nodes/node_pov/opt_pov_limited_third_present.kb.json +35 -0
  64. package/src/kb/nodes/node_pov/opt_pov_omniscient_third_past.kb.json +37 -0
  65. package/src/kb/nodes/node_pov/opt_pov_omniscient_third_present.kb.json +36 -0
  66. package/src/kb/nodes/node_rhetoric/opt_rhetoric_metaphor.kb.json +35 -0
  67. package/src/kb/nodes/node_rhetoric/opt_rhetoric_ornate.kb.json +37 -0
  68. package/src/kb/nodes/node_rhetoric/opt_rhetoric_plain.kb.json +25 -0
  69. package/src/kb/nodes/node_rhetoric/opt_rhetoric_sketch.kb.json +37 -0
  70. package/src/kb/nodes/node_sentence_rhythm/opt_rhythm_long.kb.json +42 -0
  71. package/src/kb/nodes/node_sentence_rhythm/opt_rhythm_medium.kb.json +40 -0
  72. package/src/kb/nodes/node_sentence_rhythm/opt_rhythm_mixed.kb.json +40 -0
  73. package/src/kb/nodes/node_sentence_rhythm/opt_rhythm_short.kb.json +41 -0
  74. package/src/kb/nodes/node_strictness/opt_strict_lenient.kb.json +50 -0
  75. package/src/kb/nodes/node_strictness/opt_strict_standard.kb.json +30 -0
  76. package/src/kb/nodes/node_strictness/opt_strict_strict.kb.json +52 -0
  77. package/src/kb/nodes/node_target_length/opt_length_1500.kb.json +39 -0
  78. package/src/kb/nodes/node_target_length/opt_length_2200.kb.json +39 -0
  79. package/src/kb/nodes/node_target_length/opt_length_3000.kb.json +39 -0
  80. package/src/kb/nodes/node_target_length/opt_length_4000.kb.json +39 -0
  81. package/src/kb/nodes/node_target_length/opt_length_custom.kb.json +31 -0
  82. package/src/kb/nodes/node_tone/opt_tone_badass.kb.json +45 -0
  83. package/src/kb/nodes/node_tone/opt_tone_classical.kb.json +41 -0
  84. package/src/kb/nodes/node_tone/opt_tone_cold.kb.json +42 -0
  85. package/src/kb/nodes/node_tone/opt_tone_colloquial.kb.json +33 -0
  86. package/src/kb/nodes/node_tone/opt_tone_folksy.kb.json +40 -0
  87. package/src/kb/nodes/node_tone/opt_tone_playful.kb.json +42 -0
  88. package/src/kb/nodes/node_tone/opt_tone_serious.kb.json +42 -0
  89. package/src/kb/nodes/node_twist_frequency/opt_twist_dense.kb.json +36 -0
  90. package/src/kb/nodes/node_twist_frequency/opt_twist_sparse.kb.json +26 -0
  91. package/src/kb/nodes/node_twist_frequency/opt_twist_standard.kb.json +32 -0
  92. package/src/kb/nodes/node_vocab_filler/opt_filler_relaxed.kb.json +45 -0
  93. package/src/kb/nodes/node_vocab_filler/opt_filler_standard.kb.json +46 -0
  94. package/src/kb/nodes/node_vocab_filler/opt_filler_strict.kb.json +56 -0
  95. package/src/kb/nodes/node_vocab_filler/opt_filler_webnovel.kb.json +56 -0
  96. package/src/kb/nodes/node_vocab_sensory/opt_vocab_daily.kb.json +46 -0
  97. package/src/kb/nodes/node_vocab_sensory/opt_vocab_esports.kb.json +45 -0
  98. package/src/kb/nodes/node_vocab_sensory/opt_vocab_fantasy.kb.json +40 -0
  99. package/src/kb/nodes/node_vocab_sensory/opt_vocab_generic.kb.json +32 -0
  100. package/src/kb/nodes/node_vocab_sensory/opt_vocab_historical.kb.json +43 -0
  101. package/src/kb/nodes/node_vocab_sensory/opt_vocab_horror.kb.json +48 -0
  102. package/src/kb/nodes/node_vocab_sensory/opt_vocab_military.kb.json +46 -0
  103. package/src/kb/nodes/node_vocab_sensory/opt_vocab_mystery.kb.json +43 -0
  104. package/src/kb/nodes/node_vocab_sensory/opt_vocab_scifi.kb.json +40 -0
  105. package/src/kb/nodes/node_vocab_sensory/opt_vocab_urban.kb.json +40 -0
  106. package/src/kb/nodes/node_vocab_sensory/opt_vocab_xianxia.kb.json +40 -0
  107. package/src/kb/presets/preset_daily.json +42 -0
  108. package/src/kb/presets/preset_esports.json +42 -0
  109. package/src/kb/presets/preset_fantasy.json +40 -0
  110. package/src/kb/presets/preset_historical.json +41 -0
  111. package/src/kb/presets/preset_horror.json +67 -0
  112. package/src/kb/presets/preset_miner.json +123 -0
  113. package/src/kb/presets/preset_mystery.json +55 -0
  114. package/src/kb/presets/preset_scifi_hardcore.json +55 -0
  115. package/src/kb/presets/preset_urban_jinjiang.json +42 -0
  116. package/src/kb/presets/preset_urban_tomato.json +66 -0
  117. package/src/kb/presets/preset_xianxia_qidian.json +50 -0
  118. package/src/kb/presets/preset_xianxia_tomato.json +66 -0
@@ -0,0 +1,31 @@
1
+ {
2
+ "kb_version": "2.0",
3
+ "node_id": "node_target_length",
4
+ "option_id": "opt_length_custom",
5
+ "option_name": "自定义",
6
+ "option_description": "自定义章节长度,不设固定字数阈值。由作者根据具体场景需要自行决定章节长短,AI不强制控制字数。",
7
+ "system_prompt": "你使用自定义章节长度模式,不设定固定的单章字数目标。章节长度完全由剧情需要决定:该短则短,该长则长。一场快速的对话交锋可能几百字就够,一场大决战可能需要四五千字。关键标准不是字数,而是这一章是否完成了它应该完成的叙事功能——是否讲完了一个完整的叙事单元?是否给了读者应有的情绪体验?如果答案是肯定的,字数多少都可以。注意:自定义不等于随意,章节切分要有节奏感,不能一章短到100字(那是片段不是章节),也不能一章长到2万字(那是一卷不是一章)。",
8
+ "constraints": [
9
+ "不设固定字数限制,由剧情需要决定",
10
+ "短章不低于500字,长章不超过6000字(极端特殊情况除外)",
11
+ "章节切分要有节奏感,不能随意截断",
12
+ "每章必须完成一个叙事单元(一个完整的事件/场景/情绪弧)",
13
+ "段落长度和句子节奏根据当前场景灵活调整",
14
+ "避免极端:不能100字一章也不能2万字一章",
15
+ "结尾必须有收束感(钩子、高潮收束、情绪落点均可)"
16
+ ],
17
+ "examples": [
18
+ {
19
+ "text": "自定义长度示例:\n- 过渡章/悬念章:800-1200字,快速推进留悬念\n- 日常章/发展章:2000-2500字,均衡展开\n- 战斗章/高潮章:3000-5000字,充分展开\n- 开篇第一章:2500-3500字,要有足够吸引力\n\n关键是根据剧情需要灵活调整,不被字数束缚。",
20
+ "note": "自定义模式:剧情优先,字数随内容需要灵活变化"
21
+ }
22
+ ],
23
+ "threshold_overrides": {},
24
+ "radar_weights": {
25
+ "bodyReaction": 1.0,
26
+ "sensorySignal": 1.0,
27
+ "action": 1.0,
28
+ "emotion": 1.0,
29
+ "infoAdvance": 1.0
30
+ }
31
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "kb_version": "2.0",
3
+ "node_id": "node_tone",
4
+ "option_id": "opt_tone_badass",
5
+ "option_name": "硬核爽利",
6
+ "option_description": "硬气、利落、不拖泥带水。主角霸气不圣母,打脸干脆,节奏快。适合爽文、都市、玄幻、军事题材。",
7
+ "threshold_overrides": {
8
+ "maxSentenceLength": 35,
9
+ "targetSentenceLength": 15,
10
+ "shortSentenceRatio": 0.55,
11
+ "maxParagraphLength": 100,
12
+ "minParagraphCount": 25,
13
+ "maxDialogueContinuous": 3,
14
+ "maxFillerWords": 3
15
+ },
16
+ "radar_weights": {
17
+ "action": 1.3,
18
+ "emotion": 0.8,
19
+ "infoAdvance": 1.1,
20
+ "bodyReaction": 1.1
21
+ },
22
+ "system_prompt": "硬核爽利基调的核心是'快、准、狠'。叙事节奏快,动作干脆,主角不窝囊,不圣母,不犹豫。语言本身就要有力量感。具体语言规则:\n\n1. 动词驱动:句子以动词为核心,少用形容词和副词。能用动作解决的不用心理描写,能用结果说话的不用解释。踹、砸、劈、瞪、甩、踏、碎——精准有力的单字动词优先。\n\n2. 短句连击:动作场景用连续短句制造打击感,像拳头一拳一拳打出去。每句一个动作,节奏快,不拖泥带水。关键瞬间一句一段,制造顿挫感。\n\n3. 主角硬气:主角不解释、不废话、不道歉、不回头。被挑衅直接反击,被瞧不起直接打脸,不嘴炮不犹豫。行动先于言语。但硬气不是鲁莽——该谋算的时候冷静谋算,动手的时候干净利落。\n\n4. 爽点节奏:压抑不超过两章,打脸必须当场或次日。反派装逼不超过三句就被打脸。主角出手必见血(或见效果),不磨磨唧唧。\n\n5. 语言利落:不用'似乎''好像''仿佛''可能'这类犹豫词。不用'非常''十分''极其'这类修饰词。少用心理描写,多用行为展示性格。\n\n6. 禁止窝囊:主角不能被欺负了忍气吞声,不能被打了不还手,不能看到美女就走不动路,不能圣母心泛滥救不该救的人。该杀杀,该滚滚,不拖泥带水。",
23
+ "constraints": [
24
+ "动作场景以短句为主(15字以内),连续动作一句一段,制造打击感",
25
+ "禁止犹豫词(似乎/好像/仿佛/可能/也许),硬核风格要肯定直接",
26
+ "禁止程度副词堆砌(非常/十分/极其),用动作力度体现程度",
27
+ "主角对话简洁有力,不解释不啰嗦,能用一句说完的不用两句",
28
+ "连续对话不超过3句必须穿插动作描写,动作要有力(拍桌/踹门/攥拳/拔刀)",
29
+ "反派装逼台词不超过3句必须被主角打断或打脸",
30
+ "每段目标长度50-80字,动作场景可以更短(20-30字一段)",
31
+ "单句不超过35字,超过必须拆分",
32
+ "禁止主角窝囊行为:被欺负不还手、圣母心泛滥、犹豫迟疑超过两段"
33
+ ],
34
+ "examples": [
35
+ {
36
+ "text": "门被踹开。\n\n王虎带着四个人走进来,手里拎着钢管。\n\n「就是他?」王虎叼着烟,扫了林远一眼,「打断一条腿,三万。」\n\n四个人围上来。\n\n林远放下筷子。\n\n碗里还有半碗面,汤还冒着热气。\n\n第一个人冲上来,钢管当头砸下。\n\n林远侧身,钢管砸在桌面上,木屑飞溅。他顺手拿起那碗热面,连汤带面扣在对方脸上。\n\n惨叫声。\n\n第二个人的钢管到了腰侧。林远抓住钢管,一脚踹在对方膝盖上。\n\n咔嚓。\n\n骨头断裂的声音很脆。\n\n第三个人转身想跑。林远把钢管掷出去,砸在后脑勺上,人直接扑倒。\n\n十秒。\n\n四个人全躺在地上。\n\n王虎嘴里的烟掉了。\n\n林远从桌上抽了张纸巾,擦了擦手上的面汤。\n\n「回去告诉赵老三,」林远看着王虎,声音很平,「下次派点能打的。」\n\n他拿起椅背上的外套,头也不回地走了出去。\n\n面钱放在桌上,刚好二十。",
37
+ "note": "硬核爽利示范:动词驱动(踹/拎/扫/砸/扣/抓/踹/掷/抽/擦),短句连击('门被踹开。''十秒。''四个人全躺在地上。''咔嚓。'),主角不废话不嘴炮,打完放一句狠话直接走,不拖泥带水。'面钱放在桌上,刚好二十'这个细节比任何描写都体现主角的硬气和讲究。没有心理描写,全是动作。"
38
+ }
39
+ ],
40
+ "requires": [],
41
+ "conflicts": [
42
+ "opt_tone_cold",
43
+ "opt_tone_playful"
44
+ ]
45
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "kb_version": "2.0",
3
+ "node_id": "node_tone",
4
+ "option_id": "opt_tone_classical",
5
+ "option_name": "唯美古风",
6
+ "option_description": "古典雅致,用词古雅,意境优美。适合古言、仙侠、武侠、历史题材。",
7
+ "threshold_overrides": {
8
+ "maxSentenceLength": 50,
9
+ "targetSentenceLength": 22,
10
+ "shortSentenceRatio": 0.3,
11
+ "maxParagraphLength": 150,
12
+ "maxFillerWords": 6
13
+ },
14
+ "radar_weights": {
15
+ "sensorySignal": 1.2,
16
+ "emotion": 1.1,
17
+ "action": 0.9
18
+ },
19
+ "system_prompt": "唯美古风基调的核心是'语言雅致有意境,但不堆砌辞藻'。古典美感来自意象选取和节奏控制,不是生僻字大杂烩。具体语言规则:\n\n1. 用词:可以使用文言词汇和四字格,但要自然不生硬。常用古风词(月色/霜雪/青衫/长剑/落花/孤灯/江河/山河)可以用,生僻字和冷门典故要避免。半文半白是最佳状态,读起来有古韵但不晦涩。\n\n2. 意象:古风靠意象传情——月、雪、花、剑、酒、灯、雨、风、雁、马。意象要服务于情绪,不要为了好看堆意象。同一个场景选1-2个核心意象贯穿。\n\n3. 节奏:句式长短错落,对偶和散句交替。紧张处用短句,抒情处用长句。四字格不要连续超过3个,否则像古风生成器。\n\n4. 禁止事项:禁止现代网络用语、禁止现代口语词(OK/搞定/牛逼)、禁止翻译腔、禁止过度堆砌辞藻(同一个描写用三个以上形容词就是堆砌)。禁止'宛若''犹如''仿佛'连用。\n\n5. 意境留白:情绪不直说,用景物烘托。不写'她很悲伤',写'雨打残荷,烛泪成行'。不写'他很孤独',写'千山暮雪,只影向谁去'的感觉。",
20
+ "constraints": [
21
+ "禁止现代口语和网络用语(搞定/OK/牛逼/咋/啥等),保持语言时代感",
22
+ "四字格使用不超过总句数的30%,禁止连续3个以上四字格堆砌",
23
+ "比喻用词要新鲜,禁止陈词滥调(心如刀割/泪如雨下/沉鱼落雁/闭月羞花)",
24
+ "每个场景选1-2个核心意象贯穿,不要同时堆5个以上意象",
25
+ "单句不超过50字,长句中要有停顿,禁止一逗到底",
26
+ "情感表达以景物烘托为主,禁止直接情绪词(悲伤/愤怒/开心)超过每千字2次",
27
+ "对话要符合古人身份,禁用现代句式,但也不能全是之乎者也导致晦涩",
28
+ "段落目标长度80-120字"
29
+ ],
30
+ "examples": [
31
+ {
32
+ "text": "雪落了一夜。\n\n推窗时,满院皆是白。那株老梅开了,疏枝横斜,花瓣上积着薄雪,风一吹便簌簌落下来,像谁在听不见的地方叹气。\n\n她拢了拢斗篷,在窗前站了许久。铜炉里的香快燃尽了,余温透过薄薄的衣袖传来,像谁的指尖轻轻碰了碰她的手腕。\n\n院门外传来马蹄声,由远及近,停在了门前。\n\n她没有动。\n\n雪还在落。梅花落在雪上,白的更白,红的更红,像谁在一幅留白太多的画上,随手点了一笔硃砂。\n\n敲门声。\n\n她终于转过身去,脚步很轻,像是怕踩碎了什么。",
33
+ "note": "古风示范:意象是雪和梅,语言半文半白(疏枝横斜/簌簌/拢了拢/硃砂)但不晦涩。没有直接写'她在等人''她很紧张',通过'站了许久''脚步很轻,怕踩碎什么'和雪落梅开的意象传递情绪。四字格自然融入(疏枝横斜/由远及近),没有堆砌感。"
34
+ }
35
+ ],
36
+ "requires": [],
37
+ "conflicts": [
38
+ "opt_tone_badass",
39
+ "opt_tone_colloquial"
40
+ ]
41
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "kb_version": "2.0",
3
+ "node_id": "node_tone",
4
+ "option_id": "opt_tone_cold",
5
+ "option_name": "清冷疏离",
6
+ "option_description": "清冷克制,疏离淡然。情感不外露,叙事保持距离感,像隔了一层薄冰。适合悬疑、文艺、暗黑题材,也是矿工风格。",
7
+ "threshold_overrides": {
8
+ "maxSentenceLength": 45,
9
+ "targetSentenceLength": 18,
10
+ "shortSentenceRatio": 0.5,
11
+ "maxParagraphLength": 120,
12
+ "maxFillerWords": 4,
13
+ "maxExpositionContinuous": 200
14
+ },
15
+ "radar_weights": {
16
+ "sensorySignal": 1.2,
17
+ "emotion": 0.6,
18
+ "action": 1.1,
19
+ "bodyReaction": 1.3
20
+ },
21
+ "system_prompt": "清冷疏离基调的核心是'叙事者不参与情感,只记录'。像法医记录现场、监控摄像头拍画面——冷静、精确、不评判。情感藏在冰面下,读者通过细节自己感知。具体语言规则:\n\n1. 精确量化:涉及温度、距离、时间、尺寸时用具体数字而非模糊描述。不说'很冷',说'室温3度';不说'很久',说'三分十七秒';不说'很远',说'四十七步'。数字本身传递冷感。\n\n2. 感官白描:感官描写要像医学记录——光线来源、声音频率、温度变化、材质触感,不附加情感评价。'墙壁表面温度35.8度,比正常高3.8度'比'墙壁传来诡异的温热'更冷更有力。\n\n3. 情感零度:禁止叙事者评论人物情绪。不写'他感到恐惧''她很悲伤',只写身体反应和外部行为——瞳孔收缩、手指发白、呼吸频率变化、脚步停顿了几秒。让读者自己判断情绪。\n\n4. 句子短而干净:多用短句和断句,少用修饰语。每句话只传递一个信息。删除所有程度副词(非常/十分/极其/特别)和情感形容词(恐怖/美丽/恶心/动人)。\n\n5. 留白与停顿:动作之间可以有空隙。人物不立刻反应,停顿本身就是反应。环境描写插入在动作之间,制造冷感和疏离感。\n\n6. 标点克制:少用感叹号(千分之五以内),少用省略号,句号为主。破折号谨慎使用。逗号断句要狠,不要一逗到底。",
22
+ "constraints": [
23
+ "禁止叙事者直接陈述情绪(恐惧/悲伤/愤怒/紧张等),只能通过身体反应和行为间接表现",
24
+ "禁止程度副词(非常/十分/极其/特别/很/真的/太),用具体细节替代",
25
+ "禁止情感形容词直接修饰场景(恐怖的/诡异的/美丽的/恶心的),用细节让读者自己感受",
26
+ "感叹号使用频率不超过千分之一(约每2000字最多1个)",
27
+ "涉及温度、距离、时间、数量时优先使用精确数字而非模糊描述",
28
+ "每段目标长度50-100字,关键瞬间可用1-2句极短段落制造顿点",
29
+ "句子以短句为主(10-20字),单句不超过45字,短长比约1:1",
30
+ "每300字至少有1处身体锚点(生理反应/感官细节)"
31
+ ],
32
+ "examples": [
33
+ {
34
+ "text": "铜碗里的水已经凉了。\n\n他把温度计贴在壁面上,等了三十秒。红色液柱停在35.8的位置。\n\n比昨天高0.4度。\n\n通风管的声音变了。原来的低频嗡鸣消失了,换成一种不规则的震颤,像什么东西在管壁里面爬。他把耳朵贴上去听了五秒,没听出规律。\n\n老李在角落睡觉。右胳膊的肿胀蔓延到了肘部,皮肤下面透出一种不正常的青紫色。呼吸频率每分钟十一次。\n\n他收回温度计,塞进上衣内袋。口袋里还有半块压缩饼干和一个打火机。\n\n矿灯电量:47%。\n\n他看了一眼通道深处。黑暗很浓,矿灯光只能照亮前方十二米。十二米之外什么都看不见。\n\n他把矿灯拧到最暗,坐下,背靠壁面。\n\n壁面在跳。很轻,几乎察觉不到,像心跳。\n\n他闭上眼。",
35
+ "note": "冷峻克制示范:全程没有一个情绪词(没有恐惧/紧张/绝望),只有精确数字(35.8度/0.4度/五秒/十一次/47%/十二米)和白描(液柱位置/通风管声音/胳膊青紫/壁面在跳)。情感全部压在文字底下——读者通过数字异常(壁温升高、通风管变声、呼吸11次偏低、电量47%)自己感受到危险逼近。结尾'他闭上眼'四个字比'他陷入了绝望'有力一百倍。"
36
+ }
37
+ ],
38
+ "requires": [],
39
+ "conflicts": [
40
+ "opt_tone_playful"
41
+ ]
42
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "kb_version": "2.0",
3
+ "node_id": "node_tone",
4
+ "option_id": "opt_tone_colloquial",
5
+ "option_name": "口语白话",
6
+ "option_description": "通俗流畅的口语化叙事(默认),像在讲故事,不端着,适合大多数网文类型。",
7
+ "threshold_overrides": {},
8
+ "radar_weights": {
9
+ "emotion": 1.0,
10
+ "action": 1.0,
11
+ "infoAdvance": 1.0,
12
+ "bodyReaction": 1.0,
13
+ "sensorySignal": 1.0
14
+ },
15
+ "system_prompt": "口语白话是默认叙事基调,核心是'像说书人在给读者讲故事'。语言通俗直白,不端着,不故作高深,但也不能粗糙水字数。具体语言规则:\n\n1. 用词层面:多用常用词,少用生僻字和书面语。动词要精准(走/跑/跳/踹/瞪/攥),不要用华丽但空洞的形容词。可以用适度口语词(知道/明白/搞/整/咋/啥),但不能满篇方言。\n\n2. 句式层面:以中短句为主(15-25字),偶尔长句补充信息。句子结构要简单直接,主谓宾清晰,不要多层从句嵌套。可以有断句、省略主语,但不能混乱。\n\n3. 叙事距离:中等距离——叙事者知道主角在想什么,但不会跳出来评论。可以用自由间接引语(把人物的想法融入叙述),但不能用第二人称'你'跟读者说话(除非特殊设计)。\n\n4. 节奏:叙事节奏明快,不拖泥带水。描写点到为止,动作干脆利落。信息传递直接,不绕弯子。\n\n5. 通俗≠粗糙:口语化不等于水字数。每句话都要有信息量,不能说废话。'他很厉害'是废话,'他一刀劈碎了试剑石'是有效的。'非常紧张'是废话,'手心全是汗'是有效的。\n\n6. 禁止事项:禁止文艺腔('彼时''忽而''颔首''蹙眉')、禁止翻译腔('是的,他想''我恐怕不能同意')、禁止书面语堆砌、禁止过度解释(把读者当傻子什么都说明白)。",
16
+ "constraints": [
17
+ "以中短句为主(15-25字),单句不超过50字,禁止一逗到底",
18
+ "禁止使用生僻词、文言词(彼时/忽而/颔首/蹙眉/沉吟/思忖等),除非角色对话需要",
19
+ "禁止程度副词堆砌(非常/十分/极其/很+形容词连续出现),用具体细节替代",
20
+ "每段必须有实质内容(动作/对话/信息/感官),禁止空洞段落('他心中百感交集''气氛十分凝重'这类空话)",
21
+ "禁止叙事者跳出来对读者说话('各位看官''你猜怎么着''你要知道')",
22
+ "形容词使用克制——能用动词和名词表达的不用形容词",
23
+ "段落目标长度80-120字,手机阅读友好"
24
+ ],
25
+ "examples": [
26
+ {
27
+ "text": "陈默推开宿舍门的时候,屋里三个人正在打牌。\n\n「回来了?」上铺的老张头也没抬,甩出一张牌,「今天工头找你干啥?」\n\n「没干啥。」陈默把外套挂在门后,在自己床沿坐下,开始解鞋带。矿靴上全是泥,鞋带结成了硬块,解了半天才解开。\n\n「没干啥能留你到这个点?」对面床的小李扔了牌,凑过来,脸上带着那种知道了秘密的笑,「听说深区那边又出事了?」\n\n陈默没接话。他把矿靴脱下来,摆在床下摆齐,然后从枕头底下摸出半块干硬的馒头,咬了一口。\n\n馒头是凉的,硬得像石头。\n\n「到底咋了?」小李不依不饶。\n\n陈默嚼着馒头,看了他一眼。小李的眼睛在矿灯光下发亮,像等着听故事的小孩。\n\n「壁温升到36了。」陈默说。\n\n屋里安静了两秒。老张手里的牌停在半空。\n\n「操。」老张把牌往床上一摔。",
28
+ "note": "口语白话示范:用词通俗(干啥/没干啥/咋了/操),句子短,动词精准(甩/扔/凑/摸/嚼/摔),没有华丽修饰,但信息量大。'馒头是凉的,硬得像石头'一个细节就传递了环境艰苦和人物心情。结尾一个'操'字比任何描写都有力。叙事直接,不解释壁温36度意味着什么(读者通过老张的反应自己体会)。"
29
+ }
30
+ ],
31
+ "requires": [],
32
+ "conflicts": []
33
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "kb_version": "2.0",
3
+ "node_id": "node_tone",
4
+ "option_id": "opt_tone_folksy",
5
+ "option_name": "乡土市井",
6
+ "option_description": "烟火气十足,有生活质感,柴米油盐、街坊邻里、市井百态。适合年代文、乡土文、市井生活题材。",
7
+ "threshold_overrides": {
8
+ "maxSentenceLength": 45,
9
+ "targetSentenceLength": 20,
10
+ "shortSentenceRatio": 0.45,
11
+ "maxParagraphLength": 150,
12
+ "maxDialogueContinuous": 4
13
+ },
14
+ "radar_weights": {
15
+ "emotion": 1.1,
16
+ "sensorySignal": 1.3,
17
+ "action": 0.9
18
+ },
19
+ "system_prompt": "乡土市井基调的核心是'烟火气'。写的是柴米油盐、家长里短、街坊邻里、三教九流,文字要有生活质感,能闻到油烟味、听到叫卖声、摸到粗布的纹理。具体语言规则:\n\n1. 生活细节:写具体的食物(葱油饼、豆腐脑、红烧肉、窝窝头)、具体的价格(两毛五、三块二)、具体的物件(搪瓷缸、暖水瓶、二八自行车、缝纫机)、具体的场所(菜市场、大杂院、胡同口、供销社)。细节越具体越真实。\n\n2. 方言适度:可以用方言词汇和口语表达,但不能多到看不懂。北方口语(咋、啥、中、甭、搁、得劲)、南方口语(伢子、晓得、莫、噻)根据故事地点选用,保持语言的地域感。\n\n3. 感官丰富:嗅觉(油烟味、煤气味、槐花香、臭豆腐味)、味觉(咸了、淡了、辣、酸、甜)、触觉(粗布磨手、板凳硌屁股、太阳晒得暖烘烘)、听觉(叫卖声、自行车铃、收音机、炒菜声)——五感全开,这是烟火气的来源。\n\n4. 人物鲜活:小人物的喜怒哀乐,接地气的生存智慧。说话做事符合身份——小贩会吆喝、大妈会砍价、工人会骂娘、孩子会撒泼。不写完美人物,有缺点有毛病有小算盘才真实。\n\n5. 节奏舒缓:生活流叙事,不追求快节奏。张家长李家短、买菜做饭上班下班,日常里藏着人情冷暖。",
20
+ "constraints": [
21
+ "每500字至少有1处具体的生活细节(食物/价格/物件/场所),不能飘在空中",
22
+ "方言词汇控制在10%-15%,不能影响阅读理解,必要时通过上下文理解",
23
+ "五感描写中嗅觉和味觉至少各出现1次/千字,烟火气来自气味和味道",
24
+ "对话要符合人物身份和地域,小贩说话像小贩,大妈说话像大妈",
25
+ "禁止空洞抒情和华丽辞藻,用具体的生活场景代替抽象的情感描写",
26
+ "人物要有小缺点和小算盘,不能高大全,接地气的人物才鲜活",
27
+ "段落目标长度80-120字,叙事节奏从容不急躁",
28
+ "禁止网络用语和现代梗,保持时代感和生活真实感"
29
+ ],
30
+ "examples": [
31
+ {
32
+ "text": "天还没亮透,王婶就起床了。\n\n煤球炉子封了一夜,捅开的时候冒了一阵黑烟,呛得她直咳嗽。她扇了两下蒲扇,火苗子腾地起来了,蓝盈盈的,映得她脸上的皱纹都在跳。\n\n和面的盆是搪瓷的,掉了三块漆,露着黑铁底。她舀了两瓢白面,一瓢玉米面,兑了温水,手在面里搅和,指缝里全是面嘎巴。\n\n外间屋传来她男人的咳嗽声,老烟枪,咳起来像要把肺都吐出来。\n\n「死不了就起来,」王婶朝里间喊,「今天豆腐摊张瘸子来,晚了就没热乎的了。」\n\n她掀开咸菜坛子,一股咸酸味蹿出来。捞了两根萝卜条,滴了两滴香油,搁在粗瓷碟子里。棒子面粥在锅里咕嘟着,泡泡顶开了锅盖,顺着锅沿往下淌,在煤球炉子上滋啦一声,糊味就上来了。\n\n王婶赶紧把锅盖掀开一条缝。\n\n胡同口已经有动静了。卖牛奶的铃铛叮铃叮铃响,扫街的老陈头拿着大扫帚哗啦哗啦,对门李家的收音机在放《朝阳沟》,哇啦哇啦的。\n\n新的一天开始了。",
33
+ "note": "乡土市井示范:具体生活细节(煤球炉子/搪瓷盆掉漆/两瓢白面一瓢玉米面/萝卜条滴香油/棒子面粥咕嘟/《朝阳沟》),方言适度(咋/啥/搁/甭没有硬塞),五感全开(呛得咳嗽/蓝盈盈火苗/咸酸味/滋啦糊味/铃铛叮铃/哗啦扫帚声),节奏舒缓,就是普通人家的一个早晨,但烟火气十足。"
34
+ }
35
+ ],
36
+ "requires": [],
37
+ "conflicts": [
38
+ "opt_tone_cold"
39
+ ]
40
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "kb_version": "2.0",
3
+ "node_id": "node_tone",
4
+ "option_id": "opt_tone_playful",
5
+ "option_name": "俏皮轻松",
6
+ "option_description": "轻松幽默,吐槽有趣,节奏明快。适合轻小说、都市喜剧、甜宠、吐槽风作品。",
7
+ "threshold_overrides": {
8
+ "maxSentenceLength": 40,
9
+ "targetSentenceLength": 18,
10
+ "shortSentenceRatio": 0.5,
11
+ "maxParagraphLength": 120,
12
+ "maxDialogueContinuous": 5,
13
+ "maxFillerWords": 10
14
+ },
15
+ "radar_weights": {
16
+ "emotion": 1.2,
17
+ "action": 1.0,
18
+ "sensorySignal": 0.8
19
+ },
20
+ "system_prompt": "俏皮轻松基调的核心是'有趣、好读、让人笑'。叙事可以有吐槽、有反差、有内心OS,节奏明快,读起来不累。但搞笑不是胡闹,要有章法。具体语言规则:\n\n1. 吐槽与内心OS:允许叙事者或主角用轻松的口吻吐槽,可以用括号、破折号补充内心吐槽。主角内心想法可以很跳脱、很真实、很接地气,但不要每段都吐槽,会累。\n\n2. 反差萌:笑点来自反差——严肃的场景里出现很蠢的细节、高冷的人做出很傻的事、紧张时刻突然冒出一句不合时宜的话。反差要自然,不能硬挠痒痒。\n\n3. 夸张但不离谱:可以适当夸张描写('他的脸黑得像锅底''眼睛瞪得铜铃大'),但要服务于笑点,不能无意义夸张。\n\n4. 节奏轻快:句子短,对话多,描写点到为止。动作描写要有趣,不要像武功秘籍一样一板一眼。\n\n5. 禁止事项:不要用网络烂梗('yyds''绝绝子''emo'这类会过时的词),不要为了搞笑破坏人物设定(高冷角色突然变话痨),不要在严肃剧情里强行搞笑(会破坏气氛),不要低俗。\n\n6. 甜宠/轻松向:如果是甜宠文,笑点来自男女主的互动和反差,不是刻意讲段子。情感要甜但不腻,互动要自然。",
21
+ "constraints": [
22
+ "吐槽频率控制:每千字不超过3处内心OS/吐槽,不要句句都在抖机灵",
23
+ "禁止使用过时网络热词和烂梗,用生活化的真实幽默代替",
24
+ "句子短为主(15-20字),对话占比可以适当提高到40%-50%",
25
+ "搞笑不能破坏人物设定——角色的说话和行为方式要符合其性格",
26
+ "严肃剧情(生死/离别/重大转折)时禁止强行搞笑",
27
+ "反差萌要自然,不能硬造笑点,不能为了搞笑让角色OOC",
28
+ "段落目标长度60-100字,短段落多,留白多,读起来轻松",
29
+ "可以使用感叹号和问号,但禁止滥用(每千字感叹号不超过15个)"
30
+ ],
31
+ "examples": [
32
+ {
33
+ "text": "周一早上七点半。\n\n林夏盯着镜子里的自己,沉默了三秒。\n\n黑眼圈重得像被人打了两拳,头发翘起来一撮,像天线。她用手按了按,按下去,弹起来。再按,再弹。\n\n行,今天走朋克风。\n\n她叼着一片面包冲出门,电梯在15楼停了,门一开——\n\n顾言琛站在里面。西装革履,头发一丝不苟,手里端着一杯咖啡,整个人精致得像杂志封面。\n\n林夏嘴里的面包差点掉下来。\n\n更要命的是,她那撮天线头发还在翘着。\n\n顾言琛的目光落在她头顶,停顿了零点五秒。\n\n「早。」他说,语气平静得像什么都没看见。\n\n林夏用最快的速度把头发捋平,挤出一个笑容:「早啊顾总,好巧啊哈哈。」\n\n电梯门关上。\n\n顾言琛很体贴地没有再看她,只是嘴角好像动了一下。\n\n林夏面无表情地盯着跳动的楼层数字。\n\n毁灭吧。赶紧的。",
34
+ "note": "俏皮轻松示范:内心吐槽('行今天走朋克风''毁灭吧赶紧的')自然不生硬,笑点来自反差(女主狼狈vs男主精致、翘起来的头发),没有刻意讲段子但让人会心一笑。夸张适度(黑眼圈像被打了两拳、像天线),对话自然。结尾内心OS是典型的轻松风处理方式。"
35
+ }
36
+ ],
37
+ "requires": [],
38
+ "conflicts": [
39
+ "opt_tone_cold",
40
+ "opt_tone_serious"
41
+ ]
42
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "kb_version": "2.0",
3
+ "node_id": "node_tone",
4
+ "option_id": "opt_tone_serious",
5
+ "option_name": "严肃正剧",
6
+ "option_description": "庄重沉稳,用词严谨,有历史厚重感。适合历史正剧、严肃文学、谍战、权谋题材。",
7
+ "threshold_overrides": {
8
+ "maxSentenceLength": 55,
9
+ "targetSentenceLength": 25,
10
+ "shortSentenceRatio": 0.3,
11
+ "maxParagraphLength": 180,
12
+ "maxFillerWords": 5,
13
+ "maxDialogueTagRepeat": 2
14
+ },
15
+ "radar_weights": {
16
+ "emotion": 0.9,
17
+ "action": 1.0,
18
+ "infoAdvance": 1.2
19
+ },
20
+ "system_prompt": "严肃正剧基调的核心是'沉稳、厚重、可信'。叙事像历史记录一样扎实,用词精准不含糊,情感深沉不外放,矛盾冲突有分量。具体语言规则:\n\n1. 用词严谨:用词准确,不含糊其辞,不调侃不戏谑。名词动词精准,避免模糊词(大概/可能/好像)。涉及历史、制度、器物时用词要符合时代背景。\n\n2. 句式沉稳:句子偏长,结构完整,允许复句和从句,但逻辑必须清晰。不用半截话、不用网络语、不用口语碎片。\n\n3. 叙事距离:叙事者保持客观中立,不站队不评论。不替读者做价值判断,把事实呈现出来让读者自己判断。可以写人物内心,但要有深度有层次,不肤浅。\n\n4. 情感深沉:情感表达要克制但有重量。不喊不叫不哭天抢地,大悲无声,大怒无形。越是重要的情感,越要用克制的方式写。\n\n5. 冲突有分量:矛盾冲突不是小打小闹,而是立场、信仰、利益、家国的冲突。每一次冲突都要有前因后果,有代价有牺牲。",
21
+ "constraints": [
22
+ "禁止网络用语、口语碎片、戏谑调侃语气,保持叙事庄重感",
23
+ "禁止模糊词(好像/似乎/大概)连续使用,关键信息必须精确",
24
+ "句子结构完整,避免半截话和省略主语过多导致混乱",
25
+ "情感表达克制,禁止角色大喊大叫、情绪崩溃式的廉价宣泄",
26
+ "涉及历史/制度/器物/礼仪时用词必须符合时代背景,不能出现穿越式错误",
27
+ "对话要符合人物身份和教育背景,权谋人物说话含蓄有潜台词",
28
+ "段落目标长度100-150字,叙事节奏稳健不急躁",
29
+ "单句不超过55字,长句必须有清晰的逻辑结构"
30
+ ],
31
+ "examples": [
32
+ {
33
+ "text": "光绪二十六年,庚子。\n\n七月二十一日,天未明,两宫微服出德胜门西行。銮舆不备,扈从寥寥,王公士民未知所往。\n\n李鸿章自广州奉诏北上,舟至上海,以疾留。张之洞、刘坤一联络东南各省,与各国领事议'东南互保',约以租界归各国保护,长江内地归督抚保护,两不相扰。\n\n京师沦陷已三日。\n\n紫禁城太和殿前的荒草长到了半人高。日本兵在乾清宫前喂马,俄国兵占据了颐和园,英国军官在天坛的圜丘上拍照。户部存银三百万两被日本兵掠走,内务府的宝物被一车一车运往东交民巷。\n\n直隶总督裕禄在杨村兵败自杀。李秉衡率军北上勤王,于通州张家湾兵败,服毒殉国。\n\n城破那日,军机处章京王瓘正在内廷当值。",
34
+ "note": "严肃正剧示范:以史笔叙事,时间地点人物精确,用词严谨(銮舆/扈从/微服/勤王),不渲染情绪但沉重感自然涌出。白描史实(荒草半人高/喂马/拍照/掠银)比任何情绪描写都有力量。"
35
+ }
36
+ ],
37
+ "requires": [],
38
+ "conflicts": [
39
+ "opt_tone_playful",
40
+ "opt_tone_badass"
41
+ ]
42
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "kb_version": "3.1",
3
+ "node_id": "node_twist_frequency",
4
+ "option_id": "opt_twist_dense",
5
+ "option_name": "密集反咬(250-350字一次,番茄/爽文/悬疑)",
6
+ "option_description": "2026追读标准:每250-350字一次信息反咬,千字≥3个意外/转折。读者刚形成判断就被颠覆,根本停不下来。",
7
+ "system_prompt": "你使用密集信息反咬模式——这是2026年番茄/七猫等免费网文平台追读率最高的节奏模式。严格遵守:\n\n【反咬频率铁则】\n- 每250-350字必须有一次信息反咬:读者刚形成一个判断,立刻被新信息颠覆。\n- 千字反咬密度≥3个(不含章末钩子)。\n- 禁止连续400字无转折、无意外、无新发现。\n\n【反咬类型库】\n- 安全反咬:以为安全→有危险(「他松了口气,才发现身后的呼吸声不对。」)\n- 身份反咬:以为是A→是B(「来的人不是救援,是第二批矿工。但他们三个月前就该死了。」)\n- 判断反咬:以为某人错了→他是对的(「老范说别凿。林深以为他胆小,直到他摸到那道纹路。」)\n- 进程反咬:以为结束了→才刚开始(「液球溶解了号牌。他以为没事了,然后液球开始爬。」)\n- 阵营反咬:以为是友→有疑点(「寻递给他水。林深接过,看见她指甲缝里有黑色液体。」)\n- 发现反咬:新发现颠覆之前所有认知(「号牌上的数字是6。陈六的号牌。但陈六三个月前就死了。」)\n\n【反咬写法】\n- 反咬必须具体:不能写「他觉得哪里不对」,必须写具体哪里不对(声音不对/温度不对/数字不对/表情不对/物件不对)。\n- 反咬出现后立刻接主角身体反应(胃一缩/后颈凉/手指僵/呼吸停),不许解释,不许停顿。\n- 大小反咬交替:小反咬(细节异常)每250字一个,中反咬(判断颠覆)每700字一个,大反咬(认知颠覆/危险升级)放在章末钩子位置。\n- 对话中也要有反咬:一人说出判断→另一人反对→第三人拿出证据打两个人的脸。",
8
+ "constraints": [
9
+ "每250-350字一次信息反咬,千字≥3个",
10
+ "反咬必须具体(具体什么不对),禁止「似乎/好像/哪里不对」空泛反咬",
11
+ "反咬后立刻接身体反应,不停顿解释",
12
+ "大小反咬交替,避免连续大反转导致疲劳",
13
+ "禁止连续400字无转折/无意外/无新发现",
14
+ "对话中也要有碰撞和反咬"
15
+ ],
16
+ "examples": [
17
+ {
18
+ "text": "(反咬节奏示范,约1200字6次反咬)\n\n老范说别凿了。→林深以为他胆小(初始判断)\n→摸到纹路不像凿痕(反咬1:细节异常)\n→老范手刚贴上去就缩回来,像摸到烫的(反咬2:老范反应不对)\n→提到陈六(反咬3:陈六的名字出现,不是落石)\n→踩到半块号牌,数字6(反咬4:陈六的号牌在这里)\n→壁动了,黑色液体渗出来(反咬5:危险升级)\n→液球溶解号牌,开始爬(反咬6:不是水,是活的)\n→拐弯处全是纹路(章末大反咬/钩子)",
19
+ "note": "密集反咬节奏:每200字左右一次小颠覆,层层升级,读者根本停不下来"
20
+ }
21
+ ],
22
+ "threshold_overrides": {
23
+ "twistFrequency": "dense",
24
+ "minTwistsPer1000": 3,
25
+ "maxConsecutiveNoTwist": 3
26
+ },
27
+ "radar_weights": {
28
+ "bodyReaction": 1.2,
29
+ "sensorySignal": 1.1,
30
+ "action": 1.2,
31
+ "emotion": 1.1,
32
+ "infoAdvance": 1.5,
33
+ "twistFrequency": 1.5,
34
+ "hookStrength": 1.2
35
+ }
36
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "kb_version": "3.0",
3
+ "node_id": "node_twist_frequency",
4
+ "option_id": "opt_twist_sparse",
5
+ "option_name": "稀疏反咬(800字+一次,慢热文)",
6
+ "option_description": "反咬频率低,适合慢热文、传统文学、日常治愈系,靠氛围和人物而非反转驱动。",
7
+ "system_prompt": "你使用稀疏反咬频率模式。反咬频率较低,约800字以上一次大的信息变化,更多靠氛围铺陈、人物互动、细节积累推动。但仍然要求章节末尾有一次关键转折或发现,不能整章平铺直叙。",
8
+ "constraints": [
9
+ "800字以上一次大反咬",
10
+ "中间可以用小细节变化替代大反转",
11
+ "章节末尾必须有一次关键转折",
12
+ "仍然禁止连续1000字完全无新信息"
13
+ ],
14
+ "examples": [],
15
+ "threshold_overrides": {
16
+ "twistFrequency": "sparse",
17
+ "minTwistsPer1000": 1
18
+ },
19
+ "radar_weights": {
20
+ "bodyReaction": 1.0,
21
+ "sensorySignal": 1.3,
22
+ "action": 0.9,
23
+ "emotion": 1.3,
24
+ "infoAdvance": 0.8
25
+ }
26
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "kb_version": "3.0",
3
+ "node_id": "node_twist_frequency",
4
+ "option_id": "opt_twist_standard",
5
+ "option_name": "标准反咬(300-400字一次,默认)",
6
+ "option_description": "每300-400字一次信息反咬/反转,读者刚形成判断就被颠覆,是网文追读的标准密度。",
7
+ "system_prompt": "你使用标准反咬频率模式。严格遵守每300字信息反咬铁则:每250-350字必须有一次信息反咬——读者刚形成一个判断,立刻用新信息颠覆。反咬类型:以为安全→危险/以为是A→是B/以为某人错了→他对了/以为结束→才刚开始/以为是友→有疑点。禁止连续400字无转折、无意外、无新发现。每段只给一个新信息,新信息出来后必须接人物身体反应或物理痕迹。",
8
+ "constraints": [
9
+ "每250-350字必须有一次信息反咬/反转",
10
+ "反咬类型多样化,不连续用同一种",
11
+ "新信息出来后必须接人物身体反应",
12
+ "禁止线性匀速推进",
13
+ "每段只承载一个新信息"
14
+ ],
15
+ "examples": [
16
+ {
17
+ "text": "反咬链条示例:\n1.(0字)发现异常声音→老范说风里有东西\n2.(280字)寻说茧没收到信号→以为老范听错了(建立预期)\n3.(320字)寻脸色变了→确实多了一拍(反咬1:老范是对的)\n4.(580字)声音停了→以为它走了(建立预期)\n5.(650字)碎石在动→它在下面(反咬2:没走,更近了)",
18
+ "note": "标准反咬:每300字左右颠覆一次读者判断"
19
+ }
20
+ ],
21
+ "threshold_overrides": {
22
+ "twistFrequency": "standard",
23
+ "minTwistsPer1000": 3
24
+ },
25
+ "radar_weights": {
26
+ "bodyReaction": 1.2,
27
+ "sensorySignal": 1.0,
28
+ "action": 1.2,
29
+ "emotion": 1.0,
30
+ "infoAdvance": 1.5
31
+ }
32
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "kb_version": "2.0",
3
+ "node_id": "node_vocab_filler",
4
+ "option_id": "opt_filler_relaxed",
5
+ "option_name": "宽松模式",
6
+ "option_description": "宽松填充词检测,允许更多过渡和渲染词汇。maxFillerSentences=5, maxFillerWords=12。适合节奏较慢、描写丰富的文风,或对水字数容忍度较高的平台。",
7
+ "system_prompt": "你使用宽松填充词检测模式。在这个模式下,大部分过渡词、情绪渲染词、节奏调节词都被允许,只有极端明显的凑字数(如整段重复、毫无意义的胡言乱语)才会被标记为填充。宽松模式允许作者自由使用形容词、副词、感叹词、过渡句来调节行文节奏和氛围。网文读者习惯了一定量的“水”来缓冲节奏,只要不是太过分就可以接受。但注意:宽松不等于纵容,整段照搬前面的内容、毫无意义的凑字数、连续多句什么都没说——这些仍然需要修正。",
8
+ "constraints": [
9
+ "每千字填充词句不超过5句",
10
+ "每千字填充词不超过12个",
11
+ "允许自由使用过渡词、渲染词、感叹词",
12
+ "允许套路化表达(适度),但禁止连续使用",
13
+ "禁止整段重复已有内容",
14
+ "禁止连续3句以上完全无信息量",
15
+ "允许心理描写和情绪渲染,即使不直接推进剧情"
16
+ ],
17
+ "vocabulary": {
18
+ "add": {
19
+ "fillerPatterns": [
20
+ "整段重复内容",
21
+ "完全无意义的胡言乱语",
22
+ "连续多句重复同一个感叹"
23
+ ]
24
+ }
25
+ },
26
+ "examples": [
27
+ {
28
+ "text": "张浩站在山顶,俯瞰着脚下连绵起伏的群山,心中不由得涌起一股豪情壮志。\n\n是啊,他经历了那么多,付出了那么多的努力和汗水,终于站到了今天这个位置。回想当初,他只是一个什么都不懂的毛头小子,谁能想到他能有今天?\n\n不得不说,命运这个东西,有时候真的很奇妙。\n\n他深吸一口气,山风猎猎,吹动他的衣袍。远方,夕阳正缓缓沉入群山之间,将整个天空染成一片壮丽的金红。\n\n(宽松模式允许这类情绪渲染和感叹,虽然不直接推进剧情,但有助于氛围塑造和情绪共鸣)",
29
+ "note": "宽松模式:允许较多的情绪渲染和感叹词,只要不是纯粹凑字数"
30
+ }
31
+ ],
32
+ "threshold_overrides": {
33
+ "maxFillerSentences": 5,
34
+ "maxFillerWords": 12,
35
+ "maxDashCount": 5,
36
+ "maxEllipsisCount": 5
37
+ },
38
+ "radar_weights": {
39
+ "bodyReaction": 0.9,
40
+ "sensorySignal": 1.0,
41
+ "action": 0.8,
42
+ "emotion": 1.2,
43
+ "infoAdvance": 0.8
44
+ }
45
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "kb_version": "2.0",
3
+ "node_id": "node_vocab_filler",
4
+ "option_id": "opt_filler_standard",
5
+ "option_name": "通用基础(默认)",
6
+ "option_description": "标准填充词检测模式,使用默认阈值。允许适度的填充词和过渡表达,在节奏和精炼之间取得平衡。maxFillerSentences=3, maxFillerWords=8。",
7
+ "system_prompt": "你使用标准填充词检测模式。在这个模式下,明显的空洞填充(重复啰嗦、无意义凑字数)需要删减,但允许适度的过渡词、情绪渲染词和节奏调节词。写作不是电报,适当的铺垫、情绪渲染和过渡连接是必要的。关键标准是:这句话虽然不是核心信息,但它是否在调节节奏、渲染氛围、或者提供必要的缓冲?如果是,可以保留。如果只是单纯重复、凑字数、或者空洞无物,则应该删减。",
8
+ "constraints": [
9
+ "每千字填充词句不超过3句",
10
+ "每千字填充词不超过8个",
11
+ "允许适度的过渡词和连接词(然而/但是/就在这时等)",
12
+ "允许适度的情绪渲染词(但不要重复堆砌)",
13
+ "禁止连续多句无实质内容",
14
+ "禁止同一段落内重复表达同一个意思",
15
+ "套路句(倒吸冷气/震惊等)可以偶尔使用,但一章内不超过2次"
16
+ ],
17
+ "vocabulary": {
18
+ "add": {
19
+ "fillerPatterns": [
20
+ "心中暗道", "暗自思忖", "在心里想着",
21
+ "倒吸一口冷气", "倒吸一口凉气", "所有人都惊呆了",
22
+ "不得不说", "话说回来",
23
+ "不知道为什么"
24
+ ]
25
+ }
26
+ },
27
+ "examples": [
28
+ {
29
+ "text": "他推开那扇门,一股霉味扑面而来。屋子里落满了灰尘,看起来已经很久没有人住过了。\n\n他环顾四周,目光最终落在了桌上的一封信上。信封已经泛黄,但上面的字迹还依稀可辨。\n\n他走过去,拿起那封信,手指微微有些颤抖——这是父亲的笔迹。\n\n(标准模式允许“微微有些颤抖”这类情绪渲染,也允许连接词和过渡,但“实在是太不可思议了他简直不敢相信自己的眼睛”这类重复空洞的表达会被标记为填充)",
30
+ "note": "标准模式:允许适度的描写和情绪渲染,但不允许空洞重复"
31
+ }
32
+ ],
33
+ "threshold_overrides": {
34
+ "maxFillerSentences": 3,
35
+ "maxFillerWords": 8,
36
+ "maxDashCount": 3,
37
+ "maxEllipsisCount": 3
38
+ },
39
+ "radar_weights": {
40
+ "bodyReaction": 1.0,
41
+ "sensorySignal": 1.0,
42
+ "action": 1.0,
43
+ "emotion": 1.0,
44
+ "infoAdvance": 1.0
45
+ }
46
+ }
@@ -0,0 +1,56 @@
1
+ {
2
+ "kb_version": "2.0",
3
+ "node_id": "node_vocab_filler",
4
+ "option_id": "opt_filler_strict",
5
+ "option_name": "严格模式",
6
+ "option_description": "严格检测填充词/水字数模式,将更多词汇和句式判定为填充。maxFillerSentences=1(每千字最多1句填充),maxFillerWords=4(每千字最多4个填充词)。适合追求精炼文风的作者。",
7
+ "system_prompt": "你使用严格填充词检测模式。在这个模式下,几乎所有空洞无信息量的表达都会被判定为填充并需要删减。严格限制以下类型的表达:无意义的感叹(“真是太……了”“不得不说”)、重复的强调(反复说同一个意思)、空洞的过渡(“话说回来”“值得一提的是”)、冗余的修饰(不必要的形容词和副词堆砌)、凑字数的心理描写(没有实质内容的“他想了想”“心中暗道”之后跟空洞感想)、万能填充句(“周围的人都惊呆了”“倒吸一口冷气”等过度使用的套路句)。每一句话都必须推进剧情、塑造人物或传递信息,否则就该删。",
8
+ "constraints": [
9
+ "每千字填充词句不超过1句",
10
+ "每千字填充词不超过4个",
11
+ "禁止使用空洞感叹:“真是太……了”“简直……”“不得不说”“不可否认”",
12
+ "禁止无信息量的心理描写和自言自语",
13
+ "禁止反复强调同一个信息(说一遍就够)",
14
+ "禁止套路化万能句滥用(“所有人都惊呆了”“倒吸冷气”等)",
15
+ "禁止不必要的副词和形容词堆砌",
16
+ "每个句子都必须有实质功能(推进/塑造/传递信息)"
17
+ ],
18
+ "vocabulary": {
19
+ "add": {
20
+ "fillerPatterns": [
21
+ "不由得", "忍不住", "不禁", "竟然", "居然", "简直", "实在", "确实", "的确",
22
+ "非常", "十分", "极其", "相当", "格外", "异常",
23
+ "话说回来", "值得一提的是", "不得不说", "不可否认", "众所周知",
24
+ "周围的人都惊呆了", "所有人都震惊了", "倒吸一口冷气", "倒吸一口凉气",
25
+ "心中暗道", "心里想着", "暗自思忖", "在心里盘算着",
26
+ "不知道为什么", "不知道怎么回事", "不知道为什么",
27
+ "仿佛", "好像", "似乎", "宛如", "犹如",
28
+ "只见", "但见", "却见", "话说", "且说",
29
+ "顿时", "霎时", "刹那间", "转眼间", "顷刻间", "一瞬间", "下一秒",
30
+ "然而", "但是", "可是", "不过", "只是",
31
+ "事实上", "实际上", "其实", "说实话", "老实说",
32
+ "没想到的是", "令人意外的是", "出人意料的是",
33
+ "这个时候", "就在这时", "正在这时", "就在这个时候"
34
+ ]
35
+ }
36
+ },
37
+ "examples": [
38
+ {
39
+ "text": "【填充句-需删除】\n他实在是太厉害了,简直就是天才中的天才,周围的人都不由得倒吸一口冷气,所有人都震惊了。\n\n【修改后-精炼】\n他赢了。",
40
+ "note": "严格模式:大量修饰词和套路句都被视为填充,应删减到最精炼的表达"
41
+ }
42
+ ],
43
+ "threshold_overrides": {
44
+ "maxFillerSentences": 1,
45
+ "maxFillerWords": 4,
46
+ "maxDashCount": 1,
47
+ "maxEllipsisCount": 1
48
+ },
49
+ "radar_weights": {
50
+ "bodyReaction": 1.0,
51
+ "sensorySignal": 1.0,
52
+ "action": 1.1,
53
+ "emotion": 0.9,
54
+ "infoAdvance": 1.3
55
+ }
56
+ }