@oh-my-pi/pi-catalog 18.5.0 → 18.6.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 +33 -0
- package/dist/types/compat/collapse.d.ts +7 -0
- package/dist/types/provider-models/special.d.ts +6 -0
- package/dist/types/types.d.ts +15 -2
- package/dist/types/wire/gemini-headers.d.ts +6 -3
- package/package.json +4 -4
- package/src/compat/axes.ts +2 -2
- package/src/compat/collapse.ts +11 -0
- package/src/compat/resolve.ts +9 -22
- package/src/compat/rules/README.md +1 -1
- package/src/compat/rules/classes/anthropic.kdl +30 -0
- package/src/compat/rules/classes/deepseek.kdl +5 -3
- package/src/compat/rules/classes/glm.kdl +1 -1
- package/src/compat/rules/classes/kimi.kdl +7 -0
- package/src/compat/rules/classes/meta.kdl +4 -4
- package/src/compat/rules/classes/openai.kdl +7 -1
- package/src/compat/rules/providers/amazon-bedrock.kdl +0 -7
- package/src/compat/rules/providers/cursor.kdl +6 -8
- package/src/compat/rules/providers/google-antigravity.kdl +5 -1
- package/src/compat/rules/providers/meta.kdl +3 -3
- package/src/compat/rules/providers/ollama.kdl +3 -0
- package/src/compat/rules/providers/opencode-go.kdl +11 -0
- package/src/compat/rules/providers/tool-result-images.kdl +16 -0
- package/src/compat/rules/taxonomy/_collapse.kdl +34 -2
- package/src/compat/rules/taxonomy/deepseek.kdl +4 -0
- package/src/compat/rules/taxonomy/kimi.kdl +5 -0
- package/src/compat/rules.json +1 -1
- package/src/discovery/cursor.ts +26 -3
- package/src/models.json +1 -1
- package/src/provider-models/cache-provider-id.ts +10 -4
- package/src/provider-models/cline-pass.ts +33 -0
- package/src/provider-models/openai-compat.ts +70 -15
- package/src/provider-models/special.ts +9 -2
- package/src/types.ts +20 -2
- package/src/wire/gemini-headers.ts +39 -21
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,39 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [18.6.0] - 2026-10-03
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- Fixed DeepSeek V4 model IDs and the V4.1 Flash alias lacking version information in model identity and dashboards ([#14194](https://github.com/can1357/oh-my-pi/issues/14194)).
|
|
10
|
+
- Fixed Antigravity models such as Claude Opus 5.5 and Sonnet 5.5 disappearing after `omp models refresh`. When the update check failed, omp reported an outdated Antigravity client version (2.8.0), so the server left the newer models out of the list. The fallback version is now 2.19.1.
|
|
11
|
+
- DSML tool calls from DeepSeek models are now parsed on every host. This includes local servers (llama.cpp, LM Studio, vLLM), custom providers from `models.yml`, and gateways that weren't on the old list of supported hosts. Before, a complete `<|DSML|tool_calls>` envelope from these hosts showed up as plain text and the tool never ran ([#14202](https://github.com/can1357/oh-my-pi/pull/14202) by [@H4vC](https://github.com/H4vC)).
|
|
12
|
+
|
|
13
|
+
## [18.5.1] - 2026-10-03
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- Added support for listing models from Codex-compatible gateways through openaiCodexModelManagerOptions.baseUrl, with discovery caches isolated per endpoint.
|
|
18
|
+
- Exposed the max reasoning-effort tier for Muse Spark 1.3 contributor models on Meta and Muse Code providers.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- Added full configurable reasoning-effort ladders for ClinePass DeepSeek V4.1 Flash Free and Muse Spark 1.3 Contributor Free models.
|
|
23
|
+
- 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.
|
|
24
|
+
- Updated Fireworks model pricing to use Fireworks-specific rates, correcting missing and inaccurate costs for supported models.
|
|
25
|
+
- 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.
|
|
26
|
+
|
|
27
|
+
### Fixed
|
|
28
|
+
|
|
29
|
+
- Fixed image input for OpenAI models used through custom Amazon Bedrock Converse providers when images are read through tools.
|
|
30
|
+
- Fixed local Ollama thinking models continuing to reason when thinking was disabled, reducing delays such as slow session-title generation.
|
|
31
|
+
- Fixed reasoning-level availability for OpenCode Go models so unsupported levels are no longer offered and reasoning can be disabled where supported.
|
|
32
|
+
- Fixed Anthropic-compatible Claude Opus 5.5 sessions failing after tool use or system-prompt changes.
|
|
33
|
+
- Fixed Cursor Grok 4.5 and 4.6 model selectors and overrides intermittently resolving to inconsistent model IDs.
|
|
34
|
+
- Fixed Google Antigravity Gemini 3.1 Flash Image being recognized as an image-capable model for image roles and fallback chains.
|
|
35
|
+
- Fixed GitHub Copilot base models reporting an incorrect long-context window when a separate -1m model is available.
|
|
36
|
+
- 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.
|
|
37
|
+
|
|
5
38
|
## [18.5.0] - 2026-10-03
|
|
6
39
|
|
|
7
40
|
### 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
|
}
|
package/dist/types/types.d.ts
CHANGED
|
@@ -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;
|
|
@@ -24,7 +24,7 @@ export declare const getGeminiCliHeaders: (modelId?: string) => {
|
|
|
24
24
|
* client the version and manifest are captured from, independent of the host
|
|
25
25
|
* platform. Overrides: PI_AI_ANTIGRAVITY_VERSION / _CL / _OS / _ARCH.
|
|
26
26
|
*/
|
|
27
|
-
export declare const DEFAULT_ANTIGRAVITY_VERSION = "2.
|
|
27
|
+
export declare const DEFAULT_ANTIGRAVITY_VERSION = "2.19.1";
|
|
28
28
|
/** Current Antigravity client version: env override → manifest-discovered → pinned fallback. */
|
|
29
29
|
export declare function getAntigravityVersion(): string;
|
|
30
30
|
/**
|
|
@@ -35,8 +35,11 @@ export declare function parseAntigravityManifestVersion(yamlText: string): strin
|
|
|
35
35
|
/**
|
|
36
36
|
* Resolves the latest Antigravity release from the official update manifest.
|
|
37
37
|
* Success is cached for the process lifetime; failures are silent (the pinned
|
|
38
|
-
* fallback stays valid) and
|
|
39
|
-
* Skipped entirely when PI_AI_ANTIGRAVITY_VERSION is set.
|
|
38
|
+
* fallback stays valid) and suppress further lookups for
|
|
39
|
+
* `ANTIGRAVITY_VERSION_RETRY_MS`. Skipped entirely when PI_AI_ANTIGRAVITY_VERSION is set.
|
|
40
|
+
*
|
|
41
|
+
* The lookup is shared by concurrent callers, so it is bounded only by its own
|
|
42
|
+
* timeout; `signal` ends this caller's wait without cancelling the lookup.
|
|
40
43
|
*/
|
|
41
44
|
export declare function ensureAntigravityVersion(fetcher?: FetchImpl, signal?: AbortSignal): Promise<void>;
|
|
42
45
|
/** Antigravity `User-Agent` header value; rebuilt when the discovered version changes. */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oh-my-pi/pi-catalog",
|
|
3
|
-
"version": "18.
|
|
3
|
+
"version": "18.6.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.
|
|
97
|
-
"@oh-my-pi/pi-utils": "18.
|
|
96
|
+
"@oh-my-pi/omptype": "18.6.0",
|
|
97
|
+
"@oh-my-pi/pi-utils": "18.6.0"
|
|
98
98
|
},
|
|
99
99
|
"devDependencies": {
|
|
100
100
|
"@bgotink/kdl": "0.4.0",
|
|
101
|
-
"@oh-my-pi/pi-ai": "18.
|
|
101
|
+
"@oh-my-pi/pi-ai": "18.6.0",
|
|
102
102
|
"@types/bun": "^1.3.14"
|
|
103
103
|
},
|
|
104
104
|
"engines": {
|
package/src/compat/axes.ts
CHANGED
|
@@ -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",
|
package/src/compat/collapse.ts
CHANGED
|
@@ -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:
|
package/src/compat/resolve.ts
CHANGED
|
@@ -179,7 +179,7 @@ function overlayEffortMapAxis(
|
|
|
179
179
|
}
|
|
180
180
|
|
|
181
181
|
function effortList(value: unknown): readonly Effort[] | undefined {
|
|
182
|
-
if (!Array.isArray(value)
|
|
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:
|
|
508
|
+
supportsSamplingParams: true,
|
|
509
509
|
supportsPenaltyAndStopParams: !(isGrok && reasoningCapable),
|
|
510
510
|
reasoningEffortMap: {},
|
|
511
511
|
supportsUsageInStreaming: !isCerebrasHost,
|
|
@@ -598,26 +598,12 @@ function detectOpenAICompat(
|
|
|
598
598
|
};
|
|
599
599
|
}
|
|
600
600
|
|
|
601
|
-
const DSML_HEALING_PROVIDERS: Record<string, true> = {
|
|
602
|
-
ollama: true,
|
|
603
|
-
"ollama-cloud": true,
|
|
604
|
-
nvidia: true,
|
|
605
|
-
deepseek: true,
|
|
606
|
-
fireworks: true,
|
|
607
|
-
nanogpt: true,
|
|
608
|
-
"opencode-go": true,
|
|
609
|
-
openrouter: true,
|
|
610
|
-
// Transparent gateways / user-configured hosts forward the upstream model's
|
|
611
|
-
// native chat template unchanged, so a deepseek-classed model behind them
|
|
612
|
-
// still emits DSML tool-call envelopes and needs the DSML healer.
|
|
613
|
-
litellm: true,
|
|
614
|
-
nous: true,
|
|
615
|
-
};
|
|
616
|
-
|
|
617
601
|
/**
|
|
618
602
|
* Default leaked-markup healer. Kimi/DeepSeek dedicated grammars are keyed on
|
|
619
603
|
* identity class; official OpenAI heals nothing; everything else defaults to
|
|
620
|
-
* the generic `thinking` healer.
|
|
604
|
+
* the generic `thinking` healer. DSML is DeepSeek's own tool-call grammar, so
|
|
605
|
+
* every host serving a DeepSeek model gets it — gateways, local backends, and
|
|
606
|
+
* custom providers alike.
|
|
621
607
|
*/
|
|
622
608
|
function detectStreamMarkupHealing(
|
|
623
609
|
provider: string,
|
|
@@ -628,7 +614,7 @@ function detectStreamMarkupHealing(
|
|
|
628
614
|
// Kimi ids keep the generic healer, matching the census.
|
|
629
615
|
const isKimiK2 = facts.is("kimi") && facts.identity.family?.startsWith("k2") === true;
|
|
630
616
|
if (provider === "kimi-code" || provider === "moonshot" || isKimiK2) return "kimi";
|
|
631
|
-
if (facts.is("deepseek")
|
|
617
|
+
if (facts.is("deepseek")) return "dsml";
|
|
632
618
|
if (isOfficialOpenAIEndpoint(provider, baseUrl)) return undefined;
|
|
633
619
|
return "thinking";
|
|
634
620
|
}
|
|
@@ -759,7 +745,7 @@ function resolveOpenAIResponsesPolicy(
|
|
|
759
745
|
thinkingLoopGuard: undefined,
|
|
760
746
|
reasoningEffortMap: {},
|
|
761
747
|
supportsReasoningParams: true,
|
|
762
|
-
supportsSamplingParams:
|
|
748
|
+
supportsSamplingParams: true,
|
|
763
749
|
supportsPenaltyAndStopParams: !isXaiHost,
|
|
764
750
|
thinkingFormat,
|
|
765
751
|
reasoningDisableMode: resolveReasoningDisableMode(thinkingFormat),
|
|
@@ -906,7 +892,7 @@ function resolveAnthropicPolicy(
|
|
|
906
892
|
supportsThinkingBindingControls: false,
|
|
907
893
|
supportsBetweenToolsThinking: false,
|
|
908
894
|
supportsForcedToolChoice: !requiresThinkingEnabled && !facts.family("fable", "mythos"),
|
|
909
|
-
supportsSamplingParams:
|
|
895
|
+
supportsSamplingParams: true,
|
|
910
896
|
requiresToolResultId: false,
|
|
911
897
|
requiresThinkingEnabled,
|
|
912
898
|
replayUnsignedThinking:
|
|
@@ -1162,6 +1148,7 @@ function resolveThinkingPolicy<TApi extends Api>(
|
|
|
1162
1148
|
if (compat !== undefined && "trustExplicitThinkingOnly" in compat && compat.trustExplicitThinkingOnly === true) {
|
|
1163
1149
|
return undefined;
|
|
1164
1150
|
}
|
|
1151
|
+
if (rule.efforts?.length === 0) return undefined;
|
|
1165
1152
|
const config: ThinkingConfig = {
|
|
1166
1153
|
mode: rule.mode ?? defaultThinkingMode(spec, facts),
|
|
1167
1154
|
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" {
|
|
@@ -92,8 +92,10 @@ class "deepseek" {
|
|
|
92
92
|
models "deepseek-flash" priority=10 {
|
|
93
93
|
strip-image-input #false
|
|
94
94
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
95
|
+
// DSML is the model's own tool-call grammar, not a host quirk: any server
|
|
96
|
+
// running DeepSeek's chat template without (or with a broken) tool parser
|
|
97
|
+
// leaks it into content — hosted gateways, local backends, and custom
|
|
98
|
+
// providers alike. On hosts that parse it the healer sees no markup.
|
|
99
|
+
stream-markup-healing-pattern "dsml"
|
|
98
100
|
thinking-loop-guard "deepseek"
|
|
99
101
|
}
|
|
@@ -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
|
|
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"
|
|
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
|
-
//
|
|
32
|
-
//
|
|
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
|
-
|
|
36
|
-
|
|
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
|
-
|
|
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
|
|
46
|
-
// contributor tiers
|
|
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-
|
|
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.
|
|
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"
|
|
@@ -15,6 +15,10 @@ class "deepseek" {
|
|
|
15
15
|
family "v4" glob="*deepseek-v4*"
|
|
16
16
|
family "v3" glob="*deepseek-v3*"
|
|
17
17
|
|
|
18
|
+
revision prefix="deepseek-v" anywhere=#true
|
|
19
|
+
|
|
20
|
+
override id="deepseek-bare-flash-v4-1" provider="deepseek" model="deepseek-flash" class="deepseek" family="flash" revision="4.1" rationale="The first-party bare Flash alias serves DeepSeek V4.1 Flash, not V4 Flash" provenance="providers/deepseek.kdl"
|
|
21
|
+
override id="opencode-go-bare-flash-v4-1" provider="opencode-go" model="deepseek-flash" class="deepseek" family="flash" revision="4.1" rationale="OpenCode Go's bare Flash lane shares the reviewed V4.1 Flash deployment contract" provenance="providers/opencode-go.kdl"
|
|
18
22
|
override id="vercel-deepseek-v3-2-thinking-product" provider="vercel-ai-gateway" model="deepseek-v3.2-thinking" logical="deepseek/deepseek-v3.2-thinking" class="deepseek" rationale="Oracle exposes this independently priced product rather than an effort route" provenance="fixtures/llm-oracle/catalog/models.normalized.json"
|
|
19
23
|
override id="opencode-zen-big-pickle-family" provider="opencode-zen" model="big-pickle" class="deepseek" rationale="OpenCode Zen's big-pickle is a DeepSeek reasoning alias whose upstream 400s require exact reasoning_content replay" provenance="models.json census"
|
|
20
24
|
override id="umans-deepseek-v4-flash-family" provider="umans" model="umans-deepseek-v4-flash-0731" logical="umans-deepseek-v4-flash-0731" class="deepseek" rationale="The opaque Umans product identifier is backed by the reviewed DeepSeek V4 Flash family" provenance="fixtures/llm-oracle/catalog-policy/compat-profiles.json:compat-04"
|