@oh-my-pi/pi-catalog 16.4.0 → 16.4.1

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,24 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [16.4.1] - 2026-07-10
6
+
7
+ ### Added
8
+
9
+ - Added GPT-5.6 Luna, Sol, and Terra models
10
+ - Added perplexity-academic-researcher model
11
+
12
+ ### Changed
13
+
14
+ - Updated context windows for multiple GPT-5.6 models
15
+ - Increased max tokens for several models
16
+ - Updated cache write costs for GPT-5.6 variants
17
+ - Reduced pricing for select models
18
+
19
+ ### Removed
20
+
21
+ - Removed the generated GPT-5.6 pro-reasoning aliases (`gpt-5.6-{luna,sol,terra}-pro`) from the `openai-codex` subscription provider — pro reasoning is not offered on subscriptions; the `openai` API-key aliases remain
22
+
5
23
  ## [16.4.0] - 2026-07-10
6
24
 
7
25
  ### Breaking Changes
@@ -56,14 +56,14 @@ export interface OpenAIModelManagerConfig {
56
56
  export declare function openaiModelManagerOptions(config?: OpenAIModelManagerConfig): ModelManagerOptions<"openai-responses">;
57
57
  /**
58
58
  * Re-derive the generated pro-reasoning aliases (`gpt-5.6-*-pro`) for the
59
- * first-party `openai`/`openai-codex` gpt-5.6 rows. Each alias inherits the
60
- * base row's metadata, requests the base wire id via `requestModelId`, and
61
- * sets `reasoningMode: "pro"` so Responses-family request builders emit
59
+ * first-party `openai` gpt-5.6 rows. Each alias inherits the base row's
60
+ * metadata, requests the base wire id via `requestModelId`, and sets
61
+ * `reasoningMode: "pro"` so Responses-family request builders emit
62
62
  * `reasoning: { mode: "pro" }`. Called by the models.json generator after all
63
- * sources merge: stale copies of the owned aliases (previous snapshot) are
64
- * dropped and re-projected from the current base rows so alias metadata always
65
- * tracks the base, while a real upstream model that occupies an alias id wins
66
- * and suppresses the projection.
63
+ * sources merge: stale copies of the owned aliases (previous snapshot,
64
+ * including retired `openai-codex` rows) are dropped and re-projected from the
65
+ * current base rows so alias metadata always tracks the base, while a real
66
+ * upstream model that occupies an alias id wins and suppresses the projection.
67
67
  */
68
68
  export declare function projectOpenAIProReasoningAliases(models: readonly ModelSpec<Api>[]): ModelSpec<Api>[];
69
69
  export interface GroqModelManagerConfig {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@oh-my-pi/pi-catalog",
4
- "version": "16.4.0",
4
+ "version": "16.4.1",
5
5
  "description": "Model catalog for omp: bundled model database, provider discovery descriptors, model identity, classification, and equivalence",
6
6
  "homepage": "https://omp.sh",
7
7
  "author": "Can Boluk",
@@ -34,12 +34,12 @@
34
34
  },
35
35
  "dependencies": {
36
36
  "@bufbuild/protobuf": "^2.12.0",
37
- "@oh-my-pi/pi-utils": "16.4.0",
37
+ "@oh-my-pi/pi-utils": "16.4.1",
38
38
  "arktype": "^2.2.0",
39
39
  "zod": "^4"
40
40
  },
41
41
  "devDependencies": {
42
- "@oh-my-pi/pi-ai": "16.4.0",
42
+ "@oh-my-pi/pi-ai": "16.4.1",
43
43
  "@types/bun": "^1.3.14"
44
44
  },
45
45
  "engines": {
package/src/models.json CHANGED
@@ -18667,7 +18667,7 @@
18667
18667
  "cacheRead": 0.2,
18668
18668
  "cacheWrite": 0
18669
18669
  },
18670
- "contextWindow": 200000,
18670
+ "contextWindow": 1000000,
18671
18671
  "maxTokens": 64000,
18672
18672
  "headers": {
18673
18673
  "User-Agent": "opencode/1.3.15",
@@ -19190,7 +19190,7 @@
19190
19190
  "cacheRead": 0.5,
19191
19191
  "cacheWrite": 0
19192
19192
  },
19193
- "contextWindow": 400000,
19193
+ "contextWindow": 1050000,
19194
19194
  "maxTokens": 128000,
19195
19195
  "headers": {
19196
19196
  "User-Agent": "opencode/1.3.15",
@@ -19207,6 +19207,108 @@
19207
19207
  },
19208
19208
  "contextPromotionTarget": "github-copilot/gpt-5.4"
19209
19209
  },
19210
+ "gpt-5.6-luna": {
19211
+ "id": "gpt-5.6-luna",
19212
+ "name": "GPT-5.6 Luna",
19213
+ "api": "openai-responses",
19214
+ "provider": "github-copilot",
19215
+ "baseUrl": "https://api.githubcopilot.com",
19216
+ "reasoning": true,
19217
+ "input": [
19218
+ "text",
19219
+ "image"
19220
+ ],
19221
+ "cost": {
19222
+ "input": 1,
19223
+ "output": 6,
19224
+ "cacheRead": 0.1,
19225
+ "cacheWrite": 0
19226
+ },
19227
+ "contextWindow": 1050000,
19228
+ "maxTokens": 128000,
19229
+ "headers": {
19230
+ "User-Agent": "opencode/1.3.15",
19231
+ "X-GitHub-Api-Version": "2026-06-01"
19232
+ },
19233
+ "thinking": {
19234
+ "mode": "effort",
19235
+ "efforts": [
19236
+ "low",
19237
+ "medium",
19238
+ "high",
19239
+ "xhigh",
19240
+ "max"
19241
+ ]
19242
+ }
19243
+ },
19244
+ "gpt-5.6-sol": {
19245
+ "id": "gpt-5.6-sol",
19246
+ "name": "GPT-5.6 Sol",
19247
+ "api": "openai-responses",
19248
+ "provider": "github-copilot",
19249
+ "baseUrl": "https://api.githubcopilot.com",
19250
+ "reasoning": true,
19251
+ "input": [
19252
+ "text",
19253
+ "image"
19254
+ ],
19255
+ "cost": {
19256
+ "input": 5,
19257
+ "output": 30,
19258
+ "cacheRead": 0.5,
19259
+ "cacheWrite": 0
19260
+ },
19261
+ "contextWindow": 1050000,
19262
+ "maxTokens": 128000,
19263
+ "headers": {
19264
+ "User-Agent": "opencode/1.3.15",
19265
+ "X-GitHub-Api-Version": "2026-06-01"
19266
+ },
19267
+ "thinking": {
19268
+ "mode": "effort",
19269
+ "efforts": [
19270
+ "low",
19271
+ "medium",
19272
+ "high",
19273
+ "xhigh",
19274
+ "max"
19275
+ ]
19276
+ }
19277
+ },
19278
+ "gpt-5.6-terra": {
19279
+ "id": "gpt-5.6-terra",
19280
+ "name": "GPT-5.6 Terra",
19281
+ "api": "openai-responses",
19282
+ "provider": "github-copilot",
19283
+ "baseUrl": "https://api.githubcopilot.com",
19284
+ "reasoning": true,
19285
+ "input": [
19286
+ "text",
19287
+ "image"
19288
+ ],
19289
+ "cost": {
19290
+ "input": 2.5,
19291
+ "output": 15,
19292
+ "cacheRead": 0.25,
19293
+ "cacheWrite": 0
19294
+ },
19295
+ "contextWindow": 1050000,
19296
+ "maxTokens": 128000,
19297
+ "headers": {
19298
+ "User-Agent": "opencode/1.3.15",
19299
+ "X-GitHub-Api-Version": "2026-06-01"
19300
+ },
19301
+ "thinking": {
19302
+ "mode": "effort",
19303
+ "efforts": [
19304
+ "low",
19305
+ "medium",
19306
+ "high",
19307
+ "xhigh",
19308
+ "max"
19309
+ ]
19310
+ }
19311
+ },
19210
19312
  "grok-code-fast-1": {
19211
19313
  "id": "grok-code-fast-1",
19212
19314
  "name": "Grok Code Fast 1",
@@ -48660,6 +48762,25 @@
48660
48762
  "contextWindow": null,
48661
48763
  "maxTokens": null
48662
48764
  },
48765
+ "perplexity-academic-researcher": {
48766
+ "id": "perplexity-academic-researcher",
48767
+ "name": "perplexity-academic-researcher",
48768
+ "api": "openai-completions",
48769
+ "provider": "nanogpt",
48770
+ "baseUrl": "https://nano-gpt.com/api/v1",
48771
+ "reasoning": false,
48772
+ "input": [
48773
+ "text"
48774
+ ],
48775
+ "cost": {
48776
+ "input": 0,
48777
+ "output": 0,
48778
+ "cacheRead": 0,
48779
+ "cacheWrite": 0
48780
+ },
48781
+ "contextWindow": null,
48782
+ "maxTokens": null
48783
+ },
48663
48784
  "phi-4-mini-instruct": {
48664
48785
  "id": "phi-4-mini-instruct",
48665
48786
  "name": "phi-4-mini-instruct",
@@ -63390,47 +63511,6 @@
63390
63511
  ]
63391
63512
  }
63392
63513
  },
63393
- "gpt-5.6-luna-pro": {
63394
- "id": "gpt-5.6-luna-pro",
63395
- "name": "GPT-5.6 Luna Pro",
63396
- "api": "openai-codex-responses",
63397
- "provider": "openai-codex",
63398
- "baseUrl": "https://chatgpt.com/backend-api",
63399
- "reasoning": true,
63400
- "input": [
63401
- "text",
63402
- "image"
63403
- ],
63404
- "cost": {
63405
- "input": 1,
63406
- "output": 6,
63407
- "cacheRead": 0.1,
63408
- "cacheWrite": 1.25
63409
- },
63410
- "remoteCompaction": {
63411
- "enabled": true,
63412
- "api": "openai-codex-responses",
63413
- "v2StreamingEnabled": true
63414
- },
63415
- "contextWindow": 372000,
63416
- "maxTokens": 128000,
63417
- "preferWebsockets": true,
63418
- "useResponsesLite": true,
63419
- "priority": 3,
63420
- "requestModelId": "gpt-5.6-luna",
63421
- "reasoningMode": "pro",
63422
- "applyPatchToolType": "freeform",
63423
- "thinking": {
63424
- "mode": "effort",
63425
- "efforts": [
63426
- "low",
63427
- "medium",
63428
- "high",
63429
- "xhigh",
63430
- "max"
63431
- ]
63432
- }
63433
- },
63434
63514
  "gpt-5.6-sol": {
63435
63515
  "id": "gpt-5.6-sol",
63436
63516
  "name": "GPT-5.6 Sol",
@@ -63470,47 +63550,6 @@
63470
63550
  ]
63471
63551
  }
63472
63552
  },
63473
- "gpt-5.6-sol-pro": {
63474
- "id": "gpt-5.6-sol-pro",
63475
- "name": "GPT-5.6 Sol Pro",
63476
- "api": "openai-codex-responses",
63477
- "provider": "openai-codex",
63478
- "baseUrl": "https://chatgpt.com/backend-api",
63479
- "reasoning": true,
63480
- "input": [
63481
- "text",
63482
- "image"
63483
- ],
63484
- "cost": {
63485
- "input": 5,
63486
- "output": 30,
63487
- "cacheRead": 0.5,
63488
- "cacheWrite": 6.25
63489
- },
63490
- "remoteCompaction": {
63491
- "enabled": true,
63492
- "api": "openai-codex-responses",
63493
- "v2StreamingEnabled": true
63494
- },
63495
- "contextWindow": 372000,
63496
- "maxTokens": 128000,
63497
- "preferWebsockets": true,
63498
- "useResponsesLite": true,
63499
- "priority": 1,
63500
- "requestModelId": "gpt-5.6-sol",
63501
- "reasoningMode": "pro",
63502
- "applyPatchToolType": "freeform",
63503
- "thinking": {
63504
- "mode": "effort",
63505
- "efforts": [
63506
- "low",
63507
- "medium",
63508
- "high",
63509
- "xhigh",
63510
- "max"
63511
- ]
63512
- }
63513
- },
63514
63553
  "gpt-5.6-terra": {
63515
63554
  "id": "gpt-5.6-terra",
63516
63555
  "name": "GPT-5.6 Terra",
@@ -63549,47 +63588,6 @@
63549
63588
  "max"
63550
63589
  ]
63551
63590
  }
63552
- },
63553
- "gpt-5.6-terra-pro": {
63554
- "id": "gpt-5.6-terra-pro",
63555
- "name": "GPT-5.6 Terra Pro",
63556
- "api": "openai-codex-responses",
63557
- "provider": "openai-codex",
63558
- "baseUrl": "https://chatgpt.com/backend-api",
63559
- "reasoning": true,
63560
- "input": [
63561
- "text",
63562
- "image"
63563
- ],
63564
- "cost": {
63565
- "input": 2.5,
63566
- "output": 15,
63567
- "cacheRead": 0.25,
63568
- "cacheWrite": 3.125
63569
- },
63570
- "remoteCompaction": {
63571
- "enabled": true,
63572
- "api": "openai-codex-responses",
63573
- "v2StreamingEnabled": true
63574
- },
63575
- "contextWindow": 372000,
63576
- "maxTokens": 128000,
63577
- "preferWebsockets": true,
63578
- "useResponsesLite": true,
63579
- "priority": 2,
63580
- "requestModelId": "gpt-5.6-terra",
63581
- "reasoningMode": "pro",
63582
- "applyPatchToolType": "freeform",
63583
- "thinking": {
63584
- "mode": "effort",
63585
- "efforts": [
63586
- "low",
63587
- "medium",
63588
- "high",
63589
- "xhigh",
63590
- "max"
63591
- ]
63592
- }
63593
63591
  }
63594
63592
  },
63595
63593
  "opencode": {
@@ -65525,6 +65523,96 @@
65525
65523
  },
65526
65524
  "contextPromotionTarget": "opencode-zen/gpt-5.4"
65527
65525
  },
65526
+ "gpt-5.6-luna": {
65527
+ "id": "gpt-5.6-luna",
65528
+ "name": "GPT-5.6 Luna",
65529
+ "api": "openai-responses",
65530
+ "provider": "opencode-zen",
65531
+ "baseUrl": "https://opencode.ai/zen/v1",
65532
+ "reasoning": true,
65533
+ "input": [
65534
+ "text",
65535
+ "image"
65536
+ ],
65537
+ "cost": {
65538
+ "input": 1,
65539
+ "output": 6,
65540
+ "cacheRead": 0.1,
65541
+ "cacheWrite": 1.25
65542
+ },
65543
+ "contextWindow": 1050000,
65544
+ "maxTokens": 128000,
65545
+ "thinking": {
65546
+ "mode": "effort",
65547
+ "efforts": [
65548
+ "low",
65549
+ "medium",
65550
+ "high",
65551
+ "xhigh",
65552
+ "max"
65553
+ ]
65554
+ }
65555
+ },
65556
+ "gpt-5.6-sol": {
65557
+ "id": "gpt-5.6-sol",
65558
+ "name": "GPT-5.6 Sol",
65559
+ "api": "openai-responses",
65560
+ "provider": "opencode-zen",
65561
+ "baseUrl": "https://opencode.ai/zen/v1",
65562
+ "reasoning": true,
65563
+ "input": [
65564
+ "text",
65565
+ "image"
65566
+ ],
65567
+ "cost": {
65568
+ "input": 5,
65569
+ "output": 30,
65570
+ "cacheRead": 0.5,
65571
+ "cacheWrite": 6.25
65572
+ },
65573
+ "contextWindow": 1050000,
65574
+ "maxTokens": 128000,
65575
+ "thinking": {
65576
+ "mode": "effort",
65577
+ "efforts": [
65578
+ "low",
65579
+ "medium",
65580
+ "high",
65581
+ "xhigh",
65582
+ "max"
65583
+ ]
65584
+ }
65585
+ },
65586
+ "gpt-5.6-terra": {
65587
+ "id": "gpt-5.6-terra",
65588
+ "name": "GPT-5.6 Terra",
65589
+ "api": "openai-responses",
65590
+ "provider": "opencode-zen",
65591
+ "baseUrl": "https://opencode.ai/zen/v1",
65592
+ "reasoning": true,
65593
+ "input": [
65594
+ "text",
65595
+ "image"
65596
+ ],
65597
+ "cost": {
65598
+ "input": 2.5,
65599
+ "output": 15,
65600
+ "cacheRead": 0.25,
65601
+ "cacheWrite": 3.125
65602
+ },
65603
+ "contextWindow": 1050000,
65604
+ "maxTokens": 128000,
65605
+ "thinking": {
65606
+ "mode": "effort",
65607
+ "efforts": [
65608
+ "low",
65609
+ "medium",
65610
+ "high",
65611
+ "xhigh",
65612
+ "max"
65613
+ ]
65614
+ }
65615
+ },
65528
65616
  "grok-4.5": {
65529
65617
  "id": "grok-4.5",
65530
65618
  "name": "Grok 4.5",
@@ -65601,7 +65689,7 @@
65601
65689
  "cacheRead": 0,
65602
65690
  "cacheWrite": 0
65603
65691
  },
65604
- "contextWindow": 256000,
65692
+ "contextWindow": 190000,
65605
65693
  "maxTokens": 64000,
65606
65694
  "thinking": {
65607
65695
  "mode": "effort",
@@ -68111,13 +68199,13 @@
68111
68199
  "text"
68112
68200
  ],
68113
68201
  "cost": {
68114
- "input": 0.09,
68115
- "output": 0.18,
68116
- "cacheRead": 0.018,
68202
+ "input": 0.08399999999999999,
68203
+ "output": 0.16799999999999998,
68204
+ "cacheRead": 0.016800000000000002,
68117
68205
  "cacheWrite": 0
68118
68206
  },
68119
68207
  "contextWindow": 1048576,
68120
- "maxTokens": 65536,
68208
+ "maxTokens": 384000,
68121
68209
  "thinking": {
68122
68210
  "mode": "effort",
68123
68211
  "efforts": [
@@ -75529,9 +75617,9 @@
75529
75617
  "text"
75530
75618
  ],
75531
75619
  "cost": {
75532
- "input": 0.77,
75533
- "output": 2.42,
75534
- "cacheRead": 0.143,
75620
+ "input": 0.42,
75621
+ "output": 1.32,
75622
+ "cacheRead": 0.078,
75535
75623
  "cacheWrite": 0
75536
75624
  },
75537
75625
  "contextWindow": 1048576,
@@ -79347,7 +79435,7 @@
79347
79435
  "input": 1.25,
79348
79436
  "output": 7.5,
79349
79437
  "cacheRead": 0.125,
79350
- "cacheWrite": 0
79438
+ "cacheWrite": 1.5625
79351
79439
  },
79352
79440
  "contextWindow": 1000000,
79353
79441
  "maxTokens": 128000,
@@ -79377,7 +79465,7 @@
79377
79465
  "input": 1.25,
79378
79466
  "output": 7.5,
79379
79467
  "cacheRead": 0.125,
79380
- "cacheWrite": 0
79468
+ "cacheWrite": 1.5625
79381
79469
  },
79382
79470
  "contextWindow": 1000000,
79383
79471
  "maxTokens": 128000,
@@ -79407,7 +79495,7 @@
79407
79495
  "input": 6.25,
79408
79496
  "output": 37.5,
79409
79497
  "cacheRead": 0.625,
79410
- "cacheWrite": 0
79498
+ "cacheWrite": 7.8125
79411
79499
  },
79412
79500
  "contextWindow": 1000000,
79413
79501
  "maxTokens": 128000,
@@ -79437,7 +79525,7 @@
79437
79525
  "input": 6.25,
79438
79526
  "output": 37.5,
79439
79527
  "cacheRead": 0.625,
79440
- "cacheWrite": 0
79528
+ "cacheWrite": 7.8125
79441
79529
  },
79442
79530
  "contextWindow": 1000000,
79443
79531
  "maxTokens": 128000,
@@ -79467,7 +79555,7 @@
79467
79555
  "input": 3.125,
79468
79556
  "output": 18.75,
79469
79557
  "cacheRead": 0.3125,
79470
- "cacheWrite": 0
79558
+ "cacheWrite": 3.90625
79471
79559
  },
79472
79560
  "contextWindow": 1000000,
79473
79561
  "maxTokens": 128000,
@@ -79497,7 +79585,7 @@
79497
79585
  "input": 3.125,
79498
79586
  "output": 18.75,
79499
79587
  "cacheRead": 0.3125,
79500
- "cacheWrite": 0
79588
+ "cacheWrite": 3.90625
79501
79589
  },
79502
79590
  "contextWindow": 1000000,
79503
79591
  "maxTokens": 128000,
@@ -823,17 +823,23 @@ const OPENAI_PRO_REASONING_BASE_IDS: Record<string, true> = {
823
823
  "gpt-5.6-sol": true,
824
824
  "gpt-5.6-terra": true,
825
825
  };
826
- const OPENAI_PRO_REASONING_PROVIDERS: Record<string, true> = { openai: true, "openai-codex": true };
826
+ /**
827
+ * Providers whose generated pro aliases this pass owns. `openai-codex` stays in
828
+ * the sweep so stale aliases from earlier snapshots are dropped on regen, but
829
+ * projection is `openai`-only — subscription (Codex) auth does not offer pro
830
+ * reasoning.
831
+ */
832
+ const OPENAI_PRO_REASONING_SWEEP_PROVIDERS: Record<string, true> = { openai: true, "openai-codex": true };
827
833
 
828
834
  /**
829
835
  * A row this generator pass owns: one of the derived `gpt-5.6-*-pro` alias ids
830
- * on `openai`/`openai-codex` that carries the generated `reasoningMode` marker.
836
+ * on a swept provider that carries the generated `reasoningMode` marker.
831
837
  * A real upstream model occupying the same id has no `reasoningMode` and is
832
838
  * never touched.
833
839
  */
834
840
  function isGeneratedOpenAIProReasoningAlias(model: ModelSpec<Api>): boolean {
835
841
  return (
836
- OPENAI_PRO_REASONING_PROVIDERS[model.provider] === true &&
842
+ OPENAI_PRO_REASONING_SWEEP_PROVIDERS[model.provider] === true &&
837
843
  model.reasoningMode !== undefined &&
838
844
  model.id.endsWith("-pro") &&
839
845
  OPENAI_PRO_REASONING_BASE_IDS[model.id.slice(0, -"-pro".length)] === true
@@ -842,21 +848,21 @@ function isGeneratedOpenAIProReasoningAlias(model: ModelSpec<Api>): boolean {
842
848
 
843
849
  /**
844
850
  * Re-derive the generated pro-reasoning aliases (`gpt-5.6-*-pro`) for the
845
- * first-party `openai`/`openai-codex` gpt-5.6 rows. Each alias inherits the
846
- * base row's metadata, requests the base wire id via `requestModelId`, and
847
- * sets `reasoningMode: "pro"` so Responses-family request builders emit
851
+ * first-party `openai` gpt-5.6 rows. Each alias inherits the base row's
852
+ * metadata, requests the base wire id via `requestModelId`, and sets
853
+ * `reasoningMode: "pro"` so Responses-family request builders emit
848
854
  * `reasoning: { mode: "pro" }`. Called by the models.json generator after all
849
- * sources merge: stale copies of the owned aliases (previous snapshot) are
850
- * dropped and re-projected from the current base rows so alias metadata always
851
- * tracks the base, while a real upstream model that occupies an alias id wins
852
- * and suppresses the projection.
855
+ * sources merge: stale copies of the owned aliases (previous snapshot,
856
+ * including retired `openai-codex` rows) are dropped and re-projected from the
857
+ * current base rows so alias metadata always tracks the base, while a real
858
+ * upstream model that occupies an alias id wins and suppresses the projection.
853
859
  */
854
860
  export function projectOpenAIProReasoningAliases(models: readonly ModelSpec<Api>[]): ModelSpec<Api>[] {
855
861
  const kept = models.filter(model => !isGeneratedOpenAIProReasoningAlias(model));
856
862
  const ids = new Set(kept.map(model => `${model.provider}/${model.id}`));
857
863
  const out = [...kept];
858
864
  for (const model of kept) {
859
- if (!OPENAI_PRO_REASONING_PROVIDERS[model.provider]) continue;
865
+ if (model.provider !== "openai") continue;
860
866
  if (!OPENAI_PRO_REASONING_BASE_IDS[model.id]) continue;
861
867
  const aliasId = `${model.id}-pro`;
862
868
  const aliasKey = `${model.provider}/${aliasId}`;