@oh-my-pi/pi-catalog 18.6.3 → 18.7.0

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,23 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [18.7.0] - 2026-10-06
6
+
7
+ ### Added
8
+
9
+ - Added Mistral Large 4 with reasoning support, image input, a 1M-token context window, and preview pricing.
10
+ - Added configurable thinking levels from low through maximum for MiniMax-M3.1-Flash-Preview; because the model always reasons, requests that disable thinking use the low level.
11
+ - Added Google Antigravity pricing and model support for Claude Opus 5.5 and Sonnet 5.5.
12
+
13
+ ### Changed
14
+
15
+ - MiniMax Token Plan providers (`minimax-code` and `minimax-code-cn`) now use MiniMax's recommended Anthropic-compatible API for model requests and login key validation.
16
+ - Google Antigravity now exposes Claude Opus 5.5 and Sonnet 5.5 once each, with selectable low, medium, and high thinking levels.
17
+
18
+ ### Fixed
19
+
20
+ - Added the correct published pricing for GPT-6 Astra's Ultrafast service tier: a 6× multiplier on the OpenAI API and an 8× multiplier on the Codex card.
21
+
5
22
  ## [18.6.3] - 2026-10-06
6
23
 
7
24
  ### Added
@@ -622,6 +622,8 @@ export interface CompiledProvider {
622
622
  id: string;
623
623
  /** Preferred model id when no explicit selection is made. */
624
624
  defaultModel: string;
625
+ /** Whether the provider participates in automatic default selection (defaults to true). */
626
+ automaticDefault?: boolean;
625
627
  /** Env vars consulted, in order, for the runtime API-key fallback. */
626
628
  envVars?: string[];
627
629
  /** The runtime creates a model manager even without a valid API key. */
@@ -15,6 +15,22 @@ export type KindApiKind = (typeof KIND_API_KINDS)[number];
15
15
  export type WebSearchGrounding = "gemini" | "anthropic" | "codex" | "xai" | "openrouter" | "openai";
16
16
  /** Non-chat runner protocols accepted by catalog seeds, outside the chat dispatch union. */
17
17
  export declare const RUNNER_APIS: readonly ["local-inference", "web-search", "typesafe", "openrouter-decisions", "openai-images", "openrouter-images", "xai-tts", "openai-speech", "openai-embeddings", "openrouter-rerank", "openrouter-video", "openai-transcriptions"];
18
+ /** Kind each single-purpose runner API serves; `local-inference` hosts several kinds. */
19
+ export declare const RUNNER_API_KINDS: Record<Exclude<(typeof RUNNER_APIS)[number], "local-inference">, ModelKind>;
20
+ /** Kind a runner API serves; `undefined` for chat transports and multi-kind `local-inference`. */
21
+ export declare function runnerApiKind(api: Api): ModelKind | undefined;
22
+ /** Catalog APIs `generate_image` runs through a pi-ai image client; the hosted Responses pair needs a carrier model. */
23
+ export declare const IMAGE_GENERATION_APIS: readonly ["openai-images", "openrouter-images", "google-generative-ai", "google-gemini-cli", "openai-responses", "openai-codex-responses"];
24
+ export type ImageGenerationApi = (typeof IMAGE_GENERATION_APIS)[number];
25
+ /**
26
+ * Kinds a model on `api` may declare: a runner api serves its own kind; a chat
27
+ * transport serves `chat` and `tiny`, plus `image` when `generate_image` runs it
28
+ * (hosted Responses image tool, Gemini image models). `undefined` for
29
+ * `local-inference`, which hosts several kinds chosen by the model itself.
30
+ */
31
+ export declare function servedKinds(api: Api): readonly ModelKind[] | undefined;
32
+ /** Whether a model of `kind` can run on `api`. */
33
+ export declare function apiServesKind(api: Api, kind: ModelKind): boolean;
18
34
  /** Resolve a model's kind while preserving chat semantics for existing catalog rows. */
19
35
  export declare function modelKind(model: Pick<Model, "kind">): ModelKind;
20
36
  /** Canonical thinking transport used by a model. */
@@ -1090,6 +1106,12 @@ export interface Model<TApi extends Api = Api> {
1090
1106
  id: string;
1091
1107
  /** Role-specific runner capability; omitted for ordinary chat models. */
1092
1108
  kind?: ModelKind;
1109
+ /**
1110
+ * Verbatim configured kind (models.yml, `modelOverrides`, runtime
1111
+ * registrations). `buildModel` applies it over catalog `kind` rules on every
1112
+ * rebuild, so a configured runner keeps its role.
1113
+ */
1114
+ kindConfig?: ModelKind;
1093
1115
  /** Grounding transport supported by this chat model. */
1094
1116
  webSearch?: WebSearchGrounding;
1095
1117
  /** Cheaper same-provider model to run hosted web search in this model's place (model id or provider/id). */
@@ -1302,9 +1324,9 @@ export interface Model<TApi extends Api = Api> {
1302
1324
  /**
1303
1325
  * Per-service-tier cost multipliers baked from the `service-tier-cost`
1304
1326
  * catalog axis (e.g. `{ priority: 2.5 }`). Absent tiers use the API-generic
1305
- * defaults.
1327
+ * defaults, and a tier with no published price stays at 1x.
1306
1328
  */
1307
- serviceTierCost?: Readonly<Partial<Record<"flex" | "priority", number>>>;
1329
+ serviceTierCost?: Readonly<Partial<Record<"flex" | "priority" | "ultrafast", number>>>;
1308
1330
  /**
1309
1331
  * Provider-supplied one-line blurb for this model. Set only when an upstream
1310
1332
  * ships one (Devin's `GetCliModelConfigs`); never synthesized locally.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oh-my-pi/pi-catalog",
3
- "version": "18.6.3",
3
+ "version": "18.7.0",
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.6.3",
97
- "@oh-my-pi/pi-utils": "18.6.3"
96
+ "@oh-my-pi/omptype": "18.7.0",
97
+ "@oh-my-pi/pi-utils": "18.7.0"
98
98
  },
99
99
  "devDependencies": {
100
100
  "@bgotink/kdl": "0.4.0",
101
- "@oh-my-pi/pi-ai": "18.6.3",
101
+ "@oh-my-pi/pi-ai": "18.7.0",
102
102
  "@types/bun": "^1.3.14"
103
103
  },
104
104
  "engines": {
package/src/build.ts CHANGED
@@ -101,9 +101,11 @@ function applyCatalogAssignments<TApi extends Api>(model: Model<TApi>, catalog:
101
101
  if (serviceTierCost !== undefined) {
102
102
  const flex = numberField(serviceTierCost, "flex");
103
103
  const priorityTier = numberField(serviceTierCost, "priority");
104
+ const ultrafast = numberField(serviceTierCost, "ultrafast");
104
105
  model.serviceTierCost = {
105
106
  ...(flex !== undefined && { flex }),
106
107
  ...(priorityTier !== undefined && { priority: priorityTier }),
108
+ ...(ultrafast !== undefined && { ultrafast }),
107
109
  };
108
110
  }
109
111
  const priority = catalog.priority;
@@ -363,7 +365,8 @@ export function buildModel<TApi extends Api>(spec: ModelSpec<TApi>): Model<TApi>
363
365
  };
364
366
  applyCatalogAssignments(model, policy.catalog);
365
367
  applyCatalogCorrections(model, policy.catalog);
366
- // Configured lifetimes replace catalog lifetimes rather than merging with them.
368
+ // Configured kinds and lifetimes replace catalog values rather than merging with them.
369
+ if (spec.kindConfig !== undefined) model.kind = spec.kindConfig;
367
370
  if (spec.promptCacheConfig !== undefined) model.promptCache = { ...spec.promptCacheConfig };
368
371
  return model;
369
372
  }
@@ -413,6 +413,10 @@ provider "muse-code" {
413
413
 
414
414
  Only `discovery` enrolls a provider in `generate-models.ts`; providers without it are never fetched at generation time (see the `charm-hyper` entry for why a live gateway deliberately omits it).
415
415
 
416
+ `automatic-default #false` keeps a provider available for explicit selection but excludes it from startup fallback and automatic model presets. The default is `#true`; `apple` opts out because its on-device context cannot accommodate the standard coding-agent prompt in many projects.
417
+
418
+ `kind-apis { <kind> "<api>" }` maps each non-chat kind (`image`, `tts`, `stt`, `embedding`, `rerank`, `video`) to the API discovery assigns rows of that kind. A runner API must sit under the kind it serves (`RUNNER_API_KINDS` in `src/types.ts`); chat APIs, which serve hosted image generation, and multi-kind `local-inference` may back any kind.
419
+
416
420
  ### Seed rows
417
421
 
418
422
  A `seed` _defines_ bundled rows for providers whose catalog cannot be discovered at generation time — credential-scoped rosters, unauthenticated regens, or models ahead of upstream catalogs. Every other stratum patches rows; this one authors them. Runtime model managers hand the rows to `staticModels` through `seedModels(provider)`; the generator bundles them per the seed's `bundle` policy. Values are literal — a seed never derives from another provider's row, and pricing is never borrowed.
@@ -4,6 +4,6 @@ auth "minimax-code-cn" {
4
4
  auth-url "https://platform.minimaxi.com/subscribe/token-plan"
5
5
  instructions "Subscribe to Token Plan and copy your API key"
6
6
  prompt "Paste your MiniMax Token Plan API key" placeholder="sk-..."
7
- validate "chat-completions" base-url="https://api.minimaxi.com/v1" model="MiniMax-M3"
7
+ validate "anthropic-messages" base-url="https://api.minimaxi.com/anthropic" model="MiniMax-M3"
8
8
  }
9
9
  }
@@ -4,6 +4,6 @@ auth "minimax-code" {
4
4
  auth-url "https://platform.minimax.io/subscribe/token-plan"
5
5
  instructions "Subscribe to Token Plan and copy your API key"
6
6
  prompt "Paste your MiniMax Token Plan API key" placeholder="sk-..."
7
- validate "chat-completions" label="MiniMax Token Plan" base-url="https://api.minimax.io/v1" model="MiniMax-M3"
7
+ validate "anthropic-messages" label="MiniMax Token Plan" base-url="https://api.minimax.io/anthropic" model="MiniMax-M3"
8
8
  }
9
9
  }
@@ -51,7 +51,7 @@ class "minimax" {
51
51
  thinking-efforts "minimal" "low" "medium" "high" "xhigh"
52
52
  }
53
53
  }
54
- on "minimax" "minimax-cn" "vercel-ai-gateway" {
54
+ on "minimax" "minimax-cn" "minimax-code" "minimax-code-cn" "vercel-ai-gateway" {
55
55
  thinking-mode "anthropic-adaptive"
56
56
  family "m2" {
57
57
  // Replaces the Anthropic-route MiniMax effort remap table.
@@ -71,6 +71,26 @@ class "minimax" {
71
71
  thinking-efforts "low" "medium" "high"
72
72
  }
73
73
  }
74
+ // MiniMax-M3.1-Flash-Preview always thinks (`thinking.type: "disabled"` and
75
+ // effort `none` 400 with error 2013) and tunes depth through
76
+ // `output_config.effort` from `low` to `max` (the default when omitted).
77
+ // The identity map replaces the M3 family's adaptive-tag-only map so each
78
+ // level reaches the wire. Like the M2 family, thinking cannot be turned off:
79
+ // `thinking-requires-effort` hides the off level and clamps forced-off
80
+ // requests to the lowest effort instead of sending `disabled`.
81
+ on "minimax" "minimax-cn" "minimax-code" "minimax-code-cn" {
82
+ models "MiniMax-M3.1-Flash-Preview" {
83
+ thinking-requires-effort #true
84
+ thinking-efforts "low" "medium" "high" "xhigh" "max"
85
+ thinking-effort-map {
86
+ low "low"
87
+ medium "medium"
88
+ high "high"
89
+ }
90
+ }
91
+ }
92
+ // Token Plan rows ride the Anthropic route; these OpenAI-only wire axes
93
+ // serve the legacy lightning rows that stay on the OpenAI-compatible one.
74
94
  on "minimax-code" "minimax-code-cn" {
75
95
  supports-reasoning-effort #false
76
96
  supports-store #false
@@ -5,4 +5,5 @@
5
5
  provider "apple" {
6
6
  default-model "on-device"
7
7
  allow-unauthenticated #true
8
+ automatic-default #false
8
9
  }
@@ -6,11 +6,16 @@ provider "minimax-code-cn" priority=1 {
6
6
 
7
7
  // Replaces the provider-id regex in both OpenAI baselines.
8
8
  reasoning-deltas-may-be-cumulative #true
9
- class "minimax" {
9
+ // residue: the legacy lightning SKUs survive only as previous-snapshot rows
10
+ // on the OpenAI-compatible route (models.dev and both live model lists omit
11
+ // them), so they keep that route's effort-mode thinking instead of the
12
+ // Anthropic adaptive rules the rest of the plan uses.
13
+ models "MiniMax-M2.1-lightning" "MiniMax-M2.5-lightning" {
10
14
  thinking-mode "effort"
11
- }
12
- // residue: taxonomy ranks and exact globs do not isolate these models.
13
- models "MiniMax-M3" {
14
- thinking-efforts "minimal" "low" "medium" "high"
15
+ thinking-effort-map {
16
+ low "low"
17
+ medium "medium"
18
+ high "high"
19
+ }
15
20
  }
16
21
  }
@@ -6,11 +6,16 @@ provider "minimax-code" priority=1 {
6
6
 
7
7
  // Replaces the provider-id regex in both OpenAI baselines.
8
8
  reasoning-deltas-may-be-cumulative #true
9
- class "minimax" {
9
+ // residue: the legacy lightning SKUs survive only as previous-snapshot rows
10
+ // on the OpenAI-compatible route (models.dev and both live model lists omit
11
+ // them), so they keep that route's effort-mode thinking instead of the
12
+ // Anthropic adaptive rules the rest of the plan uses.
13
+ models "MiniMax-M2.1-lightning" "MiniMax-M2.5-lightning" {
10
14
  thinking-mode "effort"
11
- }
12
- // residue: taxonomy ranks and exact globs do not isolate these models.
13
- models "MiniMax-M3" {
14
- thinking-efforts "minimal" "low" "medium" "high"
15
+ thinking-effort-map {
16
+ low "low"
17
+ medium "medium"
18
+ high "high"
19
+ }
15
20
  }
16
21
  }
@@ -4,6 +4,26 @@ provider "mistral" {
4
4
  default-model "devstral-medium-latest"
5
5
  env "MISTRAL_API_KEY"
6
6
 
7
+ // Public-preview aliases and current USD / 1M token pricing:
8
+ // https://docs.mistral.ai/models/mistral-large-4-0 (2026-10-06).
9
+ // Public preview is 50% off: input $0.68, output $2.09, cached input $0.07.
10
+ // List prices: input $1.36, output $4.18, cached input $0.14; update when preview ends.
11
+ // No separate maximum output-token limit is published.
12
+ seed api="openai-completions" base-url="https://api.mistral.ai/v1" bundle="always" {
13
+ model "mistral-large-4" name="Mistral Large 4" {
14
+ reasoning #true
15
+ input "text" "image"
16
+ cost input=0.68 output=2.09 cache-read=0.07 cache-write=0
17
+ limits context=1000000
18
+ }
19
+ model "mistral-large-4-0" name="Mistral Large 4" {
20
+ reasoning #true
21
+ input "text" "image"
22
+ cost input=0.68 output=2.09 cache-read=0.07 cache-write=0
23
+ limits context=1000000
24
+ }
25
+ }
26
+
7
27
  thinking-mode "effort"
8
28
  class "unknown" {
9
29
  thinking-efforts "minimal" "low" "medium" "high" "xhigh"
@@ -76,6 +76,12 @@ provider "openai-codex" {
76
76
  service-tier-cost {
77
77
  flex 0.5
78
78
  priority 2.5
79
+ // Ultrafast is Astra-only. This table uses OpenAI's included-usage
80
+ // multipliers for Codex: Ultrafast 8x and Fast 2.5x Standard (purchased
81
+ // credits / Enterprise pay-as-you-go bill 6x and 2x instead). See
82
+ // https://learn.chatgpt.com/docs/agent-configuration/speed and
83
+ // https://learn.chatgpt.com/docs/pricing.
84
+ ultrafast 8
79
85
  }
80
86
  limits-patch {
81
87
  context-window 272000
@@ -176,6 +176,11 @@ provider "openai" {
176
176
  cache-read 2.0
177
177
  cache-write 25.0
178
178
  }
179
+ // Ultrafast is Astra-only: $60/$6/$75/$300 per 1M short-context
180
+ // (6x the standard card), and the same 6x holds on the long-context tier.
181
+ service-tier-cost {
182
+ ultrafast 6
183
+ }
179
184
  }
180
185
  // residue: the bare Daybreak rolling aliases pin the documented 5.6-gen
181
186
  // wire restrictions without carrying the gpt- prefix identity.
@@ -351,6 +351,8 @@ behavior {
351
351
  alias "claude-opus-4-6" peer-id="claude-opus-4-6@default"
352
352
  alias "claude-sonnet-4-5" peer-id="claude-sonnet-4-5@20250929"
353
353
  alias "claude-sonnet-4-6" peer-id="claude-sonnet-4-6@default"
354
+ alias "claude-opus-5-5" peer-id="claude-opus-5-5@default"
355
+ alias "claude-sonnet-5-5" peer-id="claude-sonnet-5-5@default"
354
356
  }
355
357
  // SuperGrok surfaces a few models under IDs that differ from their public
356
358
  // xai equivalent, so the exact-id price mirror misses them.
@@ -88,6 +88,24 @@ collapse {
88
88
  mode "budget"
89
89
  efforts "minimal" "low" "medium" "high"
90
90
  }
91
+ variant-family "google-antigravity" "claude-opus-5-5" name="Claude Opus 5.5" {
92
+ members "claude-opus-5-5-low" "claude-opus-5-5-medium" "claude-opus-5-5-high"
93
+ route "low" "claude-opus-5-5-low"
94
+ route "medium" "claude-opus-5-5-medium"
95
+ route "high" "claude-opus-5-5-high"
96
+ mode "budget"
97
+ efforts "low" "medium" "high"
98
+ requires-effort #true
99
+ }
100
+ variant-family "google-antigravity" "claude-sonnet-5-5" name="Claude Sonnet 5.5" {
101
+ members "claude-sonnet-5-5-low" "claude-sonnet-5-5-medium" "claude-sonnet-5-5-high"
102
+ route "low" "claude-sonnet-5-5-low"
103
+ route "medium" "claude-sonnet-5-5-medium"
104
+ route "high" "claude-sonnet-5-5-high"
105
+ mode "budget"
106
+ efforts "low" "medium" "high"
107
+ requires-effort #true
108
+ }
91
109
  variant-family "google-antigravity" "claude-sonnet-4-6" name="Claude Sonnet 4.6" {
92
110
  members "claude-sonnet-4-6" "claude-sonnet-4-6-thinking"
93
111
  mode "budget"