@oh-my-pi/pi-catalog 18.4.3 → 18.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/types/compat/anthropic.d.ts +6 -0
  3. package/dist/types/compat/auth-ids.d.ts +2 -2
  4. package/dist/types/compat/axes.d.ts +3 -1
  5. package/dist/types/compat/factory-droid.d.ts +65 -0
  6. package/dist/types/compat/provider-ids.d.ts +1 -1
  7. package/dist/types/compat/resolve.d.ts +8 -2
  8. package/dist/types/compat/types.d.ts +26 -1
  9. package/dist/types/discovery/cursor-proto.d.ts +284 -0
  10. package/dist/types/discovery/cursor.d.ts +12 -6
  11. package/dist/types/discovery/factory-droid.d.ts +28 -0
  12. package/dist/types/discovery/index.d.ts +1 -0
  13. package/dist/types/discovery/protobuf.d.ts +3 -3
  14. package/dist/types/hosts.d.ts +13 -0
  15. package/dist/types/model-manager.d.ts +10 -0
  16. package/dist/types/models.d.ts +5 -1
  17. package/dist/types/provider-models/cache-provider-id.d.ts +2 -1
  18. package/dist/types/provider-models/descriptor-types.d.ts +2 -1
  19. package/dist/types/provider-models/openai-compat.d.ts +21 -0
  20. package/dist/types/provider-models/special.d.ts +2 -0
  21. package/dist/types/types.d.ts +115 -3
  22. package/dist/types/wire/codex.d.ts +5 -3
  23. package/dist/types/wire/cursor.d.ts +20 -0
  24. package/dist/types/wire/factory-droid.d.ts +45 -0
  25. package/package.json +4 -4
  26. package/src/build.ts +19 -0
  27. package/src/compat/anthropic.ts +11 -1
  28. package/src/compat/auth-ids.ts +4 -0
  29. package/src/compat/axes.ts +114 -1
  30. package/src/compat/cascade.ts +8 -1
  31. package/src/compat/collapse.ts +3 -0
  32. package/src/compat/factory-droid.ts +170 -0
  33. package/src/compat/provider-ids.ts +2 -0
  34. package/src/compat/resolve.ts +59 -8
  35. package/src/compat/rules/README.md +15 -7
  36. package/src/compat/rules/auth/_order.kdl +2 -2
  37. package/src/compat/rules/auth/factory-droid.kdl +28 -0
  38. package/src/compat/rules/auth/helmcode.kdl +9 -0
  39. package/src/compat/rules/classes/anthropic.kdl +16 -4
  40. package/src/compat/rules/providers/cursor.kdl +29 -17
  41. package/src/compat/rules/providers/factory-droid.kdl +1166 -0
  42. package/src/compat/rules/providers/helmcode.kdl +120 -0
  43. package/src/compat/rules/providers/openai-codex.kdl +17 -0
  44. package/src/compat/rules/runtime/behavior.kdl +44 -0
  45. package/src/compat/rules/taxonomy/_collapse.kdl +36 -14
  46. package/src/compat/rules.json +1 -1
  47. package/src/compat/types.ts +27 -1
  48. package/src/discovery/codex.ts +16 -0
  49. package/src/discovery/cursor-models.proto +261 -0
  50. package/src/discovery/cursor-proto.ts +471 -0
  51. package/src/discovery/cursor.ts +817 -88
  52. package/src/discovery/devin.ts +1 -3
  53. package/src/discovery/factory-droid.ts +296 -0
  54. package/src/discovery/index.ts +1 -0
  55. package/src/discovery/protobuf.ts +16 -7
  56. package/src/hosts.ts +47 -0
  57. package/src/model-manager.ts +13 -0
  58. package/src/models.json +1 -1
  59. package/src/models.ts +13 -0
  60. package/src/provider-models/cache-provider-id.ts +37 -6
  61. package/src/provider-models/descriptor-types.ts +2 -1
  62. package/src/provider-models/descriptors.ts +4 -0
  63. package/src/provider-models/openai-compat.ts +83 -17
  64. package/src/provider-models/special.ts +26 -2
  65. package/src/types.ts +129 -1
  66. package/src/wire/codex.ts +5 -3
  67. package/src/wire/cursor.ts +32 -0
  68. package/src/wire/factory-droid.ts +130 -0
@@ -152,7 +152,7 @@ discovery {
152
152
 
153
153
  ## Cascade grammar
154
154
 
155
- A cascade document starts with `class`, `provider`, or `on-api`. Root `on-api` declares a transport contract independent of model identity and provider name. Every selector adds a conjunct to the current rule. `on` scopes by deployment provider; `on-api` scopes by request adapter, including custom provider names. Axis directives may appear directly in any permitted scope, and nested selector blocks may appear alongside them.
155
+ A cascade document starts with `class`, `provider`, or `on-api`. Root `on-api` declares a transport contract independent of model identity and provider name. Every selector adds a conjunct to the current rule. `on` scopes by deployment provider; `on-api` scopes by request adapter, including custom provider names; `on-upstream` scopes by the actual upstream selected behind that deployment. An upstream never changes the deployment provider or imports that upstream's direct-host rules. Axis directives may appear directly in any permitted scope, and nested selector blocks may appear alongside them.
156
156
 
157
157
  ```kdl
158
158
  class "gemini" {
@@ -182,14 +182,15 @@ provider "openrouter" {
182
182
  | Selector | Form | Matching semantics |
183
183
  | ---------- | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
184
184
  | `class` | `class "id" { ... }` | Exact class ID. At document root it may contain `on`, `on-api`, `family`, `revision`, and `models`. Under `provider` it may contain `family`, `revision`, and `models`. |
185
- | `provider` | `provider "id" { ... }` | Exact provider ID. It is root-only and may contain `class` and `models`. |
185
+ | `provider` | `provider "id" { ... }` | Exact provider ID. It is root-only and may contain `class`, `on-api`, and `models`. |
186
186
  | `on` | `on "provider-a" "provider-b" { ... }` | One or more provider IDs, combined as OR. It is allowed only under a root `class`, and may contain `family`, `revision`, and `models`. |
187
- | `on-api` | `on-api "adapter-a" "adapter-b" { ... }` | One or more request adapter IDs, combined as OR. At document root it may contain `class` and `models`; under a root `class` it may contain `family`, `revision`, and `models`. |
187
+ | `on-api` | `on-api "adapter-a" "adapter-b" { ... }` | One or more request adapter IDs, combined as OR. At document root it may contain `class` and `models`; under a root `class` or `provider` it may contain `family`, `revision`, and `models`. |
188
188
  | `family` | `family "id" { ... }` | Exact classified family ID. It may contain `revision` and `models`. A target with no family does not match. |
189
189
  | `revision` | `revision ">=2.5 <4" { ... }` | A non-empty, whitespace-separated conjunction of comparisons. It may contain `models`. A target with no revision does not match. |
190
- | `models` | `models "id" "vendor/*" { ... }` | One or more alternatives, combined as OR. It cannot contain another selector. `token="name"` matches an ASCII-case-insensitive token bounded by non-alphanumerics. |
190
+ | `models` | `models "id" "vendor/*" { ... }` | One or more alternatives, combined as OR. It may contain only `on-upstream`. `token="name"` matches an ASCII-case-insensitive token bounded by non-alphanumerics. |
191
+ | `on-upstream` | `on-upstream "a" "b" { ... }` | Exact selected upstream IDs, combined as OR. Allowed inside any selector scope once; preserves the containing scope's other permitted children. Absent upstream never matches. |
191
192
 
192
- Class, provider/`on`, `on-api`, and family selector values are compared exactly and case-sensitively to the structured resolve target. Revision operators are `>=`, `>`, `<=`, `<`, and `=`; operands have one to three dot-separated unsigned 8-bit components, omitted components zero.
193
+ Every selector scope may additionally contain `on-upstream`; it cannot replace an already constrained upstream. Class, provider/`on`, `on-api`, `on-upstream`, and family values are compared exactly and case-sensitively to the structured resolve target. Revision operators are `>=`, `>`, `<=`, `<`, and `=`; operands have one to three dot-separated unsigned 8-bit components, omitted components zero.
193
194
 
194
195
  A `models` string without `*` is an exact, case-sensitive match against the provider-relative model identifier. A string containing `*` is an anchored, ASCII-case-insensitive wildcard match. Prefer taxonomy ranks; retain exact/glob lists only when they isolate the census member set exactly, and keep a `// residue:` comment explaining why ranks do not.
195
196
 
@@ -197,6 +198,8 @@ A `models` string without `*` is an exact, case-sensitive match against the prov
197
198
 
198
199
  `buildDiscoveredModel(spec, providerType)` resolves the catalog `discovery-api` axis before materializing compatibility. It preserves the credential-bearing provider ID and records `providerType` as the backend used for provider selectors on subsequent rebuilds. Ordinary `buildModel` preserves its input API. This lets custom-named llama.cpp deployments reuse the same rules without model-specific discovery code.
199
200
 
201
+ `resolveModelPolicy(spec, { upstream })` resolves the selected route without mutating the model identity. Call it again when retry routing selects another upstream. Its typed `request` record carries request-shaping axes (reasoning history, disabled-effort semantics, Anthropic thinking mode, Responses options, and Google thinking dialect); shared transport fields remain in `compat`. Both records use the same per-axis cascade, precedence, ambiguity checks, and upstream-aware cache key. Request fields have the `request` applicability record in `axes.ts`, so they do not leak into shared transport compat objects. See [`providers/factory-droid.kdl`](providers/factory-droid.kdl) for the upstream-scoped consumer.
202
+
200
203
  ### Axis vocabulary and value shapes
201
204
 
202
205
  The directive vocabulary is closed and lives in **`src/compat/axes.ts`** — one table mapping each kebab-case directive to its resolved camelCase field, namespace (`wire` / `thinking` / `catalog`), value shape, applicable compat records, and (for enums) accepted values. The compiler rejects unknown directives and out-of-vocabulary values against that table; consult it rather than a duplicated table here.
@@ -204,12 +207,16 @@ The directive vocabulary is closed and lives in **`src/compat/axes.ts`** — one
204
207
  The three value shapes are:
205
208
 
206
209
  - **Scalar**: exactly one KDL boolean, integer, float, or string argument and no children. `#null` is rejected.
207
- - **Array**: one or more scalar arguments and no children; it resolves to a JSON array.
210
+ - **Array**: one or more scalar arguments and no children; it resolves to a JSON array. Axes marked `emptyArray` in `axes.ts` also accept a bare directive, which assigns an explicit empty list (`region-upstreams-eu` with no arguments: the region never serves the model).
208
211
  - **Object**: no arguments and a child block, including an empty block. Child names are kebab-case: an axis-directive spelling compiles to its resolved axis key (`template-reasoning-effort` → `qwenTemplateReasoningEffort`), anything else converts mechanically (`input-threshold` → `inputThreshold`); camelCase names are a compile error. `extra-body` payloads (top-level or nested) are the exception — their child names are literal wire JSON keys copied verbatim (`enable_thinking`). Each child is either one scalar or another object; arrays are not representable inside an object payload.
209
212
 
210
213
  A rule cannot assign the same resolved axis twice in one block.
211
214
  One object axis carries a computed form: `long-context-cost` accepts either the absolute rates (`input-threshold` + `input`/`output`/`cache-read`/`cache-write`) or `input-threshold` + `multiplier` (with optional `input-threshold-inclusive`), which derives the tier from the row's live base price at build time so the rule tracks upstream list-price updates (xAI's SuperGrok 200K tier). Rows without a token price carry no tier.
212
215
 
216
+ `context-window-authoritative #true` preserves a host's supplied context window through runtime model selection instead of applying inferred expansion or reference-price-tier caps. Explicit user context overrides still apply afterward. It applies to rows materialized through `buildModel` (discovery and regenerated bundles). See [`providers/factory-droid.kdl`](providers/factory-droid.kdl).
217
+
218
+ The routed-subscription registry axes (`upstream-rotation`, `region-upstreams-global|us|eu`, `region-limits-eu`, `credit-rates`, `list-price-from`, `routing-family`, `policy-aliases`, `entitlement`, `default-reasoning-off`) describe a gateway whose proxy fans one model out to several upstreams. They are read through `src/compat/factory-droid.ts` by Factory Droid discovery and its request provider, not materialized by `buildModel`. A provider-wide `region-upstreams-*` rule is the upstream serving table and a model rule replaces it for that region. `list-price-from "<provider>" ["<id>"]` shows a bundled row's list price beside the subscription's own billing; unlike seed values it is resolved at runtime and degrades to the seed's zero cost when the row is gone. See [`providers/factory-droid.kdl`](providers/factory-droid.kdl), whose wire and billing pool per model are `api-routes` and `quota-tiers` rules in `runtime/behavior.kdl`.
219
+
213
220
  ### Time-based pricing
214
221
 
215
222
  The catalog object axis `time-based-cost` materializes into `ModelCost.timeBased`. It uses **named child objects**, not KDL arrays or repeated anonymous windows. For example, inside a matching provider/model scope:
@@ -258,7 +265,7 @@ Rules resolve independently per axis. A matching rule is ranked by:
258
265
  The tuple is compared lexicographically, greatest first:
259
266
 
260
267
  - model exactness is `2` when any matching `models` selector is exact, `1` when the best matching selector is a glob or token, and `0` when the rule has no `models` selector;
261
- - dimension count is the number of present dimensions among class, provider/`on`, API/`on-api`, family, revision, and models;
268
+ - dimension count is the number of present dimensions among class, provider/`on`, API/`on-api`, upstream/`on-upstream`, family, revision, and models;
262
269
  - priority is the local block's `priority`, defaulting to `0`.
263
270
 
264
271
  The highest-ranked matching assignment wins for that axis. Two distinct rules that tie on all three components and assign the same axis are an ambiguity error even if their values are equal. File and declaration order never resolve the tie; add an explicit priority only after confirming the overlap is intentional.
@@ -417,6 +424,7 @@ A `seed` _defines_ bundled rows for providers whose catalog cannot be discovered
417
424
  | `always` | Every regeneration. Same-id upstream/discovery rows win dedup. |
418
425
  | `fallback` | Only when the provider's authoritative catalog discovery did not succeed. |
419
426
  | `empty` | Only when no other source produced a row for the provider. |
427
+ | `never` | Never; the provider's runtime model manager is the only consumer. |
420
428
 
421
429
  `precedence="seed"` prepends the rows after the previous-snapshot merge and cross-provider reference fills, so the authored row wins dedup and same-id rows on other hosts never overwrite its name or capabilities (QwenCloud Token Plan, Meta). The default `upstream` precedence appends before the snapshot merge, so the current seed — not a stale snapshot copy — is the fallback row.
422
430
 
@@ -5,8 +5,8 @@ login-order "openai-codex" "anthropic" "zai" "zai-coding-plan" "kimi-code" "open
5
5
  "cursor" "devin" "google-antigravity" "google-gemini-cli" "openai-codex-device" "xai" "xai-oauth" \
6
6
  "gitlab-duo" "gitlab-duo-agent" "alibaba-coding-plan" "alibaba-token-plan" "aiand" "abliteration" "zhipu-coding-plan" \
7
7
  "umans" "qwen-portal" "sakana" "minimax-code" "minimax-code-cn" "xiaomi" "xiaomi-token-plan-sgp" \
8
- "xiaomi-token-plan-ams" "xiaomi-token-plan-cn" "firepass" "cline-pass" "commandcode" "charm-hyper" "deepseek" "stepfun" "muse-code" "meta" "moonshot" \
9
- "cerebras" "baseten" "fireworks" "together" "nvidia" "novita" "deepinfra" "huggingface" "perplexity" \
8
+ "xiaomi-token-plan-ams" "xiaomi-token-plan-cn" "firepass" "cline-pass" "factory-droid" "commandcode" "charm-hyper" "deepseek" "stepfun" "muse-code" "meta" "moonshot" \
9
+ "cerebras" "baseten" "helmcode" "fireworks" "together" "nvidia" "novita" "deepinfra" "huggingface" "perplexity" \
10
10
  "qianfan" "venice" "siliconflow" "siliconflow-cn" "synthetic" "nanogpt" "wafer-serverless" "coreweave" \
11
11
  "vercel-ai-gateway" "cloudflare-ai-gateway" "litellm" "kilo" "zenmux" "opencode-zen" "opencode-go" \
12
12
  "yolo-auto" "tavily" "kagi" "exa" "parallel" "typesafe" "ollama" "ollama-cloud" "lm-studio" "llama.cpp" "vllm" \
@@ -0,0 +1,28 @@
1
+ auth "factory-droid" {
2
+ name "Factory Droid"
3
+ org-scoped-identity #true
4
+ // WorkOS public client: the access token authorizes the Factory LLM proxy.
5
+ login "device-code" {
6
+ client-id "client_01HNM792M5G5G1A2THWPXKFMXB"
7
+ device url="https://api.workos.com/user_management/authorize/device" timeout-ms=15000 {
8
+ headers { Accept "application/json" }
9
+ }
10
+ token url="https://api.workos.com/user_management/authenticate" timeout-ms=15000 {
11
+ headers { Accept "application/json" }
12
+ }
13
+ credential {
14
+ expires "jwt" skew-ms=0 fallback-ms=86400000
15
+ email "user.email" claim="email"
16
+ account-id "user.id" claim="sub"
17
+ // WorkOS organization_id is internal; only this claim can be used as X-Factory-Org-Id.
18
+ org-id claim="external_org_id"
19
+ }
20
+ after-exchange hook="factory-droid-region"
21
+ }
22
+ refresh {
23
+ token url="https://api.workos.com/user_management/authenticate" timeout-ms=15000 {
24
+ headers { Accept "application/json" }
25
+ }
26
+ after-refresh hook="factory-droid-region"
27
+ }
28
+ }
@@ -0,0 +1,9 @@
1
+ auth "helmcode" {
2
+ name "Helmcode"
3
+ login "api-key" {
4
+ auth-url "https://cloud.helmcode.com"
5
+ instructions "Copy your API key from the Helmcode dashboard"
6
+ prompt "Paste your Helmcode API key" placeholder="sk-..."
7
+ validate "models-endpoint" label="Helmcode" url="https://api.helmcode.com/v1/models"
8
+ }
9
+ }
@@ -7,11 +7,11 @@ class "anthropic" {
7
7
  thinking-prefix-binding #true
8
8
  }
9
9
  }
10
- // On-demand compaction (compact-2026-09-04) is available on the Claude
11
- // API and Vertex, not Amazon Bedrock or unverified gateway deployments.
10
+ // On-demand compaction (compact-2026-09-04) works on the Claude API, Vertex,
11
+ // and Amazon Bedrock's `/anthropic` routes, not Bedrock Converse.
12
12
  // Foundry / Claude Platform on AWS are first-party Anthropic routes whose
13
13
  // effective URLs are checked at request time.
14
- on "anthropic" "google-vertex" {
14
+ on "anthropic" "google-vertex" "amazon-bedrock" "bedrock-mantle" {
15
15
  family "fable" {
16
16
  revision ">=5" {
17
17
  supports-server-compaction #true
@@ -68,6 +68,10 @@ class "anthropic" {
68
68
  family "sonnet" {
69
69
  revision ">=5.5 <6" {
70
70
  supports-forced-tool-choice #false
71
+ // `thinking: {type: "disabled"}` is a 400; `between_tools` is the
72
+ // lowest thinking setting.
73
+ // https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#turn-off-up-front-thinking
74
+ supports-between-tools-thinking #true
71
75
  // Signed thinking is bound to the exact preceding conversation.
72
76
  thinking-prefix-binding #true
73
77
  }
@@ -104,7 +108,6 @@ class "anthropic" {
104
108
  supports-mid-conversation-tool-changes #true
105
109
  supports-turn-scoped-system #true
106
110
  supports-per-message-effort #true
107
- supports-thinking-binding-controls #true
108
111
  }
109
112
  }
110
113
  family "opus" {
@@ -118,6 +121,15 @@ class "anthropic" {
118
121
  }
119
122
  }
120
123
  }
124
+ // Vertex rejects `thinking.block_binding` on Sonnet 5.5 with 400
125
+ // `thinking.adaptive.block_binding: Extra inputs are not permitted`.
126
+ on "anthropic" "cloudflare-ai-gateway" {
127
+ family "sonnet" {
128
+ revision ">=5.5" {
129
+ supports-thinking-binding-controls #true
130
+ }
131
+ }
132
+ }
121
133
  on "aimlapi" "gitlab-duo" "kilo" "nanogpt" "venice" {
122
134
  thinking-efforts "minimal" "low" "medium" "high" "xhigh"
123
135
  }
@@ -8,6 +8,11 @@ provider "cursor" {
8
8
  }
9
9
 
10
10
  thinking-mode "effort"
11
+ // Cursor's default route selects a differently priced backing model per request.
12
+ models "default" {
13
+ pricing-status "variable"
14
+ }
15
+
11
16
  class "anthropic" {
12
17
  family "fable" {
13
18
  requires-cursor-tool-schema-projection #true
@@ -211,9 +216,10 @@ provider "cursor" {
211
216
  }
212
217
  }
213
218
  // Claude Opus 5 Fast: the docs name the fast wire ids but publish no
214
- // fast multiplier, so fast bills at the base Opus 5 card.
219
+ // fast rate. Discovery applies AvailableModels' declared fast multiplier
220
+ // (2x); the base card only seeds rows discovery left unpriced.
215
221
  models "claude-opus-5-high-fast" "claude-opus-5-low-fast" "claude-opus-5-medium-fast" "claude-opus-5-thinking-max-fast" "claude-opus-5-thinking-xhigh-fast" {
216
- cost-patch {
222
+ cost-fallback {
217
223
  input 5.0
218
224
  output 25.0
219
225
  cache-read 0.5
@@ -231,9 +237,10 @@ provider "cursor" {
231
237
  }
232
238
  }
233
239
  // Claude Opus 5.5 Fast: the docs name the fast wire id but publish no
234
- // fast multiplier, so fast bills at the base Opus 5.5 card.
240
+ // fast rate. Discovery prices it from AvailableModels' declared fast
241
+ // multiplier; the base card only seeds rows discovery left unpriced.
235
242
  models "claude-opus-5-5-fast" {
236
- cost-patch {
243
+ cost-fallback {
237
244
  input 4.0
238
245
  output 20.0
239
246
  cache-read 0.2
@@ -267,8 +274,9 @@ provider "cursor" {
267
274
  cache-write 0
268
275
  }
269
276
  }
270
- // Grok 4.5: $2/$6, cache read $0.50, no write fee.
271
- models "cursor-grok-4.5" {
277
+ // Grok 4.5: $2/$6, cache read $0.50, no write fee. Legacy id plus the
278
+ // per-effort wire slugs AvailableModels serves.
279
+ models "cursor-grok-4.5" "cursor-grok-4.5-low" "cursor-grok-4.5-medium" "cursor-grok-4.5-high" {
272
280
  cost-patch {
273
281
  input 2.0
274
282
  output 6.0
@@ -277,7 +285,7 @@ provider "cursor" {
277
285
  }
278
286
  }
279
287
  // Grok 4.5 Fast: $4/$18, cache read $1.00. Output is 3x base per docs.
280
- models "cursor-grok-4.5-fast" {
288
+ models "cursor-grok-4.5-fast" "cursor-grok-4.5-low-fast" "cursor-grok-4.5-medium-fast" "cursor-grok-4.5-high-fast" {
281
289
  cost-patch {
282
290
  input 4.0
283
291
  output 18.0
@@ -285,8 +293,9 @@ provider "cursor" {
285
293
  cache-write 0
286
294
  }
287
295
  }
288
- // Grok 4.6: $2/$6, cache read $0.50, no write fee.
289
- models "cursor-grok-4.6" {
296
+ // Grok 4.6: $2/$6, cache read $0.50, no write fee. Legacy id plus the
297
+ // per-effort wire slugs AvailableModels serves.
298
+ models "cursor-grok-4.6" "cursor-grok-4.6-low" "cursor-grok-4.6-medium" "cursor-grok-4.6-high" "cursor-grok-4.6-xhigh" {
290
299
  cost-patch {
291
300
  input 2.0
292
301
  output 6.0
@@ -295,7 +304,8 @@ provider "cursor" {
295
304
  }
296
305
  }
297
306
  // Grok 4.6 Fast: $4/$12, cache read $1.00.
298
- models "cursor-grok-4.6-fast" {
307
+ models "cursor-grok-4.6-fast" "cursor-grok-4.6-low-fast" "cursor-grok-4.6-medium-fast" "cursor-grok-4.6-high-fast" \
308
+ "cursor-grok-4.6-xhigh-fast" {
299
309
  cost-patch {
300
310
  input 4.0
301
311
  output 12.0
@@ -448,10 +458,10 @@ provider "cursor" {
448
458
  cache-write 0
449
459
  }
450
460
  }
451
- // GPT-5.2 Fast: the docs publish no fast multiplier, so fast bills at
452
- // the base GPT-5.2 card.
461
+ // GPT-5.2 Fast: the docs publish no fast rate. Discovery applies the
462
+ // declared fast multiplier; the base card only seeds unpriced rows.
453
463
  models "gpt-5.2-fast" "gpt-5.2-high-fast" "gpt-5.2-low-fast" "gpt-5.2-xhigh-fast" {
454
- cost-patch {
464
+ cost-fallback {
455
465
  input 1.75
456
466
  output 14.0
457
467
  cache-read 0.175
@@ -486,9 +496,10 @@ provider "cursor" {
486
496
  cache-write 0
487
497
  }
488
498
  }
489
- // GPT-5.3 Codex Fast: no fast multiplier published; base card applies.
499
+ // GPT-5.3 Codex Fast: no fast rate published; discovery applies the
500
+ // declared multiplier, and the base card only seeds unpriced rows.
490
501
  models "gpt-5.3-codex-fast" "gpt-5.3-codex-high-fast" "gpt-5.3-codex-low-fast" "gpt-5.3-codex-xhigh-fast" {
491
- cost-patch {
502
+ cost-fallback {
492
503
  input 1.75
493
504
  output 14.0
494
505
  cache-read 0.175
@@ -543,9 +554,10 @@ provider "cursor" {
543
554
  cache-write 0
544
555
  }
545
556
  }
546
- // GPT-5.5 Fast: higher fast rates are unpublished; base card applies.
557
+ // GPT-5.5 Fast: fast rates are unpublished; discovery applies the declared
558
+ // multiplier, and the base card only seeds unpriced rows.
547
559
  models "gpt-5.5-fast" {
548
- cost-patch {
560
+ cost-fallback {
549
561
  input 5.0
550
562
  output 30.0
551
563
  cache-read 0.5