@oh-my-pi/pi-catalog 18.11.0 → 18.11.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,17 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [18.11.1] - 2026-10-15
6
+
7
+ ### Fixed
8
+
9
+ - Enabled long prompt-cache retention (`ttl: "1h"`) for Claude models on `google-vertex` ([#15505](https://github.com/can1357/oh-my-pi/pull/15505) by [@hpost](https://github.com/hpost))
10
+ - Fixed Gemini 4 Argon on Google Vertex and the Gemini API failing every request with "Thinking budget is not supported for this model": Gemini 4 now sends `thinkingLevel` instead of `thinkingBudget`, and Argon offers only the low, medium, and high levels Google accepts ([#15643](https://github.com/can1357/oh-my-pi/pull/15643) by [@kevcube](https://github.com/kevcube))
11
+ - Fixed the Antigravity model selector offering roster rows the backend marks disabled (`disabled: true`, e.g. `gemini-4-argon-disabled` on accounts without Argon access), which answered `Cloud Code Assist API error (404): Requested entity was not found.`; discovery now skips them the way it already skips `isInternal` rows ([#15684](https://github.com/can1357/oh-my-pi/pull/15684) by [@CharleoYang](https://github.com/CharleoYang))
12
+ - Removed Google Antigravity's Gemini 3.5 Flash and its `gemini-3-flash` alias from the model list; Antigravity retired them and answers every request with a retirement notice instead of a reply ([#15445](https://github.com/can1357/oh-my-pi/pull/15445) by [@will-bogusz](https://github.com/will-bogusz))
13
+ - Fixed `xai-oauth` Grok 4.20 models (`grok-4.20-0309-reasoning`, `-non-reasoning`, `grok-4.20-multi-agent-0309`) advertising a 2M context window when the SuperGrok API rejects prompts over 1M; auto-compaction and context usage now work from the 1M window ([#15443](https://github.com/can1357/oh-my-pi/pull/15443) by [@will-bogusz](https://github.com/will-bogusz))
14
+ - Fixed trailing-dot `localhost.` and `*.local.` custom endpoints losing local-backend compatibility settings ([#15798](https://github.com/can1357/oh-my-pi/issues/15798)).
15
+
5
16
  ## [18.11.0] - 2026-10-14
6
17
 
7
18
  ### Added
@@ -18,6 +18,13 @@ export interface AntigravityDiscoveryApiModel {
18
18
  apiProvider?: string;
19
19
  modelProvider?: string;
20
20
  isInternal?: boolean;
21
+ /**
22
+ * Set for roster rows the backend lists but refuses to serve on this
23
+ * account (e.g. `gemini-4-argon-disabled`, `tagTitle: "Unavailable"`,
24
+ * `model: MODEL_PLACEHOLDER_M421`); a request against such an id answers
25
+ * `Cloud Code Assist API error (404): Requested entity was not found.`
26
+ */
27
+ disabled?: boolean;
21
28
  supportsVideo?: boolean;
22
29
  }
23
30
  /**
@@ -1230,6 +1230,8 @@ export interface Model<TApi extends Api = Api> {
1230
1230
  requiresGlyphTokenization?: boolean;
1231
1231
  /** Whether this model requires Cursor's tool-schema combiner projection. */
1232
1232
  requiresCursorToolSchemaProjection?: boolean;
1233
+ /** Whether advertised tool schemas occupy every model request's context (false for deferred catalogs). */
1234
+ toolSchemasInContext?: boolean;
1233
1235
  /** Whether this model requires tool-result images hoisted into sibling user content blocks. */
1234
1236
  requiresToolResultImageHoisting?: boolean;
1235
1237
  /**
@@ -1493,7 +1495,7 @@ export interface Model<TApi extends Api = Api> {
1493
1495
  * vocabulary of `buildModel`. Identical to `Model` except `compat` carries the
1494
1496
  * sparse override shape and nothing is resolved yet.
1495
1497
  */
1496
- export interface ModelSpec<TApi extends Api = Api> extends Omit<Model<TApi>, "compat" | "identity" | "compatConfig" | "requiresGlyphTokenization" | "requiresCursorToolSchemaProjection" | "requiresToolResultImageHoisting" | "supportsAssistantPrefill" | "supportsComputerUseConfig"> {
1498
+ export interface ModelSpec<TApi extends Api = Api> extends Omit<Model<TApi>, "compat" | "identity" | "compatConfig" | "requiresGlyphTokenization" | "requiresCursorToolSchemaProjection" | "toolSchemasInContext" | "requiresToolResultImageHoisting" | "supportsAssistantPrefill" | "supportsComputerUseConfig"> {
1497
1499
  /** Sparse compatibility overrides; resolved into `Model.compat` by `buildModel`. */
1498
1500
  compat?: CompatConfigOf<TApi>;
1499
1501
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oh-my-pi/pi-catalog",
3
- "version": "18.11.0",
3
+ "version": "18.11.1",
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.11.0",
97
- "@oh-my-pi/pi-utils": "18.11.0"
96
+ "@oh-my-pi/omptype": "18.11.1",
97
+ "@oh-my-pi/pi-utils": "18.11.1"
98
98
  },
99
99
  "devDependencies": {
100
100
  "@bgotink/kdl": "0.4.0",
101
- "@oh-my-pi/pi-ai": "18.11.0",
101
+ "@oh-my-pi/pi-ai": "18.11.1",
102
102
  "@types/bun": "^1.3.14"
103
103
  },
104
104
  "engines": {
package/src/build.ts CHANGED
@@ -115,6 +115,11 @@ function applyCatalogAssignments<TApi extends Api>(model: Model<TApi>, catalog:
115
115
  } else {
116
116
  delete model.requiresCursorToolSchemaProjection;
117
117
  }
118
+ if (catalog.toolSchemasInContext === false) {
119
+ model.toolSchemasInContext = false;
120
+ } else {
121
+ delete model.toolSchemasInContext;
122
+ }
118
123
  const requiresToolResultImageHoisting = catalog.requiresToolResultImageHoisting;
119
124
  if (requiresToolResultImageHoisting === true) {
120
125
  model.requiresToolResultImageHoisting = true;
@@ -340,6 +340,7 @@ export const AXES: Readonly<Record<string, AxisDef>> = {
340
340
  values: ["freeform", "function"],
341
341
  },
342
342
  "requires-native-tools": { key: "requiresNativeTools", set: "catalog", shape: "scalar", values: [true, false] },
343
+ "tool-schemas-in-context": { key: "toolSchemasInContext", set: "catalog", shape: "scalar", values: [true, false] },
343
344
  "requires-tool-free-history-for-tool-opt-out": {
344
345
  key: "requiresToolFreeHistoryForToolOptOut",
345
346
  set: "catalog",
@@ -276,6 +276,7 @@ function hasLocalLoopbackBaseUrl(baseUrl: string | undefined): boolean {
276
276
  let hostname: string;
277
277
  try {
278
278
  hostname = new URL(baseUrl).hostname.toLowerCase();
279
+ if (hostname.endsWith(".")) hostname = hostname.slice(0, -1);
279
280
  } catch {
280
281
  return false;
281
282
  }
@@ -1039,7 +1040,8 @@ function defaultThinkingMode<TApi extends Api>(spec: ModelSpec<TApi>, facts: Ide
1039
1040
  case "google-generative-ai":
1040
1041
  case "google-gemini-cli":
1041
1042
  case "google-vertex":
1042
- return facts.is("gemini") && facts.revMajor() === 3 ? "google-level" : "budget";
1043
+ // Gemini 3+ `google-level` is a `thinking-mode` rule in classes/gemini.kdl.
1044
+ return "budget";
1043
1045
  case "anthropic-messages":
1044
1046
  if (facts.is("minimax") && facts.family("m2", "m3")) return "anthropic-adaptive";
1045
1047
  if (facts.is("glm") && facts.revGte("5.2") && (spec.provider === "umans" || spec.provider === "zai")) {
@@ -66,13 +66,15 @@ class "gemini" {
66
66
  }
67
67
  }
68
68
  }
69
- // Gemini 3.7+ Flash native thinkingLevel does not accept `minimal`
70
- // (400 THINKING_LEVEL_MINIMAL; observed on 3.7 and 3.8). Only the direct
69
+ // Gemini 3.7+ Flash and Gemini 4 Argon native thinkingLevel does not accept
70
+ // `minimal` (400 THINKING_LEVEL_MINIMAL; observed on Flash 3.7 and 3.8, and
71
+ // documented for Argon and Argon Cyber Permissive). Only the direct
71
72
  // google-level transports emit `thinkingLevel` on the wire, so the tier is
72
73
  // dropped there; budget (anthropic-messages) and reasoning_effort resellers
73
74
  // never send the rejected value and keep the four-tier ladder. The collapsed
74
75
  // google-antigravity / google-gemini-cli variants remap minimal -> LOW and
75
76
  // carry their own explicit ladder, so they are unaffected.
77
+ // https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/gemini/4-argon
76
78
  // https://ai.google.dev/gemini-api/docs/generate-content/thinking#thinking-levels
77
79
  on "google" "google-vertex" "opencode-zen" {
78
80
  family "flash" {
@@ -80,6 +82,13 @@ class "gemini" {
80
82
  thinking-efforts "low" "medium" "high"
81
83
  }
82
84
  }
85
+ // Exact ids: a revision-wide rule would tie with the Pro low/high ladder.
86
+ // Gemini API discovery has no bundled Argon reference and infers
87
+ // `reasoning: false` from the id; repair it so the ladder is selectable.
88
+ models "gemini-4-argon" "gemini-4-argon-cyber-permissive" {
89
+ thinking-upgrade-neutral #true
90
+ thinking-efforts "low" "medium" "high"
91
+ }
83
92
  }
84
93
  // Gemini 4 Argon's introductory list price ($2/$10, $0.10 cached) ends
85
94
  // 2026-11-30; from 2026-12-01 Google bills $4/$20, $0.20 cached, on the
@@ -116,6 +125,13 @@ class "gemini" {
116
125
  // Replaces the Gemini 3+ mandatory-reasoning fallback.
117
126
  thinking-requires-effort #true
118
127
  }
128
+ // Gemini 3+ takes `thinkingLevel` on the native Google transports; Gemini 4
129
+ // rejects `thinkingBudget` outright (400 "Use thinking level instead").
130
+ on-api "google-generative-ai" "google-gemini-cli" "google-vertex" {
131
+ revision ">=3" {
132
+ thinking-mode "google-level"
133
+ }
134
+ }
119
135
  // Public Gemini requires the bypass sentinel on every unsigned call and
120
136
  // supports function-part ids. Scope by adapter so custom providers using
121
137
  // the same wire protocol inherit both contracts. The Cloud Code Assist
@@ -28,6 +28,10 @@ provider "google-vertex" {
28
28
  }
29
29
  }
30
30
  class "anthropic" {
31
+ // Vertex rawPredict honors `cache_control.ttl: "1h"` (writes bill to
32
+ // `ephemeral_1h_input_tokens`, entries outlive 5m) without any beta; the
33
+ // `extended-cache-ttl-2025-04-11` beta is rejected in `anthropic_beta`.
34
+ supports-long-cache-retention #true
31
35
  revision ">=4.5 <4.6" {
32
36
  thinking-efforts "minimal" "low" "medium" "high" "xhigh"
33
37
  }
@@ -1,4 +1,7 @@
1
1
  // Cursor always exposes server-owned native operations, even with an empty tool catalog.
2
2
  on-api "cursor-agent" {
3
3
  requires-native-tools #true
4
+ // MCP schemas live in Cursor's server-side catalog and enter model context
5
+ // only when dynamically selected, not as a fixed cost on every turn.
6
+ tool-schemas-in-context #false
4
7
  }
@@ -15,8 +15,9 @@ provider "xai-oauth" {
15
15
 
16
16
  // Source of truth for the xai-oauth chat picker. Declaration order is headline order.
17
17
  // Context windows from hermes-agent/agent/model_metadata.py:205-220
18
- // ("Values sourced from models.dev (2026-04)"). grok-build is xAI's
19
- // coding-fine-tuned chat model; 512K context per user spec (2026-05-17).
18
+ // ("Values sourced from models.dev (2026-04)") unless a row says otherwise.
19
+ // grok-build is xAI's coding-fine-tuned chat model; 512K context per user
20
+ // spec (2026-05-17).
20
21
  //
21
22
  // xai-oauth's /v1/models exposes no per-request output limit on the OAuth
22
23
  // (Grok Build / SuperGrok) surface, so maxTokens mirrors contextWindow. The
@@ -68,25 +69,27 @@ provider "xai-oauth" {
68
69
  cost input=0 output=0 cache-read=0 cache-write=0
69
70
  limits context=500000 max-tokens=500000
70
71
  }
71
- // Text-only per the bundled catalog.
72
+ // grok-4.20-*-0309: api.x.ai rejects prompts over 1M tokens on this surface
73
+ // ([input_too_large] "... > 1000000 tokens", all three ids, 2026-10-12).
74
+ // Multi-agent is text-only per the bundled catalog.
72
75
  model "grok-4.20-multi-agent-0309" name="Grok 4.20 (Multi-Agent)" {
73
76
  reasoning #true
74
77
  input "text"
75
78
  cost input=0 output=0 cache-read=0 cache-write=0
76
- limits context=2000000 max-tokens=2000000
79
+ limits context=1000000 max-tokens=1000000
77
80
  }
78
81
  model "grok-4.20-0309-reasoning" name="Grok 4.20 (Reasoning)" {
79
82
  reasoning #true
80
83
  input "text" "image"
81
84
  cost input=0 output=0 cache-read=0 cache-write=0
82
- limits context=2000000 max-tokens=2000000
85
+ limits context=1000000 max-tokens=1000000
83
86
  supports-reasoning-effort #false
84
87
  }
85
88
  model "grok-4.20-0309-non-reasoning" name="Grok 4.20 (Non-Reasoning)" {
86
89
  reasoning #false
87
90
  input "text" "image"
88
91
  cost input=0 output=0 cache-read=0 cache-write=0
89
- limits context=2000000 max-tokens=2000000
92
+ limits context=1000000 max-tokens=1000000
90
93
  }
91
94
  // Cursor's "Composer 2.5 Fast" exposed via SuperGrok: non-reasoning,
92
95
  // text-only, 200K context (mirrors Cursor's composer-* catalog entries).
@@ -173,6 +173,10 @@ behavior {
173
173
  // serve; the dedicated tool surfaces route them instead.
174
174
  exclude-models provider="xai-oauth" exact="grok-imagine-image-quality" exact="grok-imagine-image-2.0" \
175
175
  prefix="grok-imagine-video" prefix="grok-stt-" prefix="grok-voice-"
176
+ // Antigravity still advertises the Gemini 3.5 Flash wire ids, but every
177
+ // request to them answers with a retirement notice instead of a reply.
178
+ // `gemini-3-flash` is the family's recycled alias and routes to the same ids.
179
+ exclude-models provider="google-antigravity" exact="gemini-3.5-flash" exact="gemini-3-flash"
176
180
  // Meta's /v1/models lists image generation and transcription SKUs beside
177
181
  // the Muse Spark chat models, and SAM segmentation beside them.
178
182
  exclude-models provider="meta" prefix="muse-image-" prefix="muse-voice-" prefix="sam-"
@@ -349,7 +353,6 @@ behavior {
349
353
  // Google); price rows at their first-party equivalents, Vertex before
350
354
  // Anthropic for Claude ids. Aliases map ids whose peer ships differently.
351
355
  pricing-peer provider="google-antigravity" peers="google" "google-vertex" "anthropic" {
352
- alias "gemini-3-flash" peer-id="gemini-3-flash-preview"
353
356
  alias "gemini-3-pro" peer-id="gemini-3-pro-preview"
354
357
  alias "gemini-3.1-pro" peer-id="gemini-3.1-pro-preview"
355
358
  alias "claude-opus-4-5" peer-id="claude-opus-4-5@20251101"