From 76285ecb8b25abc5426d5e10110bd5b968521ccf Mon Sep 17 00:00:00 2001 From: tcmofashi Date: Tue, 12 Aug 2025 18:42:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=AF=B9=E5=8A=A8?= =?UTF-8?q?=E4=BD=9C=E7=9A=84=E9=87=8D=E8=BD=BD=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mais4u/constant_s4u.py | 2 +- .../body_emotion_action_manager.py | 48 +++++++++++++++++-- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/mais4u/constant_s4u.py b/src/mais4u/constant_s4u.py index 8a7446405..b7892e555 100644 --- a/src/mais4u/constant_s4u.py +++ b/src/mais4u/constant_s4u.py @@ -1 +1 @@ -ENABLE_S4U = False \ No newline at end of file +ENABLE_S4U = True diff --git a/src/mais4u/mais4u_chat/body_emotion_action_manager.py b/src/mais4u/mais4u_chat/body_emotion_action_manager.py index 8e05a025e..c30fd7ba4 100644 --- a/src/mais4u/mais4u_chat/body_emotion_action_manager.py +++ b/src/mais4u/mais4u_chat/body_emotion_action_manager.py @@ -15,7 +15,8 @@ from src.mais4u.s4u_config import s4u_config logger = get_logger("action") -HEAD_CODE = { +# 使用字典作为默认值,但通过Prompt来注册以便外部重载 +DEFAULT_HEAD_CODE = { "看向上方": "(0,0.5,0)", "看向下方": "(0,-0.5,0)", "看向左边": "(-1,0,0)", @@ -26,7 +27,7 @@ HEAD_CODE = { "看向正前方": "(0,0,0)", } -BODY_CODE = { +DEFAULT_BODY_CODE = { "双手背后向前弯腰": "010_0070", "歪头双手合十": "010_0100", "标准文静站立": "010_0101", @@ -42,7 +43,44 @@ BODY_CODE = { } +def get_head_code() -> dict: + """获取头部动作代码字典""" + head_code_str = global_prompt_manager.get_prompt("head_code_prompt") + if not head_code_str: + return DEFAULT_HEAD_CODE + try: + return json.loads(head_code_str) + except Exception as e: + logger.error(f"解析head_code_prompt失败,使用默认值: {e}") + return DEFAULT_HEAD_CODE + + +def get_body_code() -> dict: + """获取身体动作代码字典""" + body_code_str = global_prompt_manager.get_prompt("body_code_prompt") + if not body_code_str: + return DEFAULT_BODY_CODE + try: + return json.loads(body_code_str) + except Exception as e: + logger.error(f"解析body_code_prompt失败,使用默认值: {e}") + return DEFAULT_BODY_CODE + + def init_prompt(): + # 注册头部动作代码 + Prompt( + json.dumps(DEFAULT_HEAD_CODE, ensure_ascii=False, indent=2), + "head_code_prompt", + ) + + # 注册身体动作代码 + Prompt( + json.dumps(DEFAULT_BODY_CODE, ensure_ascii=False, indent=2), + "body_code_prompt", + ) + + # 注册原有提示模板 Prompt( """ {chat_talking_prompt} @@ -105,7 +143,7 @@ class ChatAction: async def send_action_update(self): """发送动作更新到前端""" - body_code = BODY_CODE.get(self.body_action, "") + body_code = get_body_code().get(self.body_action, "") await send_api.custom_to_stream( message_type="body_action", content=body_code, @@ -147,7 +185,7 @@ class ChatAction: try: # 冷却池处理:过滤掉冷却中的动作 self._update_body_action_cooldown() - available_actions = [k for k in BODY_CODE.keys() if k not in self.body_action_cooldown] + available_actions = [k for k in get_body_code().keys() if k not in self.body_action_cooldown] all_actions = "\n".join(available_actions) prompt = await global_prompt_manager.format_prompt( @@ -210,7 +248,7 @@ class ChatAction: try: # 冷却池处理:过滤掉冷却中的动作 self._update_body_action_cooldown() - available_actions = [k for k in BODY_CODE.keys() if k not in self.body_action_cooldown] + available_actions = [k for k in get_body_code().keys() if k not in self.body_action_cooldown] all_actions = "\n".join(available_actions) prompt = await global_prompt_manager.format_prompt(