From e2d03b587d2a477fd91e9246bf83a5a6625951f2 Mon Sep 17 00:00:00 2001 From: bridge Date: Sat, 3 Jan 2026 21:25:24 +0800 Subject: [PATCH] refactor world desc --- src/classes/avatar/action_mixin.py | 7 +++++ src/classes/mutual_action/mutual_action.py | 3 +++ src/classes/nickname.py | 1 + src/classes/single_choice.py | 2 ++ src/classes/story_teller.py | 5 ++-- src/classes/world.py | 30 ++++++++++++---------- static/templates/mutual_action.txt | 3 +++ static/templates/nickname.txt | 3 +++ static/templates/single_choice.txt | 3 +++ static/templates/story_dual.txt | 3 +++ static/templates/story_single.txt | 3 +++ 11 files changed, 47 insertions(+), 16 deletions(-) diff --git a/src/classes/avatar/action_mixin.py b/src/classes/avatar/action_mixin.py index 96321e2..e5748d0 100644 --- a/src/classes/avatar/action_mixin.py +++ b/src/classes/avatar/action_mixin.py @@ -87,6 +87,13 @@ class ActionMixin: ) continue # 再验证 + if not isinstance(plan.params, dict): + get_logger().logger.warning( + "非法参数: Avatar(name=%s) 动作 %s 参数类型错误: %s", + self.name, plan.action_name, type(plan.params) + ) + continue + params_for_can_start = filter_kwargs_for_callable(action.can_start, plan.params) can_start, reason = action.can_start(**params_for_can_start) if not can_start: diff --git a/src/classes/mutual_action/mutual_action.py b/src/classes/mutual_action/mutual_action.py index b06c628..e2e605a 100644 --- a/src/classes/mutual_action/mutual_action.py +++ b/src/classes/mutual_action/mutual_action.py @@ -71,10 +71,13 @@ class MutualAction(DefineAction, LLMAction, ActualActionMixin, TargetingMixin): avatar_name_2: target_avatar.get_info(detailed=False), } + world_info = self.world.static_info + feedback_actions = self.FEEDBACK_ACTIONS desc = self.DESC action_name = self.ACTION_NAME return { + "world_info": world_info, "avatar_infos": avatar_infos, "avatar_name_1": avatar_name_1, "avatar_name_2": avatar_name_2, diff --git a/src/classes/nickname.py b/src/classes/nickname.py index f227127..565a71e 100644 --- a/src/classes/nickname.py +++ b/src/classes/nickname.py @@ -71,6 +71,7 @@ async def generate_nickname(avatar: "Avatar") -> Optional[dict]: # 准备模板参数 template_path = CONFIG.paths.templates / "nickname.txt" infos = { + "world_info": avatar.world.static_info, "avatar_info": expanded_info, } diff --git a/src/classes/single_choice.py b/src/classes/single_choice.py index 2390442..7411e05 100644 --- a/src/classes/single_choice.py +++ b/src/classes/single_choice.py @@ -33,10 +33,12 @@ async def make_decision( # 3. 调用 AI template_path = CONFIG.paths.templates / "single_choice.txt" + world_info = avatar.world.static_info result = await call_llm_with_task_name( "single_choice", template_path, infos={ + "world_info": world_info, "avatar_infos": avatar_infos, "choices": full_choices_str } diff --git a/src/classes/story_teller.py b/src/classes/story_teller.py index 1b8f216..83399be 100644 --- a/src/classes/story_teller.py +++ b/src/classes/story_teller.py @@ -65,11 +65,11 @@ class StoryTeller: """构建模板渲染所需的数据字典""" # 默认空关系列表 - possible_new_relations = [] - possible_cancel_relations = [] avatar_name_1 = "" avatar_name_2 = "" + world_info = actors[0].world.static_info + # 如果有两个有效角色,计算可能的关系 non_null = [a for a in actors if a is not None] if len(non_null) >= 2: @@ -77,6 +77,7 @@ class StoryTeller: avatar_name_2 = non_null[1].name return { + "world_info": world_info, "avatar_infos": avatar_infos, "avatar_name_1": avatar_name_1, "avatar_name_2": avatar_name_2, diff --git a/src/classes/world.py b/src/classes/world.py index deb4931..371f16d 100644 --- a/src/classes/world.py +++ b/src/classes/world.py @@ -33,7 +33,7 @@ class World(): world_info = {**map_info, **static_info} if self.current_phenomenon: - world_info["天地灵机"] = f"【{self.current_phenomenon.name}】{self.current_phenomenon.desc}" + world_info["当前天地灵机"] = f"【{self.current_phenomenon.name}】{self.current_phenomenon.desc}" return world_info @@ -45,16 +45,18 @@ class World(): @property def static_info(self) -> dict: - desc = """这是一个诸多修士竞相修行的修仙世界。 -修仙的境界从弱到强:练气、筑基、金丹、元婴。每个境界分前期、中期、后期。境界间差距很大。 -寿元:每个角色均有寿元,超过寿元后容易老死。提升境界和某些宝物、丹药能提高寿元。 -死亡:HP降至0以下也会死亡。 -区域:不同区域有不同效果,在适当的区域做适当的事情事半功倍。 -修炼:修炼可以增加经验,直到到达突破前的瓶颈。突破是概率事件,突破后会进入下一个境界。 -灵根:决定了你与天地灵气的亲和度。在与自身灵根属性匹配的区域(如火灵根在火属性洞府)修炼,效率最高。 -天地灵机:世界每隔数年会有一次天象变动(如灵气潮汐),影响角色能力。 -灵石:修仙界的通用货币。可用于购买法宝丹药,通过采集、交易或掠夺获取。 -宗门:修士的庇护所。加入宗门可习得独门功法、获同门庇护;散修自由但资源匮乏。 -战斗:弱肉强食。境界压制极大,高境界者对低境界者有绝对优势。若对方死亡,胜者可掠夺败者财物。 -动作:你有一系列可以执行的动作。要注意动作的效果、限制条件、区域和时间。""" - return {"世界描述": desc} \ No newline at end of file + desc = { + "简介": "这是一个诸多修士竞相修行的修仙世界。", + "境界": "修仙的境界从弱到强:练气、筑基、金丹、元婴。每个境界分前期、中期、后期。境界间差距很大。", + "寿元": "每个角色均有寿元,超过寿元后容易老死。提升境界和某些宝物、丹药能提高寿元。", + "死亡": "HP降至0以下也会死亡。", + "区域": "不同区域有不同效果,在适当的区域做适当的事情事半功倍。", + "修炼": "修炼可以增加经验,直到到达突破前的瓶颈。突破是概率事件,突破后会进入下一个境界。", + "灵根": "决定了你与天地灵气的亲和度。在与自身灵根属性匹配的区域(如火灵根在火属性洞府)修炼,效率最高。", + "天地灵机": "世界每隔数年会有一次天象变动(如灵气潮汐),影响角色能力。", + "灵石": "修仙界的通用货币。可用于购买法宝丹药,通过采集、交易或掠夺获取。", + "宗门": "修士的庇护所。加入宗门可习得独门功法、获同门庇护;散修自由但资源匮乏。", + "战斗": "弱肉强食。境界压制极大,高境界者对低境界者有绝对优势。若对方死亡,胜者可掠夺败者财物。", + "动作": "你有一系列可以执行的动作。要注意动作的效果、限制条件、区域和时间。" + } + return desc \ No newline at end of file diff --git a/static/templates/mutual_action.txt b/static/templates/mutual_action.txt index 5c33fbe..1c837b9 100644 --- a/static/templates/mutual_action.txt +++ b/static/templates/mutual_action.txt @@ -1,5 +1,8 @@ 你是一个决策者,这是一个仙侠世界,你负责来决定两个NPC的下一步行为。 +世界背景: +{world_info} + 你需要进行决策的NPC的dict[AvatarName, info]为 {avatar_infos} diff --git a/static/templates/nickname.txt b/static/templates/nickname.txt index c6ea599..5941bf1 100644 --- a/static/templates/nickname.txt +++ b/static/templates/nickname.txt @@ -1,5 +1,8 @@ 你是一个仙侠世界的故事家,负责为修仙界人物起绰号。 +世界背景: +{world_info} + 绰号是修仙界中对一个人物的评价和称谓,要求: 1. 符合修仙世界观,具有仙侠风格 2. 可以有多种不同角度,比如角色的性格、行为、事迹、关系、武器、长相、功法、宗门等 diff --git a/static/templates/single_choice.txt b/static/templates/single_choice.txt index 8f05e2f..8d3b02e 100644 --- a/static/templates/single_choice.txt +++ b/static/templates/single_choice.txt @@ -1,5 +1,8 @@ 你是一个决策者,这是一个修仙世界,你需要帮一个修仙者做一个决策。 +世界背景: +{world_info} + 你需要进行决策的NPC的dict[AvatarName, info]为 {avatar_infos} diff --git a/static/templates/story_dual.txt b/static/templates/story_dual.txt index 3d78168..db176d2 100644 --- a/static/templates/story_dual.txt +++ b/static/templates/story_dual.txt @@ -1,5 +1,8 @@ 你是一个小说家,这是一个仙侠世界,你需要把一个事件扩展为一个约200~500字的故事。 +世界背景: +{world_info} + 你需要进行决策的NPC的dict[AvatarName, info]为 {avatar_infos} diff --git a/static/templates/story_single.txt b/static/templates/story_single.txt index 6c4ace9..faf3eeb 100644 --- a/static/templates/story_single.txt +++ b/static/templates/story_single.txt @@ -1,5 +1,8 @@ 你是一个小说家,这是一个仙侠世界,你需要把一个事件扩展为一个约200~500字的故事。 +世界背景: +{world_info} + 你需要进行决策的NPC的dict[AvatarName, info]为 {avatar_infos}