Skip to content

Use current-window spend for the OpenRouter Key Limit meter - #101

Merged
mstallone merged 1 commit into
mainfrom
port-openrouter-key-limit
Aug 14, 2026
Merged

Use current-window spend for the OpenRouter Key Limit meter#101
mstallone merged 1 commit into
mainfrom
port-openrouter-key-limit

Conversation

@mstallone

Copy link
Copy Markdown
Owner

TL;DR — The Key Limit meter now charges the current limit window's spend against the key's cap, instead of the key's lifetime spend. Port of upstream openusage robinebers#1109.

What was happening

  • The /key endpoint reports usage (lifetime spend on the key) and limit_remaining (what is left in the configured limit window).
  • The Key Limit meter used lifetime usage against the cap, so once a key had ever spent more than one window's cap, the meter pinned at or past 100% even right after a daily/weekly/monthly reset.

What this changes

  • OpenRouterUsageMapper.keyMetrics computes used as max(0, limit − limit_remaining), so the meter tracks the current window.
  • Regression test: lifetime usage of 12 with limit 5 / limit_remaining 3 now maps to 2 used of 5.
  • docs/providers/openrouter.md describes the window semantics.

Heads-up

  • A key whose payload has limit but no limit_remaining now shows as fully used rather than at lifetime spend; this matches upstream's tested behavior, and OpenRouter always returns limit_remaining alongside a configured limit.

Tests

  • swift test --filter OpenRouter — 30 tests, 0 failures.

@mstallone
mstallone merged commit 45a87e7 into main Aug 14, 2026
2 checks passed
@mstallone
mstallone deleted the port-openrouter-key-limit branch August 14, 2026 21:19
mstallone added a commit that referenced this pull request Aug 16, 2026
**TL;DR** — Records the v0.8.11 changelog ahead of tagging the release.

**What was happening**
- Eight PRs (#101#108) merged since v0.8.10 — the upstream openusage
port batch plus the Gemini 3.7 / Codex long-context pricing fix — with
no changelog entry yet.

**What this changes**
- Prepends the owner-approved v0.8.11 section to `CHANGELOG.md`: seven
entries under Bug Fixes, the Sparkle 2.9.5 bump under Chores, and the
full commit list for the v0.8.10...v0.8.11 range.

**Heads-up**
- Once this merges, `v0.8.11` is tagged on the merge commit to start the
release run; the same notes are published onto the GitHub Release.
mstallone added a commit that referenced this pull request Sep 5, 2026
<!-- CURSOR_AGENT_PR_BODY_BEGIN -->
## TL;DR

Selective re-implementation of the new upstream OpenUsage commits that
still apply on Runway: Codex auto-review stays a first-class model in
spend breakdowns and prices as GPT-5.6 Luna from 2026-07-09, and Grok
CLI's `grok-proxy` slug resolves to Grok Build.

## What was happening

- Upstream has moved on since the last port wave (Runway #101#108).
Each new OpenUsage commit was reviewed against Runway's architecture,
existing ports, and the "don't bloat" bar.
- Codex still replaced `codex-auto-review` with its dated GPT fallback
before aggregation (openusage robinebers#1085), so the breakdown showed gpt-5.5
instead of auto-review.
- That fallback table still stopped at gpt-5.5 (openusage robinebers#1125). OpenAI
moved auto-review onto GPT-5.6 Luna on 2026-07-09, so every auto-review
event since July was priced 25× too high.
- Grok CLI now logs `grok-proxy` for Grok Build (openusage robinebers#1123); that
slug had no alias, so those tokens were dropped from the spend tiles.

## What this changes

- Parser keeps the measured `codex-auto-review` slug and stores the
dated GPT fallback on `Event.pricingModel` only for cost. Aggregation
keys the rate cache by both slugs so a day that spans the Luna cutoff
does not reuse the first event's rates.
- Adds `("2026-07-09", "gpt-5.6-luna")` at the top of the auto-review
fallback table (ours; ccusage's snapshot still stops at gpt-5.5). Bumps
the Codex JSONL cache schema to 2 so already-remapped events are
reparsed.
- Aliases `grok-proxy` → `grok-build-0.1` and stamps `updated_at` with a
same-day ISO timestamp so the feed wins over today's date-only cache.
- Documents the auto-review identity/pricing split on the Codex
spend-tiles page.

## Heads-up

Reviewed and **not** ported, with reasons:

- **openusage robinebers#1116 / robinebers#1127** (mandatory daily analytics ping, PostHog
bump) — Runway removed analytics in #9.
- **openusage robinebers#1111 / robinebers#1106** (scroll / reorder / SVG parse) — Runway
already has `ReorderFrameStore`, parsed-once `ProviderMark`, row-local
reorder gestures, and the rebuilt popover scroll path. Taking their
patch would duplicate and fight that work.
- **openusage robinebers#1033** (Reset All Settings) — Runway already has Reset
All Customization; a second Settings-wide reset is extra surface, and
earlier port waves already skipped it.
- **openusage robinebers#1128** (Sparkle 2.9.5 → 2.9.6) — relevant security bump,
but this environment cannot refresh `Package.resolved`'s `originHash`.
Dependabot is already scheduled weekly; worth a dedicated follow-up.
- Pricing/provider commits through robinebers#1112, robinebers#1108, robinebers#1110, robinebers#1109, robinebers#1105,
robinebers#1103, robinebers#1101, robinebers#1097, robinebers#1093, robinebers#1089, robinebers#1087, robinebers#1050, robinebers#1019, robinebers#1082 are
already in `main`.

## Tests

- New parser tests: auto-review lines keep the slug; post-2026-07-09
lines price as Luna; the 2026-07-08/09 boundary stays gpt-5.5.
- New aggregation tests: breakdown shows `codex-auto-review` while
costing the fallback; Luna and gpt-5.5 auto-review events on either side
of the cutoff keep independent rates (guards the rate-cache key).
- `grok-proxy` resolves to the same rates as `grok-build-0.1`.
- This environment is Linux, so `swift test` could not be run here. CI
on `macos-26` is the compile/test gate.
<!-- CURSOR_AGENT_PR_BODY_END -->

<div><a
href="https://cursor.com/agents/bc-28a06551-9894-4f4b-ac34-9d5daf6e62b1?cursor_ref=pr_footer&cursor_cta=open_in_web"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/assets/images/open-in-web-light.png"><img
alt="Open in Web" width="114" height="28"
src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a>&nbsp;<a
href="https://cursor.com/background-agent?bcId=bc-28a06551-9894-4f4b-ac34-9d5daf6e62b1&cursor_ref=pr_footer&cursor_cta=open_in_cursor"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img
alt="Open in Cursor" width="131" height="28"
src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a>&nbsp;</div>

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant