@oh-my-pi/pi-catalog 16.3.13 → 16.3.15

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.
@@ -821,6 +821,62 @@ export function openaiModelManagerOptions(config?: OpenAIModelManagerConfig): Mo
821
821
  };
822
822
  }
823
823
 
824
+ /** First-party gpt-5.6 SKUs that accept `reasoning: { mode: "pro" }` on the Responses APIs. */
825
+ const OPENAI_PRO_REASONING_BASE_IDS: Record<string, true> = {
826
+ "gpt-5.6-luna": true,
827
+ "gpt-5.6-sol": true,
828
+ "gpt-5.6-terra": true,
829
+ };
830
+ const OPENAI_PRO_REASONING_PROVIDERS: Record<string, true> = { openai: true, "openai-codex": true };
831
+
832
+ /**
833
+ * A row this generator pass owns: one of the derived `gpt-5.6-*-pro` alias ids
834
+ * on `openai`/`openai-codex` that carries the generated `reasoningMode` marker.
835
+ * A real upstream model occupying the same id has no `reasoningMode` and is
836
+ * never touched.
837
+ */
838
+ function isGeneratedOpenAIProReasoningAlias(model: ModelSpec<Api>): boolean {
839
+ return (
840
+ OPENAI_PRO_REASONING_PROVIDERS[model.provider] === true &&
841
+ model.reasoningMode !== undefined &&
842
+ model.id.endsWith("-pro") &&
843
+ OPENAI_PRO_REASONING_BASE_IDS[model.id.slice(0, -"-pro".length)] === true
844
+ );
845
+ }
846
+
847
+ /**
848
+ * Re-derive the generated pro-reasoning aliases (`gpt-5.6-*-pro`) for the
849
+ * first-party `openai`/`openai-codex` gpt-5.6 rows. Each alias inherits the
850
+ * base row's metadata, requests the base wire id via `requestModelId`, and
851
+ * sets `reasoningMode: "pro"` so Responses-family request builders emit
852
+ * `reasoning: { mode: "pro" }`. Called by the models.json generator after all
853
+ * sources merge: stale copies of the owned aliases (previous snapshot) are
854
+ * dropped and re-projected from the current base rows so alias metadata always
855
+ * tracks the base, while a real upstream model that occupies an alias id wins
856
+ * and suppresses the projection.
857
+ */
858
+ export function projectOpenAIProReasoningAliases(models: readonly ModelSpec<Api>[]): ModelSpec<Api>[] {
859
+ const kept = models.filter(model => !isGeneratedOpenAIProReasoningAlias(model));
860
+ const ids = new Set(kept.map(model => `${model.provider}/${model.id}`));
861
+ const out = [...kept];
862
+ for (const model of kept) {
863
+ if (!OPENAI_PRO_REASONING_PROVIDERS[model.provider]) continue;
864
+ if (!OPENAI_PRO_REASONING_BASE_IDS[model.id]) continue;
865
+ const aliasId = `${model.id}-pro`;
866
+ const aliasKey = `${model.provider}/${aliasId}`;
867
+ if (ids.has(aliasKey)) continue;
868
+ ids.add(aliasKey);
869
+ out.push({
870
+ ...model,
871
+ id: aliasId,
872
+ name: `${model.name} Pro`,
873
+ requestModelId: model.id,
874
+ reasoningMode: "pro",
875
+ });
876
+ }
877
+ return out;
878
+ }
879
+
824
880
  // ---------------------------------------------------------------------------
825
881
  // 2. Groq
826
882
  // ---------------------------------------------------------------------------
@@ -983,6 +1039,7 @@ export const XAI_OAUTH_CURATED_MODELS: readonly XAICuratedModel[] = [
983
1039
  input: ["text", "image"],
984
1040
  },
985
1041
  { id: "grok-4.3", contextWindow: 1_000_000, name: "Grok 4.3", input: ["text", "image"] },
1042
+ { id: "grok-4.5", contextWindow: 500_000, name: "Grok 4.5", input: ["text", "image"] },
986
1043
  // grok-4.20-multi-agent-0309 is text-only per the bundled catalog; omit `input` for the default.
987
1044
  { id: "grok-4.20-multi-agent-0309", contextWindow: 2_000_000, name: "Grok 4.20 (Multi-Agent)" },
988
1045
  {
package/src/types.ts CHANGED
@@ -691,6 +691,13 @@ export interface Model<TApi extends Api = Api> {
691
691
  * everything local (selection, caching, usage attribution) keys on `id`.
692
692
  */
693
693
  requestModelId?: string;
694
+ /**
695
+ * `reasoning.mode` to send on OpenAI Responses-family requests. Set on
696
+ * generated pro aliases (`gpt-5.6-*-pro` on `openai`/`openai-codex`) that
697
+ * pair a base wire id (`requestModelId`) with OpenAI's pro reasoning
698
+ * serving path. Absent everywhere else; providers omit the wire field.
699
+ */
700
+ reasoningMode?: "pro";
694
701
  name: string;
695
702
  api: TApi;
696
703
  provider: Provider;
@@ -113,6 +113,14 @@ function thinkingPair(baseId: string, name: string): EffortVariantFamily {
113
113
 
114
114
  type DevinTierRoutes = Partial<Record<"off" | "minimal" | "low" | "medium" | "high" | "xhigh", string>>;
115
115
 
116
+ const DEVIN_FIVE_TIER_EFFORTS: readonly Effort[] = [
117
+ Effort.Minimal,
118
+ Effort.Low,
119
+ Effort.Medium,
120
+ Effort.High,
121
+ Effort.XHigh,
122
+ ];
123
+
116
124
  function devinTierFamily(
117
125
  id: string,
118
126
  name: string,
@@ -160,6 +168,44 @@ function devinTierFamily(
160
168
  };
161
169
  }
162
170
 
171
+ /**
172
+ * GPT-5.6 (Luna/Sol/Terra) adds a genuine `max` tier above `xhigh`, so the
173
+ * standard family shifts every user effort up one notch (`minimal` → `-low`
174
+ * … `xhigh` → `-max`), mirroring the Opus 4.7+ five-tier mapping. Devin
175
+ * serves no `-max-priority` sibling, so the fast family keeps the direct
176
+ * `low..xhigh` `-priority` scale.
177
+ */
178
+ function devinGpt56Families(variant: "luna" | "sol" | "terra", name: string): readonly EffortVariantFamily[] {
179
+ const base = `gpt-5-6-${variant}`;
180
+ return [
181
+ devinTierFamily(
182
+ base,
183
+ name,
184
+ {
185
+ off: `${base}-none`,
186
+ minimal: `${base}-low`,
187
+ low: `${base}-medium`,
188
+ medium: `${base}-high`,
189
+ high: `${base}-xhigh`,
190
+ xhigh: `${base}-max`,
191
+ },
192
+ DEVIN_FIVE_TIER_EFFORTS,
193
+ ),
194
+ devinTierFamily(
195
+ `${base}-fast`,
196
+ `${name} Fast`,
197
+ {
198
+ off: `${base}-none-priority`,
199
+ low: `${base}-low-priority`,
200
+ medium: `${base}-medium-priority`,
201
+ high: `${base}-high-priority`,
202
+ xhigh: `${base}-xhigh-priority`,
203
+ },
204
+ DEVIN_FIVE_TIER_EFFORTS,
205
+ ),
206
+ ];
207
+ }
208
+
163
209
  const GEMINI_3_FLASH_FAMILY_EFFORTS: readonly Effort[] = [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High];
164
210
  const GEMINI_3_PRO_FAMILY_EFFORTS: readonly Effort[] = [Effort.Low, Effort.High];
165
211
 
@@ -330,7 +376,7 @@ export const DEVIN_VARIANT_COLLAPSE_TABLE: VariantCollapseTable = {
330
376
  },
331
377
  thinking: {
332
378
  mode: "effort",
333
- efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh],
379
+ efforts: DEVIN_FIVE_TIER_EFFORTS,
334
380
  requiresEffort: true,
335
381
  },
336
382
  },
@@ -353,7 +399,7 @@ export const DEVIN_VARIANT_COLLAPSE_TABLE: VariantCollapseTable = {
353
399
  },
354
400
  thinking: {
355
401
  mode: "effort",
356
- efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh],
402
+ efforts: DEVIN_FIVE_TIER_EFFORTS,
357
403
  requiresEffort: true,
358
404
  },
359
405
  },
@@ -376,7 +422,7 @@ export const DEVIN_VARIANT_COLLAPSE_TABLE: VariantCollapseTable = {
376
422
  },
377
423
  thinking: {
378
424
  mode: "effort",
379
- efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh],
425
+ efforts: DEVIN_FIVE_TIER_EFFORTS,
380
426
  requiresEffort: true,
381
427
  },
382
428
  },
@@ -399,7 +445,7 @@ export const DEVIN_VARIANT_COLLAPSE_TABLE: VariantCollapseTable = {
399
445
  },
400
446
  thinking: {
401
447
  mode: "effort",
402
- efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh],
448
+ efforts: DEVIN_FIVE_TIER_EFFORTS,
403
449
  requiresEffort: true,
404
450
  },
405
451
  },
@@ -413,7 +459,7 @@ export const DEVIN_VARIANT_COLLAPSE_TABLE: VariantCollapseTable = {
413
459
  high: "MODEL_GPT_5_2_HIGH",
414
460
  xhigh: "MODEL_GPT_5_2_XHIGH",
415
461
  },
416
- [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh],
462
+ DEVIN_FIVE_TIER_EFFORTS,
417
463
  ),
418
464
  devinTierFamily(
419
465
  "gpt-5-3-codex",
@@ -424,7 +470,7 @@ export const DEVIN_VARIANT_COLLAPSE_TABLE: VariantCollapseTable = {
424
470
  high: "gpt-5-3-codex-high",
425
471
  xhigh: "gpt-5-3-codex-xhigh",
426
472
  },
427
- [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh],
473
+ DEVIN_FIVE_TIER_EFFORTS,
428
474
  ),
429
475
  devinTierFamily(
430
476
  "gpt-5-3-codex-fast",
@@ -435,7 +481,7 @@ export const DEVIN_VARIANT_COLLAPSE_TABLE: VariantCollapseTable = {
435
481
  high: "gpt-5-3-codex-high-priority",
436
482
  xhigh: "gpt-5-3-codex-xhigh-priority",
437
483
  },
438
- [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh],
484
+ DEVIN_FIVE_TIER_EFFORTS,
439
485
  ),
440
486
  devinTierFamily(
441
487
  "gpt-5-4",
@@ -447,7 +493,7 @@ export const DEVIN_VARIANT_COLLAPSE_TABLE: VariantCollapseTable = {
447
493
  high: "gpt-5-4-high",
448
494
  xhigh: "gpt-5-4-xhigh",
449
495
  },
450
- [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh],
496
+ DEVIN_FIVE_TIER_EFFORTS,
451
497
  ),
452
498
  devinTierFamily(
453
499
  "gpt-5-4-fast",
@@ -459,7 +505,7 @@ export const DEVIN_VARIANT_COLLAPSE_TABLE: VariantCollapseTable = {
459
505
  high: "gpt-5-4-high-priority",
460
506
  xhigh: "gpt-5-4-xhigh-priority",
461
507
  },
462
- [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh],
508
+ DEVIN_FIVE_TIER_EFFORTS,
463
509
  ),
464
510
  devinTierFamily(
465
511
  "gpt-5-4-mini",
@@ -470,7 +516,7 @@ export const DEVIN_VARIANT_COLLAPSE_TABLE: VariantCollapseTable = {
470
516
  high: "gpt-5-4-mini-high",
471
517
  xhigh: "gpt-5-4-mini-xhigh",
472
518
  },
473
- [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh],
519
+ DEVIN_FIVE_TIER_EFFORTS,
474
520
  ),
475
521
  devinTierFamily(
476
522
  "gpt-5-5",
@@ -482,7 +528,7 @@ export const DEVIN_VARIANT_COLLAPSE_TABLE: VariantCollapseTable = {
482
528
  high: "gpt-5-5-high",
483
529
  xhigh: "gpt-5-5-xhigh",
484
530
  },
485
- [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh],
531
+ DEVIN_FIVE_TIER_EFFORTS,
486
532
  ),
487
533
  devinTierFamily(
488
534
  "gpt-5-5-fast",
@@ -494,8 +540,11 @@ export const DEVIN_VARIANT_COLLAPSE_TABLE: VariantCollapseTable = {
494
540
  high: "gpt-5-5-high-priority",
495
541
  xhigh: "gpt-5-5-xhigh-priority",
496
542
  },
497
- [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh],
543
+ DEVIN_FIVE_TIER_EFFORTS,
498
544
  ),
545
+ ...devinGpt56Families("luna", "GPT-5.6 Luna"),
546
+ ...devinGpt56Families("sol", "GPT-5.6 Sol"),
547
+ ...devinGpt56Families("terra", "GPT-5.6 Terra"),
499
548
  devinTierFamily(
500
549
  "gemini-3-1-pro",
501
550
  "Gemini 3.1 Pro",