@oh-my-pi/pi-catalog 18.5.0 → 18.5.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,31 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [18.5.1] - 2026-10-03
6
+
7
+ ### Added
8
+
9
+ - Added support for listing models from Codex-compatible gateways through openaiCodexModelManagerOptions.baseUrl, with discovery caches isolated per endpoint.
10
+ - Exposed the max reasoning-effort tier for Muse Spark 1.3 contributor models on Meta and Muse Code providers.
11
+
12
+ ### Changed
13
+
14
+ - Added full configurable reasoning-effort ladders for ClinePass DeepSeek V4.1 Flash Free and Muse Spark 1.3 Contributor Free models.
15
+ - Recognize bare and provider-qualified k3 and k3-256k selectors as Kimi K3, enabling K3-specific catalog policies and replace-edit fallback behavior while preserving explicit edit-mode overrides.
16
+ - Updated Fireworks model pricing to use Fireworks-specific rates, correcting missing and inaccurate costs for supported models.
17
+ - Updated Fireworks fast-model listings to replace retired models with glm-5.3-fast and kimi-k3-fast; GLM-5.3 Fast now exposes low, high, and max reasoning levels on Fireworks, Baseten, and Vercel AI Gateway.
18
+
19
+ ### Fixed
20
+
21
+ - Fixed image input for OpenAI models used through custom Amazon Bedrock Converse providers when images are read through tools.
22
+ - Fixed local Ollama thinking models continuing to reason when thinking was disabled, reducing delays such as slow session-title generation.
23
+ - Fixed reasoning-level availability for OpenCode Go models so unsupported levels are no longer offered and reasoning can be disabled where supported.
24
+ - Fixed Anthropic-compatible Claude Opus 5.5 sessions failing after tool use or system-prompt changes.
25
+ - Fixed Cursor Grok 4.5 and 4.6 model selectors and overrides intermittently resolving to inconsistent model IDs.
26
+ - Fixed Google Antigravity Gemini 3.1 Flash Image being recognized as an image-capable model for image roles and fallback chains.
27
+ - Fixed GitHub Copilot base models reporting an incorrect long-context window when a separate -1m model is available.
28
+ - Fixed newer OpenAI and Anthropic model families being incorrectly marked as accepting sampling parameters when accessed through compatible providers such as Amazon Bedrock, Google, Devin, or OpenRouter; explicit compatibility overrides continue to take precedence.
29
+
5
30
  ## [18.5.0] - 2026-10-03
6
31
 
7
32
  ### Added
@@ -102,6 +102,13 @@ export interface VariantCollapseTable {
102
102
  * Discovery uses this accessor to preserve injectable table seams.
103
103
  */
104
104
  export declare function reviewedCollapseTable(provider: string): VariantCollapseTable | undefined;
105
+ /**
106
+ * Logical id of the reviewed `provider` family claiming `memberId` as a member
107
+ * or extra alias, or `undefined` when no reviewed family owns it. Cursor's rich
108
+ * discovery names lanes with it so they keep the id the legacy-slug collapse
109
+ * (and the bundled catalog) assigns.
110
+ */
111
+ export declare function reviewedVariantFamilyId(provider: string, memberId: string): string | undefined;
105
112
  /**
106
113
  * The global automatic rule: derive an `X` + `X-thinking` family for every
107
114
  * pair where both ids are live in `specs` (trailing or infix token). Gates:
@@ -24,6 +24,12 @@ export interface OpenAICodexModelManagerConfig {
24
24
  * keeps the previous/bundled catalog instead.
25
25
  */
26
26
  resolveAccounts?: () => Promise<readonly OpenAICodexAccount[] | null>;
27
+ /**
28
+ * Codex backend base URL (e.g. a Codex-compatible gateway from `models.yml`).
29
+ * Defaults to the official ChatGPT backend. Also scopes the discovery cache,
30
+ * so a gateway roster never serves the official endpoint and vice versa.
31
+ */
32
+ baseUrl?: string;
27
33
  clientVersion?: string;
28
34
  fetch?: FetchImpl;
29
35
  }
@@ -651,6 +651,12 @@ export interface BedrockCompat {
651
651
  * `PI_OPENAI_STREAM_IDLE_TIMEOUT_MS` alias, then the 300s default.
652
652
  */
653
653
  streamIdleTimeoutMs?: number;
654
+ /**
655
+ * Whether the served model accepts explicit sampling parameters
656
+ * (`temperature`, `topP`, …). Class rules set `false` for model lines that
657
+ * reject them on every host. Unassigned: accepted.
658
+ */
659
+ supportsSamplingParams?: boolean;
654
660
  /**
655
661
  * Whether the model accepts a forced `toolChoice` (`any` / `tool`). Claude
656
662
  * Opus/Sonnet 5.5 reject it outright; the request builder downgrades forced
@@ -666,6 +672,8 @@ export interface ResolvedBedrockCompat {
666
672
  supportsLongPromptCacheRetention: boolean;
667
673
  promptCacheMinimumTokens: number;
668
674
  promptCacheMaximumCheckpoints: number;
675
+ /** See {@link BedrockCompat.supportsSamplingParams}. */
676
+ supportsSamplingParams?: boolean;
669
677
  supportsForcedToolChoice: boolean;
670
678
  /**
671
679
  * Stream-watchdog idle-timeout fallback in ms for hosts with no keepalive
@@ -918,9 +926,11 @@ export interface DevinCompat {
918
926
  modelRouter?: boolean;
919
927
  /** Whether the upstream model supports native parallel tool calls. */
920
928
  supportsParallelToolCalls?: boolean;
929
+ /** See {@link BedrockCompat.supportsSamplingParams}. */
930
+ supportsSamplingParams?: boolean;
921
931
  }
922
932
  /** Fully-resolved devin-agent compat view. */
923
- export type ResolvedDevinCompat = Required<DevinCompat>;
933
+ export type ResolvedDevinCompat = Required<Omit<DevinCompat, "supportsSamplingParams">> & Pick<DevinCompat, "supportsSamplingParams">;
924
934
  /**
925
935
  * Compatibility settings for the Google API family (google-generative-ai,
926
936
  * google-vertex, google-gemini-cli). Class-driven defaults come from the
@@ -955,13 +965,16 @@ export interface GoogleCompat {
955
965
  stripImageInput?: boolean;
956
966
  /** Thinking-loop watchdog guard family applied to streamed reasoning. */
957
967
  thinkingLoopGuard?: "gemini" | "deepseek" | "xai";
968
+ /** See {@link BedrockCompat.supportsSamplingParams}. */
969
+ supportsSamplingParams?: boolean;
958
970
  }
959
971
  /** Fully-resolved google-API compat view, materialized once by `buildModel`. */
960
- export type ResolvedGoogleCompat = Required<Omit<GoogleCompat, "streamFirstEventTimeoutMs" | "streamIdleTimeoutMs" | "thinkingLoopGuard" | "antigravityUsageLabel">> & {
972
+ export type ResolvedGoogleCompat = Required<Omit<GoogleCompat, "streamFirstEventTimeoutMs" | "streamIdleTimeoutMs" | "thinkingLoopGuard" | "antigravityUsageLabel" | "supportsSamplingParams">> & {
961
973
  streamFirstEventTimeoutMs?: number;
962
974
  streamIdleTimeoutMs?: number;
963
975
  thinkingLoopGuard?: GoogleCompat["thinkingLoopGuard"];
964
976
  antigravityUsageLabel?: string;
977
+ supportsSamplingParams?: boolean;
965
978
  };
966
979
  /** Sparse, user-authored compat overrides for a given API (models.json / config vocabulary). */
967
980
  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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oh-my-pi/pi-catalog",
3
- "version": "18.5.0",
3
+ "version": "18.5.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.5.0",
97
- "@oh-my-pi/pi-utils": "18.5.0"
96
+ "@oh-my-pi/omptype": "18.5.1",
97
+ "@oh-my-pi/pi-utils": "18.5.1"
98
98
  },
99
99
  "devDependencies": {
100
100
  "@bgotink/kdl": "0.4.0",
101
- "@oh-my-pi/pi-ai": "18.5.0",
101
+ "@oh-my-pi/pi-ai": "18.5.1",
102
102
  "@types/bun": "^1.3.14"
103
103
  },
104
104
  "engines": {
@@ -293,7 +293,7 @@ export const AXES: Readonly<Record<string, AxisDef>> = {
293
293
  "stream-idle-timeout-ms": wire("streamIdleTimeoutMs", [...OAI, "anthropic", "bedrock", "google"]),
294
294
  "strip-image-input": wire("stripImageInput", [...OAI, "anthropic", "google"]),
295
295
  "supports-forced-tool-choice": wire("supportsForcedToolChoice", [...OAI, "anthropic", "bedrock"]),
296
- "supports-sampling-params": wire("supportsSamplingParams", [...OAI, "anthropic"]),
296
+ "supports-sampling-params": wire("supportsSamplingParams", [...OAI, "anthropic", "bedrock", "devin", "google"]),
297
297
  "thinking-loop-guard": wire("thinkingLoopGuard", [...OAI, "anthropic", "google"], "scalar", [
298
298
  "gemini",
299
299
  "deepseek",
@@ -304,7 +304,7 @@ export const AXES: Readonly<Record<string, AxisDef>> = {
304
304
  "thinking-default-level": { key: "defaultLevel", set: "thinking", shape: "scalar", values: EFFORTS },
305
305
  "thinking-effort-budgets": { key: "effortBudgets", set: "thinking", shape: "object" },
306
306
  "thinking-effort-map": { key: "effortMap", set: "thinking", shape: "object" },
307
- "thinking-efforts": { key: "efforts", set: "thinking", shape: "array", values: EFFORTS },
307
+ "thinking-efforts": { key: "efforts", set: "thinking", shape: "array", values: EFFORTS, emptyArray: true },
308
308
  "thinking-mode": {
309
309
  key: "mode",
310
310
  set: "thinking",
@@ -490,6 +490,17 @@ export function reviewedCollapseTable(provider: string): VariantCollapseTable |
490
490
  return REVIEWED_COLLAPSE_TABLES[provider] ?? REVIEWED_COLLAPSE_TABLES[provider.toLowerCase()];
491
491
  }
492
492
 
493
+ /**
494
+ * Logical id of the reviewed `provider` family claiming `memberId` as a member
495
+ * or extra alias, or `undefined` when no reviewed family owns it. Cursor's rich
496
+ * discovery names lanes with it so they keep the id the legacy-slug collapse
497
+ * (and the bundled catalog) assigns.
498
+ */
499
+ export function reviewedVariantFamilyId(provider: string, memberId: string): string | undefined {
500
+ const table = reviewedCollapseTable(provider);
501
+ return table ? getAliasIndex(table).resolve(memberId.trim()) : undefined;
502
+ }
503
+
493
504
  /**
494
505
  * The global automatic rule: derive an `X` + `X-thinking` family for every
495
506
  * pair where both ids are live in `specs` (trailing or infix token). Gates:
@@ -179,7 +179,7 @@ function overlayEffortMapAxis(
179
179
  }
180
180
 
181
181
  function effortList(value: unknown): readonly Effort[] | undefined {
182
- if (!Array.isArray(value) || value.length === 0) return undefined;
182
+ if (!Array.isArray(value)) return undefined;
183
183
  const out: Effort[] = [];
184
184
  for (const entry of value) {
185
185
  const effort = THINKING_EFFORTS.find(candidate => candidate === entry);
@@ -505,7 +505,7 @@ function detectOpenAICompat(
505
505
  // API-conditional: this completions-only Copilot exclusion cannot be a
506
506
  // provider rule without changing Copilot Responses rows.
507
507
  supportsReasoningParams: provider !== "github-copilot",
508
- supportsSamplingParams: !(facts.is("openai") && (facts.family("o-series") || facts.revGte("5"))),
508
+ supportsSamplingParams: true,
509
509
  supportsPenaltyAndStopParams: !(isGrok && reasoningCapable),
510
510
  reasoningEffortMap: {},
511
511
  supportsUsageInStreaming: !isCerebrasHost,
@@ -759,7 +759,7 @@ function resolveOpenAIResponsesPolicy(
759
759
  thinkingLoopGuard: undefined,
760
760
  reasoningEffortMap: {},
761
761
  supportsReasoningParams: true,
762
- supportsSamplingParams: !(facts.is("openai") && (facts.family("o-series") || facts.revGte("5"))),
762
+ supportsSamplingParams: true,
763
763
  supportsPenaltyAndStopParams: !isXaiHost,
764
764
  thinkingFormat,
765
765
  reasoningDisableMode: resolveReasoningDisableMode(thinkingFormat),
@@ -906,7 +906,7 @@ function resolveAnthropicPolicy(
906
906
  supportsThinkingBindingControls: false,
907
907
  supportsBetweenToolsThinking: false,
908
908
  supportsForcedToolChoice: !requiresThinkingEnabled && !facts.family("fable", "mythos"),
909
- supportsSamplingParams: !facts.anthropicAdaptiveGenAtLeast("4.7"),
909
+ supportsSamplingParams: true,
910
910
  requiresToolResultId: false,
911
911
  requiresThinkingEnabled,
912
912
  replayUnsignedThinking:
@@ -1162,6 +1162,7 @@ function resolveThinkingPolicy<TApi extends Api>(
1162
1162
  if (compat !== undefined && "trustExplicitThinkingOnly" in compat && compat.trustExplicitThinkingOnly === true) {
1163
1163
  return undefined;
1164
1164
  }
1165
+ if (rule.efforts?.length === 0) return undefined;
1165
1166
  const config: ThinkingConfig = {
1166
1167
  mode: rule.mode ?? defaultThinkingMode(spec, facts),
1167
1168
  efforts: rule.efforts ?? fallbackEfforts(spec, compat),
@@ -209,7 +209,7 @@ The directive vocabulary is closed and lives in **`src/compat/axes.ts`** — one
209
209
  The three value shapes are:
210
210
 
211
211
  - **Scalar**: exactly one KDL boolean, integer, float, or string argument and no children. `#null` is rejected.
212
- - **Array**: one or more scalar arguments and no children; it resolves to a JSON array. Axes marked `emptyArray` in `axes.ts` also accept a bare directive, which assigns an explicit empty list (`region-upstreams-eu` with no arguments: the region never serves the model).
212
+ - **Array**: one or more scalar arguments and no children; it resolves to a JSON array. Axes marked `emptyArray` in `axes.ts` also accept a bare directive, which assigns an explicit empty list (`region-upstreams-eu` with no arguments: the region never serves the model). Bare `thinking-efforts` keeps a reasoning-capable deployment without selectable effort tiers off the effort dial.
213
213
  - **Object**: no arguments and a child block, including an empty block. Child names are kebab-case: an axis-directive spelling compiles to its resolved axis key (`template-reasoning-effort` → `qwenTemplateReasoningEffort`), anything else converts mechanically (`input-threshold` → `inputThreshold`); camelCase names are a compile error. `extra-body` payloads (top-level or nested) are the exception — their child names are literal wire JSON keys copied verbatim (`enable_thinking`). Each child is either one scalar or another object; arrays are not representable inside an object payload.
214
214
 
215
215
  A rule cannot assign the same resolved axis twice in one block.
@@ -7,6 +7,30 @@ class "anthropic" {
7
7
  thinking-prefix-binding #true
8
8
  }
9
9
  }
10
+ // Adaptive Claude (Opus 4.7+, Sonnet/Fable/Mythos 5+) rejects explicit
11
+ // sampling params (`temperature`, `top_p`, `top_k`) with a 400 on every
12
+ // serving host. The `<10` bound keeps whole-number revisions such as
13
+ // `claude-opus-45` (Opus 4.5) out of the range.
14
+ family "opus" {
15
+ revision ">=4.7 <10" {
16
+ supports-sampling-params #false
17
+ }
18
+ }
19
+ family "sonnet" {
20
+ revision ">=5 <10" {
21
+ supports-sampling-params #false
22
+ }
23
+ }
24
+ family "fable" {
25
+ revision ">=5 <10" {
26
+ supports-sampling-params #false
27
+ }
28
+ }
29
+ family "mythos" {
30
+ revision ">=5 <10" {
31
+ supports-sampling-params #false
32
+ }
33
+ }
10
34
  // On-demand compaction (compact-2026-09-04) works on the Claude API, Vertex,
11
35
  // and Amazon Bedrock's `/anthropic` routes, not Bedrock Converse.
12
36
  // Foundry / Claude Platform on AWS are first-party Anthropic routes whose
@@ -145,6 +169,12 @@ class "anthropic" {
145
169
  revision ">=5" {
146
170
  supports-per-message-effort #true
147
171
  }
172
+ // Opus 5.5 is prefix-bound like Sonnet 5.5; without `drop_block` a
173
+ // changed system prompt or tool set fails the replay with a 400.
174
+ // Bounded for the same reason as the forced-tool-choice rule above.
175
+ revision ">=5.5 <6" {
176
+ supports-thinking-binding-controls #true
177
+ }
148
178
  }
149
179
  }
150
180
  on "aimlapi" "gitlab-duo" "kilo" "nanogpt" "venice" {
@@ -107,7 +107,7 @@ class "glm" {
107
107
  // the intentional overlap with census host-dialect residues such as
108
108
  // baseten's `zai-org/GLM-5*`.
109
109
  models "*glm-5.3" "*glm-5.3-air" "*glm-5.3-turbo" "*glm-5.3-flash" "*glm-5.3:*" \
110
- "*glm-5.3-flash-uncensored" "*glm-5.3-free" "*glm-5.3-highspeed" "*glm-5.3-flash-lab" priority=10 {
110
+ "*glm-5.3-flash-uncensored" "*glm-5.3-free" "*glm-5.3-highspeed" "*glm-5.3-fast" "*glm-5.3-flash-lab" priority=10 {
111
111
  thinking-default-level "max"
112
112
  thinking-efforts "low" "high" "max"
113
113
  thinking-requires-effort #true
@@ -115,5 +115,12 @@ class "kimi" {
115
115
  native-kimi-k3-reasoning #true
116
116
  clamp-output-to-model-max #true
117
117
  }
118
+ // Native K3 accepts forced tools on the Anthropic surface too;
119
+ // omitting thinking leaves its mandatory provider default intact.
120
+ on-api "anthropic-messages" {
121
+ family "k3" {
122
+ supports-forced-tool-choice #true
123
+ }
124
+ }
118
125
  }
119
126
  }
@@ -3,13 +3,13 @@
3
3
  class "meta" {
4
4
  // Exact ids on purpose: only an exact selector upgrades hosts whose
5
5
  // discovery misreports a Muse Spark revision as non-reasoning.
6
- // muse-spark-1.3 exposes the max effort tier; older/contributor revisions
7
- // keep the 5-tier ladder.
8
- models "muse-spark-1.3" {
6
+ // muse-spark-1.3 standard and contributor expose the max effort tier;
7
+ // older revisions keep the 5-tier ladder.
8
+ models "muse-spark-1.3" "muse-spark-1.3-contributor" {
9
9
  thinking-efforts "minimal" "low" "medium" "high" "xhigh" "max"
10
10
  thinking-mode "effort"
11
11
  }
12
- models "muse-spark-1.1" "muse-spark-1.2" "muse-spark-1.2-contributor" "muse-spark-1.3-contributor" {
12
+ models "muse-spark-1.1" "muse-spark-1.2" "muse-spark-1.2-contributor" {
13
13
  thinking-efforts "minimal" "low" "medium" "high" "xhigh"
14
14
  thinking-mode "effort"
15
15
  }
@@ -1,9 +1,15 @@
1
1
  // Model-lineage compat for "openai"; regenerated from the frozen census using class taxonomy selectors.
2
2
 
3
3
  class "openai" {
4
- // Replaces the o-series mandatory-reasoning fallback.
4
+ // Replaces the o-series mandatory-reasoning fallback. o-series and GPT-5+
5
+ // reject explicit sampling params (`temperature`, `top_p`) with a 400 on
6
+ // every serving host (#5606), whichever API fronts them.
5
7
  family "o-series" {
6
8
  thinking-requires-effort #true
9
+ supports-sampling-params #false
10
+ }
11
+ revision ">=5" {
12
+ supports-sampling-params #false
7
13
  }
8
14
  // GPT wire ladders are model generations, not host contracts: <5.2 keeps
9
15
  // the classic four-tier scale, 5.2+ drops minimal for xhigh, and 5.6+
@@ -36,8 +36,6 @@ provider "amazon-bedrock" {
36
36
  }
37
37
  class "openai" {
38
38
  thinking-mode "effort"
39
- // OpenAI models reject Converse image blocks nested inside toolResult content.
40
- requires-tool-result-image-hoisting #true
41
39
  }
42
40
  class "deepseek" {
43
41
  requires-reasoning-content-for-all-assistant-turns #true
@@ -51,11 +49,6 @@ provider "amazon-bedrock" {
51
49
  class "unknown" {
52
50
  thinking-efforts "minimal" "low" "medium" "high"
53
51
  thinking-mode "budget"
54
- // Opaque application-inference-profile ARNs carry no vendor signal, so an
55
- // OpenAI-backed profile classifies here and would otherwise nest images in
56
- // toolResult content and hit the same rejection. Hoisting is accepted by
57
- // every Converse model measured, so it is the safe default for unknowns.
58
- requires-tool-result-image-hoisting #true
59
52
  }
60
53
  // residue: taxonomy ranks and exact globs do not isolate these models.
61
54
  models "moonshot.kimi-k2-thinking" {
@@ -28,12 +28,14 @@ provider "cursor" {
28
28
  }
29
29
  }
30
30
  // GetUsableModels advertises no input modalities or context windows.
31
- // K3 (including the bare `k3` alias Cursor serves) is natively
32
- // multimodal and 1M-context.
31
+ // Reviewed full-context K3 aliases are multimodal and 1M-context.
32
+ // K3 family identity alone does not verify other Cursor SKUs such as k3-256k.
33
33
  class "kimi" {
34
34
  family "k3" {
35
- input-modalities "text" "image"
36
- context-window-floor 1000000
35
+ models "*kimi-k3*" "k3" "*/k3" {
36
+ input-modalities "text" "image"
37
+ context-window-floor 1000000
38
+ }
37
39
  }
38
40
  family "k2.7-code" {
39
41
  // Cursor advertised Kimi K2.7 Code Context window 262k.
@@ -56,10 +58,6 @@ provider "cursor" {
56
58
  context-window-floor 272000
57
59
  }
58
60
  }
59
- models "k3" "*/k3" {
60
- input-modalities "text" "image"
61
- context-window-floor 1000000
62
- }
63
61
  models "default" {
64
62
  context-window-floor 256000
65
63
  }
@@ -64,7 +64,11 @@ provider "google-antigravity" {
64
64
  models "gemini-3-pro" {
65
65
  thinking-mode "google-level"
66
66
  }
67
- models "gemini-3-pro-image" {
67
+ // Antigravity discovery lists image SKUs beside chat models with no output
68
+ // modality, so they would build as chat. Accounts advertise either SKU in
69
+ // `imageGenerationModelIds` (gemini-3.1-flash-image replaced
70
+ // gemini-3-pro-image on some accounts, #11106).
71
+ models "gemini-3-pro-image" "gemini-3.1-flash-image" {
68
72
  kind "image"
69
73
  }
70
74
  // residue: taxonomy ranks and exact globs do not isolate these models.
@@ -42,8 +42,8 @@ provider "meta" {
42
42
  supports-reasoning-effort #true
43
43
  include-encrypted-reasoning #true
44
44
  }
45
- // Meta documents the `max` effort tier for Muse Spark 1.3 (standard) only;
46
- // contributor tiers and other revisions stay on the 5-tier ladder.
45
+ // Meta documents the `max` effort tier for Muse Spark 1.3 standard and
46
+ // contributor tiers; other revisions stay on the 5-tier ladder.
47
47
  model "muse-spark-1.3" name="Muse Spark 1.3" {
48
48
  reasoning #true
49
49
  input "text" "image"
@@ -60,7 +60,7 @@ provider "meta" {
60
60
  cost input=0.1 output=0.2 cache-read=0.002 cache-write=0
61
61
  limits context=1048576 max-tokens=131072
62
62
  thinking-mode "effort"
63
- thinking-efforts "minimal" "low" "medium" "high" "xhigh"
63
+ thinking-efforts "minimal" "low" "medium" "high" "xhigh" "max"
64
64
  supports-reasoning-effort #true
65
65
  include-encrypted-reasoning #true
66
66
  }
@@ -13,6 +13,9 @@ provider "ollama" priority=-1 {
13
13
  // Replaces both Ollama empty-length finish baselines.
14
14
  empty-length-finish-is-context-error #true
15
15
  thinking-efforts "low" "medium" "high" "max"
16
+ // Ollama's OpenAI-compatible endpoints accept effort "none" to turn thinking
17
+ // off; the lowest ladder effort ("low") still thinks on e.g. Gemma 4.
18
+ reasoning-disable-mode "none-effort"
16
19
  // Ollama continues a trailing assistant turn verbatim on /api/chat and
17
20
  // /v1/responses alike; callers use it to commit an output prefix.
18
21
  supports-assistant-prefill #true
@@ -78,6 +78,17 @@ provider "opencode-go" {
78
78
  thinking-mode "effort"
79
79
  }
80
80
  }
81
+ // LongCat exposes a reasoning toggle, not selectable effort tiers.
82
+ // Off uses the gateway's boolean reasoning switch, never a fake lowest tier.
83
+ models "longcat-2.5-preview-free" {
84
+ thinking-efforts
85
+ supports-reasoning-effort #false
86
+ reasoning-disable-mode "openrouter-enabled-false"
87
+ }
88
+ // Space Bunny publishes low through max, without the generic minimal tier.
89
+ models "space-bunny-free" {
90
+ thinking-efforts "low" "medium" "high" "xhigh" "max"
91
+ }
81
92
  // residue: taxonomy ranks and exact globs do not isolate these models.
82
93
  models "glm-5" "glm-5.1" {
83
94
  thinking-efforts "minimal" "low" "medium" "high" "xhigh"
@@ -0,0 +1,16 @@
1
+ // Converse rejects image blocks nested inside toolResult content for OpenAI models,
2
+ // so their tool-result images move into sibling user blocks. The rule is scoped by
3
+ // adapter, not provider name, so a custom provider on bedrock-converse-stream gets
4
+ // it too.
5
+ on-api "bedrock-converse-stream" {
6
+ class "openai" {
7
+ requires-tool-result-image-hoisting #true
8
+ }
9
+ // Opaque application-inference-profile ARNs carry no vendor signal, so an
10
+ // OpenAI-backed profile classifies here and would otherwise nest images in
11
+ // toolResult content and hit the same rejection. Hoisting is accepted by
12
+ // every Converse model measured, so it is the safe default for unknowns.
13
+ class "unknown" {
14
+ requires-tool-result-image-hoisting #true
15
+ }
16
+ }
@@ -639,6 +639,12 @@ collapse {
639
639
  // Retired id: the Codex image model was relabeled to what the backend runs
640
640
  // (gpt-image-2-codex); keep saved `openai-codex/gpt-image-1` roles resolving.
641
641
  provider-alias "openai-codex" "gpt-image-1" "gpt-image-2"
642
+ // Retired rich-lane ids: AvailableModels discovery named Grok 4.5/4.6 lanes
643
+ // after the unprefixed model name before they adopted these family ids
644
+ // (#14164). Family `aliases` (not `provider-alias`) so saved selectors and
645
+ // models.yml `modelOverrides` keyed by the old ids both migrate. Grok 4.6
646
+ // is spelled out instead of riding the `cursor-grok-{rev}` template: a
647
+ // templated `grok-{rev}` alias would also claim the live Grok 4.7+ ids.
642
648
  variant-family "cursor" "cursor-grok-4.5" name="Grok 4.5" {
643
649
  members "cursor-grok-4.5-low" "cursor-grok-4.5-medium" "cursor-grok-4.5-high"
644
650
  route "low" "cursor-grok-4.5-low"
@@ -648,6 +654,7 @@ collapse {
648
654
  efforts "low" "medium" "high"
649
655
  requires-effort #true
650
656
  default-member "cursor-grok-4.5-medium"
657
+ aliases "grok-4.5"
651
658
  }
652
659
  variant-family "cursor" "cursor-grok-4.5-fast" name="Grok 4.5 Fast" {
653
660
  members "cursor-grok-4.5-low-fast" "cursor-grok-4.5-medium-fast" "cursor-grok-4.5-high-fast"
@@ -658,8 +665,33 @@ collapse {
658
665
  efforts "low" "medium" "high"
659
666
  requires-effort #true
660
667
  default-member "cursor-grok-4.5-medium-fast"
668
+ aliases "grok-4.5-fast"
661
669
  }
662
- variant-family "cursor" "cursor-grok-{rev}" name="Grok {rev}" revision=">=4.6" {
670
+ variant-family "cursor" "cursor-grok-4.6" name="Grok 4.6" {
671
+ members "cursor-grok-4.6-low" "cursor-grok-4.6-medium" "cursor-grok-4.6-high" "cursor-grok-4.6-xhigh"
672
+ route "low" "cursor-grok-4.6-low"
673
+ route "medium" "cursor-grok-4.6-medium"
674
+ route "high" "cursor-grok-4.6-high"
675
+ route "xhigh" "cursor-grok-4.6-xhigh"
676
+ mode "effort"
677
+ efforts "low" "medium" "high" "xhigh"
678
+ requires-effort #true
679
+ default-member "cursor-grok-4.6-medium"
680
+ aliases "grok-4.6"
681
+ }
682
+ variant-family "cursor" "cursor-grok-4.6-fast" name="Grok 4.6 Fast" {
683
+ members "cursor-grok-4.6-low-fast" "cursor-grok-4.6-medium-fast" "cursor-grok-4.6-high-fast" "cursor-grok-4.6-xhigh-fast"
684
+ route "low" "cursor-grok-4.6-low-fast"
685
+ route "medium" "cursor-grok-4.6-medium-fast"
686
+ route "high" "cursor-grok-4.6-high-fast"
687
+ route "xhigh" "cursor-grok-4.6-xhigh-fast"
688
+ mode "effort"
689
+ efforts "low" "medium" "high" "xhigh"
690
+ requires-effort #true
691
+ default-member "cursor-grok-4.6-medium-fast"
692
+ aliases "grok-4.6-fast"
693
+ }
694
+ variant-family "cursor" "cursor-grok-{rev}" name="Grok {rev}" revision=">=4.7" {
663
695
  members "cursor-grok-{rev}-low" "cursor-grok-{rev}-medium" "cursor-grok-{rev}-high" "cursor-grok-{rev}-xhigh"
664
696
  route "low" "cursor-grok-{rev}-low"
665
697
  route "medium" "cursor-grok-{rev}-medium"
@@ -670,7 +702,7 @@ collapse {
670
702
  requires-effort #true
671
703
  default-member "cursor-grok-{rev}-medium"
672
704
  }
673
- variant-family "cursor" "cursor-grok-{rev}-fast" name="Grok {rev} Fast" revision=">=4.6" {
705
+ variant-family "cursor" "cursor-grok-{rev}-fast" name="Grok {rev} Fast" revision=">=4.7" {
674
706
  members "cursor-grok-{rev}-low-fast" "cursor-grok-{rev}-medium-fast" "cursor-grok-{rev}-high-fast" "cursor-grok-{rev}-xhigh-fast"
675
707
  route "low" "cursor-grok-{rev}-low-fast"
676
708
  route "medium" "cursor-grok-{rev}-medium-fast"
@@ -1,6 +1,9 @@
1
1
  class "kimi" {
2
2
  namespace "moonshotai"
3
3
  bounded "kimi"
4
+ // Kimi Code exposes bare K3 SKUs; selectors may include a provider namespace.
5
+ exact "k3"
6
+ exact "k3-256k"
4
7
 
5
8
  family "k2" glob="*kimi-k2*"
6
9
  family "k2.5" glob="*kimi-k2.5*" priority=10
@@ -13,6 +16,8 @@ class "kimi" {
13
16
  family "k2.7-code" glob="*kimi-k2p7*code*" priority=10
14
17
  family "k2-thinking" glob="*kimi-k2-thinking*" priority=20
15
18
  family "k3" glob="*kimi-k3*"
19
+ family "k3" glob="k3"
20
+ family "k3" glob="k3-256k"
16
21
 
17
22
  override id="kilo-kimi-k2-thinking-product" provider="kilo" model="kimi-k2-thinking" logical="moonshotai/kimi-k2-thinking" class="kimi" rationale="Oracle exposes this independently priced product rather than an effort route" provenance="fixtures/llm-oracle/catalog/models.normalized.json"
18
23
  override id="openrouter-kimi-k2-thinking-product" provider="openrouter" model="kimi-k2-thinking" logical="moonshotai/kimi-k2-thinking" class="kimi" rationale="Oracle exposes this independently priced product rather than an effort route" provenance="fixtures/llm-oracle/catalog/models.normalized.json"