Skip to content

在首次使用kimi-code的tui时用 /model 切换模型到K3,底部 的上下文上限ui不刷新,仍显示上一个模型的值 #2977

Description

@Win-Hao

版本 / 环境

  • 版本:v0.36.1。已核对 main @ 84da6629(2026-08-17)为同一段代码;回归自 feat(tui): lazy-create the session on first use with the v2 engine #2458(2026-08-04,v2 引擎改为会话懒加载),含该改动的 release 为 0.33.0 / 0.34.0 / 0.35.0 / 0.36.0 / 0.36.1(最新)
  • 平台:macOS(Darwin 25.5.0 arm64 arm
  • 开放平台 / 订阅:Kimi Code 订阅(/login 走 OAuth,provider 为 managed:kimi-code
  • 模型:kimi-code/kimi-for-coding(显示名 K2.7 Coding,max_context_size = 262144)→ kimi-code/k3(显示名 K3,max_context_size = 1048576
  • 引擎:agent-core-v2(当前默认引擎)

现象

新用户登录后默认的模型设置为k2.7(256k)、在发出第一条消息之前/model 切换模型到k3(1m),footer 右下角的上下文上限没有跟着刷新变化,仍然显示上一个模型的值:

登录完成(默认 k2.7)     context: 0% (0/256k)    ← 正确
/model 切到 k3           context: 0% (0/256k)    ← 应为 1M
关闭 TUI 重新打开         context: 0% (0/1M)      ← 正确

显示的上下文context值既不是坏值也不是 0,而是上一个模型的合法上限,且没有任何报错。对于刚上手、想体验 k3 1m上下文的新用户来说,首次使用会让用户觉得很疑惑,质疑是k3没有1M上下文,还是自己切模型没有成功,普通用户首次使用时会因此停在窗口很长一段时间。

根因:footer 这一栏只读 appState.maxContextTokensapps/kimi-code/src/tui/components/chrome/footer.ts:341),自身不做任何推导。而写这个字段的地方一共四处,其中只有 hydrateLazyConfigDefaultsapps/kimi-code/src/tui/kimi-tui.ts:1790,v2 无会话时按配置预填)能在没有会话时生效,且只在启动 /使用 /reload命令 / 登录后触发。

v2 从 #2458 开始就已经改为懒建会话,发送第一条消息之前 session === undefined。此时通过输入 /modelperformModelSwitch 的没有会话分支(apps/kimi-code/src/tui/commands/config.ts:515)→ AuthFlowController.activateModelAfterLoginapps/kimi-code/src/tui/controllers/auth-flow.ts:89-101),该分支的参数只写了 modelthinkingEffort,没有写 maxContextTokensperformModelSwitch 收尾的 setAppState 也没有。这就导致了上一个模型的context值原地留了下来。

有会话时不受影响:session.setModel() 会触发引擎的 emitStatusUpdated()packages/agent-core-v2/src/agent/profile/profileService.ts:743-765)发出带 maxContextTokensagent.status.updated,TUI 在 session-event-handler.ts:712 收下更新。无会话时没有这条事件,也没有别人补上。

复现步骤

  1. 全新用户(~/.kimi-code/config.toml 里还没有 default_model),终端运行 kimi 打开 TUI
  2. /login,走 OAuth 完成登录
  3. 登录完成后默认模型是 k2.7,右下角显示 context: 0% (0/256k) —— 这一步是正确的
  4. /model 选择 k3(1M 上下文)
  5. 右下角仍然是 0/256k

三组对照(均正常,可用来定位):

  • 关闭 TUI 重新打开 → 0/1M(重新跑了一次按配置预填,而第 4 步已把 default_model 写成 k3)
  • 不重启、直接发一条消息 → 会话建立后立刻变成 0/1M
  • 改用 /provider 里的模型选择器切换 → 不受影响(该路径经 setDefaultModel 间接调用了 refreshConfigAfterLoginhydrateLazyConfigDefaults

期望行为

/model 切换模型后,footer 的上下文ui显示应立即反映新模型的上下文,与重启之后、以及发出第一条消息之后的显示保持一致。

补充

  • 影响窗口是"切完模型 → 发出第一条消息"之间。新用户切到 k3 后先看一眼上下文有多大,恰好落在这个窗口里
  • 模型选择器里"仅本次会话"那条路径(onSessionOnlySelect)同样受影响,因为走的同一个判定,所以该pr也能修复
  • 已在本地写出确定性复现用例(showModelPicker + 真实 AuthFlowControllersession === undefined):修复前断言 2621441048576 失败,修复后通过。修复本身很小(生产代码 +7 / -1,另含回归测试与 changeset),随后提交 PR

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions