提交更新:修复了本地向量化的错误,修复了embedding接口错误
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
/__pycache__
|
||||
/AI_novel
|
||||
/vectorstore
|
||||
config.json
|
||||
+301
-100
@@ -1,101 +1,302 @@
|
||||
目录
|
||||
《星旅提瓦特》
|
||||
|
||||
第1章 :意外的穿越
|
||||
第2章 :提瓦特的初印象
|
||||
第3章 :神秘的元素之力
|
||||
第4章 :初识伙伴
|
||||
第5章 :探索孤独的心灵
|
||||
第6章 :冲突的种子
|
||||
第7章 :寻找归属感
|
||||
第8章 :揭开旧生活的面纱
|
||||
第9章 :伊尔的内心战争
|
||||
第10章 :莱娜的隐秘之谜
|
||||
第11章 :不同理念的碰撞
|
||||
第12章 :信任的考验
|
||||
第13章 :元素的传承
|
||||
第14章 :国家的危机
|
||||
第15章 :历史的回响
|
||||
第16章 :离别的痛苦
|
||||
第17章 :意外的救助
|
||||
第18章 :二人的矛盾升级
|
||||
第19章 :莱娜的秘密身份
|
||||
第20章 :勇气与脆弱
|
||||
第21章 :信仰的丧失
|
||||
第22章 :敌人的阴影
|
||||
第23章 :团结的力量
|
||||
第24章 :心灵的契约
|
||||
第25章 :遭遇的考验
|
||||
第26章 :寻找真相的旅程
|
||||
第27章 :伊尔的困惑与苦痛
|
||||
第28章 :希望的曙光
|
||||
第29章 :道德的抉择
|
||||
第30章 :揭露阴谋的关键
|
||||
第31章 :危机的加深
|
||||
第32章 :莱娜的征途
|
||||
第33章 :生与死的抉择
|
||||
第34章 :攀登的决心
|
||||
第35章 :遭遇叛徒
|
||||
第36章 :难忘的过往
|
||||
第37章 :勇敢面对内心
|
||||
第38章 :追寻信念的光芒
|
||||
第39章 :重聚的温暖
|
||||
第40章 :绝境中的选择
|
||||
第41章 :心灵的感召
|
||||
第42章 :勇气的火焰
|
||||
第43章 :愈合的力量
|
||||
第44章 :两个世界的裂痕
|
||||
第45章 :莱娜的使命
|
||||
第46章 :面对过去的抉择
|
||||
第47章 :背后的黑手
|
||||
第48章 :团结的契机
|
||||
第49章 :意外的力量觉醒
|
||||
第50章 :发现真相的第一步
|
||||
第51章 :感情的纠葛
|
||||
第52章 :信任重建
|
||||
第53章 :旧敌的再现
|
||||
第54章 :希望与绝望
|
||||
第55章 :勇敢的寡言者
|
||||
第56章 :天理的试炼
|
||||
第57章 :未知的恐惧
|
||||
第58章 :内心的挣扎
|
||||
第59章 :辉煌的重现
|
||||
第60章 :绝地反击
|
||||
第61章 :宿命的交汇
|
||||
第62章 :与过去的和解
|
||||
第63章 :冲突的顶点
|
||||
第64章 :理想与现实的抉择
|
||||
第65章 :命运的交错
|
||||
第66章 :成长的代价
|
||||
第67章 :星的决定
|
||||
第68章 :失去的痛苦
|
||||
第69章 :最后的希望
|
||||
第70章 :勇气之源
|
||||
第71章 :荣耀之战
|
||||
第72章 :爱的牺牲
|
||||
第73章 :背负随行
|
||||
第74章 :重塑信仰
|
||||
第75章 :群星的聚集
|
||||
第76章 :命运的逆转
|
||||
第77章 :决战的前夜
|
||||
第78章 :承载的力量
|
||||
第79章 :归者的使命
|
||||
第80章 :能否拯救一切
|
||||
第81章 :灵魂的救赎
|
||||
第82章 :心灵的碰撞
|
||||
第83章 :胜利与失败
|
||||
第84章 :被遗忘的记忆
|
||||
第85章 :阳光再现
|
||||
第86章 :信念的拥抱
|
||||
第87章 :重生的希望
|
||||
第88章 :抉择的时刻
|
||||
第89章 :命运的启示
|
||||
第90章 :最后的决策
|
||||
第91章 :逆光而行
|
||||
第92章 :双重的身份
|
||||
第93章 :献出所有的希望
|
||||
第94章 :心的归宿
|
||||
第95章 :重聚与亲密
|
||||
第96章 :与敌的对峙
|
||||
第97章 :星的觉醒
|
||||
第98章 :平衡的重现
|
||||
第99章 :团结的结晶
|
||||
第100章 :新世界的曙光
|
||||
1. 穿越之旅
|
||||
- 星在星穹铁道上的意外穿越,开启了提瓦特的新篇章。
|
||||
|
||||
2. 迷雾中的初遇
|
||||
- 星在蒙德初见琴,感受到这片土地的风与友善。
|
||||
|
||||
3. 蒙德的秘密
|
||||
- 星探索蒙德的文化,发现这里隐藏的历史与神秘。
|
||||
|
||||
4. 骑士团的使命
|
||||
- 琴向星介绍骑士团的职责,星逐渐卷入其中。
|
||||
|
||||
5. 甘雨的来信
|
||||
- 星收到来自璃月的信件,甘雨的温暖与关怀让她心生向往。
|
||||
|
||||
6. 璃月之旅
|
||||
- 星前往璃月,体验独特的岩之文化。
|
||||
|
||||
7. 千年的孤独
|
||||
- 星与甘雨初次相遇,分享各自的孤独与渴望。
|
||||
|
||||
8. 阿贝多的实验
|
||||
- 阿贝多邀请星参与炼金实验,引发了一系列搞笑而意外的事件。
|
||||
|
||||
9. 黑暗势力的影子
|
||||
- 黑暗势力开始在提瓦特活动,星感到前所未有的危机。
|
||||
|
||||
10. 命运的旋涡
|
||||
- 星与各国角色的命运交织,感受到身处漩涡中心的无奈。
|
||||
|
||||
11. 凯亚的神秘
|
||||
- 星与凯亚的互动越来越频繁,潜在的情感开始萌芽。
|
||||
|
||||
12. 面对过往
|
||||
- 星通过梦境回忆起自己在星穹铁道的生活与遗憾。
|
||||
|
||||
13. 稻妻的召唤
|
||||
- 星接到前往稻妻的邀请,了解这个国家的雷之文化。
|
||||
|
||||
14. 雷电将军的统治
|
||||
- 星初见雷电将军,感受到她的冷酷与威严。
|
||||
|
||||
15. 战斗与信念
|
||||
- 星卷入稻妻的内部纷争,为正义而战。
|
||||
|
||||
16. 情感的对峙
|
||||
- 琴、甘雨、凯亚之间的情感矛盾逐渐升级。
|
||||
|
||||
17. 背叛与和解
|
||||
- 星被误解与背叛,她努力修复人际关系。
|
||||
|
||||
18. 水之国的秘境
|
||||
- 星探访Fontaine,领略水元素的神秘魅力。
|
||||
|
||||
19. 纳特兰的热情
|
||||
- 前往Natlan,星感受到火的激情与热烈。
|
||||
|
||||
20. Sumeru的冰雪
|
||||
- 星走入Sumeru,迎接无尽的冰与寒冷。
|
||||
|
||||
21. 智慧的考验
|
||||
- 与阿贝多共同追寻智慧的真相,接受炼金术的挑战。
|
||||
|
||||
22. 情感的困境
|
||||
- 星在角色之间的情感纠葛中挣扎,难以选择。
|
||||
|
||||
23. 友谊的羁绊
|
||||
- 星与各国角色逐渐建立深厚的友谊,共同面对危机。
|
||||
|
||||
24. 黑暗势力的蔓延
|
||||
- 邻国的黑暗势力逐渐扩张,威胁提瓦特的和平。
|
||||
|
||||
25. 群星的呼唤
|
||||
- 星感受到神秘力量的召唤,探索自我本源。
|
||||
|
||||
26. 秘密的真相
|
||||
- 星发现自身的特殊能力与提瓦特的关联。
|
||||
|
||||
27. 智者的对话
|
||||
- 星与甘雨探讨信仰与价值观的碰撞。
|
||||
|
||||
28. 夜幕下的约定
|
||||
- 星与凯亚在月光下的对话,情感逐渐升温。
|
||||
|
||||
29. 战斗的号角
|
||||
- 黑暗势力全面进攻,星与伙伴们面对强敌。
|
||||
|
||||
30. 牺牲与成长
|
||||
- 在战斗中有人牺牲,星经历痛苦与成长。
|
||||
|
||||
31. 团结的力量
|
||||
- 各国联合奋起反抗,星成为他们的钱塘。
|
||||
|
||||
32. 情感的纠葛
|
||||
- 角色之间复杂的情感关系达到高潮。
|
||||
|
||||
33. 历史的回响
|
||||
- 星深入探讨提瓦特历史背后的秘密。
|
||||
|
||||
34. 迷失的自我
|
||||
- 星感到无比迷茫,寻找自己的价值与归属。
|
||||
|
||||
35. 命运的选择
|
||||
- 角色们面临各自的命运抉择,星更加坚定。
|
||||
|
||||
36. 友情的考验
|
||||
- 伴随战斗的加剧,友情经受着巨大的考验。
|
||||
|
||||
37. 爱的蜕变
|
||||
- 星与琴之间的感情逐渐升温,内心波动加剧。
|
||||
|
||||
38. 黑暗的深渊
|
||||
- 星与伙伴们深入敌后的冒险,面临生死考验。
|
||||
|
||||
39. 重拾信念
|
||||
- 在黑暗中,星与甘雨共同重拾对信念的坚定。
|
||||
|
||||
40. 最终的冲突
|
||||
- 星与黑暗势力的最终对决,真相逐渐揭晓。
|
||||
|
||||
41. 团结的胜利
|
||||
- 各国角色携手打败黑暗势力,提瓦特迎来光明。
|
||||
|
||||
42. 内心的归属
|
||||
- 星在战后寻找自我的归属,决定留在提瓦特。
|
||||
|
||||
43. 新的征程
|
||||
- 星与伙伴们共同规划下一步的冒险。
|
||||
|
||||
44. 与琴的告别
|
||||
- 雅致的情感告别,琴与星的羁绊愈加深厚。
|
||||
|
||||
45. 甘雨的承诺
|
||||
- 甘雨向星表达深厚的友情与支持。
|
||||
|
||||
46. 凯亚的反思
|
||||
- 凯亚在最终战斗后对自己的态度进行反思。
|
||||
|
||||
47. 雷电将军的转变
|
||||
- 雷电将军在星的影响下开始重新思考自己的信念。
|
||||
|
||||
48. 新的挑战
|
||||
- 星与伙伴们面对新的冒险与挑战,继续探索提瓦特的奥秘。
|
||||
|
||||
49. 互相扶持
|
||||
- 星与朋友在困难时互相扶持,建立更深的友谊。
|
||||
|
||||
50. 遗失的记忆
|
||||
- 星逐渐恢复穿越前的记忆,理解自身的命运。
|
||||
|
||||
51. 彼岸的希望
|
||||
- 星与伙伴们共同追寻实现梦想的希望。
|
||||
|
||||
52. 未来的选择
|
||||
- 角色们对未来进行深思,探索各自的可能。
|
||||
|
||||
53. 团体的温暖
|
||||
- 在冒险中重温团队间的温暖与支持。
|
||||
|
||||
54. 残留的悔恨
|
||||
- 星感受过去的悔恨与无奈,努力向前。
|
||||
|
||||
55. 神秘的力量
|
||||
- 星探索神秘力量与提瓦特的结合。
|
||||
|
||||
56. 爱的边界
|
||||
- 星思考情感的定义,突破爱的边界。
|
||||
|
||||
57. 全新的开始
|
||||
- 各角色在经历洗礼后,迎接全新的开始。
|
||||
|
||||
58. 不屈的信仰
|
||||
- 角色们坚定信仰,团结共同拯救提瓦特。
|
||||
|
||||
59. 重拾勇气
|
||||
- 在战斗与磨难中,星与伙伴们再次重拾勇气。
|
||||
|
||||
60. 未来的希冀
|
||||
- 星对未来设定新的希望与目标。
|
||||
|
||||
61. 历史的传承
|
||||
- 星逐渐明白提瓦特历史的传承与意义。
|
||||
|
||||
62. 迷失的难题
|
||||
- 星面临内心迷失的问题,努力找到解答。
|
||||
|
||||
63. 永恒的承诺
|
||||
- 角色们对彼此许下永恒的承诺与信任。
|
||||
|
||||
64. 心灵的感应
|
||||
- 星与伙伴们之间建立特殊的心灵感应。
|
||||
|
||||
65. 茫茫星海
|
||||
- 星思考自己所站的位置,在浩瀚星海中感到渺小。
|
||||
|
||||
66. 时间的流转
|
||||
- 在经历日月交替中,角色们逐渐成长。
|
||||
|
||||
67. 生活的真谛
|
||||
- 星领悟生活的真谛与意义,与角色们共同分享。
|
||||
|
||||
68. 团体的凝聚
|
||||
- 团队的凝聚力在冒险中进一步加强。
|
||||
|
||||
69. 信念的重构
|
||||
- 角色们对信念进行重构,理解不同的信仰。
|
||||
|
||||
70. 心灵的告白
|
||||
- 角色们在特定场合进行深情告白,情感达到了顶点。
|
||||
|
||||
71. 挑战的延续
|
||||
- 随着冒险的深入,角色们面对新的挑战与冒险。
|
||||
|
||||
72. 心灵的同行
|
||||
- 星与角色们沿途的心灵交流,增进理解与信任。
|
||||
|
||||
73. 困扰的阴影
|
||||
- 星面临来自内心阴影的困扰,努力寻求解决。
|
||||
|
||||
74. 踏上归途
|
||||
- 星决定在提瓦特长久地生活,而非返回原来的世界。
|
||||
|
||||
75. 爱的升华
|
||||
- 星与琴、甘雨的爱在困扰中升华出新层次。
|
||||
|
||||
76. 新的开始
|
||||
- 星与伙伴们共同踏上新的冒险之旅。
|
||||
|
||||
77. 艰难的抉择
|
||||
- 各角色面临自己的抉择,做出新的决定。
|
||||
|
||||
78. 追寻真相
|
||||
- 星深入探寻提瓦特的核心秘密,与朋友们并肩作战。
|
||||
|
||||
79. 心灵的重建
|
||||
- 各角色在情感的波折中重建自己的内心世界。
|
||||
|
||||
80. 无畏的冒险
|
||||
- 与伙伴们一起,不畏艰险继续冒险。
|
||||
|
||||
81. 承诺的反思
|
||||
- 分开与相聚中,角色们不断反思彼此的承诺。
|
||||
|
||||
82. 明亮的未来
|
||||
- 星展望稳定与和平的未来,与伙伴们共同祈愿。
|
||||
|
||||
83. 精神的力量
|
||||
- 星意识到精神力量在冒险过程中的重要性。
|
||||
|
||||
84. 合作的喜悦
|
||||
- 在面对挑战时,角色们愈加体会到合作的魅力。
|
||||
|
||||
85. 内心的力量
|
||||
- 星在冒险中探索内心的力量与可能性。
|
||||
|
||||
86. 失落的记忆
|
||||
- 星逐渐恢复关于提瓦特的重要记忆,涌现出久违的温暖。
|
||||
|
||||
87. 团结的信念
|
||||
- 在新的旅途中,各国团结一心,捍卫家园。
|
||||
|
||||
88. 挑战的巅峰
|
||||
- 对抗黑暗势力的最终巅峰,所有角色齐心协力。
|
||||
|
||||
89. 转折的温柔
|
||||
- 星与伙伴们在战斗中涌现脆弱之心,增进情感。
|
||||
|
||||
90. 爱的告白
|
||||
- 星为自己珍惜的情感付出,开启告白之旅。
|
||||
|
||||
91. 希望的光芒
|
||||
- 战斗之后,星与伙伴们共同追寻新的希望。
|
||||
|
||||
92. 信仰的纽带
|
||||
- 各角色在信仰上建立起新的纽带。
|
||||
|
||||
93. 永恒的牵绊
|
||||
- 星与伙伴们对彼此的承诺与牵绊更加坚定。
|
||||
|
||||
94. 最终的归宿
|
||||
- 星对自己在提瓦特的归宿有了清晰的认识。
|
||||
|
||||
95. 团体的梦想
|
||||
- 各角色分享对未来的梦想,愿景永不消逝。
|
||||
|
||||
96. 温暖的重聚
|
||||
- 在冒险后,星与伙伴们的重聚,感受到温暖。
|
||||
|
||||
97. 爱的升华
|
||||
- 星与众伙伴的情感达到新的高度,相守相伴。
|
||||
|
||||
98. 珍惜的时光
|
||||
- 彼此珍惜的时光让角色们的关系更加紧密。
|
||||
|
||||
99. 新的篇章
|
||||
- 星准备开启新的篇章,与伙伴们一同探索未知。
|
||||
|
||||
100. 与星同行
|
||||
- 星在提瓦特生活与冒险的美好结尾,成为真正的家园。
|
||||
|
||||
+41
-23
@@ -1,36 +1,54 @@
|
||||
最终作品设定
|
||||
|
||||
小说设定
|
||||
小说名称:《星旅提瓦特》
|
||||
|
||||
小说名称: 星陨提瓦特
|
||||
主题
|
||||
在遥远的星空彼端,星穹铁道的主角星在一次意外中穿越到原神的提瓦特大陆,面对黑暗势力的威胁,她肩负起拯救这片土地的重任。在这个充满元素力量的新世界中,星与来自不同国家、不同背景的角色们建立起紧密的情感联系,爱恨交织,最终揭开了隐藏在历史背后的秘密。
|
||||
|
||||
总字数走向: 约40万字,分为100章,每章约4000字。整体走向为主角经历成长、探索与冲突,逐渐揭开提瓦特大陆的秘密与危机,最终实现拯救与情感的圆满。
|
||||
类型
|
||||
玄幻、冒险、爱情
|
||||
|
||||
小说类型与基调: 本作为玄幻、穿越与冒险题材,主线围绕丰富的爱恨情仇展展开。基调相对轻松,同时穿插挑战与深思,旨在营造出一种既有趣又引人深思的氛围。
|
||||
故事设定
|
||||
- 背景世界:提瓦特大陆分为七个国家,代表不同元素力量,包括蒙德(风)、璃月(岩)、稻妻(雷)、须弥(草)、Fontaine(水)、Natlan(火)和Sumeru(冰)。每个国家都有独特的文化、信仰和神明,星必须探索这些国家,寻找力量与盟友,以对抗威胁提瓦特的邪恶势力。
|
||||
|
||||
写作风格: 采用细腻、抒情的写作风格,重点描绘角色内心的探索与情感。叙事视角主要为第三人称全知视角,辅以第一人称的内心独白,以增强角色深度。
|
||||
- 主角:星,一名20岁的年轻女性,星穷铁道的乘客,因意外穿越到提瓦特。性格坚韧、不屈,内心渴望寻求归属与理解。她拥有跨越宇宙的能力,能感应元素力量,随着故事的发展,她逐渐发现自己与提瓦特的元素力量有着密切联系。
|
||||
|
||||
整体世界观: 故事设定在提瓦特大陆,这是一个拥有七个不同国度和独特元素力量的神秘幻想世界。历史与传说丰富,比如“天理之战”及各个神祇的传奇故事。科技与魔法并存,元素魔法高度发达,社会结构以王国与神明为核心,复杂的势力交错使人民生活受其影响。
|
||||
- 主要角色:
|
||||
- 琴:25岁,蒙德骑士团副团长,勇敢且正义感强,对星的好奇与保护欲逐渐转化为深厚的情感,面临职责与情感的内心矛盾。
|
||||
|
||||
- 甘雨:外形20多岁,千岁的璃月半仙,聪慧温柔,与星结成伙伴关系,逐渐对星产生复杂的情感,因使命感而感到孤独。
|
||||
|
||||
- 凯亚:28岁,蒙德骑士,幽默而神秘,与星之间的互动充满火花,暗生好感,却因性格使然表现得轻佻。
|
||||
|
||||
- 雷电将军:未知年龄(看似30岁),稻妻的统治者,冷酷无情。星的出现让她开始反思自己的信念,内心对星逐渐产生吸引。
|
||||
|
||||
- 阿贝多:24岁,璃月的炼金术士,追求真理与知识。对星的独特吸引力使他更加关注她,两人之间的互动充满潜在的火花。
|
||||
|
||||
核心内容梗概: 故事采用英雄之旅结构,主角星因意外穿越到提瓦特,面临神明失去信仰、元素失衡,国家动荡的空前危机。在寻找回家的过程中,星结识了来自不同国家的伙伴,体验各地人文风情,并逐渐揭示穿越的真相。最终,星与伙伴们合力对抗共同的敌人,重塑世界的平衡,也收获真挚的情感。
|
||||
故事进展
|
||||
- 第一章:穿越之旅:星在乘坐星穹铁道时遭遇神秘现象,被传送到提瓦特大陆,初次感受到这里的魔法与危险。
|
||||
- 中段:星逐渐适应提瓦特生活,遇见各国角色并与他们建立关系,发展情感。同时,黑暗势力逐渐显现,开始捣乱。
|
||||
- 爱恨交错的情感:星与不同角色之间情感波动形成复杂的三角关系与误会,推动情节发展与冲突。
|
||||
- 高潮:各国联合对抗黑暗势力,星发现隐藏的真相,角色间的关系在生死考验中经历波折。
|
||||
- 结局:星经过艰辛战斗,拯救提瓦特,找到了内心的归属,决定留在提瓦特继续她的冒险。
|
||||
|
||||
情节安排设想: 主线围绕星的成长与拯救提瓦特的冒险分为三个阶段:第一阶段是星的穿越与初识,以及角色冲突的引入;第二阶段是与伙伴的深入互动,逐步揭露敌人阴谋及情感发展;第三阶段是最终决战与角色命运交织。副线聚焦其他角色的故事,展示他们与星的命运交织,为故事营造丰富的世界感。
|
||||
章节安排
|
||||
- 总章节数:100章,每章约4000字。章节围绕故事的重大事件、角色关系发展及情感冲突展开,穿插战斗场景与情感对话,逐渐推进主线与副线,构建深厚的世界观。
|
||||
|
||||
角色关系与主要角色设定:
|
||||
预期效果
|
||||
通过这部小说,读者将体验星穹铁道与原神世界的交融,感受到精彩的冒险故事与复杂的人际关系中爱的珍贵与痛苦。
|
||||
|
||||
1. 星(主角): 一名勇敢、好奇且善良的年轻人,满怀探索未知的欲望,面临对归属感的挣扎。在拯救提瓦特的过程中,她渴望成为真正的英雄,同时也处理与伙伴间复杂的情感关系。
|
||||
---
|
||||
|
||||
2. 伊尔(冷静的魔法师): 理智、谨慎,拥有强大师法的他在经历失败后变得冷淡,内心深处隐藏痛苦。希望能通过知识与能力解决危机,努力解脱自己的内心痛楚。与星的理想与现实相悖,易引发冲突。
|
||||
角色关系发展
|
||||
- 随着故事的发展,角色与星的关系在战斗与情感交流中不断变化,形成复杂的三人关系和误会,推动情节发展。每位角色在星的影响下找到了各自的定位与归属,形成更为团结的团队,共同守护提瓦特的未来。
|
||||
|
||||
3. 莱娜(隐秘的元素使者): 神秘而强大的她深谙元素魔法,在寻找与星的关系中,探索自己的身份之谜。与伊尔之间存在信任危机,随着故事发展,二人将面临信任与情感的考验。
|
||||
敏感线及处理限制
|
||||
在故事中,涉及到复杂情感关系与角色成长的敏感线须谨慎处理,以避免负面影响:
|
||||
1. 情感纠葛:避免过于戏剧化的情感对立,确保角色情感发展符合逻辑。
|
||||
2. 信念冲突:尊重各角色的信念,展现多元化价值观,而非仅单一立场。
|
||||
3. 责任与牺牲:描绘牺牲时避免血腥或悲惨的过度描写,确保具有深刻意义。
|
||||
4. 文化差异:尊重各国文化,避免采用刻板印象,准确表现各国背景。
|
||||
5. 性别角色:展现女性角色的多维性与复杂性,避免单一化形象。
|
||||
6. 身份认同:积极探讨归属感与自我认同,保障角色内心旅程的积极性。
|
||||
|
||||
暗线与伏笔构思:
|
||||
|
||||
1. 星的过往: 星对旧生活的怀念与痛苦逐渐显现,推动她在救助他人和回归原生活之间的抉择,进而引发与伙伴之间的深入讨论。
|
||||
|
||||
2. 伊尔的秘密: 伊尔对过去的隐瞒以及与敌对势力的牵连,在关键时刻暴露,导致团队关系动摇,让星更深刻地理解他的痛苦。
|
||||
|
||||
3. 莱娜的使命: 莱娜的神秘身份及意图逐步显露,最终必须面对身份的真实,仅在关键时刻,有赖于星与伊尔的支持,坚定她内心的归属感。
|
||||
|
||||
4. 星与伊尔的理念冲突: 星与伊尔在道德取向上发生摩擦,在选择重大事件时,两人的冲突达到顶峰,最终通过事件的解决促进彼此之间的理解与成长。
|
||||
|
||||
在这些设定中,角色的动机与暗线及伏笔相互交织,为整个故事增添了复杂性与紧张感,确保每一位角色的成长与情感发展贯穿始终,丰富了提瓦特大陆的冒险传奇。
|
||||
通过谨慎处理这些敏感线,小说将更加深刻和动人,吸引读者产生共鸣。
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
|
||||
星缓缓睁开眼睛,意识到自己正躺在一片陌生的土地上。四周是葱茏的树木,阳光透过树叶洒下斑驳的光影,微风轻拂,带来一丝清新的气息。她试图站起身来,身体却感到无力,仿佛刚经历了一场翻天覆地的梦境。迷茫与恐惧瞬间涌上心头——她究竟身处何地?
|
||||
|
||||
“别 panicking,星。”她自言自语,努力让自己冷静下来。可无论她怎么深呼吸,心中的慌乱与不安依旧如影随形。刚才她还在自己的家中,思绪被一扇打开的窗户吸引,目光追随着飞过的鸟儿,突然遭遇了一道神秘的光芒,她的意识就在那瞬间被撕扯了开来。而现在,她却身处于这个陌生的世界,这一切都让她感到无比的恐慌。
|
||||
|
||||
尝试坐起身来,星环顾四周,发现这片森林似乎与她的记忆截然相反。树木高耸入云,树干粗壮而苍翠,叶子则在微风中轻轻摇晃,发出沙沙的声响。然而,这些美丽的自然景象并没有为她带来一丝安慰——相反,她觉得一种不安的气息弥漫在空气中,仿佛这片森林隐藏着某种不为人知的秘密。
|
||||
|
||||
星的心中掠过一丝奇异的感觉,似乎这片土地上有着某种她无法理解的力量在流动。她强迫自己站起身,决定探索这个世界。若想办法找到回家的路,先得了解这个地方。她开始慢慢前行,脚下的土地干燥而坚硬,偶尔踩到几根枯枝,发出清脆的声响。
|
||||
|
||||
随着深入森林,她注意到周围的植物似乎散发着微弱的光芒,仿佛在回应着她的存在。星试图触摸那些植物,感受那股能量,却发现它们在她的手指间划过时变成了莹莹的光点,瞬间就消散了。她心中一紧,这显然不是普通的植物,她的直觉告诉她,自己可能身处于一个充满魔法的地方。
|
||||
|
||||
就在这时,她的思绪被一阵低语声打断。星停下脚步,四处张望,试图找到声音的来源。声音似乎从四面八方传来,但却又似乎是从某个深渊中回荡而出,朦胧而模糊。
|
||||
|
||||
“是谁在说话?”星喃喃自语,然而没有人回应。她心中浮现出一丝不安,迫切想要找到声音的源头。正当她准备继续探索时,眼前突然闪过一道亮光。她的心一颤,抬头看去,透过树木的缝隙,她隐约看到一个身影,似乎在远处的空旷地带移动。
|
||||
|
||||
出于好奇,星忍不住向前走去,穿越过一片茂密的灌木丛。终于,她走出林间,来到了一个开阔的空地上。眼前的一幕让她惊讶不已——一座宏伟的法阵正镶嵌于地面,阵法复杂而美丽,闪烁着微光,似乎在向她召唤。
|
||||
|
||||
“这是什么?”星自言自语,心中充满了疑惑与好奇。她走到法阵边缘,感觉到一股温暖的气流从阵法中透出。星的手指微微颤动,不由自主地伸向了那个法阵,触碰到了那些复杂的符文。瞬间,她感到一阵剧烈的震动,法阵光芒大盛,星的身体被卷入其中,意识在瞬间模糊而又清晰。
|
||||
|
||||
“啊!”她惊呼,仿佛被一股无形的力量撕扯着。整个世界都在颠覆,光芒刺眼,四周的景象如同狂风中的飘絮般不断变换,星感到自己像是随风而舞的叶子,无法控制。就在意识即将消散的瞬间,她听到了那个低语声,竟然清晰而响亮:“命运的选择。”
|
||||
|
||||
然后,星失去了意识。
|
||||
|
||||
当她再次睁开眼睛时,发现自己坐在一块石头上,周围是一片开阔的草地,远处是连绵起伏的山脉,天空湛蓝,阳光温暖,仿佛一切都是那么美好。可在她心中,却依然残留着那股恐惧与不安。
|
||||
|
||||
“这是哪里?”她自言自语,四处打量。就在这时,一个阴影笼罩了她,星抬头一看,面前站着一个高大的男子,身穿长袍,手中握着法杖,面容冷峻,眼神中透着智慧与审视。
|
||||
|
||||
“你是谁?”星有些警惕地问道,虽然心中已经有了几分预感。
|
||||
|
||||
“我是伊尔,一个魔法师。”男子的声音低沉而有力,似乎带着某种压迫感,“你应该是从那个法阵中被传送过来的吧?”
|
||||
|
||||
星点点头,虽然内心依旧充满困惑,但她知道自己必须与眼前这个陌生人好好交流。“是的,我…我不知道自己为什么来到这里。”
|
||||
|
||||
伊尔微微皱眉,目光在她身上扫视,似乎在打量她的言语是否可信。“这片土地并不安全,你的到来可不是什么偶然。元素的平衡正在崩溃,神明的意志也逐渐淡去。”
|
||||
|
||||
“神明的意志?”星困惑地问道,心中浮现出关于提瓦特的传说与故事。她从小就听说过这个富饶而神秘的大陆,但从未想过自己会置身其中。
|
||||
|
||||
“没错,”伊尔坚定地点头,“提瓦特大陆上,七位神明各自守护着一个国度,而你在这里的出现,可能与某种更大的命运息息相关。”
|
||||
|
||||
“我只想回家。”星低声说道,心中依然渴望着熟悉的生活,尽管她也感受到这个新的世界是如此吸引人。
|
||||
|
||||
“回家并不是那么简单。”伊尔的声音中透着冷静,他的眼神中闪烁着某种复杂的情感,“在这片土地上,你必须要面对许多你无法想象的挑战。”
|
||||
|
||||
星感到了一丝绝望,她并不想成为一名英雄,自己不过是一名普通的年轻人。“我……我能做些什么?”
|
||||
|
||||
“或许我们可以一起探索这个世界。”伊尔的语气缓和了一些,似乎对她产生了一丝信任,“我对魔法的研究或许能帮助你找到线索。”
|
||||
|
||||
“谢谢你,伊尔。”星感激地点头,虽然她对眼前的陌生人依然有些顾虑,但她知道自己必须要有人陪伴,才能在这个陌生的世界中生存下去。
|
||||
|
||||
就在这时,草地的另一侧,一道神秘的光芒闪过,随即出现了另一个身影。那是一位少女,长发披肩,身穿轻盈的衣袍,眼神深邃而神秘,她似乎在默默地注视着星与伊尔。
|
||||
|
||||
“你是……”星愣了一下,有些惊讶。
|
||||
|
||||
“我叫莱娜。”少女轻声说道,她的声音如同空灵的风铃,给人一种奇特的亲切感,“我感觉到了你的到来,希望能和你们一起探索这个世界。”
|
||||
|
||||
“你也感知到了?”伊尔微微皱眉,似乎对莱娜的出现有些意外,却又没有质疑的意思。
|
||||
|
||||
“是的。”莱娜的眼神透着某种不易察觉的情感,“我对自然元素有着强烈的感应,能够感受到世界的变化。”
|
||||
|
||||
星心中一震,莱娜的出现让她感到了一丝安慰,也增添了对这个世界的探索欲望。“或许我们可以一起合作,找出这个世界的秘密。”
|
||||
|
||||
莱娜微微一笑,仿佛认可了星的提议。“我相信,我们的命运将会交织在一起。”
|
||||
|
||||
三人之间逐渐形成了一种微妙的默契。尽管星对这个新世界的未来仍感到模糊不清,内心的惶恐也未完全消散,但在伊尔与莱娜的陪伴下,她逐渐意识到自己不再孤单。接下来,等待她的将是未知的冒险,她必须做好面对的准备。
|
||||
|
||||
正当星准备问伊尔关于这个世界的更多事情时,突然,一股强烈的能量波动猛然袭来,她耳边仿佛听到了那道低语的声音再度浮现,清晰而坚定:“命运的选择,终于来临!”
|
||||
|
||||
星的心脏骤然加速,四周的空气似乎在那一瞬间凝固。她抬头,看到远处的天空中,一片阴云迅速聚集而来,预示着某种危险的逼近。一个模糊的影像在天际闪现,似乎正暗示着未来的冲突与挑战,而她所要面对的,绝不仅仅是对自我归属的探索。
|
||||
|
||||
“我们要走!”伊尔的声音打断了星的思绪,他的目光变得凝重,“不可忽视的危机即将降临,我们必须立刻找到安全的地方!”
|
||||
|
||||
星与莱娜对视一眼,心中都涌起一股紧迫感。对即将来临的挑战,三人并肩而立,准备迎接未知的未来。此刻,她们的命运已经交织在了一起,故事的篇章才刚刚开启,而未来的旅程充满了未知与悬念。
|
||||
@@ -0,0 +1,38 @@
|
||||
### 更新后的角色信息
|
||||
|
||||
#### 星(主角)
|
||||
- **年龄**: 20岁
|
||||
- **背景**: 原本生活在大都市的普通女性,因对归属感的渴望而选择乘坐星穹铁道,意外穿越到了提瓦特的异世界。性格内向而敏感,心中充满探索未知的渴望,也对勇气与坚定有着深深的向往。在穿越前,常感孤独,并在快节奏的生活中迷失。希望找到属于自己的位置。
|
||||
- **当前状态**: 刚经历第一次战斗,成功调动了风的元素力量,感受到力量带来的惊喜与恐惧。与琴建立了更深的信任关系,并对凯亚产生了好奇。内心对“失落者”的传闻感到不安,迫切想探索更多秘密。
|
||||
- **持有物品**: 发现并拥有一枚神秘的元素徽章,能够帮助她更好地感应周围的元素力量。
|
||||
- **能力变化**: 初步掌握了风的元素力量,能够调动周围空气并产生简单的风力效果。对元素力量的认知和控制有所提高,但仍感到不安。
|
||||
|
||||
#### 琴
|
||||
- **年龄**: 25岁(推测)
|
||||
- **身份**: 蒙德骑士团副团长
|
||||
- **背景**: 作为一名优秀的骑士,琴责任心强,性格坚定而富有魅力。她总是尽力保护弱者,并热心助人。随着与星的互动加深,逐渐对星的潜力有了更深的认识,并愿意将自己的经验传授给她。
|
||||
- **当前状态**: 在与星的合作中,感受到自身责任感的加重,积极支持星的成长和探索。虽然因战斗受了些许伤,但依然充满信心。
|
||||
- **能力变化**: 通过指导星,她在观察中感受到自己的领导能力在逐渐增强,并对元素力量的理解也在加深。
|
||||
|
||||
#### 凯亚
|
||||
- **年龄**: 28岁(推测)
|
||||
- **身份**: 蒙德骑士
|
||||
- **背景**: 个性幽默而神秘,内心深处隐藏着自己的故事与秘密。他对星产生了浓厚的兴趣,并希望给予帮助,打算在日后更多地与星互动。
|
||||
- **当前状态**: 在观察星与琴的互动中,感受到两者之间的信任逐渐加深,暗自思考如何以自己独特的方式帮助她。同时,他对于“失落者”的传闻也开始感到不安。
|
||||
- **能力变化**: 在星的成长过程中,他开始适时提供帮助,利用骑士团的资源,提升自己在团体中的影响力。
|
||||
|
||||
### 角色关系与动态
|
||||
- **星与琴**: 在共同战斗和探索中,两者的信任关系愈加深厚,星逐渐在琴身上看到勇气与责任感。琴将继续引导星应对未来的挑战。
|
||||
- **星与凯亚**: 凯亚对星的关注逐渐加深,可能会在未来向星提供帮助与指导,星对此感到好奇与期待。
|
||||
- **琴与凯亚**: 两者之间默契依旧,琴对凯亚的调侃逐渐演变为互相支持,形成了良好的团队氛围。
|
||||
|
||||
### 正在发生的重要事件
|
||||
1. **战斗事件**: 星首次参与战斗,成功调动元素力量击退风狼,展示出她在新环境中的适应能力与潜力。此战斗让星的力量得到了初步的验证与掌握。
|
||||
2. **探索蒙德城**: 星与琴一同游览蒙德城,了解提瓦特的文化,努力寻找归属感。在探索过程中,星的内心感受到归属的渴望逐渐增强。
|
||||
3. **黑暗势力的威胁**: 关于“失落者”的传言开始在城镇中流传,星的内心感到一丝不安,暗示着未来的挑战。星开始对这股黑暗势力的成因与目的产生疑问。
|
||||
|
||||
### 新增角色
|
||||
- **无**: 目前未新增重要角色。
|
||||
|
||||
### 总结
|
||||
在这一章节中,星与琴通过合作加深了彼此的理解与信任,而凯亚则为星的旅程增添了神秘与支持。星经历了首次战斗,展现了她的潜力与勇气,但同时也面临对力量无法完全掌控的恐惧。随着黑暗势力的威胁逐渐显露,星的冒险将进一步展开,她的使命、归属感以及与伙伴间的关系将随着故事的发展不断深化。
|
||||
@@ -0,0 +1,9 @@
|
||||
### 更新后的全局摘要:
|
||||
|
||||
故事的主角星是一名二十岁的年轻女性,渴望寻找归属感。在一次神秘的星穹铁道旅行中,列车突然发生剧烈震动,星被一种强大的力量吸引,随即穿越时空,经历了奇异的景象。当她醒来时,发现自己身处一个生机勃勃的新世界——提瓦特。
|
||||
|
||||
在这个陌生的世界中,星感受到一种元素的力量,但也遭遇了受到黑暗力量影响的野兽。在危急时刻,一位名叫琴的骑士及时救下了她,并成为她在此世界的向导和首个伙伴。琴向星介绍了提瓦特的各国文化及其信仰,并带她游览蒙德城,逐渐让星感受到归属感。然而,星的直觉告诉她这片土地并不如表面般美好,暗影中的身影让她倍感不安。
|
||||
|
||||
在与琴的互动中,星对骑士的勇气与责任感心生向往,决心努力变得勇敢。在一次遭遇强大风狼的战斗中,琴展现了无畏与坚定,而星在琴的鼓励下,首次成功调动了元素力量,击退了风狼,增强了自信与能力。此时,另一位骑士凯亚的出现为她们的冒险增添了更多悬念与期待。
|
||||
|
||||
随着星、琴和凯亚之间的信任与默契加深,她逐渐意识到提瓦特的黑暗势力正在潜藏,威胁着这个美丽的世界。在战斗与温馨的互动之后,星发誓要找到自己来到这个世界的原因,并与新的伙伴们一起面对即将到来的挑战。她的冒险才刚刚开始,未来的旅程将充满挑战与奇迹,同时隐藏着更多未知的秘密等待她去探索与揭示。
|
||||
+35
-37
@@ -1,71 +1,69 @@
|
||||
星缓缓睁开眼睛,意识到自己正躺在一片陌生的土地上。四周是葱茏的树木,阳光透过树叶洒下斑驳的光影,微风轻拂,带来一丝清新的气息。她试图站起身来,身体却感到无力,仿佛刚经历了一场翻天覆地的梦境。迷茫与恐惧瞬间涌上心头——她究竟身处何地?
|
||||
在刚刚经历过激烈战斗的蒙德城,傍晚的阳光透过云层洒下金色的光辉,为这座充满生机的城市增添了一层温暖的纱衣。星和琴并肩走回城镇,琴微微侧身,依然带着战斗后的兴奋与满足,星却感受到心中的复杂情绪在不断翻涌。她刚刚第一次施展出元素力量,尽管成功地击退了风狼,内心的雀跃却因为随之而来的恐惧而逐渐淡化。
|
||||
|
||||
“别 panicking,星。”她自言自语,努力让自己冷静下来。可无论她怎么深呼吸,心中的慌乱与不安依旧如影随形。刚才她还在自己的家中,思绪被一扇打开的窗户吸引,目光追随着飞过的鸟儿,突然遭遇了一道神秘的光芒,她的意识就在那瞬间被撕扯了开来。而现在,她却身处于这个陌生的世界,这一切都让她感到无比的恐慌。
|
||||
“你真的做得很好,星。”琴的声音如同一阵温暖的微风,轻轻拂过星的脸庞,然而星却只能微微一笑,心中却难以平静。她的内心仿佛被一层迷雾笼罩,虽然在琴的鼓励下,她感受到了一丝勇气,但对力量的惧怕依然如影随形。
|
||||
|
||||
尝试坐起身来,星环顾四周,发现这片森林似乎与她的记忆截然相反。树木高耸入云,树干粗壮而苍翠,叶子则在微风中轻轻摇晃,发出沙沙的声响。然而,这些美丽的自然景象并没有为她带来一丝安慰——相反,她觉得一种不安的气息弥漫在空气中,仿佛这片森林隐藏着某种不为人知的秘密。
|
||||
“谢谢你,琴……”星低声说道,目光游离在城镇的街道上。眼前的景象虽然美好,但她却感到一阵无形的压迫感,仿佛有一双无形的手在她的心头紧紧握住,无法呼吸。
|
||||
|
||||
星的心中掠过一丝奇异的感觉,似乎这片土地上有着某种她无法理解的力量在流动。她强迫自己站起身,决定探索这个世界。若想办法找到回家的路,先得了解这个地方。她开始慢慢前行,脚下的土地干燥而坚硬,偶尔踩到几根枯枝,发出清脆的声响。
|
||||
正当她沉浸在思考之中时,琴突然停下了脚步,眼中闪过一丝困惑。“你听到了吗?城里似乎有些不同寻常。”琴的眉头微微皱起,耳边响起了低沉的低语声,似乎是从远处传来。星定神一听,果然在街道的尽头,有人群围着正在交谈,低语声隐约提到黑暗的力量与失踪的居民。
|
||||
|
||||
随着深入森林,她注意到周围的植物似乎散发着微弱的光芒,仿佛在回应着她的存在。星试图触摸那些植物,感受那股能量,却发现它们在她的手指间划过时变成了莹莹的光点,瞬间就消散了。她心中一紧,这显然不是普通的植物,她的直觉告诉她,自己可能身处于一个充满魔法的地方。
|
||||
“我们去看看。”星的心中瞬间燃起一丝好奇与紧迫感,虽然对未知的事情感到害怕,但内心的探险欲望却推着她向前。她与琴一起穿过熙熙攘攘的人群,朝着传言的来源走去。
|
||||
|
||||
就在这时,她的思绪被一阵低语声打断。星停下脚步,四处张望,试图找到声音的来源。声音似乎从四面八方传来,但却又似乎是从某个深渊中回荡而出,朦胧而模糊。
|
||||
当她们接近人群时,星注意到围着一名老者,他苍白的脸上满是忧愁,声音颤抖地讲述着黑暗势力的传说。围观的人们听得津津有味,不时低声讨论。星心中顿时一紧,这些黑暗势力的传闻正是她在穿越到这个世界后,心中深埋的恐惧。那种感觉就像是一场梦魇,时刻在她的背后徘徊。
|
||||
|
||||
“是谁在说话?”星喃喃自语,然而没有人回应。她心中浮现出一丝不安,迫切想要找到声音的源头。正当她准备继续探索时,眼前突然闪过一道亮光。她的心一颤,抬头看去,透过树木的缝隙,她隐约看到一个身影,似乎在远处的空旷地带移动。
|
||||
“几日前,我的小儿子失踪了。”老者紧握着手中的拐杖,声音颤抖得如同风中摇曳的树叶。他的脸上充满了无助与绝望,似乎在周围人们的注视下,所有的悲伤和愤怒都化为一股无形的压迫感。
|
||||
|
||||
出于好奇,星忍不住向前走去,穿越过一片茂密的灌木丛。终于,她走出林间,来到了一个开阔的空地上。眼前的一幕让她惊讶不已——一座宏伟的法阵正镶嵌于地面,阵法复杂而美丽,闪烁着微光,似乎在向她召唤。
|
||||
“听说是黑暗势力在作怪,他们要吞噬这个世界的光明,吞噬一切。”人群中有人附和着老者的话,众人开始小声议论,恐惧在空气中弥漫。星的心中一紧,一种不详的预感油然而生。
|
||||
|
||||
“这是什么?”星自言自语,心中充满了疑惑与好奇。她走到法阵边缘,感觉到一股温暖的气流从阵法中透出。星的手指微微颤动,不由自主地伸向了那个法阵,触碰到了那些复杂的符文。瞬间,她感到一阵剧烈的震动,法阵光芒大盛,星的身体被卷入其中,意识在瞬间模糊而又清晰。
|
||||
“琴,我们应该调查一下。”星不自觉地握紧了拳头,虽然内心仍有惶恐,但她渴望了解真相,想要找到那些失踪的同胞,想要揭开这不可名状的恐怖面纱。
|
||||
|
||||
“啊!”她惊呼,仿佛被一股无形的力量撕扯着。整个世界都在颠覆,光芒刺眼,四周的景象如同狂风中的飘絮般不断变换,星感到自己像是随风而舞的叶子,无法控制。就在意识即将消散的瞬间,她听到了那个低语声,竟然清晰而响亮:“命运的选择。”
|
||||
“是的,我们必须对此保持警惕。”琴果断地点头,决心在星的眼前闪烁。她的重要性在于对星的支持,随着她们的旅行,身为副团长的琴也意识到,保护自己身边的伙伴同样是她的职责。
|
||||
|
||||
然后,星失去了意识。
|
||||
二人跟随老者的讲述,逐渐吸引了周围人们的注意。就在这时,星的目光不由自主地朝人群的另一侧飘去,一名神秘的流浪者吸引了她的注意。他身材瘦削,裹着一件破旧的斗篷,脸上有些阴影,难以看清其真实的面容。他静静地站在一旁,似乎与周围的喧嚣格格不入。
|
||||
|
||||
当她再次睁开眼睛时,发现自己坐在一块石头上,周围是一片开阔的草地,远处是连绵起伏的山脉,天空湛蓝,阳光温暖,仿佛一切都是那么美好。可在她心中,却依然残留着那股恐惧与不安。
|
||||
“你在找什么?”星不知为何,被他的身影吸引,向他们走去。流浪者的眼中闪烁着不同寻常的光芒,仿佛看透了一切,轻声说道:“我在寻找星星。”他的声音柔和,却透着一种诡异的神秘感。
|
||||
|
||||
“这是哪里?”她自言自语,四处打量。就在这时,一个阴影笼罩了她,星抬头一看,面前站着一个高大的男子,身穿长袍,手中握着法杖,面容冷峻,眼神中透着智慧与审视。
|
||||
“星星?”星一愣,心中燃起了一种莫名的好奇。耳边传来的低语声似乎在召唤她,流浪者的言语如同钥匙,打开了她心中的那扇门。“你知道关于这片土地的事情吗?”她努力抑制着内心的热切,尽量让自己的声音听起来平静。
|
||||
|
||||
“你是谁?”星有些警惕地问道,虽然心中已经有了几分预感。
|
||||
流浪者微微一笑,眼神中透出一种难以言喻的智慧,“这里的一切都是有联系的,尤其是你与那些失落者。”他的语气中透着一丝神秘,仿佛暗示着她与黑暗势力之间的某种联系。
|
||||
|
||||
“我是伊尔,一个魔法师。”男子的声音低沉而有力,似乎带着某种压迫感,“你应该是从那个法阵中被传送过来的吧?”
|
||||
“失落者……”星喃喃自语,心中涌起一阵不安。她的直觉告诉她,这个流浪者并不简单,或许他知道她所不知的真相。
|
||||
|
||||
星点点头,虽然内心依旧充满困惑,但她知道自己必须与眼前这个陌生人好好交流。“是的,我…我不知道自己为什么来到这里。”
|
||||
就在这时,琴从一旁走过来,皱眉看着流浪者,语气中透出一丝警惕:“你是谁?为什么要在这里说这些?你知道些什么吗?”琴的声音如同风暴前的宁静,隐含着不安与防备。
|
||||
|
||||
伊尔微微皱眉,目光在她身上扫视,似乎在打量她的言语是否可信。“这片土地并不安全,你的到来可不是什么偶然。元素的平衡正在崩溃,神明的意志也逐渐淡去。”
|
||||
“我只是个流浪者,听闻真相的人很多,但愿意讲述的人却少之又少。”流浪者微微一笑,似乎对琴的警惕不以为意。他的声音如同夜风,轻柔却充满力量。“然而,星,你的出现是命运的调和,而失落者的命运与整个提瓦特息息相关。”
|
||||
|
||||
“神明的意志?”星困惑地问道,心中浮现出关于提瓦特的传说与故事。她从小就听说过这个富饶而神秘的大陆,但从未想过自己会置身其中。
|
||||
星的表情微微一变,心中既兴奋又恐惧。她知道自己与这个世界的联系正在逐渐清晰,但流浪者的话却让她感到更深的困惑。“我与失落者有什么关系?”星忍不住问道,心中充满了疑惑。
|
||||
|
||||
“没错,”伊尔坚定地点头,“提瓦特大陆上,七位神明各自守护着一个国度,而你在这里的出现,可能与某种更大的命运息息相关。”
|
||||
流浪者并没有直接回答她,反而指向天空,目光中透露出一丝沉思:“星星在夜空中闪烁,它们承载着无数个故事和秘密,唯有那些能够倾听的人才能找到答案。”他的话语如同星辰般神秘,让星的思绪越发模糊。
|
||||
|
||||
“我只想回家。”星低声说道,心中依然渴望着熟悉的生活,尽管她也感受到这个新的世界是如此吸引人。
|
||||
正当两人之间的对话逐渐深入时,突然一阵破坏性的力量让她们的谈话戛然而止。周围的空气瞬间变得沉重,众人开始慌乱地向后退去,气氛骤然冷却。琴的警觉立刻提升,迅速拉住星的手。她们感觉到了一股强大的黑暗力量正在逼近。
|
||||
|
||||
“回家并不是那么简单。”伊尔的声音中透着冷静,他的眼神中闪烁着某种复杂的情感,“在这片土地上,你必须要面对许多你无法想象的挑战。”
|
||||
“我们必须离开这里!”琴低声说道,眼中闪过一丝坚定。星的心中顿时涌起一阵不安,四周的低语声瞬间被一种阴冷的气息取代,仿佛整个世界都在彼此期待着什么。
|
||||
|
||||
星感到了一丝绝望,她并不想成为一名英雄,自己不过是一名普通的年轻人。“我……我能做些什么?”
|
||||
就在此时,几道黑影从人群中窜出,快速朝着星和琴的方向扑来。星的心跳骤然加速,目光中只看到那些黑影如同空中的阴影,凶狠而迅速。它们犹如夜幕中降临的猛兽,瞬间将周围人群的欢声笑语吞没。
|
||||
|
||||
“或许我们可以一起探索这个世界。”伊尔的语气缓和了一些,似乎对她产生了一丝信任,“我对魔法的研究或许能帮助你找到线索。”
|
||||
“准备战斗!”琴的声音坚定有力,手握武器,展现出骑士的果敢与领导力。星的心中燃起一丝勇气,尽管她对力量的掌控仍显薄弱,但此刻的她已经没有退缩的余地。
|
||||
|
||||
“谢谢你,伊尔。”星感激地点头,虽然她对眼前的陌生人依然有些顾虑,但她知道自己必须要有人陪伴,才能在这个陌生的世界中生存下去。
|
||||
黑影迅速逼近,星努力保持冷静,将先前的战斗经验回想起。就在恐惧与期待交织的瞬间,她深吸一口气,心中默念着:“我要坚持下去,我不能让任何人受到伤害!”
|
||||
|
||||
就在这时,草地的另一侧,一道神秘的光芒闪过,随即出现了另一个身影。那是一位少女,长发披肩,身穿轻盈的衣袍,眼神深邃而神秘,她似乎在默默地注视着星与伊尔。
|
||||
当黑影终于逼近,她们再次面对眼前的敌人,那是几只被黑暗力量扭曲的怪物,形态狰狞,气息阴冷。星心头一紧,几乎无法控制自己的情绪,然而琴的身影在她的脑海中闪过,那份责任与勇气激励着她。她握紧元素徽章,试图感应大自然的力量。
|
||||
|
||||
“你是……”星愣了一下,有些惊讶。
|
||||
“星,聚焦你的元素力量!”琴在她耳边坚定地鼓励着。星用力点头,努力将自己与周围的空气相连,再次感应那股温暖的气息。她心中不再是恐惧,而是一种前所未有的坚定与力量。她知道,她必须保护琴,也保护这个她逐渐爱上的世界。
|
||||
|
||||
“我叫莱娜。”少女轻声说道,她的声音如同空灵的风铃,给人一种奇特的亲切感,“我感觉到了你的到来,希望能和你们一起探索这个世界。”
|
||||
“风之力,听我号令!”星大声呼喊,周围的空气开始涌动,在她的指尖汇聚成风的漩涡。正当她准备施展力量时,那几只怪物已然冲到面前,凶猛地朝她们扑来。琴毫不犹豫地迎上前去,剑光闪烁,与怪物展开激烈的战斗。
|
||||
|
||||
“你也感知到了?”伊尔微微皱眉,似乎对莱娜的出现有些意外,却又没有质疑的意思。
|
||||
随着琴的剑舞动,星感受到了那份热血沸腾的激情,心中劈开了恐惧的阴影。在这一刻,星的力量逐渐增强,她闭上双眼,努力与风的力量合为一体。她感受到周围的空气开始流动,仿佛有一种无形的力量正随着她的心跳而起舞。
|
||||
|
||||
“是的。”莱娜的眼神透着某种不易察觉的情感,“我对自然元素有着强烈的感应,能够感受到世界的变化。”
|
||||
“来吧!”星的声音透着一丝坚定,“我将不再恐惧!”
|
||||
|
||||
星心中一震,莱娜的出现让她感到了一丝安慰,也增添了对这个世界的探索欲望。“或许我们可以一起合作,找出这个世界的秘密。”
|
||||
就在黑暗的怪物即将扑到她面前的瞬间,星指尖的一道旋风破空而出,直接轰向面前的敌人。风的力量如同洪流,撕裂着空气,瞬间将怪物击退,剧烈的撞击声响彻耳畔。惊愕的目光在怪物的脸上浮现,随之而来的则是无尽的绝望。
|
||||
|
||||
莱娜微微一笑,仿佛认可了星的提议。“我相信,我们的命运将会交织在一起。”
|
||||
“做得很好,星!”琴欣慰的声音如同春风,令她感到温暖。然而,星的心中却涌动着更多的疑问与不安。她能够在一瞬间调动起力量,但对力量的真正理解却依然如谜。
|
||||
|
||||
三人之间逐渐形成了一种微妙的默契。尽管星对这个新世界的未来仍感到模糊不清,内心的惶恐也未完全消散,但在伊尔与莱娜的陪伴下,她逐渐意识到自己不再孤单。接下来,等待她的将是未知的冒险,她必须做好面对的准备。
|
||||
随着她的逐步掌控,战斗的局势逐渐扭转。星和琴一起奋力抵抗着来自黑暗势力的侵袭,双方的斗争愈演愈烈,空气中弥漫着紧张的气息。就在她们即将取得胜利之际,流浪者的身影在维持安静的角落里静静注视着这一切,似乎在观察着星的每一个举动。
|
||||
|
||||
正当星准备问伊尔关于这个世界的更多事情时,突然,一股强烈的能量波动猛然袭来,她耳边仿佛听到了那道低语的声音再度浮现,清晰而坚定:“命运的选择,终于来临!”
|
||||
“她并不知晓自己真正的命运。”流浪者低声自语,那话语依旧飘散在夜空中,吸引着星的目光。她的心中不断回响着他的声音,仿佛在暗示着一场更大的阴谋正在悄然逼近。
|
||||
|
||||
星的心脏骤然加速,四周的空气似乎在那一瞬间凝固。她抬头,看到远处的天空中,一片阴云迅速聚集而来,预示着某种危险的逼近。一个模糊的影像在天际闪现,似乎正暗示着未来的冲突与挑战,而她所要面对的,绝不仅仅是对自我归属的探索。
|
||||
随着战斗的结束,星和琴在壮烈的胜利中保持沉默,心中却充满了未解的疑惑与不安。星的内心深处,她知道这场战斗仅仅是开始,真正的挑战还在后面等着她。而她与琴的关系也在这一回合战斗中愈发紧密,彼此的信任逐渐加深,却也孕育着新的未知。
|
||||
|
||||
“我们要走!”伊尔的声音打断了星的思绪,他的目光变得凝重,“不可忽视的危机即将降临,我们必须立刻找到安全的地方!”
|
||||
|
||||
星与莱娜对视一眼,心中都涌起一股紧迫感。对即将来临的挑战,三人并肩而立,准备迎接未知的未来。此刻,她们的命运已经交织在了一起,故事的篇章才刚刚开启,而未来的旅程充满了未知与悬念。
|
||||
“琴,我们必须找到关于失落者的真相,我总觉得这与我的命运息息相关。”星凝视着远方的黑暗,心中暗自发誓将坚定地前行。在这个星空璀璨的世界,她即将走上新的旅程,揭开那隐藏在历史背后的秘密。
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
-1
@@ -4,7 +4,7 @@
|
||||
"model_name": "gpt-4o-mini",
|
||||
"topic": "星穹铁道主角星穿越到原神提瓦特大陆,拯救提瓦特大陆,并与其中的角色展开爱恨情仇的小说设定",
|
||||
"genre": "玄幻",
|
||||
"num_chapters": 100,
|
||||
"num_chapters": 200,
|
||||
"word_number": 4000,
|
||||
"filepath": "C:/Users/xieli/Desktop/AI_NovelGenerator/AI_novel"
|
||||
}
|
||||
+199
-100
@@ -1,11 +1,20 @@
|
||||
import os
|
||||
from typing_extensions import TypedDict
|
||||
import logging
|
||||
from typing import Dict, List, Optional
|
||||
try:
|
||||
from typing import TypedDict # Python 3.8+ 直接可用;若是3.7可改用 typing_extensions
|
||||
except ImportError:
|
||||
from typing_extensions import TypedDict
|
||||
|
||||
from langchain_openai import ChatOpenAI
|
||||
from langgraph.graph import StateGraph, START, END
|
||||
from typing import Dict
|
||||
from langchain_openai import OpenAIEmbeddings
|
||||
from langchain_community.vectorstores import Chroma
|
||||
from langchain.docstore.document import Document
|
||||
|
||||
from utils import (
|
||||
read_file, append_text_to_file, clear_file_content, save_string_to_txt
|
||||
read_file, append_text_to_file, clear_file_content,
|
||||
save_string_to_txt
|
||||
)
|
||||
from prompt_definitions import (
|
||||
set_prompt, character_prompt, dark_lines_prompt,
|
||||
@@ -14,15 +23,72 @@ from prompt_definitions import (
|
||||
chapter_outline_prompt, chapter_write_prompt
|
||||
)
|
||||
|
||||
# 向量检索相关 (以Chroma为例),需要安装 langchain, chromadb 等
|
||||
from langchain.embeddings.openai import OpenAIEmbeddings
|
||||
from langchain.vectorstores import Chroma
|
||||
from langchain.docstore.document import Document
|
||||
# ============ 日志配置(可选) ============
|
||||
logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
|
||||
|
||||
# ============ 向量检索相关函数(Chroma) ============
|
||||
|
||||
# 默认用此目录存放向量库
|
||||
VECTOR_STORE_DIR = "vectorstore"
|
||||
|
||||
# =============== 多步生成:设置 & 目录 ===============
|
||||
def init_vector_store(api_key: str, base_url: str, texts: List[str]) -> Chroma:
|
||||
"""
|
||||
初始化并返回一个Chroma向量库,将传入的文本进行嵌入并保存到本地目录。
|
||||
如果不存在该目录,会自动创建。
|
||||
"""
|
||||
embeddings = OpenAIEmbeddings(
|
||||
openai_api_key=api_key,
|
||||
openai_api_base=base_url # <-- 这里用传进来的 base_url
|
||||
)
|
||||
documents = [Document(page_content=t) for t in texts]
|
||||
vectorstore = Chroma.from_documents(
|
||||
documents,
|
||||
embedding=embeddings,
|
||||
persist_directory=VECTOR_STORE_DIR
|
||||
)
|
||||
vectorstore.persist()
|
||||
return vectorstore
|
||||
|
||||
|
||||
def load_vector_store(api_key: str, base_url: str) -> Optional[Chroma]:
|
||||
"""读取已存在的向量库。若不存在则返回 None。"""
|
||||
if not os.path.exists(VECTOR_STORE_DIR):
|
||||
return None
|
||||
embeddings = OpenAIEmbeddings(
|
||||
openai_api_key=api_key,
|
||||
openai_api_base=base_url # <-- 使用 base_url
|
||||
)
|
||||
return Chroma(persist_directory=VECTOR_STORE_DIR, embedding_function=embeddings)
|
||||
|
||||
|
||||
def update_vector_store(api_key: str, base_url: str, new_chapter: str) -> None:
|
||||
"""将最新章节文本插入到向量库里,用于后续检索参考。若库不存在则初始化。"""
|
||||
store = load_vector_store(api_key, base_url)
|
||||
if not store:
|
||||
logging.info("Vector store does not exist. Initializing a new one...")
|
||||
init_vector_store(api_key, base_url, [new_chapter])
|
||||
return
|
||||
|
||||
new_doc = Document(page_content=new_chapter)
|
||||
store.add_documents([new_doc])
|
||||
store.persist()
|
||||
|
||||
|
||||
def get_relevant_context_from_vector_store(api_key: str, base_url: str, query: str, k: int = 2) -> str:
|
||||
"""
|
||||
从向量库中检索与 query 最相关的 k 条文本,拼接后返回。
|
||||
若向量库不存在则返回空字符串。
|
||||
"""
|
||||
store = load_vector_store(api_key, base_url)
|
||||
if not store:
|
||||
logging.warning("Vector store not found. Returning empty context.")
|
||||
return ""
|
||||
docs = store.similarity_search(query, k=k)
|
||||
combined = "\n".join([d.page_content for d in docs])
|
||||
return combined
|
||||
|
||||
|
||||
# ============ 多步生成:设置 & 目录 ============
|
||||
|
||||
class OverallState(TypedDict):
|
||||
topic: str
|
||||
genre: str
|
||||
@@ -34,6 +100,7 @@ class OverallState(TypedDict):
|
||||
final_novel_setting: str
|
||||
novel_directory: str
|
||||
|
||||
|
||||
def Novel_novel_directory_generate(
|
||||
api_key: str,
|
||||
base_url: str,
|
||||
@@ -43,43 +110,62 @@ def Novel_novel_directory_generate(
|
||||
number_of_chapters: int,
|
||||
word_number: int,
|
||||
filepath: str
|
||||
):
|
||||
) -> None:
|
||||
"""
|
||||
使用多步流程,生成 Novel_setting.txt 与 Novel_directory.txt
|
||||
使用多步流程,生成 Novel_setting.txt 与 Novel_directory.txt 并保存到 filepath。
|
||||
|
||||
:param api_key: OpenAI API key
|
||||
:param base_url: OpenAI API base url
|
||||
:param llm_model: 所使用的 LLM 模型名称
|
||||
:param topic: 小说主题
|
||||
:param genre: 小说类型
|
||||
:param number_of_chapters: 章节数
|
||||
:param word_number: 单章目标字数
|
||||
:param filepath: 存放生成文件的目录路径
|
||||
"""
|
||||
# 确保文件夹存在
|
||||
os.makedirs(filepath, exist_ok=True)
|
||||
|
||||
model = ChatOpenAI(
|
||||
model=llm_model,
|
||||
api_key=api_key,
|
||||
base_url=base_url
|
||||
)
|
||||
|
||||
def generate_base_setting(state: OverallState):
|
||||
def generate_base_setting(state: OverallState) -> Dict[str, str]:
|
||||
prompt = set_prompt.format(
|
||||
topic=state["topic"],
|
||||
genre=state["genre"],
|
||||
number_of_chapters=state["number_of_chapters"],
|
||||
word_number=state["word_number"],
|
||||
word_number=state["word_number"]
|
||||
)
|
||||
response = model.invoke(prompt)
|
||||
if not response:
|
||||
logging.warning("generate_base_setting: No response.")
|
||||
return {"novel_setting_base": ""}
|
||||
return {"novel_setting_base": response.content.strip()}
|
||||
|
||||
def generate_character_setting(state: OverallState):
|
||||
prompt = character_prompt.format(novel_setting=state["novel_setting_base"])
|
||||
def generate_character_setting(state: OverallState) -> Dict[str, str]:
|
||||
prompt = character_prompt.format(
|
||||
novel_setting=state["novel_setting_base"]
|
||||
)
|
||||
response = model.invoke(prompt)
|
||||
if not response:
|
||||
logging.warning("generate_character_setting: No response.")
|
||||
return {"character_setting": ""}
|
||||
return {"character_setting": response.content.strip()}
|
||||
|
||||
def generate_dark_lines(state: OverallState):
|
||||
prompt = dark_lines_prompt.format(character_info=state["character_setting"])
|
||||
def generate_dark_lines(state: OverallState) -> Dict[str, str]:
|
||||
prompt = dark_lines_prompt.format(
|
||||
character_info=state["character_setting"]
|
||||
)
|
||||
response = model.invoke(prompt)
|
||||
if not response:
|
||||
logging.warning("generate_dark_lines: No response.")
|
||||
return {"dark_lines": ""}
|
||||
return {"dark_lines": response.content.strip()}
|
||||
|
||||
def finalize_novel_setting(state: OverallState):
|
||||
def finalize_novel_setting(state: OverallState) -> Dict[str, str]:
|
||||
prompt = finalize_setting_prompt.format(
|
||||
novel_setting_base=state["novel_setting_base"],
|
||||
character_setting=state["character_setting"],
|
||||
@@ -87,19 +173,22 @@ def Novel_novel_directory_generate(
|
||||
)
|
||||
response = model.invoke(prompt)
|
||||
if not response:
|
||||
logging.warning("finalize_novel_setting: No response.")
|
||||
return {"final_novel_setting": ""}
|
||||
return {"final_novel_setting": response.content.strip()}
|
||||
|
||||
def generate_novel_directory(state: OverallState):
|
||||
def generate_novel_directory(state: OverallState) -> Dict[str, str]:
|
||||
prompt = novel_directory_prompt.format(
|
||||
final_novel_setting=state["final_novel_setting"],
|
||||
number_of_chapters=state["number_of_chapters"]
|
||||
)
|
||||
response = model.invoke(prompt)
|
||||
if not response:
|
||||
logging.warning("generate_novel_directory: No response.")
|
||||
return {"novel_directory": ""}
|
||||
return {"novel_directory": response.content.strip()}
|
||||
|
||||
# 构建状态图
|
||||
graph = StateGraph(OverallState)
|
||||
graph.add_node("generate_base_setting", generate_base_setting)
|
||||
graph.add_node("generate_character_setting", generate_character_setting)
|
||||
@@ -107,6 +196,7 @@ def Novel_novel_directory_generate(
|
||||
graph.add_node("finalize_novel_setting", finalize_novel_setting)
|
||||
graph.add_node("generate_novel_directory", generate_novel_directory)
|
||||
|
||||
# 注意修正此处节点名称
|
||||
graph.add_edge(START, "generate_base_setting")
|
||||
graph.add_edge("generate_base_setting", "generate_character_setting")
|
||||
graph.add_edge("generate_character_setting", "generate_dark_lines")
|
||||
@@ -125,78 +215,35 @@ def Novel_novel_directory_generate(
|
||||
result = app.invoke(input_params)
|
||||
|
||||
if not result:
|
||||
print("⚠️ invoke() 结果为空,生成失败。")
|
||||
logging.warning("Novel_novel_directory_generate: invoke() 结果为空,生成失败。")
|
||||
return
|
||||
|
||||
final_novel_setting = result.get("final_novel_setting", "")
|
||||
final_novel_directory = result.get("novel_directory", "")
|
||||
|
||||
if not final_novel_setting or not final_novel_directory:
|
||||
print("⚠️ 生成失败:缺少 final_novel_setting 或 novel_directory。")
|
||||
logging.warning("生成失败:缺少 final_novel_setting 或 novel_directory。")
|
||||
return
|
||||
|
||||
# 写入文件
|
||||
filename_set = os.path.join(filepath, "Novel_setting.txt")
|
||||
filename_novel_directory = os.path.join(filepath, "Novel_directory.txt")
|
||||
|
||||
final_novel_setting_cleaned = final_novel_setting.replace('#', '').replace('*', '')
|
||||
final_novel_directory_cleaned = final_novel_directory.replace('#', '').replace('*', '')
|
||||
# 清理文本(去除多余 # 或 * 等)
|
||||
def clean_text(txt: str) -> str:
|
||||
return txt.replace('#', '').replace('*', '')
|
||||
|
||||
final_novel_setting_cleaned = clean_text(final_novel_setting)
|
||||
final_novel_directory_cleaned = clean_text(final_novel_directory)
|
||||
|
||||
# 以追加方式保存;如果希望覆盖可改为 save_string_to_txt()
|
||||
append_text_to_file(final_novel_setting_cleaned, filename_set)
|
||||
append_text_to_file(final_novel_directory_cleaned, filename_novel_directory)
|
||||
|
||||
|
||||
# =============== 生成章节(含角色状态 & 全局摘要 & 向量检索) ===============
|
||||
|
||||
def init_vector_store(api_key: str, texts: list[str]) -> Chroma:
|
||||
"""
|
||||
初始化并返回一个Chroma向量库,将传入的文本进行嵌入。
|
||||
若需要可对 texts 做分句或分块处理;这里只演示简单用法。
|
||||
"""
|
||||
embeddings = OpenAIEmbeddings(openai_api_key=api_key)
|
||||
documents = [Document(page_content=t) for t in texts]
|
||||
vectorstore = Chroma.from_documents(documents, embedding=embeddings, persist_directory=VECTOR_STORE_DIR)
|
||||
vectorstore.persist()
|
||||
return vectorstore
|
||||
|
||||
def load_vector_store(api_key: str) -> Chroma:
|
||||
"""
|
||||
读取已存在的向量库。若不存在则返回None或新建一个空的。
|
||||
"""
|
||||
if not os.path.exists(VECTOR_STORE_DIR):
|
||||
return None
|
||||
embeddings = OpenAIEmbeddings(openai_api_key=api_key)
|
||||
return Chroma(persist_directory=VECTOR_STORE_DIR, embedding_function=embeddings)
|
||||
logging.info("Novel settings and directory generated successfully.")
|
||||
|
||||
|
||||
def update_vector_store(api_key: str, new_chapter: str):
|
||||
"""
|
||||
将最新章节文本插入到向量库里,用于后续检索参考。
|
||||
可根据实际需求做分块处理。此处仅作简单示范。
|
||||
"""
|
||||
store = load_vector_store(api_key)
|
||||
if not store:
|
||||
# 如果vector store不存在,先初始化
|
||||
store = init_vector_store(api_key, [new_chapter])
|
||||
return
|
||||
|
||||
embeddings = OpenAIEmbeddings(openai_api_key=api_key)
|
||||
new_doc = Document(page_content=new_chapter)
|
||||
store.add_documents([new_doc])
|
||||
store.persist()
|
||||
|
||||
|
||||
def get_relevant_context_from_vector_store(api_key: str, query: str, k: int=2) -> str:
|
||||
"""
|
||||
从向量库中检索与 query 最相关的 k 条文本,拼接后返回。
|
||||
用于在生成大纲或写正文时,为大模型提供更多上下文。
|
||||
"""
|
||||
store = load_vector_store(api_key)
|
||||
if not store:
|
||||
return ""
|
||||
docs = store.similarity_search(query, k=k)
|
||||
# 简单拼接
|
||||
combined = "\n".join([d.page_content for d in docs])
|
||||
return combined
|
||||
# ============ 生成章节(每章独立文件) ============
|
||||
|
||||
def generate_chapter_with_state(
|
||||
novel_settings: str,
|
||||
@@ -213,11 +260,25 @@ def generate_chapter_with_state(
|
||||
多步流程:
|
||||
1) 更新/创建全局摘要
|
||||
2) 更新/生成角色状态文档
|
||||
3) 根据向量检索获取往期章节相关内容
|
||||
3) 向量检索获取往期上下文
|
||||
4) 大纲 -> 正文
|
||||
5) 更新向量库
|
||||
最终写入 chapter.txt、lastchapter.txt、character_state.txt、global_summary.txt
|
||||
5) 写入 chapter_{novel_number}.txt, 更新 lastchapter.txt
|
||||
6) 更新向量库
|
||||
|
||||
:param novel_settings: 最终的作品设定(字符串)
|
||||
:param novel_novel_directory: 小说目录信息(此处暂时未使用,可根据需求做扩展)
|
||||
:param api_key: OpenAI API Key
|
||||
:param base_url: OpenAI Base URL
|
||||
:param model_name: LLM 模型名称
|
||||
:param novel_number: 当前要生成的章节号
|
||||
:param filepath: 文件存放的目录
|
||||
:param word_number: 单章目标字数
|
||||
:param lastchapter: 上一章内容(若为空字符串,表示无上一章)
|
||||
:return: 本章生成的正文内容
|
||||
"""
|
||||
# 确保文件夹存在
|
||||
os.makedirs(filepath, exist_ok=True)
|
||||
|
||||
model = ChatOpenAI(
|
||||
model=model_name,
|
||||
api_key=api_key,
|
||||
@@ -225,35 +286,44 @@ def generate_chapter_with_state(
|
||||
temperature=0.9
|
||||
)
|
||||
|
||||
# --- 文件名定义 ---
|
||||
# --- 文件路径定义 ---
|
||||
chapters_dir = os.path.join(filepath, "chapters")
|
||||
os.makedirs(chapters_dir, exist_ok=True)
|
||||
|
||||
chapter_file = os.path.join(chapters_dir, f"chapter_{novel_number}.txt")
|
||||
lastchapter_file = os.path.join(filepath, "lastchapter.txt")
|
||||
character_state_file = os.path.join(filepath, "character_state.txt")
|
||||
global_summary_file = os.path.join(filepath, "global_summary.txt")
|
||||
chapter_file = os.path.join(filepath, "chapter.txt")
|
||||
lastchapter_file = os.path.join(filepath, "lastchapter.txt")
|
||||
|
||||
# --- 读取现有文档(可能为空) ---
|
||||
old_char_state = read_file(character_state_file)
|
||||
old_global_summary = read_file(global_summary_file)
|
||||
|
||||
# --- 1) 更新全局摘要 (若上一章文本不为空) ---
|
||||
# 1) 更新全局摘要
|
||||
def update_global_summary(chapter_text: str, old_summary: str) -> str:
|
||||
prompt = summary_prompt.format(chapter_text=chapter_text, global_summary=old_summary)
|
||||
prompt = summary_prompt.format(
|
||||
chapter_text=chapter_text,
|
||||
global_summary=old_summary
|
||||
)
|
||||
response = model.invoke(prompt)
|
||||
if not response:
|
||||
logging.warning("update_global_summary: No response.")
|
||||
return old_summary
|
||||
return response.content.strip()
|
||||
|
||||
if lastchapter.strip():
|
||||
# 用上一章内容更新全局摘要
|
||||
new_global_summary = update_global_summary(lastchapter, old_global_summary)
|
||||
else:
|
||||
new_global_summary = old_global_summary
|
||||
|
||||
# --- 2) 更新角色状态文档 ---
|
||||
# 2) 更新角色状态文档
|
||||
def update_character_state(chapter_text: str, old_state: str) -> str:
|
||||
prompt = update_character_state_prompt.format(chapter_text=chapter_text, old_state=old_state)
|
||||
prompt = update_character_state_prompt.format(
|
||||
chapter_text=chapter_text,
|
||||
old_state=old_state
|
||||
)
|
||||
response = model.invoke(prompt)
|
||||
if not response:
|
||||
logging.warning("update_character_state: No response.")
|
||||
return old_state
|
||||
return response.content.strip()
|
||||
|
||||
@@ -262,13 +332,19 @@ def generate_chapter_with_state(
|
||||
else:
|
||||
new_char_state = old_char_state
|
||||
|
||||
# --- 3) 从向量库检索相关上下文,用来帮助生成新的大纲 ---
|
||||
# 例如,可以根据“角色状态”或“本章关键词”来查询。
|
||||
# 简单示范:以 "回顾剧情" 作为检索Query
|
||||
relevant_context = get_relevant_context_from_vector_store(api_key, "回顾剧情", k=2)
|
||||
# 3) 从向量库检索上下文
|
||||
relevant_context = get_relevant_context_from_vector_store(
|
||||
api_key, base_url, "回顾剧情", k=2 # <-- 多传一个 base_url
|
||||
)
|
||||
|
||||
# --- 4) 大纲 -> 正文 ---
|
||||
def outline_chapter(novel_setting: str, char_state: str, global_summary: str, chap_num: int, extra_context: str) -> str:
|
||||
# 4) 生成大纲
|
||||
def outline_chapter(
|
||||
novel_setting: str,
|
||||
char_state: str,
|
||||
global_summary: str,
|
||||
chap_num: int,
|
||||
extra_context: str
|
||||
) -> str:
|
||||
prompt = chapter_outline_prompt.format(
|
||||
novel_setting=novel_setting,
|
||||
character_state=char_state + "\n\n【历史上下文】\n" + extra_context,
|
||||
@@ -277,12 +353,23 @@ def generate_chapter_with_state(
|
||||
)
|
||||
response = model.invoke(prompt)
|
||||
if not response:
|
||||
logging.warning("outline_chapter: No response.")
|
||||
return ""
|
||||
return response.content.strip()
|
||||
|
||||
chap_outline = outline_chapter(novel_settings, new_char_state, new_global_summary, novel_number, relevant_context)
|
||||
chap_outline = outline_chapter(
|
||||
novel_settings, new_char_state, new_global_summary, novel_number, relevant_context
|
||||
)
|
||||
|
||||
def write_chapter(novel_setting: str, char_state: str, global_summary: str, outline: str, wnum: int, extra_context: str) -> str:
|
||||
# 5) 生成正文
|
||||
def write_chapter(
|
||||
novel_setting: str,
|
||||
char_state: str,
|
||||
global_summary: str,
|
||||
outline: str,
|
||||
wnum: int,
|
||||
extra_context: str
|
||||
) -> str:
|
||||
prompt = chapter_write_prompt.format(
|
||||
novel_setting=novel_setting,
|
||||
character_state=char_state + "\n\n【历史上下文】\n" + extra_context,
|
||||
@@ -292,26 +379,38 @@ def generate_chapter_with_state(
|
||||
)
|
||||
response = model.invoke(prompt)
|
||||
if not response:
|
||||
logging.warning("write_chapter: No response.")
|
||||
return ""
|
||||
return response.content.strip()
|
||||
|
||||
chapter_content = write_chapter(novel_settings, new_char_state, new_global_summary, chap_outline, word_number, relevant_context)
|
||||
chapter_content = write_chapter(
|
||||
novel_settings,
|
||||
new_char_state,
|
||||
new_global_summary,
|
||||
chap_outline,
|
||||
word_number,
|
||||
relevant_context
|
||||
)
|
||||
|
||||
# 写入文件并更新记录
|
||||
if chapter_content:
|
||||
# --- 写入 chapter.txt 与 lastchapter.txt ---
|
||||
append_text_to_file(chapter_content, chapter_file)
|
||||
save_string_to_txt(chapter_content, chapter_file)
|
||||
|
||||
# 更新 lastchapter.txt
|
||||
clear_file_content(lastchapter_file)
|
||||
save_string_to_txt(chapter_content, lastchapter_file)
|
||||
|
||||
# --- 更新全局摘要、角色状态到文件 ---
|
||||
# 更新角色状态、全局摘要
|
||||
clear_file_content(character_state_file)
|
||||
save_string_to_txt(new_char_state, character_state_file)
|
||||
|
||||
clear_file_content(global_summary_file)
|
||||
save_string_to_txt(new_global_summary, global_summary_file)
|
||||
|
||||
# --- 5) 更新向量检索库 ---
|
||||
update_vector_store(api_key, chapter_content)
|
||||
# 6) 更新向量检索库
|
||||
update_vector_store(api_key, base_url, chapter_content)
|
||||
logging.info(f"Chapter {novel_number} generated successfully.")
|
||||
else:
|
||||
logging.warning(f"Chapter {novel_number} generation failed.")
|
||||
|
||||
return chapter_content
|
||||
|
||||
Reference in New Issue
Block a user