Files
werkrevisor/docs/prs/2026-10-06-PR#22-estimated-costs-and-split.md
claude-code d7a8ffe825
werkator/server build succeeded after 00:25
werkator build succeeded after 01:13
werkrevisor 0.18.1: estimated costs marked, LLM and Jev listed apart (#22)
Co-authored-by: claude-code <claude-code@javagil.de>
2026-10-06 11:28:06 +02:00

85 lines
3.8 KiB
Markdown

# PR#22: the dashboard marks estimated costs and lists LLM and Jev apart
> **WARNING:** This document describes only the change applied in this PR.
> It may already be outdated once the next PR is merged.
> Historic PR documentation is not maintained along with new PRs; treat it as a snapshot.
## The Problem
The dashboard of werkrevisor 0.18.0 shows one cost per period: the LLM costs via OpenRouter plus the Jev costs.
Some of these amounts are werkrevisor's own calculation from the token counts and the prices in the config:
- the Jev costs always, since TypeSafe reports no amount;
- the LLM costs, if OpenRouter reports no amount for a call.
If a price in the config is outdated, such an amount differs from the bill, but the dashboard shows it like a billed one.
The dashboard also does not show how the two providers contribute to the costs.
## Non-Goals
- No comparison with the bills of OpenRouter or TypeSafe.
- No change of the usage record: it already holds both parts and the cost status.
## The Scenarios
### Feature: estimated costs are marked as such
#### Scenario#22.01: a period with an estimated part shows its total as an estimate
So that nobody takes a calculated amount for a billed one.
- **Given** a period holds `<costs>`
- **When** someone opens the dashboard
- **Then** the total of the period `<shows>`
| costs | shows |
|---|---|
| only LLM costs reported by OpenRouter | the mark "=" |
| a Jev cost | the mark "≈" |
| an LLM cost that werkrevisor estimated | the mark "≈" |
| a review whose LLM cost is unknown | the mark "≈" |
##### Verified by
- [UsageApiIntegrationTest: estimated parts are counted apart](../../server/src/test/kotlin/de/hoennig/werkrevisor/server/UsageApiIntegrationTest.kt)
- manual check in a browser, see [Measurement](#measurement)
### Feature: the costs of the providers are listed apart
#### Scenario#22.02: the dashboard lists LLM and Jev below the total
So that the reader sees what each provider costs.
- **Given** the reviews of the last 24 hours cost 0.18 USD for the LLM and 0.0007 USD for Jev
- **When** someone opens the dashboard
- **Then** the card of the last 24 hours shows the total "≈ 0.1807 USD"
- **and** below it, in smaller print, "LLM via OpenRouter = 0.1800 USD" and "Jev via TypeSafe ≈ 0.0007 USD"
##### Verified by
- [UsageApiIntegrationTest: estimated parts are counted apart](../../server/src/test/kotlin/de/hoennig/werkrevisor/server/UsageApiIntegrationTest.kt)
- manual check in a browser, see [Measurement](#measurement)
## The Solution
- `GET /api/stats` returns per sum also `llmCostUsd`, `jevCostUsd`, `estimatedLlmReviews`, `llmEstimated` and `estimated`;
any Jev cost above 0 makes the total an estimate, and the Jev line always shows "≈",
since TypeSafe reports no amounts; the LLM line shows "≈" if an LLM cost is estimated or unknown.
- The Web Component marks every amount with "=" if a provider reported it or "≈" if werkrevisor calculated it,
and lists LLM and Jev below each total, in smaller print;
the tables per day, week and month mark estimated totals too.
- The Jev part of a review counts even if its LLM costs are unknown; before, the whole review was left out of the sum.
The list of recent reviews shows such a review with its Jev part and "+ LLM unknown", so that it agrees with the sums.
- werkrevisor 0.18.1.
## Measurement
On 2026-10-06, the dashboard ran locally with the 180 usage records of the earlier runs.
Each card showed its total with "≈" and below it the LLM and Jev parts, each with "=" or "≈";
the tables per period marked estimated totals and caused no horizontal scrolling of the page,
neither at 800 px nor at a phone width of 375 px, where a wide table scrolls inside its own section.
## Prerequisite PRs
- PR#21: the statistics service and the dashboard Web Component.