使用 @ 提及即时切换模型对话

日期: 2025年9月16日
功能: 在消息里直接点名模型,让下一条回复换成对应模型
上线耗时: 约 1 天

🎯 为什么要做这个功能

长对话默认绑定同一个模型可以保持语境一致,但如果临时想问问别的模型,就必须反复打开设置面板切换:

  1. 打开会话设置
  2. 改掉默认模型
  3. 发送问题等待回答
  4. 再切回原来的默认模型

当你需要对比不同供应商、或者只想用某个模型补一句答案时,这套流程既慢又容易忘记切回来。我们希望它像标记同事一样轻松。

💡 功能概述

现在在消息中输入 @模型名 就能临时“劫持”本次请求,回复会来自被点名的模型,而会话默认模型完全不动。

  • 提及单个模型(例如 @gpt-4o-mini)即可只改动本条信息。
  • 连续提及多个模型(例如 @openrouter/claude-3.5-sonnet @llama3)可以一次性并行提问。
  • 不写 @ 时仍使用会话默认模型,体验与之前一致。

输入框在你键入 @ 后会弹出模型家族与实时搜索,并支持键盘导航,不必死记硬背模型 ID。

🔍 核心实现细节

1. 解析提及同时保持提示干净

ChatInputBox.vue 在用户输入时同步解析提及,将结果记录在 hijackedModels,并把原始文本里的 @模型 去掉,生成 sanitizedContent。服务器收到的就是这份干净内容,模型提示里不会留下 @claude 一类的符号。

2. 单条消息生效的覆盖策略

Chat.vue 在发送前先看 hijackedModels 是否存在。一旦检测到,就只对本次请求临时替换模型;会话侧栏的默认配置完全不会被修改。消息历史也会使用 sanitizedContent,确保回放时内容干净。

3. 提及在界面上是“一等公民”

我们更新了 ModelMentionText.vue,无论是简单模型名还是 openrouter/claude-3.5-sonnet 这样的命名空间,都能渲染成统一的徽标。自动生成标题的逻辑同样读取去除提及后的文本,不会把对话命名成“@gpt-4o mini 讨论”。

✅ 最终效果

  • 一键临时切换模型,默认配置安全无副作用。
  • 键盘即可操作,适合高频对比不同模型。
  • 消息记录与模型提示保持整洁,即使用户频繁提及模型。

现在就试试:在输入框里输入 @,选择一个模型,享受无阻力的模型对比体验。