diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx index cd47e917085b..a4242a52741a 100644 --- a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx @@ -201,15 +201,17 @@ export function Prompt(props: PromptProps) { const last = msg.findLast((item): item is AssistantMessage => item.role === "assistant" && item.tokens.output > 0) if (!last) return + const cached = last.tokens.cache.read + last.tokens.cache.write const tokens = - last.tokens.input + last.tokens.output + last.tokens.reasoning + last.tokens.cache.read + last.tokens.cache.write + last.tokens.input + last.tokens.output + last.tokens.reasoning + cached if (tokens <= 0) return const model = 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 = msg.reduce((sum, item) => sum + (item.role === "assistant" ? item.cost : 0), 0) + const tokenText = cached > 0 ? `${Locale.number(tokens)} (${Locale.number(cached)} cached)` : Locale.number(tokens) return { - context: pct ? `${Locale.number(tokens)} (${pct})` : Locale.number(tokens), + context: pct ? `${tokenText} (${pct})` : tokenText, cost: cost > 0 ? money.format(cost) : undefined, } }) diff --git a/packages/opencode/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx b/packages/opencode/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx index 9ffe77979150..e129985c273e 100644 --- a/packages/opencode/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx +++ b/packages/opencode/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx @@ -19,25 +19,34 @@ function View(props: { api: TuiPluginApi; session_id: string }) { if (!last) { return { tokens: 0, + cached: 0, percent: null, } } + const cached = last.tokens.cache.read + last.tokens.cache.write const tokens = - last.tokens.input + last.tokens.output + last.tokens.reasoning + last.tokens.cache.read + last.tokens.cache.write + last.tokens.input + last.tokens.output + last.tokens.reasoning + cached const model = props.api.state.provider.find((item) => item.id === last.providerID)?.models[last.modelID] return { tokens, + cached, percent: model?.limit.context ? Math.round((tokens / model.limit.context) * 100) : null, } }) + const tokenText = createMemo(() => { + const cached = state().cached + if (cached === 0) return `${state().tokens.toLocaleString()} tokens` + return `${state().tokens.toLocaleString()} tokens (${cached.toLocaleString()} cached)` + }) + return ( Context - {state().tokens.toLocaleString()} tokens + {tokenText()} {state().percent ?? 0}% used {money.format(cost())} spent diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/subagent-footer.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/subagent-footer.tsx index c857937d4acb..6e22b522cb64 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/subagent-footer.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/subagent-footer.tsx @@ -36,8 +36,9 @@ export function SubagentFooter() { const last = msg.findLast((item): item is AssistantMessage => item.role === "assistant" && item.tokens.output > 0) if (!last) return + const cached = last.tokens.cache.read + last.tokens.cache.write const tokens = - last.tokens.input + last.tokens.output + last.tokens.reasoning + last.tokens.cache.read + last.tokens.cache.write + last.tokens.input + last.tokens.output + last.tokens.reasoning + cached if (tokens <= 0) return const model = sync.data.provider.find((item) => item.id === last.providerID)?.models[last.modelID] @@ -49,8 +50,9 @@ export function SubagentFooter() { currency: "USD", }) + const tokenText = cached > 0 ? `${Locale.number(tokens)} (${Locale.number(cached)} cached)` : Locale.number(tokens) return { - context: pct ? `${Locale.number(tokens)} (${pct})` : Locale.number(tokens), + context: pct ? `${tokenText} (${pct})` : tokenText, cost: cost > 0 ? money.format(cost) : undefined, } }) diff --git a/packages/opencode/src/plugin/codex.ts b/packages/opencode/src/plugin/codex.ts index a0ff0002f48e..b7dc4d85ca9b 100644 --- a/packages/opencode/src/plugin/codex.ts +++ b/packages/opencode/src/plugin/codex.ts @@ -374,6 +374,7 @@ export async function CodexAuthPlugin(input: PluginInput): Promise { "gpt-5.3-codex", "gpt-5.4", "gpt-5.4-mini", + "gpt-5.5", ]) for (const [modelId, model] of Object.entries(provider.models)) { if (modelId.includes("codex")) continue