@oh-my-pi/pi-catalog 18.1.20 → 18.1.22

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,16 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [18.1.22] - 2026-09-14
6
+
7
+ ### Added
8
+
9
+ - Enabled assistant prefill support for Ollama models
10
+
11
+ ### Fixed
12
+
13
+ - OpenCode Zen GPT-6 Astra requests now use the Responses endpoint instead of failing through chat completions with HTTP 500 ([#12030](https://github.com/can1357/oh-my-pi/issues/12030)).
14
+
5
15
  ## [18.1.20] - 2026-09-13
6
16
 
7
17
  ### Fixed
@@ -505,6 +505,8 @@ export interface CompiledAuthProvider {
505
505
  hook: string;
506
506
  };
507
507
  allowsMissingApiKey?: boolean;
508
+ /** APIs whose provider transport resolves credentials without a stored account. */
509
+ nativeAuthApis?: string[];
508
510
  available?: boolean;
509
511
  showInLoginList?: boolean;
510
512
  storeAs?: string;
@@ -933,6 +933,13 @@ export interface Model<TApi extends Api = Api> {
933
933
  requiresCursorToolSchemaProjection?: boolean;
934
934
  /** Whether this model requires tool-result images hoisted into sibling user content blocks. */
935
935
  requiresToolResultImageHoisting?: boolean;
936
+ /**
937
+ * Whether the host continues a trailing assistant message verbatim instead of
938
+ * treating it as a completed turn (Ollama, on both its native and OpenAI-compat
939
+ * endpoints). Callers that need a committed output prefix (session titling)
940
+ * read this before appending one. Rule-owned via `supports-assistant-prefill`.
941
+ */
942
+ supportsAssistantPrefill?: boolean;
936
943
  /**
937
944
  * Model id to send on the wire when it differs from `id`. Used by catalog
938
945
  * variants that present one upstream model under several local entries —
@@ -1106,7 +1113,7 @@ export interface Model<TApi extends Api = Api> {
1106
1113
  * vocabulary of `buildModel`. Identical to `Model` except `compat` carries the
1107
1114
  * sparse override shape and nothing is resolved yet.
1108
1115
  */
1109
- export interface ModelSpec<TApi extends Api = Api> extends Omit<Model<TApi>, "compat" | "identity" | "compatConfig" | "requiresGlyphTokenization" | "requiresCursorToolSchemaProjection" | "requiresToolResultImageHoisting" | "supportsComputerUseConfig"> {
1116
+ export interface ModelSpec<TApi extends Api = Api> extends Omit<Model<TApi>, "compat" | "identity" | "compatConfig" | "requiresGlyphTokenization" | "requiresCursorToolSchemaProjection" | "requiresToolResultImageHoisting" | "supportsAssistantPrefill" | "supportsComputerUseConfig"> {
1110
1117
  /** Sparse compatibility overrides; resolved into `Model.compat` by `buildModel`. */
1111
1118
  compat?: CompatConfigOf<TApi>;
1112
1119
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@oh-my-pi/pi-catalog",
4
- "version": "18.1.20",
4
+ "version": "18.1.22",
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": "Stencil Labs, Inc.",
@@ -35,12 +35,12 @@
35
35
  "gen:proto": "bun scripts/generate-protocols.ts"
36
36
  },
37
37
  "dependencies": {
38
- "@oh-my-pi/omptype": "18.1.20",
39
- "@oh-my-pi/pi-utils": "18.1.20"
38
+ "@oh-my-pi/omptype": "18.1.22",
39
+ "@oh-my-pi/pi-utils": "18.1.22"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@bgotink/kdl": "0.4.0",
43
- "@oh-my-pi/pi-ai": "18.1.20",
43
+ "@oh-my-pi/pi-ai": "18.1.22",
44
44
  "@types/bun": "^1.3.14"
45
45
  },
46
46
  "engines": {
package/src/build.ts CHANGED
@@ -34,8 +34,9 @@ function isInputModalities(value: unknown): value is ("text" | "image")[] {
34
34
  * corrections (`cost-patch`, `limits-patch`, `long-context-cost`,
35
35
  * `context-window-floor`) overwrite upstream values; selection metadata
36
36
  * (`priority`, `apply-patch-tool-type`, `service-tier-cost`,
37
- * `requires-cursor-tool-schema-projection`, `requires-tool-result-image-hoisting`)
38
- * is rule-owned; `context-promotion-target` fills only when the spec left it unset.
37
+ * `requires-cursor-tool-schema-projection`, `requires-tool-result-image-hoisting`,
38
+ * `supports-assistant-prefill`) is rule-owned; `context-promotion-target` fills
39
+ * only when the spec left it unset.
39
40
  */
40
41
  function applyCatalogAssignments<TApi extends Api>(model: Model<TApi>, catalog: Record<string, unknown>): void {
41
42
  const serviceTierCost = objectPayload(catalog.serviceTierCost);
@@ -69,6 +70,11 @@ function applyCatalogAssignments<TApi extends Api>(model: Model<TApi>, catalog:
69
70
  } else {
70
71
  delete model.requiresToolResultImageHoisting;
71
72
  }
73
+ if (catalog.supportsAssistantPrefill === true) {
74
+ model.supportsAssistantPrefill = true;
75
+ } else {
76
+ delete model.supportsAssistantPrefill;
77
+ }
72
78
  const contextPromotionTarget = catalog.contextPromotionTarget;
73
79
  if (typeof contextPromotionTarget === "string" && model.contextPromotionTarget === undefined) {
74
80
  model.contextPromotionTarget = contextPromotionTarget;
@@ -292,6 +292,7 @@ export const AXES: Readonly<Record<string, AxisDef>> = {
292
292
  set: "catalog",
293
293
  shape: "scalar",
294
294
  },
295
+ "supports-assistant-prefill": { key: "supportsAssistantPrefill", set: "catalog", shape: "scalar" },
295
296
  priority: { key: "priority", set: "catalog", shape: "scalar" },
296
297
  "service-tier-cost": { key: "serviceTierCost", set: "catalog", shape: "object" },
297
298
  "time-based-cost": { key: "timeBased", set: "catalog", shape: "object" },
@@ -339,6 +339,7 @@ auth "anthropic" {
339
339
  expiry "jwt-or-never" // session-JWT expiry policy
340
340
  result "api-key" // OAuth login persists only credentials.access as a plain API key
341
341
  allows-missing-api-key #true
342
+ native-auth-api "bedrock-converse-stream" // provider transport resolves auth; scan plans pin this API without secrets
342
343
  available #false
343
344
  show-in-login-list #false
344
345
  }
@@ -2,4 +2,5 @@ auth "amazon-bedrock" {
2
2
  name "Amazon Bedrock"
3
3
  // Amazon Bedrock accepts bearer tokens, IAM keys, profiles, ECS/IRSA credential chains.
4
4
  env hook="aws-bedrock"
5
+ native-auth-api "bedrock-converse-stream"
5
6
  }
@@ -2,4 +2,5 @@ auth "bedrock-mantle" {
2
2
  name "Amazon Bedrock Mantle"
3
3
  env hook="aws-bedrock-mantle"
4
4
  allows-missing-api-key #true
5
+ native-auth-api "openai-responses"
5
6
  }
@@ -2,6 +2,8 @@
2
2
 
3
3
  provider "ollama-cloud" {
4
4
  thinking-mode "effort"
5
+ // Same runtime as local Ollama: a trailing assistant turn is continued verbatim.
6
+ supports-assistant-prefill #true
5
7
  class "unknown" {
6
8
  thinking-efforts "minimal" "low" "medium" "high"
7
9
  }
@@ -9,4 +9,7 @@ provider "ollama" priority=-1 {
9
9
  // Replaces both Ollama empty-length finish baselines.
10
10
  empty-length-finish-is-context-error #true
11
11
  thinking-efforts "low" "medium" "high" "max"
12
+ // Ollama continues a trailing assistant turn verbatim on /api/chat and
13
+ // /v1/responses alike; callers use it to commit an output prefix.
14
+ supports-assistant-prefill #true
12
15
  }
@@ -173,13 +173,13 @@ behavior {
173
173
  route "openai-completions" exact="glm-5.3-flash"
174
174
  }
175
175
  // OpenCode Zen: models.dev declares minimax-m3 with `@ai-sdk/anthropic`, but
176
- // the gateway serves it only at /v1/chat/completions (#1617). models.dev
177
- // omits muse-spark-1.3-contributor-free entirely, so pin its Responses route
178
- // per opencode.ai/docs/zen/#endpoints (#10610). Both gateways serve every
179
- // Muse Spark SKU at /responses, so the prefix covers revisions shipped
180
- // gateway-first; the exact ids stay as cache-migration identity.
176
+ // the gateway serves it only at /v1/chat/completions (#1617). It omits
177
+ // muse-spark-1.3-contributor-free entirely, and the gateway's GPT-6 Astra
178
+ // listing carries no transport metadata; both model lines are served only
179
+ // at /responses (#10610, #12030). The Muse prefix covers gateway-first
180
+ // revisions; exact ids stay as cache-migration identity.
181
181
  api-routes provider="opencode-zen" {
182
- route "openai-responses" prefix="muse-spark-" exact="muse-spark-1.3-contributor-free"
182
+ route "openai-responses" prefix="muse-spark-" exact="muse-spark-1.3-contributor-free" exact="gpt-6-astra"
183
183
  route "openai-completions" exact="minimax-m3" exact="minimax-m3-free"
184
184
  }
185
185
  // OpenCode Go: models.dev's npm hints misroute these (#887, #1617); the
@@ -12355,7 +12355,7 @@
12355
12355
  }
12356
12356
  },
12357
12357
  {
12358
- "source": "providers/ollama-cloud.kdl:5",
12358
+ "source": "providers/ollama-cloud.kdl:7",
12359
12359
  "class": "unknown",
12360
12360
  "providers": [
12361
12361
  "ollama-cloud"
@@ -12370,7 +12370,7 @@
12370
12370
  }
12371
12371
  },
12372
12372
  {
12373
- "source": "providers/ollama-cloud.kdl:9",
12373
+ "source": "providers/ollama-cloud.kdl:11",
12374
12374
  "providers": [
12375
12375
  "ollama-cloud"
12376
12376
  ],
@@ -12389,7 +12389,7 @@
12389
12389
  }
12390
12390
  },
12391
12391
  {
12392
- "source": "providers/ollama-cloud.kdl:13",
12392
+ "source": "providers/ollama-cloud.kdl:15",
12393
12393
  "providers": [
12394
12394
  "ollama-cloud"
12395
12395
  ],
@@ -12417,7 +12417,7 @@
12417
12417
  }
12418
12418
  },
12419
12419
  {
12420
- "source": "providers/ollama-cloud.kdl:17",
12420
+ "source": "providers/ollama-cloud.kdl:19",
12421
12421
  "providers": [
12422
12422
  "ollama-cloud"
12423
12423
  ],
@@ -12441,6 +12441,9 @@
12441
12441
  ],
12442
12442
  "thinking": {
12443
12443
  "mode": "effort"
12444
+ },
12445
+ "catalog": {
12446
+ "supportsAssistantPrefill": true
12444
12447
  }
12445
12448
  },
12446
12449
  {
@@ -12459,6 +12462,9 @@
12459
12462
  "high",
12460
12463
  "max"
12461
12464
  ]
12465
+ },
12466
+ "catalog": {
12467
+ "supportsAssistantPrefill": true
12462
12468
  }
12463
12469
  },
12464
12470
  {
@@ -16523,7 +16529,8 @@
16523
16529
  "muse-spark-"
16524
16530
  ],
16525
16531
  "exact": [
16526
- "muse-spark-1.3-contributor-free"
16532
+ "muse-spark-1.3-contributor-free",
16533
+ "gpt-6-astra"
16527
16534
  ]
16528
16535
  }
16529
16536
  },
@@ -19134,7 +19141,10 @@
19134
19141
  "name": "Amazon Bedrock",
19135
19142
  "env": {
19136
19143
  "hook": "aws-bedrock"
19137
- }
19144
+ },
19145
+ "nativeAuthApis": [
19146
+ "bedrock-converse-stream"
19147
+ ]
19138
19148
  },
19139
19149
  {
19140
19150
  "id": "azure",
@@ -19148,7 +19158,10 @@
19148
19158
  "env": {
19149
19159
  "hook": "aws-bedrock-mantle"
19150
19160
  },
19151
- "allowsMissingApiKey": true
19161
+ "allowsMissingApiKey": true,
19162
+ "nativeAuthApis": [
19163
+ "openai-responses"
19164
+ ]
19152
19165
  },
19153
19166
  {
19154
19167
  "id": "google",
@@ -520,6 +520,8 @@ export interface CompiledAuthProvider {
520
520
  name: string;
521
521
  env?: { vars: string[] } | { hook: string };
522
522
  allowsMissingApiKey?: boolean;
523
+ /** APIs whose provider transport resolves credentials without a stored account. */
524
+ nativeAuthApis?: string[];
523
525
  available?: boolean;
524
526
  showInLoginList?: boolean;
525
527
  storeAs?: string;
package/src/types.ts CHANGED
@@ -1113,6 +1113,13 @@ export interface Model<TApi extends Api = Api> {
1113
1113
  requiresCursorToolSchemaProjection?: boolean;
1114
1114
  /** Whether this model requires tool-result images hoisted into sibling user content blocks. */
1115
1115
  requiresToolResultImageHoisting?: boolean;
1116
+ /**
1117
+ * Whether the host continues a trailing assistant message verbatim instead of
1118
+ * treating it as a completed turn (Ollama, on both its native and OpenAI-compat
1119
+ * endpoints). Callers that need a committed output prefix (session titling)
1120
+ * read this before appending one. Rule-owned via `supports-assistant-prefill`.
1121
+ */
1122
+ supportsAssistantPrefill?: boolean;
1116
1123
  /**
1117
1124
  * Model id to send on the wire when it differs from `id`. Used by catalog
1118
1125
  * variants that present one upstream model under several local entries —
@@ -1295,6 +1302,7 @@ export interface ModelSpec<TApi extends Api = Api> extends Omit<
1295
1302
  | "requiresGlyphTokenization"
1296
1303
  | "requiresCursorToolSchemaProjection"
1297
1304
  | "requiresToolResultImageHoisting"
1305
+ | "supportsAssistantPrefill"
1298
1306
  | "supportsComputerUseConfig"
1299
1307
  > {
1300
1308
  /** Sparse compatibility overrides; resolved into `Model.compat` by `buildModel`. */