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

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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [18.4.6] - 2026-10-01
6
+
7
+ ### Added
8
+
9
+ - Added configurable catalog cache-warming lifetimes for cache-capable Claude models on Amazon Bedrock Converse, Bedrock Runtime, and Mantle, with 5-minute defaults and a 1-hour Converse option where supported.
10
+
11
+ ### Fixed
12
+
13
+ - Fixed forced tool calls for Claude Opus 5.5 and Sonnet 5.5 on Amazon Bedrock Converse.
14
+ - Fixed the thinking-off setting for Command Code models served through the Responses API so they no longer produce reasoning when disabled.
15
+
5
16
  ## [18.4.5] - 2026-09-30
6
17
 
7
18
  ### Added
@@ -651,6 +651,12 @@ export interface BedrockCompat {
651
651
  * `PI_OPENAI_STREAM_IDLE_TIMEOUT_MS` alias, then the 300s default.
652
652
  */
653
653
  streamIdleTimeoutMs?: number;
654
+ /**
655
+ * Whether the model accepts a forced `toolChoice` (`any` / `tool`). Claude
656
+ * Opus/Sonnet 5.5 reject it outright; the request builder downgrades forced
657
+ * choices to `auto` when this is false. Default: true.
658
+ */
659
+ supportsForcedToolChoice?: boolean;
654
660
  }
655
661
  /** Fully-resolved Bedrock Converse prompt-cache capabilities, materialized once by `buildModel`. */
656
662
  export interface ResolvedBedrockCompat {
@@ -660,6 +666,7 @@ export interface ResolvedBedrockCompat {
660
666
  supportsLongPromptCacheRetention: boolean;
661
667
  promptCacheMinimumTokens: number;
662
668
  promptCacheMaximumCheckpoints: number;
669
+ supportsForcedToolChoice: boolean;
663
670
  /**
664
671
  * Stream-watchdog idle-timeout fallback in ms for hosts with no keepalive
665
672
  * events; 0 disables the idle watchdog. Undefined defers to
@@ -1194,6 +1201,12 @@ export interface Model<TApi extends Api = Api> {
1194
1201
  * Custom models and provider overrides opt in via models.yml `promptCache`.
1195
1202
  */
1196
1203
  promptCache?: ModelPromptCache;
1204
+ /**
1205
+ * Verbatim configured lifetimes (models.yml, `modelOverrides`, runtime
1206
+ * registrations). `buildModel` applies them over catalog `prompt-cache`
1207
+ * rules on every rebuild; `{}` keeps warming disabled.
1208
+ */
1209
+ promptCacheConfig?: ModelPromptCache;
1197
1210
  /**
1198
1211
  * Interpretation of an all-zero token-rate card. Omitted zero-rate cards
1199
1212
  * are unknown; any non-zero rate is always treated as fixed pricing.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oh-my-pi/pi-catalog",
3
- "version": "18.4.5",
3
+ "version": "18.4.8",
4
4
  "description": "Model catalog for omp: bundled model database, provider discovery descriptors, model identity, classification, and equivalence",
5
5
  "keywords": [
6
6
  "ai",
@@ -93,12 +93,12 @@
93
93
  "gen:proto": "bun scripts/generate-protocols.ts"
94
94
  },
95
95
  "dependencies": {
96
- "@oh-my-pi/omptype": "18.4.5",
97
- "@oh-my-pi/pi-utils": "18.4.5"
96
+ "@oh-my-pi/omptype": "18.4.8",
97
+ "@oh-my-pi/pi-utils": "18.4.8"
98
98
  },
99
99
  "devDependencies": {
100
100
  "@bgotink/kdl": "0.4.0",
101
- "@oh-my-pi/pi-ai": "18.4.5",
101
+ "@oh-my-pi/pi-ai": "18.4.8",
102
102
  "@types/bun": "^1.3.14"
103
103
  },
104
104
  "engines": {
package/src/build.ts CHANGED
@@ -363,5 +363,7 @@ export function buildModel<TApi extends Api>(spec: ModelSpec<TApi>): Model<TApi>
363
363
  };
364
364
  applyCatalogAssignments(model, policy.catalog);
365
365
  applyCatalogCorrections(model, policy.catalog);
366
+ // Configured lifetimes replace catalog lifetimes rather than merging with them.
367
+ if (spec.promptCacheConfig !== undefined) model.promptCache = { ...spec.promptCacheConfig };
366
368
  return model;
367
369
  }
@@ -292,7 +292,7 @@ export const AXES: Readonly<Record<string, AxisDef>> = {
292
292
  "stream-first-event-timeout-ms": wire("streamFirstEventTimeoutMs", [...OAI, "google"]),
293
293
  "stream-idle-timeout-ms": wire("streamIdleTimeoutMs", [...OAI, "anthropic", "bedrock", "google"]),
294
294
  "strip-image-input": wire("stripImageInput", [...OAI, "anthropic", "google"]),
295
- "supports-forced-tool-choice": wire("supportsForcedToolChoice", [...OAI, "anthropic"]),
295
+ "supports-forced-tool-choice": wire("supportsForcedToolChoice", [...OAI, "anthropic", "bedrock"]),
296
296
  "supports-sampling-params": wire("supportsSamplingParams", [...OAI, "anthropic"]),
297
297
  "thinking-loop-guard": wire("thinkingLoopGuard", [...OAI, "anthropic", "google"], "scalar", [
298
298
  "gemini",
@@ -935,6 +935,7 @@ function resolveBedrockPolicy(spec: ModelSpec<"bedrock-converse-stream">, axes:
935
935
  supportsLongPromptCacheRetention: false,
936
936
  promptCacheMinimumTokens: 0,
937
937
  promptCacheMaximumCheckpoints: 0,
938
+ supportsForcedToolChoice: true,
938
939
  };
939
940
  // Reasoning capability is a mechanism gate; adaptive-lineage duration is rule-owned.
940
941
  compat.streamIdleTimeoutMs = compatReasoning(spec, axes) ? BEDROCK_REASONING_STREAM_IDLE_TIMEOUT_MS : undefined;
@@ -183,8 +183,8 @@ provider "openrouter" {
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
185
  | `provider` | `provider "id" { ... }` | Exact provider ID. It is root-only and may contain `class`, `on-api`, and `models`. |
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` or `provider` it may contain `family`, `revision`, and `models`. |
186
+ | `on` | `on "provider-a" "provider-b" { ... }` | One or more provider IDs, combined as OR. It is allowed under a root `class`, and may contain `on-api` to conjoin an API scope plus `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` (directly or nested inside `on`) 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
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. |
@@ -192,6 +192,8 @@ provider "openrouter" {
192
192
 
193
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.
194
194
 
195
+ An `on-api` nested inside `on` under a class requires both the selected provider and request adapter; values within each selector remain alternatives.
196
+
195
197
  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.
196
198
 
197
199
  `priority=N` is an optional signed integer property on the block that owns axis assignments. Its default is zero. Use it only to resolve an intentional equal-specificity overlap; do not use it to encode declaration order.
@@ -49,8 +49,9 @@ class "anthropic" {
49
49
  // Opus 5.5 rejects forced tool selection the way Fable/Mythos do — a
50
50
  // `tool_choice` of `tool` or `any` fails the request with 400
51
51
  // `invalid_request_error`: `tool_choice: type "tool" and "any" are not
52
- // supported for this model`. The transport downgrades the selector to
53
- // `auto` so the tool stays offered instead of the turn dying.
52
+ // supported for this model`. This holds on every route, including Bedrock
53
+ // Converse (`toolChoice: {any: {}}`). The transports downgrade the selector
54
+ // to `auto` so the tool stays offered instead of the turn dying.
54
55
  //
55
56
  // Upper-bounded on purpose: separator-collapsed ids parse their revision
56
57
  // as a whole number (`claude-opus-45` is Opus 4.5, revision 45), so an
@@ -281,27 +282,11 @@ class "anthropic" {
281
282
  }
282
283
  }
283
284
  }
284
- // AWS Bedrock Converse prompt-cache checkpoints, from the AWS model cards
285
- // (docs.aws.amazon.com/bedrock/latest/userguide/model-cards.html); cache
286
- // pricing is deliberately not used to infer these request shapes.
287
285
  on "amazon-bedrock" {
286
+ // Model metadata applies to every Bedrock request adapter.
287
+ // Upstream metadata is stale for cache pricing and context.
288
288
  family "opus" {
289
- revision ">=4 <4.5" {
290
- prompt-cache-mode "explicit"
291
- prompt-cache-minimum-tokens 1024
292
- prompt-cache-maximum-checkpoints 4
293
- }
294
- revision "=4.5" {
295
- prompt-cache-mode "explicit"
296
- prompt-cache-minimum-tokens 4096
297
- prompt-cache-maximum-checkpoints 4
298
- supports-long-prompt-cache-retention #true
299
- }
300
289
  revision "=4.6" {
301
- prompt-cache-mode "explicit"
302
- prompt-cache-minimum-tokens 4096
303
- prompt-cache-maximum-checkpoints 4
304
- // Upstream metadata is stale for cache pricing and context.
305
290
  cost-patch {
306
291
  cache-read 0.5
307
292
  cache-write 6.25
@@ -311,74 +296,196 @@ class "anthropic" {
311
296
  max-tokens 128000
312
297
  }
313
298
  }
314
- revision ">=4.7 <5" {
315
- prompt-cache-mode "explicit"
316
- prompt-cache-minimum-tokens 4096
317
- prompt-cache-maximum-checkpoints 4
318
- supports-long-prompt-cache-retention #true
319
- }
320
- revision ">=5" {
321
- prompt-cache-mode "explicit"
322
- prompt-cache-minimum-tokens 512
323
- prompt-cache-maximum-checkpoints 4
324
- supports-long-prompt-cache-retention #true
325
- }
326
299
  }
327
- family "sonnet" {
328
- revision "=3.5" {
329
- models "*3-5-sonnet-20241022-v2*" {
330
- prompt-cache-mode "explicit"
331
- prompt-cache-minimum-tokens 1024
332
- prompt-cache-maximum-checkpoints 4
333
- }
300
+ // AWS Bedrock Converse prompt-cache checkpoints, from the AWS model cards
301
+ // (docs.aws.amazon.com/bedrock/latest/userguide/model-cards.html); cache
302
+ // pricing is deliberately not used to infer these request shapes. Keep the
303
+ // provider and adapter conjunctive so this policy stays on Converse.
304
+ on-api "bedrock-converse-stream" {
305
+ family "opus" {
306
+ revision ">=4 <4.5" {
307
+ prompt-cache-mode "explicit"
308
+ prompt-cache-minimum-tokens 1024
309
+ prompt-cache-maximum-checkpoints 4
310
+ prompt-cache {
311
+ short 300
312
+ }
313
+ }
314
+ revision "=4.5" {
315
+ prompt-cache-mode "explicit"
316
+ prompt-cache-minimum-tokens 4096
317
+ prompt-cache-maximum-checkpoints 4
318
+ prompt-cache {
319
+ short 300
320
+ long 3600
321
+ }
322
+ supports-long-prompt-cache-retention #true
323
+ }
324
+ revision "=4.6" {
325
+ prompt-cache-mode "explicit"
326
+ prompt-cache-minimum-tokens 4096
327
+ prompt-cache-maximum-checkpoints 4
328
+ prompt-cache {
329
+ short 300
330
+ }
331
+ }
332
+ revision ">=4.7 <5" {
333
+ prompt-cache-mode "explicit"
334
+ prompt-cache-minimum-tokens 4096
335
+ prompt-cache-maximum-checkpoints 4
336
+ supports-long-prompt-cache-retention #true
337
+ prompt-cache {
338
+ short 300
339
+ long 3600
340
+ }
341
+ }
342
+ revision ">=5" {
343
+ prompt-cache-mode "explicit"
344
+ prompt-cache-minimum-tokens 512
345
+ prompt-cache-maximum-checkpoints 4
346
+ supports-long-prompt-cache-retention #true
347
+ prompt-cache {
348
+ short 300
349
+ long 3600
350
+ }
351
+ }
334
352
  }
335
- revision "=3.7" {
336
- prompt-cache-mode "explicit"
337
- prompt-cache-minimum-tokens 1024
338
- prompt-cache-maximum-checkpoints 4
353
+ family "sonnet" {
354
+ revision "=3.5" {
355
+ models "*3-5-sonnet-20241022-v2*" {
356
+ prompt-cache-mode "explicit"
357
+ prompt-cache-minimum-tokens 1024
358
+ prompt-cache-maximum-checkpoints 4
359
+ prompt-cache {
360
+ short 300
361
+ }
362
+ }
363
+ }
364
+ revision "=3.7" {
365
+ prompt-cache-mode "explicit"
366
+ prompt-cache-minimum-tokens 1024
367
+ prompt-cache-maximum-checkpoints 4
368
+ prompt-cache {
369
+ short 300
370
+ }
371
+ }
372
+ revision ">=4 <4.5" {
373
+ prompt-cache-mode "explicit"
374
+ prompt-cache-minimum-tokens 1024
375
+ prompt-cache-maximum-checkpoints 4
376
+ prompt-cache {
377
+ short 300
378
+ }
379
+ }
380
+ revision "=4.5" {
381
+ prompt-cache-mode "explicit"
382
+ prompt-cache-minimum-tokens 4096
383
+ prompt-cache-maximum-checkpoints 4
384
+ supports-long-prompt-cache-retention #true
385
+ prompt-cache {
386
+ short 300
387
+ long 3600
388
+ }
389
+ }
390
+ revision "=4.6" {
391
+ prompt-cache-mode "explicit"
392
+ prompt-cache-minimum-tokens 1024
393
+ prompt-cache-maximum-checkpoints 4
394
+ prompt-cache {
395
+ short 300
396
+ }
397
+ }
398
+ revision ">=5" {
399
+ prompt-cache-mode "explicit"
400
+ prompt-cache-minimum-tokens 4096
401
+ prompt-cache-maximum-checkpoints 4
402
+ supports-long-prompt-cache-retention #true
403
+ prompt-cache {
404
+ short 300
405
+ long 3600
406
+ }
407
+ }
339
408
  }
340
- revision ">=4 <4.5" {
341
- prompt-cache-mode "explicit"
342
- prompt-cache-minimum-tokens 1024
343
- prompt-cache-maximum-checkpoints 4
409
+ family "haiku" {
410
+ revision "=3.5" {
411
+ prompt-cache-mode "explicit"
412
+ prompt-cache-minimum-tokens 2048
413
+ prompt-cache-maximum-checkpoints 4
414
+ prompt-cache {
415
+ short 300
416
+ }
417
+ }
418
+ revision ">=4.5" {
419
+ prompt-cache-mode "explicit"
420
+ prompt-cache-minimum-tokens 4096
421
+ prompt-cache-maximum-checkpoints 4
422
+ supports-long-prompt-cache-retention #true
423
+ prompt-cache {
424
+ short 300
425
+ long 3600
426
+ }
427
+ }
344
428
  }
345
- revision "=4.5" {
346
- prompt-cache-mode "explicit"
347
- prompt-cache-minimum-tokens 4096
348
- prompt-cache-maximum-checkpoints 4
349
- supports-long-prompt-cache-retention #true
429
+ family "fable" {
430
+ revision ">=5" {
431
+ prompt-cache-mode "explicit"
432
+ prompt-cache-minimum-tokens 1024
433
+ prompt-cache-maximum-checkpoints 4
434
+ supports-long-prompt-cache-retention #true
435
+ prompt-cache {
436
+ short 300
437
+ long 3600
438
+ }
439
+ }
350
440
  }
351
- revision "=4.6" {
352
- prompt-cache-mode "explicit"
353
- prompt-cache-minimum-tokens 1024
354
- prompt-cache-maximum-checkpoints 4
441
+ }
442
+ }
443
+ // Messages routes on Bedrock Runtime and Mantle use the Anthropic five-minute
444
+ // cache lifetime. Require both the AWS provider and Messages API: model IDs
445
+ // alone do not distinguish Bedrock from gateways or other API lanes.
446
+ on "amazon-bedrock" "bedrock-mantle" {
447
+ on-api "anthropic-messages" {
448
+ family "opus" {
449
+ revision ">=4.7" {
450
+ prompt-cache {
451
+ short 300
452
+ }
453
+ }
355
454
  }
356
- revision ">=5" {
357
- prompt-cache-mode "explicit"
358
- prompt-cache-minimum-tokens 4096
359
- prompt-cache-maximum-checkpoints 4
360
- supports-long-prompt-cache-retention #true
455
+ family "sonnet" {
456
+ revision ">=4.6" {
457
+ prompt-cache {
458
+ short 300
459
+ }
460
+ }
361
461
  }
362
- }
363
- family "haiku" {
364
- revision "=3.5" {
365
- prompt-cache-mode "explicit"
366
- prompt-cache-minimum-tokens 2048
367
- prompt-cache-maximum-checkpoints 4
462
+ family "haiku" {
463
+ revision ">=4.5" {
464
+ prompt-cache {
465
+ short 300
466
+ }
467
+ }
368
468
  }
369
- revision ">=4.5" {
370
- prompt-cache-mode "explicit"
371
- prompt-cache-minimum-tokens 4096
372
- prompt-cache-maximum-checkpoints 4
373
- supports-long-prompt-cache-retention #true
469
+ family "fable" {
470
+ revision ">=5" {
471
+ prompt-cache {
472
+ short 300
473
+ }
474
+ }
374
475
  }
375
- }
376
- family "fable" {
377
- revision ">=5" {
378
- prompt-cache-mode "explicit"
379
- prompt-cache-minimum-tokens 1024
380
- prompt-cache-maximum-checkpoints 4
381
- supports-long-prompt-cache-retention #true
476
+ family "mythos" {
477
+ // The Mythos Preview id has no numeric revision to select.
478
+ models "*mythos-preview*" {
479
+ prompt-cache {
480
+ short 300
481
+ }
482
+ }
483
+
484
+ revision ">=5" {
485
+ prompt-cache {
486
+ short 300
487
+ }
488
+ }
382
489
  }
383
490
  }
384
491
  }
@@ -54,6 +54,24 @@ provider "commandcode" {
54
54
  supports-eager-tool-input-streaming #false
55
55
  supports-long-cache-retention #false
56
56
  }
57
+ // Endpoint contract for every id `api-routes provider="commandcode"` sends to
58
+ // Responses. Responses accepts `reasoning.effort: "none"` while chat
59
+ // completions rejects it (low|medium|high|xhigh|max only), so thinking-off
60
+ // disables reasoning instead of clamping to the lowest effort. Ids without
61
+ // an effort ladder stay inert through provider-level
62
+ // `supports-reasoning-effort #false`. The Responses endpoint also rejects an
63
+ // object `tool_choice` (verified 2026-09-29), so named choices degrade to
64
+ // `"required"`.
65
+ on-api "openai-responses" {
66
+ reasoning-disable-mode "none-effort"
67
+ supports-named-tool-choice #false
68
+ }
69
+ // First-party OpenAI grants `none` only to the 5.6 generation
70
+ // (`providers/openai.kdl`); the gateway may forward `reasoning.effort`
71
+ // unchanged, so the other GPT ids keep the first-party lowest-effort off.
72
+ models "gpt-5.3-codex" "gpt-5.4" "gpt-5.4-mini" "gpt-5.5" "gpt-6-astra" "gpt-6-luna" "gpt-6-sol" {
73
+ reasoning-disable-mode "lowest-effort"
74
+ }
57
75
  models "typesafe/jev" {
58
76
  kind "judge"
59
77
  }
@@ -154,15 +172,13 @@ provider "commandcode" {
154
172
  max-tokens 65536
155
173
  }
156
174
  }
157
- // Command Code's Responses endpoint rejects an object `tool_choice` and returns
158
- // no bytes from `image_generation` (verified 2026-09-29), so the openai
159
- // class's hosted-image and image-model grants do not apply and named choices
160
- // degrade to `"required"`. Hosted web search still works with a string `tool_choice`.
175
+ // Command Code's Responses endpoint returns no bytes from `image_generation`
176
+ // (verified 2026-09-29), so the openai class's hosted-image and image-model
177
+ // grants do not apply. Hosted web search still works with a string `tool_choice`.
161
178
  models "gpt-5.3-codex" "gpt-5.4" "gpt-5.4-mini" "gpt-5.5" "gpt-5.6-luna" "gpt-5.6-sol" \
162
179
  "gpt-5.6-terra" "gpt-6-astra" "gpt-6-luna" "gpt-6-sol" {
163
180
  hosted-image #false
164
181
  image-model #false
165
- supports-named-tool-choice #false
166
182
  }
167
183
  // ---------------------------------------------------------------------------
168
184
  // This table prices every model id that GET /provider/v1/models serves.
@@ -212,14 +212,31 @@ behavior {
212
212
  route "openai-responses" prefix="grok-4." prefix="gpt-5" prefix="gpt-6" prefix="oswe" prefix="mai-"
213
213
  }
214
214
  // Command Code serves Claude ids through its Anthropic-compatible Messages
215
- // endpoint, its ten GPT ids (the same set command-code@1.67.0 marks
216
- // `spec: "responses"`) through its Responses endpoint, and every other id
217
- // through chat completions.
215
+ // endpoint and everything else through chat completions or Responses
216
+ // (`supported_endpoints` on /provider/v1/models). Chat completions rejects
217
+ // `reasoning_effort: "none"` (low|medium|high|xhigh|max only), while
218
+ // Responses accepts `reasoning.effort: "none"`. Every id with a reviewed
219
+ // effort ladder that lists `/responses` therefore rides Responses, so
220
+ // thinking-off actually disables reasoning instead of clamping to the
221
+ // lowest effort. Ladder ids without `/responses` (deepseek-v4-flash-fast,
222
+ // gemini-3.7-flash, Qwen3.8-Flash, Qwen3.8-Max-0902, hy4-preview,
223
+ // space-bunny-alpha), the Qwen3.8 ids (chat already disables them through
224
+ // `enable_thinking: false`), and non-reasoning ids stay on chat completions.
218
225
  api-routes provider="commandcode" default="openai-completions" {
219
226
  route "anthropic-messages" prefix="claude-"
220
227
  route "openai-responses" exact="gpt-5.3-codex" exact="gpt-5.4" exact="gpt-5.4-mini" exact="gpt-5.5" \
221
228
  exact="gpt-5.6-luna" exact="gpt-5.6-sol" exact="gpt-5.6-terra" exact="gpt-6-astra" \
222
- exact="gpt-6-luna" exact="gpt-6-sol"
229
+ exact="gpt-6-luna" exact="gpt-6-sol" \
230
+ exact="deepseek/deepseek-v4-flash" exact="deepseek/deepseek-v4-flash-vision-exp" \
231
+ exact="deepseek/deepseek-v4-pro" exact="deepseek/deepseek-v4.1-flash" \
232
+ exact="deepseek/deepseek-v4.1-flash-fast" exact="moonshotai/Kimi-K3" \
233
+ exact="z-ai/glm-5.3-flash" exact="z-ai/glm-5.3-flashx" exact="zai-org/GLM-5.2" \
234
+ exact="zai-org/GLM-5.3" exact="google/gemini-3.1-flash-lite" exact="google/gemini-3.5-flash" \
235
+ exact="google/gemini-3.5-flash-lite" exact="google/gemini-3.6-flash" \
236
+ exact="google/gemini-3.8-flash" exact="MiniMaxAI/MiniMax-M3" exact="stepfun/Step-5-Preview" \
237
+ exact="xai/grok-4.5" exact="xai/grok-4.6" exact="xai/grok-4.7" exact="meta/muse-spark-1.1" \
238
+ exact="meta/muse-spark-1.2" exact="meta/muse-spark-1.2-contributor" exact="meta/muse-spark-1.3" \
239
+ exact="meta/muse-spark-1.3-contributor" exact="stealth/pixel-canary" exact="sakana/fugu-ultra"
223
240
  }
224
241
  // ZenMux fronts Anthropic ids on a dedicated Messages endpoint; every
225
242
  // other namespace stays on chat completions.