diff --git a/packages/tui/src/component/prompt/index.tsx b/packages/tui/src/component/prompt/index.tsx index aa002080b1dd..955490d6da11 100644 --- a/packages/tui/src/component/prompt/index.tsx +++ b/packages/tui/src/component/prompt/index.tsx @@ -263,17 +263,19 @@ export function Prompt(props: PromptProps) { const last = msg.findLast((item): item is AssistantMessage => item.role === "assistant" && item.tokens.output > 0) if (!last) return - const tokens = - 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] - const pct = model?.limit.context ? `${Math.round((tokens / model.limit.context) * 100)}%` : undefined - const cost = session?.cost ?? 0 - return { - context: pct ? `${Locale.number(tokens)} (${pct})` : Locale.number(tokens), - cost: cost > 0 ? money.format(cost) : undefined, - } + const cached = last.tokens.cache.read + last.tokens.cache.write + const tokens = + 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 = session?.cost ?? 0 + const tokenText = cached > 0 ? `${Locale.number(tokens)} (${Locale.number(cached)} cached)` : Locale.number(tokens) + return { + context: pct ? `${tokenText} (${pct})` : tokenText, + cost: cost > 0 ? money.format(cost) : undefined, + } }) const [store, setStore] = createStore<{ diff --git a/packages/tui/src/feature-plugins/sidebar/context.tsx b/packages/tui/src/feature-plugins/sidebar/context.tsx index f1c99d9679ce..5137ab7bf3c9 100644 --- a/packages/tui/src/feature-plugins/sidebar/context.tsx +++ b/packages/tui/src/feature-plugins/sidebar/context.tsx @@ -21,25 +21,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/tui/src/routes/session/subagent-footer.tsx b/packages/tui/src/routes/session/subagent-footer.tsx index 0aadb4f43c96..f98b24a5dc87 100644 --- a/packages/tui/src/routes/session/subagent-footer.tsx +++ b/packages/tui/src/routes/session/subagent-footer.tsx @@ -35,8 +35,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] @@ -48,8 +49,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, } })