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 5a3e1d451d6d..dd1e5cb379e9 100644
--- a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx
@@ -155,9 +155,12 @@ export function Prompt(props: PromptProps) {
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 elapsed = last.time.completed ? last.time.completed - last.time.created : 0
+ const tps = elapsed > 0 ? last.tokens.output / (elapsed / 1000) : undefined
return {
context: pct ? `${Locale.number(tokens)} (${pct})` : Locale.number(tokens),
cost: cost > 0 ? money.format(cost) : undefined,
+ tps: tps ? `${tps.toFixed(0)} t/s` : undefined,
}
})
@@ -1245,7 +1248,7 @@ export function Prompt(props: PromptProps) {
{(item) => (
- {[item().context, item().cost].filter(Boolean).join(" · ")}
+ {[item().tps, item().context, item().cost].filter(Boolean).join(" · ")}
)}
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..ccffcefe7de6 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
@@ -20,15 +20,19 @@ function View(props: { api: TuiPluginApi; session_id: string }) {
return {
tokens: 0,
percent: null,
+ tps: null,
}
}
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]
+ const elapsed = last.time.completed ? last.time.completed - last.time.created : 0
+ const tps = elapsed > 0 ? last.tokens.output / (elapsed / 1000) : null
return {
tokens,
percent: model?.limit.context ? Math.round((tokens / model.limit.context) * 100) : null,
+ tps,
}
})
@@ -39,6 +43,7 @@ function View(props: { api: TuiPluginApi; session_id: string }) {
{state().tokens.toLocaleString()} tokens
{state().percent ?? 0}% used
+ {state().tps !== null && {state().tps!.toFixed(0)} t/s}
{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 70c6f6ea9966..7be6d275a046 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
@@ -49,9 +49,13 @@ export function SubagentFooter() {
currency: "USD",
})
+ const elapsed = last.time.completed ? last.time.completed - last.time.created : 0
+ const tps = elapsed > 0 ? last.tokens.output / (elapsed / 1000) : undefined
+
return {
context: pct ? `${Locale.number(tokens)} (${pct})` : Locale.number(tokens),
cost: cost > 0 ? money.format(cost) : undefined,
+ tps: tps ? `${tps.toFixed(0)} t/s` : undefined,
}
})
@@ -87,7 +91,7 @@ export function SubagentFooter() {
{(item) => (
- {[item().context, item().cost].filter(Boolean).join(" · ")}
+ {[item().tps, item().context, item().cost].filter(Boolean).join(" · ")}
)}