版本 / 环境
版本: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.maxContextTokens(apps/kimi-code/src/tui/components/chrome/footer.ts:341),自身不做任何推导。而写这个字段的地方一共四处,其中只有 hydrateLazyConfigDefaults(apps/kimi-code/src/tui/kimi-tui.ts:1790,v2 无会话时按配置预填)能在没有会话时生效,且只在启动 /使用 /reload命令 / 登录后触发。
v2 从 #2458 开始就已经改为懒建会话,发送第一条消息之前 session === undefined。此时通过输入 /model 走 performModelSwitch 的没有会话分支(apps/kimi-code/src/tui/commands/config.ts:515)→ AuthFlowController.activateModelAfterLogin(apps/kimi-code/src/tui/controllers/auth-flow.ts:89-101),该分支的参数只写了 model 与 thinkingEffort,没有写 maxContextTokens;performModelSwitch 收尾的 setAppState 也没有。这就导致了上一个模型的context值原地留了下来。
有会话时不受影响:session.setModel() 会触发引擎的 emitStatusUpdated()(packages/agent-core-v2/src/agent/profile/profileService.ts:743-765)发出带 maxContextTokens 的 agent.status.updated,TUI 在 session-event-handler.ts:712 收下更新。无会话时没有这条事件,也没有别人补上。
复现步骤
全新用户(~/.kimi-code/config.toml 里还没有 default_model),终端运行 kimi 打开 TUI
/login,走 OAuth 完成登录
登录完成后默认模型是 k2.7,右下角显示 context: 0% (0/256k) —— 这一步是正确的
/model 选择 k3(1M 上下文)
右下角仍然是 0/256k
三组对照(均正常,可用来定位):
关闭 TUI 重新打开 → 0/1M(重新跑了一次按配置预填,而第 4 步已把 default_model 写成 k3)
不重启、直接发一条消息 → 会话建立后立刻变成 0/1M
改用 /provider 里的模型选择器切换 → 不受影响(该路径经 setDefaultModel 间接调用了 refreshConfigAfterLogin → hydrateLazyConfigDefaults)
期望行为
/model 切换模型后,footer 的上下文ui显示应立即反映新模型的上下文,与重启之后、以及发出第一条消息之后的显示保持一致。
补充
影响窗口是"切完模型 → 发出第一条消息"之间。新用户切到 k3 后先看一眼上下文有多大,恰好落在这个窗口里
模型选择器里"仅本次会话"那条路径(onSessionOnlySelect)同样受影响,因为走的同一个判定,所以该pr也能修复
已在本地写出确定性复现用例(showModelPicker + 真实 AuthFlowController,session === undefined):修复前断言 262144 ≠ 1048576 失败,修复后通过。修复本身很小(生产代码 +7 / -1,另含回归测试与 changeset),随后提交 PR
版本 / 环境
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(最新)Darwin 25.5.0 arm64 arm)/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)现象
新用户登录后默认的模型设置为k2.7(256k)、在发出第一条消息之前用
/model切换模型到k3(1m),footer 右下角的上下文上限没有跟着刷新变化,仍然显示上一个模型的值:显示的上下文context值既不是坏值也不是 0,而是上一个模型的合法上限,且没有任何报错。对于刚上手、想体验 k3 1m上下文的新用户来说,首次使用会让用户觉得很疑惑,质疑是k3没有1M上下文,还是自己切模型没有成功,普通用户首次使用时会因此停在窗口很长一段时间。
根因:footer 这一栏只读
appState.maxContextTokens(apps/kimi-code/src/tui/components/chrome/footer.ts:341),自身不做任何推导。而写这个字段的地方一共四处,其中只有hydrateLazyConfigDefaults(apps/kimi-code/src/tui/kimi-tui.ts:1790,v2 无会话时按配置预填)能在没有会话时生效,且只在启动 /使用/reload命令 / 登录后触发。v2 从 #2458 开始就已经改为懒建会话,发送第一条消息之前
session === undefined。此时通过输入/model走performModelSwitch的没有会话分支(apps/kimi-code/src/tui/commands/config.ts:515)→AuthFlowController.activateModelAfterLogin(apps/kimi-code/src/tui/controllers/auth-flow.ts:89-101),该分支的参数只写了model与thinkingEffort,没有写maxContextTokens;performModelSwitch收尾的setAppState也没有。这就导致了上一个模型的context值原地留了下来。有会话时不受影响:
session.setModel()会触发引擎的emitStatusUpdated()(packages/agent-core-v2/src/agent/profile/profileService.ts:743-765)发出带maxContextTokens的agent.status.updated,TUI 在session-event-handler.ts:712收下更新。无会话时没有这条事件,也没有别人补上。复现步骤
~/.kimi-code/config.toml里还没有default_model),终端运行kimi打开 TUI/login,走 OAuth 完成登录k2.7,右下角显示context: 0% (0/256k)—— 这一步是正确的/model选择k3(1M 上下文)0/256k三组对照(均正常,可用来定位):
0/1M(重新跑了一次按配置预填,而第 4 步已把default_model写成 k3)0/1M/provider里的模型选择器切换 → 不受影响(该路径经setDefaultModel间接调用了refreshConfigAfterLogin→hydrateLazyConfigDefaults)期望行为
/model切换模型后,footer 的上下文ui显示应立即反映新模型的上下文,与重启之后、以及发出第一条消息之后的显示保持一致。补充
onSessionOnlySelect)同样受影响,因为走的同一个判定,所以该pr也能修复showModelPicker+ 真实AuthFlowController,session === undefined):修复前断言262144≠1048576失败,修复后通过。修复本身很小(生产代码 +7 / -1,另含回归测试与 changeset),随后提交 PR