Cost dashboard¶
Lives at Settings → Costs. Rolls up LLM call spend for the caller's workspace.
What you see¶
Three rolling windows: 7 / 30 / 90 days.
Stat grid¶
- Total USD — sum of
llm_calls.cost_usdwithin the window. - LLM calls — count of rows.
- Total tokens — prompt + completion (cache-read shown separately).
- Cache-read tokens — Anthropic prompt-cache hits. Each cache-read token costs ~10% of a fresh input token, so cache hits are the main cost lever once the prompt structure is stable.
By purpose¶
Bucketed by LlmCall.purpose — planner / verdict / ask / summarizer /
tool_selector / classifier / reviewer. Sorted descending.
By connector¶
Bucketed by the connector the agent's investigation was acting against.
Calls without a tool execution land in unattributed (planner,
ask, summarizer of investigations that never reached ACTING).
Why rolling, not calendar¶
A 7-day window means now() - 7×24h to now(), not "last calendar
week". This keeps the dashboard meaningful regardless of when you
open it — Monday morning vs Friday afternoon shows the same picture.
What the dashboard doesn't show (yet)¶
- Per-user spend — every call in v0.3 is workspace-scoped; per-user attribution lands when Gaby grows multi-user investigations in v0.4.
- Daily timeseries — the rollup is one number per bucket. Time-of-day charts ship in v0.4 with the OBS-5 metrics export.
- Budget alerts —
BudgetGuardalready enforces per-investigation caps; workspace-wide rolling budgets are v0.4.
Source¶
- Backend rollup:
gaby/observability/costs.py - Endpoint:
GET /api/settings/costs?window=7d|30d|90d - Frontend:
web/src/routes/settings/CostDashboard.tsx