fix: preserve conversation model_key when creating new conversation and loading existing ones

This commit is contained in:
JOJO 2026-06-19 01:08:46 +08:00
parent c2d460a706
commit fd8decc3c3

View File

@ -36,7 +36,9 @@ class WebTerminal(MainTerminal):
if conversations:
latest = conversations[0]
conv_id = latest.get("id")
if conv_id and self.context_manager.load_conversation_by_id(conv_id):
if conv_id:
result = self.load_conversation(conv_id)
if result.get("success"):
print(f"[WebTerminal] 已加载最近对话: {conv_id}")
return
@ -112,23 +114,16 @@ class WebTerminal(MainTerminal):
"""
prefer_defaults = thinking_mode is None and run_mode is None
thinking_mode_explicit = thinking_mode is not None
# 先加载个性化默认配置(用于 start_new_conversation 的 metadata
prefs = {}
preferred_model = None
if prefer_defaults:
# 优先回到个性化/默认配置;没有配置时退回快速模式 + 默认模型
try:
prefs = load_personalization_config(self.data_dir)
except Exception as exc:
prefs = {}
logger.warning("加载个性化偏好失败,将使用内置默认: %s", exc)
# 新对话视为“干净”会话,清除图片限制便于切换模型
self.context_manager.has_images = False
preferred_model = prefs.get("default_model")
try:
self.set_model(preferred_model)
except Exception as exc:
logger.warning("忽略无效默认模型 %s: %s", preferred_model, exc)
preferred_mode = prefs.get("default_run_mode")
preferred_permission_mode = prefs.get("default_permission_mode") or None
if preferred_permission_mode not in ("readonly", "approval", "auto_approval", "unrestricted"):
@ -150,7 +145,6 @@ class WebTerminal(MainTerminal):
self.set_permission_mode(preferred_permission_mode, persist=False)
except Exception:
self.set_permission_mode("unrestricted", persist=False)
thinking_mode = self.thinking_mode
if isinstance(run_mode, str):
try:
@ -169,6 +163,8 @@ class WebTerminal(MainTerminal):
thinking_mode = self.thinking_mode
try:
# 先创建新对话。start_new_conversation 会先 save_current_conversation()
# 此时 terminal.model_key 仍是旧对话的模型,避免把旧对话覆盖成默认模型。
conversation_id = self.context_manager.start_new_conversation(
project_path=self.project_path,
thinking_mode=thinking_mode,
@ -183,6 +179,32 @@ class WebTerminal(MainTerminal):
},
)
# 新对话创建完成后再应用默认模型(此时旧对话已安全保存)。
if prefer_defaults and preferred_model:
# 新对话视为“干净”会话,清除图片限制便于切换模型
self.context_manager.has_images = False
self.context_manager.has_videos = False
try:
self.set_model(preferred_model)
except Exception as exc:
logger.warning("忽略无效默认模型 %s: %s", preferred_model, exc)
# 把默认模型同步到新对话的 metadata
try:
self.context_manager.conversation_manager.save_conversation(
conversation_id=conversation_id,
messages=self.context_manager.conversation_history,
project_path=str(self.project_path),
todo_list=self.context_manager.todo_list,
thinking_mode=self.thinking_mode,
run_mode=self.run_mode,
model_key=self.model_key,
has_images=False,
has_videos=False,
)
except Exception as exc:
logger.warning("保存新对话默认模型失败: %s", exc)
# 重置相关状态
if self.thinking_mode:
self.api_client.start_new_task()
@ -240,6 +262,12 @@ class WebTerminal(MainTerminal):
self.set_network_permission(network_permission)
except Exception:
pass
saved_model_key = meta.get("model_key")
if saved_model_key:
try:
self.set_model(saved_model_key)
except Exception as exc:
logger.warning("加载对话模型 %s 失败: %s", saved_model_key, exc)
self.pending_permission_mode = str(meta.get("pending_permission_mode") or "").strip().lower() or None
self.pending_execution_mode = str(meta.get("pending_execution_mode") or "").strip().lower() or None
self.pending_network_permission = str(meta.get("pending_network_permission") or "").strip().lower() or None