@oh-my-pi/pi-catalog 18.11.1 → 18.11.2

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,21 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [18.11.2] - 2026-10-16
6
+
7
+ ### Added
8
+
9
+ - Added `keep-bundled-names` catalog attribute to preserve static model display names during discovery
10
+ - Updated `openai-codex` provider configuration to prevent model name regressions during live discovery
11
+
12
+ ### Changed
13
+
14
+ - GPT Image models (`gpt-image-*`, `chatgpt-image-*`) now classify as their own `gpt-image` family instead of `gpt` or `chatgpt`, so GPT chat-model rules no longer apply to them ([#14619](https://github.com/can1357/oh-my-pi/pull/14619) by [@jimhester](https://github.com/jimhester))
15
+
16
+ ### Fixed
17
+
18
+ - Fixed OpenCode Zen Gemini 4 Argon failing with an unsupported protocol; it now uses the native Gemini endpoint ([#15977](https://github.com/can1357/oh-my-pi/issues/15977)).
19
+
5
20
  ## [18.11.1] - 2026-10-15
6
21
 
7
22
  ### Fixed
@@ -16,7 +16,7 @@ export type AxisShape = "scalar" | "array" | "object";
16
16
  /** Axis namespace: request-wire compat, thinking control surface, or catalog metadata. */
17
17
  export type AxisSet = "wire" | "thinking" | "catalog";
18
18
  /** Resolved compat record families a wire axis may be assigned onto. */
19
- export type CompatRecordName = "openai" | "openai-responses" | "anthropic" | "bedrock" | "devin" | "google" | "request";
19
+ export type CompatRecordName = "openai" | "openai-responses" | "anthropic" | "bedrock" | "devin" | "google" | "request" | "ollama";
20
20
  /** One axis definition: resolved key, namespace, shape, and applicability. */
21
21
  export interface AxisDef {
22
22
  /** Resolved camelCase field the directive assigns. */
@@ -634,6 +634,8 @@ export interface CompiledProvider {
634
634
  dynamicModelsAuthoritative?: boolean;
635
635
  /** Generator backfills never copy reasoning/input/limits from same-id rows on other hosts. */
636
636
  skipCrossProviderReferenceFills?: boolean;
637
+ /** Runtime discovery keeps a bundled row's display name instead of the live one. */
638
+ keepBundledNames?: boolean;
637
639
  /** Present only for providers enrolled in `generate-models.ts` discovery. */
638
640
  discovery?: CompiledProviderDiscovery;
639
641
  /** Non-chat model kinds mapped to their runtime transport APIs. */
@@ -51,6 +51,12 @@ export interface ModelManagerOptions<TApi extends Api = Api, TModelsDevPayload =
51
51
  * a zero discovery price is treated as unknown and the bundled rate is kept.
52
52
  */
53
53
  dynamicCostAuthoritative?: boolean;
54
+ /**
55
+ * When true, a static row's display name wins over the cached or live row
56
+ * for the same id, so a model keeps one name before and after discovery.
57
+ * Set from the provider's `keep-bundled-names` catalog entry.
58
+ */
59
+ keepStaticNames?: boolean;
54
60
  /**
55
61
  * When true, a fresh cache never satisfies an online-eligible refresh: the
56
62
  * dynamic fetch always runs (an explicit `"offline"` strategy is still
@@ -1100,10 +1100,16 @@ export type ResolvedGoogleCompat = Required<Omit<GoogleCompat, "streamFirstEvent
1100
1100
  maxImageDimension?: number;
1101
1101
  maxImagePayloadBytes?: number;
1102
1102
  };
1103
+ /** Ollama chat history compatibility resolved by the catalog. */
1104
+ export interface OllamaCompat {
1105
+ /** Omit assistant thinking when the deployment rejects it in history. */
1106
+ stripThinkingHistory?: boolean;
1107
+ }
1108
+ export type ResolvedOllamaCompat = Required<OllamaCompat>;
1103
1109
  /** Sparse, user-authored compat overrides for a given API (models.json / config vocabulary). */
1104
- export type CompatConfigOf<TApi extends Api> = TApi extends "openai-completions" | "openrouter" | "openai-responses" | "azure-openai-responses" | "openai-codex-responses" ? OpenAICompat : TApi extends "anthropic-messages" ? AnthropicCompat : TApi extends "bedrock-converse-stream" ? BedrockCompat : TApi extends "devin-agent" ? DevinCompat : TApi extends "google-generative-ai" | "google-vertex" | "google-gemini-cli" ? GoogleCompat : undefined;
1110
+ export type CompatConfigOf<TApi extends Api> = TApi extends "openai-completions" | "openrouter" | "openai-responses" | "azure-openai-responses" | "openai-codex-responses" ? OpenAICompat : TApi extends "anthropic-messages" ? AnthropicCompat : TApi extends "bedrock-converse-stream" ? BedrockCompat : TApi extends "devin-agent" ? DevinCompat : TApi extends "google-generative-ai" | "google-vertex" | "google-gemini-cli" ? GoogleCompat : TApi extends "ollama-chat" ? OllamaCompat : undefined;
1105
1111
  /** Resolved compat for a given API: complete record, materialized once by `buildModel`. */
1106
- export type CompatOf<TApi extends Api> = TApi extends "openrouter" ? ResolvedOpenRouterCompat : TApi extends "openai-completions" ? ResolvedOpenAICompat : TApi extends "openai-responses" | "azure-openai-responses" | "openai-codex-responses" ? ResolvedOpenAIResponsesCompat : TApi extends "anthropic-messages" ? ResolvedAnthropicCompat : TApi extends "bedrock-converse-stream" ? ResolvedBedrockCompat : TApi extends "devin-agent" ? ResolvedDevinCompat : TApi extends "google-generative-ai" | "google-vertex" | "google-gemini-cli" ? ResolvedGoogleCompat : undefined;
1112
+ export type CompatOf<TApi extends Api> = TApi extends "openrouter" ? ResolvedOpenRouterCompat : TApi extends "openai-completions" ? ResolvedOpenAICompat : TApi extends "openai-responses" | "azure-openai-responses" | "openai-codex-responses" ? ResolvedOpenAIResponsesCompat : TApi extends "anthropic-messages" ? ResolvedAnthropicCompat : TApi extends "bedrock-converse-stream" ? ResolvedBedrockCompat : TApi extends "devin-agent" ? ResolvedDevinCompat : TApi extends "google-generative-ai" | "google-vertex" | "google-gemini-cli" ? ResolvedGoogleCompat : TApi extends "ollama-chat" ? ResolvedOllamaCompat : undefined;
1107
1113
  /** Provider-native compaction endpoint configuration for one model. */
1108
1114
  export interface RemoteCompactionConfig<TApi extends Api = Api> {
1109
1115
  /** Enables provider-native compaction for providers not enabled by built-in policy. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oh-my-pi/pi-catalog",
3
- "version": "18.11.1",
3
+ "version": "18.11.2",
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.1",
97
- "@oh-my-pi/pi-utils": "18.11.1"
96
+ "@oh-my-pi/omptype": "18.11.2",
97
+ "@oh-my-pi/pi-utils": "18.11.2"
98
98
  },
99
99
  "devDependencies": {
100
100
  "@bgotink/kdl": "0.4.0",
101
- "@oh-my-pi/pi-ai": "18.11.1",
101
+ "@oh-my-pi/pi-ai": "18.11.2",
102
102
  "@types/bun": "^1.3.14"
103
103
  },
104
104
  "engines": {
@@ -20,7 +20,15 @@ export type AxisShape = "scalar" | "array" | "object";
20
20
  export type AxisSet = "wire" | "thinking" | "catalog";
21
21
 
22
22
  /** Resolved compat record families a wire axis may be assigned onto. */
23
- export type CompatRecordName = "openai" | "openai-responses" | "anthropic" | "bedrock" | "devin" | "google" | "request";
23
+ export type CompatRecordName =
24
+ | "openai"
25
+ | "openai-responses"
26
+ | "anthropic"
27
+ | "bedrock"
28
+ | "devin"
29
+ | "google"
30
+ | "request"
31
+ | "ollama";
24
32
 
25
33
  /** One axis definition: resolved key, namespace, shape, and applicability. */
26
34
  export interface AxisDef {
@@ -251,7 +259,7 @@ export const AXES: Readonly<Record<string, AxisDef>> = {
251
259
  "requires-thinking-enabled": wire("requiresThinkingEnabled", ["anthropic"]),
252
260
  "requires-tool-result-id": wire("requiresToolResultId", ["anthropic"]),
253
261
  "signing-endpoint": wire("signingEndpoint", ["anthropic"]),
254
- "strip-thinking-history": wire("stripThinkingHistory", ["anthropic"]),
262
+ "strip-thinking-history": wire("stripThinkingHistory", ["anthropic", "ollama"]),
255
263
  "supports-context-management": wire("supportsContextManagement", ["anthropic"]),
256
264
  "supports-output-effort": wire("supportsOutputEffort", ["anthropic"]),
257
265
  "supports-eager-tool-input-streaming": wire("supportsEagerToolInputStreaming", ["anthropic"]),
@@ -596,6 +604,7 @@ export const AXES: Readonly<Record<string, AxisDef>> = {
596
604
 
597
605
  /** Records applicable to each API family; used by `resolve.ts` when applying wire axes. */
598
606
  export const API_COMPAT_RECORDS: Readonly<Record<string, readonly CompatRecordName[]>> = {
607
+ "ollama-chat": ["ollama"],
599
608
  "openai-completions": ["openai"],
600
609
  openrouter: ["openai", "openai-responses"],
601
610
  "openai-responses": ["openai-responses"],
@@ -27,6 +27,7 @@ import type {
27
27
  ResolvedBedrockCompat,
28
28
  ResolvedDevinCompat,
29
29
  ResolvedGoogleCompat,
30
+ ResolvedOllamaCompat,
30
31
  ResolvedOpenAICompat,
31
32
  ResolvedOpenAIResponsesCompat,
32
33
  ResolvedOpenAISharedCompat,
@@ -974,6 +975,13 @@ function resolveBedrockPolicy(spec: ModelSpec<"bedrock-converse-stream">, axes:
974
975
  return compat;
975
976
  }
976
977
 
978
+ function resolveOllamaPolicy(spec: ModelSpec<"ollama-chat">, axes: ResolvedAxes): ResolvedOllamaCompat {
979
+ const compat: ResolvedOllamaCompat = { stripThinkingHistory: false };
980
+ applyWireAxes(compat, axes.wire, "ollama-chat");
981
+ applyCompatOverrides(compat, spec.compat);
982
+ return compat;
983
+ }
984
+
977
985
  function resolveDevinPolicy(spec: ModelSpec<"devin-agent">, axes: ResolvedAxes): ResolvedDevinCompat {
978
986
  const compat: ResolvedDevinCompat = {
979
987
  trustExplicitThinkingOnly: true,
@@ -1380,6 +1388,8 @@ export function resolveModelPolicy(input: ModelSpec<Api>, route?: ResolveRoute):
1380
1388
  compat = resolveAnthropicPolicy(spec, facts, axes);
1381
1389
  } else if (specUsesApi(spec, "bedrock-converse-stream")) {
1382
1390
  compat = resolveBedrockPolicy(spec, axes);
1391
+ } else if (specUsesApi(spec, "ollama-chat")) {
1392
+ compat = resolveOllamaPolicy(spec, axes);
1383
1393
  } else if (specUsesApi(spec, "devin-agent")) {
1384
1394
  compat = resolveDevinPolicy(spec, axes);
1385
1395
  } else if (
@@ -403,6 +403,7 @@ provider "sakana" {
403
403
  dynamic-models-authoritative #true // discovery replaces bundled rows
404
404
  allow-unauthenticated #true // runtime manager without a key
405
405
  skip-cross-provider-reference-fills #true // generator never backfills from same-id rows elsewhere
406
+ keep-bundled-names #true // discovery never renames a bundled row
406
407
  discovery label="Sakana AI" oauth-provider="sakana" allow-unauthenticated=#true {
407
408
  env "SAKANA_GEN_KEY" // generation-time keys; defaults to the provider env
408
409
  }
@@ -5,6 +5,8 @@ provider "ollama-cloud" {
5
5
  env "OLLAMA_CLOUD_API_KEY"
6
6
  discovery label="Ollama Cloud" oauth-provider="ollama-cloud"
7
7
 
8
+ // Legacy deployments can reject assistant thinking history (#1000).
9
+ strip-thinking-history #true
8
10
  thinking-mode "effort"
9
11
  // Same runtime as local Ollama: a trailing assistant turn is continued verbatim.
10
12
  supports-assistant-prefill #true
@@ -20,7 +22,12 @@ provider "ollama-cloud" {
20
22
  thinking-efforts "minimal" "low" "medium" "high"
21
23
  }
22
24
  // residue: taxonomy ranks and exact globs do not isolate these models.
25
+ // #9693 verifies thinking history for these GLM-5.2 wire IDs only.
23
26
  models "glm-5.2" {
27
+ strip-thinking-history #false
24
28
  thinking-efforts "high" "max"
25
29
  }
30
+ models "glm-5.2:cloud" {
31
+ strip-thinking-history #false
32
+ }
26
33
  }
@@ -4,6 +4,11 @@ provider "openai-codex" {
4
4
  default-model "gpt-5.5"
5
5
  env "OPENAI_CODEX_OAUTH_TOKEN"
6
6
  dynamic-models-authoritative #true
7
+ // Codex `/models` `display_name` is a title-cased slug (`GPT-6.1-Sol`,
8
+ // `GPT-5.6-Luna`) while the generator names bundled rows from the shared
9
+ // reference (`GPT-6.1 Sol`); without this the composer chip flips spelling
10
+ // once live discovery lands.
11
+ keep-bundled-names #true
7
12
  kind-apis {
8
13
  image "openai-codex-responses"
9
14
  }
@@ -119,6 +119,9 @@ provider "openrouter" {
119
119
  models "~typesafe/*" "typesafe/*" {
120
120
  kind "judge"
121
121
  }
122
+ models "~typesafe/jev-latest" "typesafe/jev-1.13" "typesafe/jev-1.14" {
123
+ input-modalities "text" "image"
124
+ }
122
125
  models "cohere/rerank-v3.5" {
123
126
  kind "rerank"
124
127
  }
@@ -14,6 +14,9 @@ provider "typesafe" {
14
14
  supports-tools #false
15
15
  }
16
16
  }
17
+ models "jev-latest" "jev-preview" "jev-1.13.0" "jev-1.14.0" {
18
+ input-modalities "text" "image"
19
+ }
17
20
 
18
21
  models "*" {
19
22
  kind "judge"
@@ -262,6 +262,8 @@ behavior {
262
262
  // at /responses (#10610, #12030). The Muse prefix covers gateway-first
263
263
  // revisions; exact ids stay as cache-migration identity.
264
264
  api-routes provider="opencode-zen" {
265
+ // Paid Argon is served only on Zen's native Google endpoint (#15977).
266
+ route "google-generative-ai" exact="gemini-4-argon"
265
267
  route "anthropic-messages" exact="union-alpha"
266
268
  route "openai-responses" prefix="muse-spark-" exact="muse-spark-1.3-contributor-free" exact="gpt-6-astra"
267
269
  route "openai-completions" exact="minimax-m3" exact="minimax-m3-free"
@@ -16,6 +16,8 @@ class "openai" {
16
16
 
17
17
  family "gpt" glob="gpt-*"
18
18
  family "chatgpt" glob="chatgpt-*"
19
+ family "gpt-image" glob="gpt-image-*"
20
+ family "gpt-image" glob="chatgpt-image-*"
19
21
  family "o-series" glob="o1"
20
22
  family "o-series" glob="o1-*"
21
23
  family "o-series" glob="o1.*"