From 56882f3169db6608ce0aa29b842fb3dcce187b35 Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Fri, 19 Jun 2026 17:33:52 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=96=B0=E5=BB=BA=E5=AF=B9=E8=AF=9D?= =?UTF-8?q?=E5=90=8E=E5=88=87=E6=8D=A2=E6=89=A7=E8=A1=8C=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=20prompt=20=E6=9C=AA=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:frozen_permission_prompt / frozen_execution_prompt 在对话创建时就被 提前构建并缓存到 conversation_metadata,后续切换模式后 build_messages 直接 返回旧缓存,不会根据当前模式重建。 修复: - 删除 _ensure_conversation / create_new_conversation 中提前预置冻结 prompt - conversation_manager 默认值从 '' 改为 None(空字符串会被误判为已缓存) - _get_or_init_frozen_prompt 增加非空判断(防御性加固) 冻结时机改为第一次 build_messages 懒加载,确保首次发消息前任意模式切换都生效。 --- core/main_terminal.py | 3 +-- core/main_terminal_parts/context.py | 2 +- core/web_terminal.py | 3 +-- utils/conversation_manager.py | 4 ++-- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/core/main_terminal.py b/core/main_terminal.py index 705ee67..6f396a6 100644 --- a/core/main_terminal.py +++ b/core/main_terminal.py @@ -654,8 +654,7 @@ class MainTerminal(MainTerminalCommandMixin, MainTerminalContextMixin, MainTermi "execution_mode": self.get_execution_mode(), "pending_permission_mode": None, "pending_execution_mode": None, - "frozen_permission_prompt": self._build_permission_mode_message() or "", - "frozen_execution_prompt": self._build_execution_mode_message() or "", + # frozen_*_prompt 不在创建时预设,由第一次 build_messages 根据当时的实际模式懒加载并冻结 }, ) print(f"{OUTPUT_FORMATS['info']} 新建对话: {conversation_id}") diff --git a/core/main_terminal_parts/context.py b/core/main_terminal_parts/context.py index 4461d85..6480025 100644 --- a/core/main_terminal_parts/context.py +++ b/core/main_terminal_parts/context.py @@ -211,7 +211,7 @@ class MainTerminalContextMixin: cm = getattr(self, "context_manager", None) meta = getattr(cm, "conversation_metadata", {}) if cm else {} cached = meta.get(key) if isinstance(meta, dict) else None - if isinstance(cached, str): + if isinstance(cached, str) and cached: return cached built = builder() or "" diff --git a/core/web_terminal.py b/core/web_terminal.py index 35f3ddd..65996bd 100644 --- a/core/web_terminal.py +++ b/core/web_terminal.py @@ -174,8 +174,7 @@ class WebTerminal(MainTerminal): "execution_mode": self.get_execution_mode() if hasattr(self, "get_execution_mode") else "sandbox", "pending_permission_mode": None, "pending_execution_mode": None, - "frozen_permission_prompt": self._build_permission_mode_message() or "", - "frozen_execution_prompt": self._build_execution_mode_message() or "", + # frozen_*_prompt 不在创建时预设,由第一次 build_messages 根据当时的实际模式懒加载并冻结 }, ) diff --git a/utils/conversation_manager.py b/utils/conversation_manager.py index 25f6140..b74640a 100644 --- a/utils/conversation_manager.py +++ b/utils/conversation_manager.py @@ -512,8 +512,8 @@ class ConversationManager: "execution_mode": "sandbox", "pending_permission_mode": None, "pending_execution_mode": None, - "frozen_permission_prompt": "", - "frozen_execution_prompt": "", + "frozen_permission_prompt": None, + "frozen_execution_prompt": None, "has_images": has_images, "has_videos": has_videos, # 首次对话尚未生成文件树快照,待首次用户消息时填充