使用 @ 提及即时切换模型对话
日期: 2025年9月16日
功能: 在消息里直接点名模型,让下一条回复换成对应模型
上线耗时: 约 1 天
🎯 为什么要做这个功能
长对话默认绑定同一个模型可以保持语境一致,但如果临时想问问别的模型,就必须反复打开设置面板切换:
- 打开会话设置
- 改掉默认模型
- 发送问题等待回答
- 再切回原来的默认模型
当你需要对比不同供应商、或者只想用某个模型补一句答案时,这套流程既慢又容易忘记切回来。我们希望它像标记同事一样轻松。
💡 功能概述
现在在消息中输入 @模型名 就能临时“劫持”本次请求,回复会来自被点名的模型,而会话默认模型完全不动。
- 提及单个模型(例如
@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 讨论”。
✅ 最终效果
- 一键临时切换模型,默认配置安全无副作用。
- 键盘即可操作,适合高频对比不同模型。
- 消息记录与模型提示保持整洁,即使用户频繁提及模型。
现在就试试:在输入框里输入 @,选择一个模型,享受无阻力的模型对比体验。