Skip to content

【已审核】feat(agent): 会话标题自动跟随话题更新#1144

Open
climashscape wants to merge 1 commit into
proma-ai:mainfrom
climashscape:feat/progressive-title-update
Open

【已审核】feat(agent): 会话标题自动跟随话题更新#1144
climashscape wants to merge 1 commit into
proma-ai:mainfrom
climashscape:feat/progressive-title-update

Conversation

@climashscape

@climashscape climashscape commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

概述

让会话标题"活"起来——当你的对话悄悄换了话题,标题会自动跟上,不用手动改。

场景

你跟 Agent 聊着聊着,话题漂移了——从"怎么写这个 API"滑到了"数据库索引怎么优化"。再看侧边栏,标题还停在最初的"帮我写 API",已经和对话内容脱节了。

这个 PR 解决的问题就是:让标题自己去追对话

怎么运作的

不是每轮都检测(那样太吵),而是设了四道闸门,过了才查:

第 1 关:是普通会话吗?(子会话/定时任务不参与)
第 2 关:用户在设置里开了吗?
第 3 关:用户手动改过标题吗?(尊重用户意图,手动改的标题不覆盖)
第 4 关:至少聊了 5 轮以上,值得看一眼了
     ↓ 全部通过
  取最近 12 条对话,生成摘要 → 发给 LLM
     ↓
  标题一样?→ 静默跳过
  标题变了?→ 自动更新 ✨

防误判:标题比对前会 normalizeTitle — 全角半角统一、空白折叠、标点全删。比如「帮我写 API!」和「帮我写API」不会因为一个叹号和空格就被判成"漂移"。更新后的标题还会过一道 sanitizeTitleOutput,防止弱模型把 prompt 指令(「只输出标题」「不要废话」之类)当标题吐出来。

防竞态:LLM 调用期间如果你又发了新消息,旧的标题结果会自动作废(CAS 机制)——不会拿过期的标题覆盖你正在进行的新话题。

怎么用

自动模式(默认开启):什么也不用做。聊着聊着话题变了,标题自己更新,侧边栏会弹一个安静的 toast「标题已自动更新为:…」。

手动触发:顶栏 AgentHeader 右边多了个 ✨ 按钮。点一下就立即检测——如果标题已经准确,会告诉你「标题已反映当前话题」;如果需要更新,即刻重生成。重生成后还有撤销按钮,万一不满意一键回退。

个性化设置

  • 不想自动更新?设置页关掉开关
  • 想用特定模型写标题?可以指定标题专用模型(渠道 + 模型独立选),和对话用的模型分开

手动改标题的尊重:如果你自己点击标题编辑,系统会记住"这是用户亲手改的",不再自动覆盖——直到你主动点 ✨ 重生成,才算"重新交给系统"。

其他细节

  • 流以错误终止时不触发漂移检测(都崩了就别折腾标题了)
  • 每轮对话自动记下当前渠道/模型到元数据,保证老会话首次发消息后也能正确解析标题模型
  • 标题生成时强制关闭 thinking/思维链(避免模型把推理过程写进标题)

改动

文件 增/删 说明
packages/shared/src/types/agent.ts +37 AgentGenerateTitleInput 扩展(messages / currentTitle / isManualRegen)、RegenerateTitleResult 类型、lastTitleTurn / titleManualOverride 元数据字段、REGENERATE_TITLE 通道常量
packages/shared/package.json +1/-1 版本 0.1.41 → 0.1.43
apps/electron/src/main/lib/agent-orchestrator.ts +403 核心引擎:漂移常量、消息提取/计数/摘要构建、normalizeTitle / sanitizeTitleOutput、标题模型解析、双模式 generateTitle、四道闸门 maybeRefreshTitle、CAS 并发安全、手动 regenerateTitle(6 种终止原因)、autoGenerateTitle 防护、completedWithError 守卫、runAgent 元数据持久化
apps/electron/src/main/lib/agent-service.ts +12 regenerateAgentTitle 导出;onTitleUpdated 新增 isAuto 参数
apps/electron/src/main/lib/agent-session-manager.ts +2 meta 更新 Pick 追加 lastTitleTurn / titleManualOverride
apps/electron/src/main/lib/settings-service.ts +3 progressiveTitleUpdateEnabled 默认 true
apps/electron/src/main/ipc.ts +22 REGENERATE_TITLE handler + 全窗口广播 + UPDATE_TITLE 追加 manual override 标记
apps/electron/src/preload/index.ts +9 regenerateAgentTitle 桥接;onAgentTitleUpdated 签名扩展
apps/electron/src/types/settings.ts +6 3 个新设置字段类型
apps/electron/src/renderer/atoms/ui-preferences.ts +44 3 个持久化 atom + 初始化函数
apps/electron/src/renderer/components/agent/AgentHeader.tsx +85 ✨ 重生成按钮(6 种 toast + 撤销 action)+ regenerating 期间禁用编辑 + 会话类型闸门
apps/electron/src/renderer/components/settings/GeneralSettings.tsx +50 开关 + 标题专用模型选择器
apps/electron/src/renderer/hooks/useGlobalAgentListeners.ts +6 自动漂移低打扰 toast
apps/electron/src/renderer/main.tsx +20 UiPreferencesInitializer 扩展
packages/core/src/providers/anthropic-adapter.ts +6/-5 标题生成无条件禁用 thinking(body.thinking = { type: 'disabled' }),避免思维链污染标题

测试

  • TypeCheck 全包通过(6/6)
  • BDD 自审查通过(4 视角并行审查:核心逻辑 / IPC 通道 / UI 状态管理 / 架构一致性)
  • 体验完整性审查通过(7 条旅程:新会话首条标题、话题漂移自动更新、手动重生成、老会话升级兼容、设置开关交互、并发竞态、多窗口同步)

紧急度

常规

备注

Closes #1079

@climashscape
climashscape force-pushed the feat/progressive-title-update branch 7 times, most recently from 69d4cfb to bfce0b2 Compare July 12, 2026 07:19
@climashscape climashscape changed the title 【等待审核】feat(agent): 渐进式标题更新——话题漂移自动重生 + 专用模型配置 【已审核】feat(agent): 渐进式标题更新——话题漂移自动重生 + 专用模型配置 Jul 12, 2026
@climashscape climashscape changed the title 【已审核】feat(agent): 渐进式标题更新——话题漂移自动重生 + 专用模型配置 【已审核】feat(agent): 会话标题自动跟随话题更新 Jul 12, 2026
@climashscape
climashscape marked this pull request as ready for review July 12, 2026 08:16
@climashscape
climashscape force-pushed the feat/progressive-title-update branch from 4d8b35f to 5d0a872 Compare July 12, 2026 08:43
实现渐进式会话标题更新:流完成后自动检测话题漂移并重新生成标题,
支持手动重生成(AgentHeader Sparkles 按钮),带节流/CAS锁/会话类型闸门。

核心功能:
- maybeRefreshTitle:三道闸门(会话类型→设置开关→节流),completeRun 后 fire-and-forget
- regenerateTitle:用户手动触发,专用 REGENERATE_TITLE_PROMPT 强制生成新标题
- titleManualOverride:用户手动编辑标题后跳过自动漂移,手动重生成后清除
- autoGenerateTitle:首条标题统一走 resolveTitleModel 模型解析路径
- sanitizeTitleOutput:黑名单滤除 prompt 指令回显,失败后静默重试极简 prompt
- 设置页:渐进式开关 + 标题专用模型选择(ModelSelector)

UX 改进:
- 自动漂移更新 toast 低打扰通知(isAuto 标志)
- 手动重生成 toast 带「撤销」按钮
- Pencil 编辑按钮不因 regenerating 锁定
- 设置描述去绝对化("始终"→"话题变化时")
@climashscape
climashscape force-pushed the feat/progressive-title-update branch from 5d0a872 to 3961ac0 Compare July 12, 2026 09:21
@climashscape

Copy link
Copy Markdown
Contributor Author
图片

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

会话标题应在对话推进中渐进式更新,而非仅首条消息生成一次

1 participant