/model 切过去就回不来了?现在一条 /model reset 回到默认模型,对话不丢


上周你想试试一个新模型,于是在会话里敲了 /model,切过去,用了十分钟。试完想回原来的模型,你改了 config.yaml 里的默认值,甚至重启了网关——结果这个会话还是跑在新模型上。最后你只好 /new,然后眼睁睁看着攒了两天的上下文一起消失。

这不是幻觉,也不是缓存没刷。/model 在会话里做的那次切换,是记在会话上的钉子:它被写进会话存储(桌面上还有一行会话记录),优先级高于你之后对默认模型的任何修改。而这颗钉子唯一的拔法,以前是开个新会话——代价是历史。

三层模型设置,谁压谁

要理解为什么会这样,得先看清模型是从哪里来的。Hermes 里其实有三层:

  1. config.yaml 的 model.default——全局默认,你平时改的就是这一层;
  2. channel_overrides——按频道/聊天单独指定模型,优先级比 config.yaml 高;
  3. 会话覆盖(session override)——你用 /model 在某个会话里临时切的模型,优先级最高,而且会持久化。

问题出在第三层的“持久化”上:它不只是当前进程里的一个变量。重启之后,会话恢复时它还在;你改 config.yaml 也不影响它,因为会话层永远先被读到。于是你会看到那种很迷惑的现象——配置里明明写着 A,这个会话却始终跑在 B 上。

以前唯一的解法是 /new:新会话没有旧钉子,自然回落到默认。代价也很直接,上下文清零。

/model reset:只拔钉子,不删历史

新合并的 /model reset 就是补这个缺口的。它不带任何参数时,做一件很具体的事:清掉当前会话的模型覆盖,让这个会话重新按“频道覆盖 → config.yaml”的顺序解析模型,对话记录原样保留。

各个界面的行为略有差别,但语义一致:

界面 具体动作
消息网关(Telegram / Discord / Slack 等) 清掉内存里的覆盖、持久化的覆盖,以及还没生效的 --once 一次性恢复;驱逐缓存的 agent,下一轮按默认路由重建;给下一轮留一条模型变更提示,避免模型还以为自己是原来那个
TUI 网关 / 桌面端(config.set model) 丢掉钉子和一次性恢复,改走配置同步切换,采用 config.yaml 的模型,并且不写回新的钉子——同时把会话行持久化,防止 session.resume 把旧钉子复活
经典 CLI 现读一次 config.yaml(不是读缓存)拿到当前默认模型;如果没有 model.default,直接告诉你没东西可回退

成功之后的提示是明确的一句话,而不是含糊的“已切换”:

Session model override cleared — now using `provider/your-default-model` (the channel/global default). Conversation history kept.

如果本来就没有钉子,它也不会假装做了什么:

No session model override is active — already using `provider/your-default-model` (the channel/global default).

CLI 上的两种边界情况各有独立文案:本来就在默认模型上,会说“已经在配置的默认模型上,没东西可重置”;config.yaml 里没有 model.default,会说“没有 model.default,没东西可回退”。

几条必须知道的规则

不许带参数。 /model reset 后面跟任何 flag 都会被拒绝,错误信息写得很直白:/model reset takes no flags — it clears this session's model override so the configured default applies again. 想切到指定模型,用 /model <名字>;想改全局默认,用 --global。两件事不要混在一条命令里。

它不是 default 的别名。 /model default 仍然按原来的语义解析(MoA 的预设里就有一个叫 default 的),所以 reset 被做成了一个独立的请求类型,而不是“切到名为 default 的模型”。如果你的某个模型 id 恰好就叫 reset,用带厂商前缀的形式(vendor/reset 或 vendor:reset)仍然可以切过去。

“默认”可能不是 config.yaml 里的那个。 因为解析顺序是 channel_overrides 优先,所以在这个频道里,/model reset 回到的是“这个频道本来该用的模型”。如果你给某个群单独配过模型,这是预期行为,不是 bug——按聊天单独指定模型 那篇里有完整的三层优先级说明。

它不改配置文件。 /model reset 只动会话层;想改全局默认,仍然是 /model <名字> --global 或者直接编辑 config.yaml。会话层和配置层是分开的,这样你才不会在测试时一不小心把所有人的默认模型改掉。

什么时候最有用

  • 试模型:切过去对比两句,不满意就 reset 回来,不用重开会话;
  • --once 用错:一次性模型本该只顶一轮,如果它被意外固化,reset 会连这个一次性恢复一起清掉;
  • 调试别人的会话:接手一个“配置改了却不生效”的会话,先 reset 一次,再看它到底跑在哪个模型上;
  • 换 provider 之后:把旧的会话钉子拔掉,新的路由才有机会生效。

状态方面也说清楚:/model reset 于 2026-11-01 合并(PR #80448),并已随 v0.22.6(2026-11-02 发布) 进入正式发行版——升级即可用;v0.22.5 及更早版本里没有这个命令。

相关阅读:模型目录信息和上下文窗口不对时怎么手工声明,见 model_overrides 配置指南;辅助模型(压缩、审批)走单独一条通道的机制,见 auxiliary 模型通道;命令本身的完整参数,见 hermes-model 命令参考。