chore: persist auto-generated titles via prompt file

This commit is contained in:
JOJO 2025-12-30 09:59:01 +08:00
parent 5bdbfa138e
commit 1efd6aa0d3
3 changed files with 28 additions and 17 deletions

View File

@ -0,0 +1,13 @@
### 任务:
生成一个简洁的、3-5个词的标题并包含一个emoji用于总结聊天内容。
### 指导原则:
- 标题应清晰代表主要话题
- 使用与话题相关且单个的emoji
- 保持简洁3-5个词
- 清晰度优先于创意
- 使用用户输入的语言回复
- 不需要回答用户的问题,不需要补充任何信息,只需要生成标题
### 输出格式:
仅输出标题本身,不要附加解释。

View File

@ -334,6 +334,9 @@ class ConversationManager:
return False
data["title"] = title
data["updated_at"] = datetime.now().isoformat()
meta = data.get("metadata", {}) or {}
meta["title_locked"] = True
data["metadata"] = meta
self._save_conversation_file(conversation_id, data)
self._update_index(conversation_id, data)
if self.current_conversation_id == conversation_id:
@ -431,10 +434,12 @@ class ConversationManager:
existing_data["messages"] = messages
existing_data["updated_at"] = datetime.now().isoformat()
# 更新标题(如果消息发生变化)
new_title = self._extract_title_from_messages(messages)
if new_title != "新对话":
existing_data["title"] = new_title
# 更新标题(如未锁定自动标题时,仍按首条消息回退)
title_locked = existing_data.get("metadata", {}).get("title_locked", False)
if not title_locked:
new_title = self._extract_title_from_messages(messages)
if new_title != "新对话":
existing_data["title"] = new_title
# 更新元数据
if project_path is not None:

View File

@ -181,18 +181,7 @@ LAST_ACTIVE_FILE = Path(LOGS_DIR).expanduser().resolve() / "last_active.json"
_last_active_lock = threading.Lock()
_last_active_cache: Dict[str, float] = {}
_idle_reaper_started = False
TITLE_PROMPT = """### 任务:
生成一个简洁的3-5个词的标题并包含一个emoji用于总结聊天内容
### 指导原则:
- 标题应清晰代表主要话题
- 使用与话题相关且单个的emoji
- 保持简洁3-5个词
- 清晰度优先于创意
- 使用用户输入的语言回复
### 输出格式:
仅输出标题本身不要附加解释"""
TITLE_PROMPT_PATH = Path(__file__).resolve().parent / "prompts" / "title_generation_prompt.txt"
def sanitize_filename_preserve_unicode(filename: str) -> str:
@ -303,8 +292,12 @@ async def _generate_title_async(user_message: str) -> Optional[str]:
if not user_message:
return None
client = DeepSeekClient(thinking_mode=False, web_mode=True)
try:
prompt_text = TITLE_PROMPT_PATH.read_text(encoding="utf-8")
except Exception:
prompt_text = "生成一个简洁的、3-5个词的标题并包含单个emoji使用用户的语言直接输出标题。"
messages = [
{"role": "system", "content": TITLE_PROMPT},
{"role": "system", "content": prompt_text},
{"role": "user", "content": user_message}
]
try: