An opencode TUI plugin that shows your Requesty.ai budget, current monthly spend, and per-model cost distribution right in the session prompt, in the session sidebar, plus a detail dialog via the /requesty slash command.
- opencode ≥ 1.18
- A Requesty API key — create one at app.requesty.ai/api-keys
The plugin surfaces your Requesty.ai budget and usage in three places, each optimized for the space it occupies: a compact sidebar, a full detail dialog, and a minimal prompt-area readout.
The sidebar gives a quick, at-a-glance view of your current month's Requesty usage:
- Monthly spend and monthly limit, pulled from
GET /v1/manage/apikey/self - A color-coded progress bar that turns yellow/red at configurable thresholds
- Projected month-end spend (
~$X EOM), extrapolated with a weekday-aware run rate (see Month-end projection), with a pace marker: ↑ over pace, → on pace, ↓ under pace - Daily spend trend: today · daily average · 7-day average · 30-day average
- Optional input/output token breakdown for each spend metric (
sidebar.showTokens) - API key name in the header, linking to the Requesty analytics dashboard filtered by that key
- Top models for the current month (up to
sidebar.maxModels), each with spend, total tokens, and input (↑) / output (↓) breakdown; click the header to collapse or expand the list - Session cost for the current session: today's spend and spend since the session started (from the session's creation timestamp, falling back to a rolling 90-day window when unavailable), each with request count and token breakdown; click the header to collapse or expand (
sidebar.showSessionInfo). Figures cover the root session including all its sub-agents, so viewing a sub-agent session shows its root's aggregate. Shows a "loading…" placeholder until the active session's data has been fetched, so it never displays an incorrect zero while loading. Revisiting a session whose figures were already loaded shows them immediately from a per-session cache.
You can disable the sidebar entirely with "sidebar": { "enabled": false }.
A compact readout on the right side of the session prompt shows:
- Today's spend
- Spend vs. limit with percentage and API key name, colored by the same thresholds as the sidebar
- Optional total session spend (
S $X, including sub-agents) to the left of today's spend whenprompt.showSessionInfois enabled - Optional month-end projection (
~$X EOM ↑) whenprompt.monthlyProjectionis enabled
Disable the readout with "prompt": { "budgetIndicator": false }.
Open the dialog with /requesty from the command palette for the full breakdown:
- KPI row: spent, limit, remaining, End of Month projection (labelled with the projection basis actually used) with a colored pace arrow, and last month's spend with a colored trend chevron
- Budget Overview card: wide progress bar, budget-health badge, days-to-exhaustion estimate based on your 7-day average, and today/daily avg/7d/30d averages
- Model Breakdown (Current Month) card: per-model table with spend, share of total spend, tokens, request count, and output/input ratio
Data comes from the Requesty Management API (apikey/self + apikey/self/usage grouped by model_used, current calendar month).
To install the plugin globally run the following command
opencode plugin -g @christiangalsterer/opencode-requesty-pluginTo install the plugin for the current project run the following command
opencode plugin @christiangalsterer/opencode-requesty-pluginTo update the plugin please run the following command.
opencode plugin -f @christiangalsterer/opencode-requesty-pluginOpenCode does not currently support plugin updates reliably. See OpenCode PRs #35777, #32822, and #37300. To force OpenCode to download the configured plugin versions, clear its plugin cache:
rm -rf ~/.cache/opencode/packages/@christiangalsterer/opencode-requesty-plugin*To the configure the plugin add/modify the configuration in either the project .opencode/tui.json or global ~/.config/opencode/tui.json file.
{
"$schema": "https://opencode.ai/tui.json",
"plugin": [
[
"@christiangalsterer/opencode-requesty-plugin",
{
"refreshIntervalMs": 300000,
"warningThreshold": 0.6,
"errorThreshold": 0.85,
"sidebar": {
"enabled": true,
"maxModels": 5,
"showTokens": true,
"order": 50
}
}
]
]
}Restart opencode after changing the config.
| Option | Type | Default | Description |
|---|---|---|---|
refreshIntervalMs |
number | 300000 (5 min) |
Periodic refresh interval (safety net) |
warningThreshold |
number | 0.7 (70%) |
Budget usage ratio at which the bar turns yellow (accepts 0–1 or 0–100) |
errorThreshold |
number | 0.9 (90%) |
Budget usage ratio at which the bar turns red (accepts 0–1 or 0–100) |
projection.basis |
string | "weekday" |
How month-end spend is extrapolated: "weekday" (per-weekday profile from your usage history), "workdays" (Mon–Fri only), or "calendar" (every day weighs the same) |
projection.historyDays |
number | 28 |
Completed days of usage history sampled for the "weekday" basis (7–84, whole days) |
sidebar.enabled |
boolean | true |
Show the sidebar widget |
sidebar.maxModels |
number | 5 |
Number of models shown in the compact sidebar list |
sidebar.showTokens |
boolean | true |
Show input/output token breakdown alongside spend in the sidebar averages block |
sidebar.showKeyName |
boolean | false |
Show the API key nickname in the sidebar header |
sidebar.showSessionInfo |
boolean | true |
Show the per-session cost collapsible section (today + since session start) |
sidebar.order |
number | 50 |
Slot order for the sidebar widget; lower numbers appear first |
prompt.enabled |
boolean | true |
Show the prompt widget |
prompt.budgetIndicator |
boolean | true |
Show spend/limit readout on the right side of the session prompt |
prompt.todaySpend |
boolean | true |
Show today's spend (T $X) in the session prompt averages block |
prompt.dailyAvg |
boolean | false |
Show the current month's daily average (D $X) in the prompt averages block |
prompt."7dAvg" |
boolean | false |
Show the 7-day average (7d $X) in the prompt averages block |
prompt."30dAvg" |
boolean | false |
Show the 30-day average (30d $X) in the prompt averages block |
prompt.showTokens |
boolean | true |
Show today's input/output token breakdown (↑X↓Y) next to today's spend in the session prompt |
prompt.showKeyName |
boolean | false |
Show the API key nickname in the session prompt readout |
prompt.showSessionInfo |
boolean | true |
Show total session spend (S $X, incl. sub-agents) left of today's spend in the prompt averages block |
prompt.monthlyProjection |
boolean | true |
Show a month-end projection (~$X EOM ↑) in the session prompt, red when the estimated spend exceeds the budget |
prompt.order |
number | 50 |
Slot order for the prompt indicator; lower numbers appear first |
dialog.showKeyName |
boolean | false |
Show the API key nickname in the detail dialog title |
warningThreshold must be lower than errorThreshold; if the ordering is invalid, both fall back to the defaults (70%/90%). Values above 1 are treated as percents, e.g. 80 means 80%.
If you utilize different API keys for various projects, it is highly recommended to enable showKeyName in your configuration. This allows you to easily identify which Requesty API key is currently active in the sidebar, session prompt, and detail dialog.
Example for enabling key identification:
{
"sidebar": { "showKeyName": true },
"prompt": { "showKeyName": true },
"dialog": { "showKeyName": true }
}{
"$schema": "https://opencode.ai/tui.json",
"plugin": [
[
"@christiangalsterer/opencode-requesty-plugin",
{
"refreshIntervalMs": 300000,
"warningThreshold": 0.7,
"errorThreshold": 0.9,
"sidebar": {
"enabled": true,
"maxModels": 5,
"showTokens": true,
"showKeyName": true,
"order": 50
},
"prompt": {
"enabled": true,
"budgetIndicator": true,
"todaySpend": true,
"dailyAvg": false,
"7dAvg": false,
"30dAvg": false,
"showTokens": true,
"showKeyName": true,
"showSessionInfo": true,
"monthlyProjection": true,
"order": 50
},
"dialog": {
"showKeyName": true
}
}
]
]
}Data is refreshed on startup, on a configurable periodic interval, when a new session is created, and when messages are updated.
All amounts are in USD and dates are evaluated in UTC. The detail dialog's Updated: footer is shown in your local timezone.
- Today — spend and tokens for the current calendar day.
- Daily avg — current month's total spend and tokens divided by the number of days elapsed so far this month.
- 7d avg — average spend and tokens over the previous 7 completed calendar days (excluding today). Days without usage count as
$0/0tokens. Uses a rolling window to ensure accuracy across month boundaries. - 30d avg — average spend and tokens over the previous 30 completed calendar days (excluding today). Days without usage count as
$0/0tokens. Uses a rolling window to ensure accuracy across month boundaries. - End of Month projection — current spend extrapolated to the end of the month, weighting the remaining days by how much you typically spend on each weekday. See Month-end projection.
- Session cost — spend, request count, and tokens for the currently active opencode session: Today and Since . Figures cover the root session including all its sub-agents (viewing a sub-agent shows its root's aggregate). The window starts at the session's creation timestamp; if that is unavailable it falls back to the last 90 days. Attribution uses Requesty's
extra.X-Session-Affinitymetadata, so values are exact per session (not estimates). While a session's data is still loading the section shows a "…" placeholder rather than a misleading zero; a previously-loaded session is served from a per-session cache so its figures appear immediately on revisit.
Coding usage is rarely spread evenly across the week, so a plain "spend so far ÷ days so far × days in month" run rate over-projects when the month started on a busy stretch and under-projects when it started on a quiet weekend. The projection therefore assigns every day of the month a weight and extrapolates over weights instead of days:
projection = spend so far ÷ (weight of days 1…today) × (weight of all days in the month)
Three bases are available via projection.basis:
| Basis | Weights | Use when |
|---|---|---|
"weekday" (default) |
Measured from your own usage: each weekday's average spend over the last projection.historyDays completed days |
You want the projection to learn your actual rhythm |
"workdays" |
Mon–Fri count, Sat/Sun count as zero | You only work weekdays and have no usable history yet |
"calendar" |
Every day counts the same (the classic run rate) | You want the simple, unweighted estimate |
Details:
- Weights are normalized to an average of 1, so a weight of
1means "an average day" and the"calendar"basis reduces exactly to the plain run rate. - The
"weekday"basis needs at least 7 sampled days carrying some spend; with a shorter or empty history it silently falls back to"calendar". The detail dialog's KPI label shows which basis was actually used (End of Month (weekday profile),(workdays)or(calendar)). - Days with no usage count as
$0, which is what makes a consistently quiet weekend measurable. Today is excluded from the history sample because its spend is still incomplete. - The pace marker (↑/→/↓) and the Budget Overview days-to-exhaustion estimate use the same weights, so a weekend no longer looks like "under pace" and an exhaustion date no longer counts days you never spend on.
- Choosing
projection.basis: "weekday"with ahistoryDaysabove 30 widens the usage request window accordingly; it stays within a single API request.
The plugin reads your Requesty API key from the opencode provider config: provider.requesty.options.apiKey in opencode.json, including {env:VAR} interpolation.
{
"provider": {
"requesty": {
"options": { "apiKey": "sk-..." }
}
}
}Or via an environment variable:
{
"provider": {
"requesty": {
"options": { "apiKey": "{env:REQUESTY_API_KEY}" }
}
}
}If no key is found, the widget shows a short setup hint instead of failing.
Point at a local checkout instead:
{
"$schema": "https://opencode.ai/tui.json",
"plugin": [
[
"file:///absolute/path/to/opencode-requesty-plugin/dist/tui.js",
{
"sidebar": { "showKeyName": true },
"prompt": { "showKeyName": true },
"dialog": { "showKeyName": true }
}
]
]
}bun install
bun run format:fix
bun run typecheck
bun run test
bun run buildThe project is fully typed TypeScript (strict mode). Sources live in src/ (.ts/.tsx), tests in test/. The build pre-compiles src/tui.tsx to dist/tui.js with OpenTUI's Solid Babel plugin (@opentui/solid/bun-plugin) and emits declarations via tsconfig.build.json.
MIT


