From 9fd3a1790e8ab775326c622cc75135519adb5a80 Mon Sep 17 00:00:00 2001 From: ChethanUK Date: Mon, 6 Jul 2026 00:31:29 +0200 Subject: [PATCH] fix(tui): use current model for context-limit display after switch Fixes #35072 --- packages/tui/src/component/prompt/index.tsx | 8 +++++++- .../tui/src/feature-plugins/sidebar/context.tsx | 13 ++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/packages/tui/src/component/prompt/index.tsx b/packages/tui/src/component/prompt/index.tsx index 115c10296ef4..af030dd7bacf 100644 --- a/packages/tui/src/component/prompt/index.tsx +++ b/packages/tui/src/component/prompt/index.tsx @@ -269,7 +269,13 @@ export function Prompt(props: PromptProps) { last.tokens.input + last.tokens.output + last.tokens.reasoning + last.tokens.cache.read + last.tokens.cache.write if (tokens <= 0) return - const model = sync.data.provider.find((item) => item.id === last.providerID)?.models[last.modelID] + // Use the currently selected model for the context-limit denominator so it + // updates immediately after a model switch, falling back to the last + // assistant message's model when nothing is selected yet. + const selected = local.model.current() + const model = + (selected && sync.data.provider.find((item) => item.id === selected.providerID)?.models[selected.modelID]) ?? + sync.data.provider.find((item) => item.id === last.providerID)?.models[last.modelID] const pct = model?.limit.context ? `${Math.round((tokens / model.limit.context) * 100)}%` : undefined const cost = session?.cost ?? 0 return { diff --git a/packages/tui/src/feature-plugins/sidebar/context.tsx b/packages/tui/src/feature-plugins/sidebar/context.tsx index f1c99d9679ce..b10f5537dbd2 100644 --- a/packages/tui/src/feature-plugins/sidebar/context.tsx +++ b/packages/tui/src/feature-plugins/sidebar/context.tsx @@ -2,6 +2,7 @@ import type { AssistantMessage } from "@opencode-ai/sdk/v2" import type { TuiPlugin, TuiPluginApi } from "@opencode-ai/plugin/tui" import type { BuiltinTuiPlugin } from "../builtins" import { createMemo } from "solid-js" +import { useLocal } from "../../context/local" const id = "internal:sidebar-context" @@ -12,6 +13,7 @@ const money = new Intl.NumberFormat("en-US", { function View(props: { api: TuiPluginApi; session_id: string }) { const theme = () => props.api.theme.current + const local = useLocal() const msg = createMemo(() => props.api.state.session.messages(props.session_id)) const session = createMemo(() => props.api.state.session.get(props.session_id)) const cost = createMemo(() => session()?.cost ?? 0) @@ -27,7 +29,16 @@ function View(props: { api: TuiPluginApi; session_id: string }) { const tokens = last.tokens.input + last.tokens.output + last.tokens.reasoning + last.tokens.cache.read + last.tokens.cache.write - const model = props.api.state.provider.find((item) => item.id === last.providerID)?.models[last.modelID] + // Use the currently selected model for the context-limit denominator so it + // updates immediately after a model switch, falling back to the last + // assistant message's model when nothing is selected yet. The global model + // picker only applies to the top-level session, so for subagent sessions + // (which run their own agent's model and can be viewed via the sidebar) use + // the session's own last-message model instead. + const selected = session()?.parentID ? undefined : local.model.current() + const model = + (selected && props.api.state.provider.find((item) => item.id === selected.providerID)?.models[selected.modelID]) ?? + props.api.state.provider.find((item) => item.id === last.providerID)?.models[last.modelID] return { tokens, percent: model?.limit.context ? Math.round((tokens / model.limit.context) * 100) : null,