@oh-my-pi/pi-catalog 16.2.5 → 16.2.7

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,19 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [16.2.7] - 2026-06-30
6
+
7
+ ### Fixed
8
+
9
+ - Fixed compatibility with Kimi K2.7 Code on native endpoints to ensure thinking mode is preserved and tool choice is not forced.
10
+ - Fixed Cerebras gemma-4-31b dynamic discovery to correctly identify the model as image-capable, enabling proper serialization of attached images.
11
+
12
+ ## [16.2.6] - 2026-06-29
13
+
14
+ ### Fixed
15
+
16
+ - Fixed namespaced GLM-5.x model IDs on Z.AI/Zhipu OpenAI-compatible endpoints to inherit the widened stream watchdog, avoiding spurious stalled-stream errors during long thinking phases. ([#3819](https://github.com/can1357/oh-my-pi/issues/3819))
17
+
5
18
  ## [16.2.3] - 2026-06-28
6
19
 
7
20
  ### Added
@@ -49,6 +49,17 @@ export declare const isMinimaxM3FamilyModelId: (modelId: string) => boolean;
49
49
  export declare const isOpenAIGptOssModelId: (modelId: string) => boolean;
50
50
  /** OpenAI model ids (gpt-*, o1-*, o3-*, o4-*, or prefixed with openai/). */
51
51
  export declare const isOpenAIModelId: (modelId: string) => boolean;
52
+ /**
53
+ * OpenAI Codex models that honor `reasoning.context: "all_turns"` (full
54
+ * cross-turn reasoning replay). The `reasoning.context` field itself exists for
55
+ * the whole gpt-5/o-series family, but the `all_turns` value is only accepted
56
+ * from gpt-5.4 onward; earlier ids (`gpt-5.1-codex`, `gpt-5.3-codex`, and
57
+ * `gpt-5.3-codex-spark`) reject it with
58
+ * `Unsupported value: 'all_turns' is not supported with this model`. Version
59
+ * floor (not an allowlist) so 5.6/6.x inherit support automatically. Callers
60
+ * fall back to omitting `context`, letting the server default to `current_turn`.
61
+ */
62
+ export declare const supportsAllTurnsReasoningContext: (modelId: string) => boolean;
52
63
  /**
53
64
  * Reasoning-capable GLM coding SKUs: glm-4.5 and up on the base / `-air` /
54
65
  * `-turbo` lines. Excludes the vision (`…v`) shape, the non-reasoning
@@ -381,6 +381,11 @@ export interface AnthropicCompat {
381
381
  * Default: auto-detected from provider/baseUrl and `model.reasoning`.
382
382
  */
383
383
  replayUnsignedThinking?: boolean;
384
+ /**
385
+ * Whether the endpoint requires `thinking.type: "enabled"` whenever the
386
+ * model reasons. Use for models that reject omitted or disabled thinking.
387
+ */
388
+ requiresThinkingEnabled?: boolean;
384
389
  /**
385
390
  * Prefix Anthropic built-in tool names (`web_search`, `code_execution`, ...)
386
391
  * when they are ordinary client tools. Some Anthropic-compatible gateways
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@oh-my-pi/pi-catalog",
4
- "version": "16.2.5",
4
+ "version": "16.2.7",
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": "Can Boluk",
@@ -34,12 +34,12 @@
34
34
  },
35
35
  "dependencies": {
36
36
  "@bufbuild/protobuf": "^2.12.0",
37
- "@oh-my-pi/pi-utils": "16.2.5",
37
+ "@oh-my-pi/pi-utils": "16.2.7",
38
38
  "arktype": "^2.2.0",
39
39
  "zod": "^4"
40
40
  },
41
41
  "devDependencies": {
42
- "@oh-my-pi/pi-ai": "16.2.5",
42
+ "@oh-my-pi/pi-ai": "16.2.7",
43
43
  "@types/bun": "^1.3.14"
44
44
  },
45
45
  "engines": {
@@ -28,6 +28,14 @@ export function isOfficialAnthropicApiUrl(baseUrl?: string): boolean {
28
28
  return lower === OFFICIAL_ANTHROPIC_URL || lower.startsWith(`${OFFICIAL_ANTHROPIC_URL}/`);
29
29
  }
30
30
 
31
+ /** Mirrors `compat/openai.ts`; native-only host gating is the caller's responsibility. */
32
+ const KIMI_K27_CODE_MODEL_PATTERN = /(?:^|\/)kimi[-._]?k2(?:[._-]?|p)7[-._]?code(?:[-._]?highspeed)?$/i;
33
+
34
+ function matchesKimiK27CodeFamily(spec: ModelSpec<"anthropic-messages">): boolean {
35
+ if (KIMI_K27_CODE_MODEL_PATTERN.test(spec.id)) return true;
36
+ return spec.id === "kimi-for-coding" && /k2\.?7 code/i.test(spec.name ?? "");
37
+ }
38
+
31
39
  /** Build the resolved anthropic-messages compat record for a model spec. */
32
40
  export function buildAnthropicCompat(spec: ModelSpec<"anthropic-messages">): ResolvedAnthropicCompat {
33
41
  const baseUrl = spec.baseUrl;
@@ -40,6 +48,7 @@ export function buildAnthropicCompat(spec: ModelSpec<"anthropic-messages">): Res
40
48
  // doesn't whitelist the `fine-grained-tool-streaming-2025-05-14` beta either
41
49
  // (issue #2558), so eager tool-input streaming is unavailable on this host.
42
50
  const isCopilot = modelMatchesHost(spec, "githubCopilot");
51
+ const requiresThinkingEnabled = modelMatchesHost(spec, "moonshotNative") && matchesKimiK27CodeFamily(spec);
43
52
  const compat: ResolvedAnthropicCompat = {
44
53
  officialEndpoint: official,
45
54
  disableStrictTools: false,
@@ -53,12 +62,13 @@ export function buildAnthropicCompat(spec: ModelSpec<"anthropic-messages">): Res
53
62
  // detection requires the canonical api.anthropic.com host plus a
54
63
  // supported model id.
55
64
  supportsMidConversationSystem: official && supportsMidConversationSystemMessages(spec.id),
56
- supportsForcedToolChoice: !isAnthropicFableOrMythosModel(spec.id),
65
+ supportsForcedToolChoice: !requiresThinkingEnabled && !isAnthropicFableOrMythosModel(spec.id),
57
66
  // Opus 4.7+ and Fable/Mythos reject temperature/top_p/top_k with a 400.
58
67
  supportsSamplingParams: !hasOpus47ApiRestrictions(spec.id),
59
68
  // Z.AI workaround (issue #814): its proxy deserializes tool_result blocks
60
69
  // into a class that reads `.id`.
61
70
  requiresToolResultId: isZai,
71
+ requiresThinkingEnabled,
62
72
  // Official Anthropic enforces signature-based thinking-chain integrity, so
63
73
  // unsigned thinking blocks must stay text there. Anthropic-compatible
64
74
  // reasoning endpoints commonly emit unsigned thinking blocks while still
@@ -33,12 +33,26 @@ import type {
33
33
  import { applyCompatOverrides } from "./apply";
34
34
 
35
35
  /** GLM coding-plan SKUs idle for minutes mid-reasoning; see `streamIdleTimeoutMs`. */
36
- const GLM_CODING_PLAN_MODEL_PATTERN = /^glm-5(?:[.-]|$)/i;
36
+ const GLM_CODING_PLAN_MODEL_PATTERN = /(^|\/)glm-5(?:[.-]|$)/i;
37
37
  const GLM_CODING_PLAN_STREAM_IDLE_TIMEOUT_MS = 600_000;
38
38
  /** Direct DeepSeek reasoning models stall between thinking and answer phases. */
39
39
  const DEEPSEEK_REASONING_STREAM_IDLE_TIMEOUT_MS = 300_000;
40
40
  /** Kimi K2.6 can spend several minutes reasoning before the first visible token. */
41
41
  const KIMI_K26_REASONING_STREAM_IDLE_TIMEOUT_MS = 300_000;
42
+ /**
43
+ * Native Kimi K2.7 Code requires `thinking.type: "enabled"` and rejects
44
+ * disabled thinking. Match the public id, its Fast variant, and the
45
+ * `kimi-code/kimi-for-coding` alias (which keeps the family name).
46
+ * Caller-disabled requests on non-native dialects (Fireworks `openai`,
47
+ * OpenRouter `openrouter`, …) MUST keep their per-dialect disable shape —
48
+ * gating on `isMoonshotKimi` is the caller's responsibility.
49
+ */
50
+ const KIMI_K27_CODE_MODEL_PATTERN = /(?:^|\/)kimi[-._]?k2(?:[._-]?|p)7[-._]?code(?:[-._]?highspeed)?$/i;
51
+
52
+ function matchesKimiK27CodeFamily(spec: ModelSpec<"openai-completions">): boolean {
53
+ if (KIMI_K27_CODE_MODEL_PATTERN.test(spec.id)) return true;
54
+ return spec.id === "kimi-for-coding" && /k2\.?7 code/i.test(spec.name ?? "");
55
+ }
42
56
  /** Xiaomi MiMo Pro on api.xiaomimimo.com can stall ~2min before the first event (issue #1770). */
43
57
  const XIAOMI_MIMO_STREAM_IDLE_TIMEOUT_MS = 300_000;
44
58
  /** Alibaba Coding Plan (coding-intl.dashscope) qwen models idle before the first event (issue #1770). */
@@ -231,6 +245,7 @@ export function buildOpenAICompat(spec: ModelSpec<"openai-completions">): Resolv
231
245
  const isKimiModel = isKimiModelId(spec.id);
232
246
  const isMoonshotNative = modelMatchesHost(hostModel, "moonshotNative");
233
247
  const isMoonshotKimi = isKimiModel && isMoonshotNative;
248
+ const requiresEnabledThinking = isMoonshotKimi && matchesKimiK27CodeFamily(spec);
234
249
  const usesMoonshotKimiPreservedThinking = isMoonshotKimi && isKimiK26ModelId(spec.id);
235
250
  const isAnthropicModel =
236
251
  modelMatchesHost(hostModel, "anthropic") || isClaudeModelId(spec.id) || isAnthropicNamespacedModelId(spec.id);
@@ -403,7 +418,7 @@ export function buildOpenAICompat(spec: ModelSpec<"openai-completions">): Resolv
403
418
  disableReasoningOnForcedToolChoice: isKimiModel || isAnthropicModel,
404
419
  disableReasoningOnToolChoice: isDeepseekFamily && Boolean(spec.reasoning) && !isOpenRouter,
405
420
  supportsToolChoice: !isDirectDeepseekReasoning,
406
- supportsForcedToolChoice: true,
421
+ supportsForcedToolChoice: !requiresEnabledThinking,
407
422
  supportsNamedToolChoice: provider !== "llama.cpp",
408
423
  maxTokensField: useMaxTokens ? "max_tokens" : "max_completion_tokens",
409
424
  requiresToolResultName: isMistral,
@@ -509,7 +524,9 @@ export function buildOpenAICompat(spec: ModelSpec<"openai-completions">): Resolv
509
524
 
510
525
  applyCompatOverrides(compat, spec.compat);
511
526
  if (spec.compat?.reasoningDisableMode === undefined) {
512
- compat.reasoningDisableMode = resolveReasoningDisableMode(compat.thinkingFormat);
527
+ compat.reasoningDisableMode = requiresEnabledThinking
528
+ ? "omit"
529
+ : resolveReasoningDisableMode(compat.thinkingFormat);
513
530
  }
514
531
  if (spec.compat?.omitReasoningEffort === undefined && !compat.supportsReasoningEffort) {
515
532
  compat.omitReasoningEffort = true;
@@ -13,6 +13,7 @@ import {
13
13
  parseAnthropicModel,
14
14
  parseGlmModel,
15
15
  parseKnownModel,
16
+ parseOpenAIModel,
16
17
  semverGte,
17
18
  } from "./classify";
18
19
 
@@ -121,6 +122,22 @@ export const isOpenAIModelId = memo((modelId: string): boolean => {
121
122
  return /(^|\/)(gpt|o1|o3|o4)[-.]/i.test(modelId) || modelId.toLowerCase().includes("openai/");
122
123
  });
123
124
 
125
+ /**
126
+ * OpenAI Codex models that honor `reasoning.context: "all_turns"` (full
127
+ * cross-turn reasoning replay). The `reasoning.context` field itself exists for
128
+ * the whole gpt-5/o-series family, but the `all_turns` value is only accepted
129
+ * from gpt-5.4 onward; earlier ids (`gpt-5.1-codex`, `gpt-5.3-codex`, and
130
+ * `gpt-5.3-codex-spark`) reject it with
131
+ * `Unsupported value: 'all_turns' is not supported with this model`. Version
132
+ * floor (not an allowlist) so 5.6/6.x inherit support automatically. Callers
133
+ * fall back to omitting `context`, letting the server default to `current_turn`.
134
+ */
135
+ export const supportsAllTurnsReasoningContext = memo((modelId: string): boolean => {
136
+ const parsed = parseOpenAIModel(bareModelId(modelId));
137
+ if (!parsed) return false;
138
+ return semverGte(parsed.version, "5.4");
139
+ });
140
+
124
141
  /**
125
142
  * Reasoning-capable GLM coding SKUs: glm-4.5 and up on the base / `-air` /
126
143
  * `-turbo` lines. Excludes the vision (`…v`) shape, the non-reasoning
package/src/models.json CHANGED
@@ -2476,7 +2476,7 @@
2476
2476
  "api": "openai-completions",
2477
2477
  "provider": "aimlapi",
2478
2478
  "baseUrl": "https://api.aimlapi.com/v1",
2479
- "reasoning": true,
2479
+ "reasoning": false,
2480
2480
  "input": [
2481
2481
  "text"
2482
2482
  ],
@@ -2487,24 +2487,7 @@
2487
2487
  "cacheWrite": 0
2488
2488
  },
2489
2489
  "contextWindow": 163840,
2490
- "maxTokens": 16384,
2491
- "thinking": {
2492
- "mode": "effort",
2493
- "efforts": [
2494
- "minimal",
2495
- "low",
2496
- "medium",
2497
- "high",
2498
- "xhigh"
2499
- ],
2500
- "effortMap": {
2501
- "minimal": "high",
2502
- "low": "high",
2503
- "medium": "high",
2504
- "high": "high",
2505
- "xhigh": "max"
2506
- }
2507
- }
2490
+ "maxTokens": 16384
2508
2491
  },
2509
2492
  "deepseek/deepseek-chat-v3.1": {
2510
2493
  "id": "deepseek/deepseek-chat-v3.1",
@@ -10620,6 +10603,35 @@
10620
10603
  ]
10621
10604
  }
10622
10605
  },
10606
+ "xai.grok-4.3": {
10607
+ "id": "xai.grok-4.3",
10608
+ "name": "Grok 4.3",
10609
+ "api": "bedrock-converse-stream",
10610
+ "provider": "amazon-bedrock",
10611
+ "baseUrl": "https://bedrock-runtime.us-east-1.amazonaws.com",
10612
+ "reasoning": true,
10613
+ "input": [
10614
+ "text",
10615
+ "image"
10616
+ ],
10617
+ "cost": {
10618
+ "input": 1.25,
10619
+ "output": 2.5,
10620
+ "cacheRead": 0.2,
10621
+ "cacheWrite": 0
10622
+ },
10623
+ "contextWindow": 1000000,
10624
+ "maxTokens": 131072,
10625
+ "thinking": {
10626
+ "mode": "budget",
10627
+ "efforts": [
10628
+ "minimal",
10629
+ "low",
10630
+ "medium",
10631
+ "high"
10632
+ ]
10633
+ }
10634
+ },
10623
10635
  "zai.glm-4.7": {
10624
10636
  "id": "zai.glm-4.7",
10625
10637
  "name": "GLM-4.7",
@@ -13672,7 +13684,7 @@
13672
13684
  "api": "openai-completions",
13673
13685
  "provider": "coreweave",
13674
13686
  "baseUrl": "https://api.inference.wandb.ai/v1",
13675
- "reasoning": true,
13687
+ "reasoning": false,
13676
13688
  "input": [
13677
13689
  "text"
13678
13690
  ],
@@ -13683,17 +13695,7 @@
13683
13695
  "cacheWrite": 0
13684
13696
  },
13685
13697
  "contextWindow": 128000,
13686
- "maxTokens": 128000,
13687
- "thinking": {
13688
- "mode": "effort",
13689
- "efforts": [
13690
- "minimal",
13691
- "low",
13692
- "medium",
13693
- "high",
13694
- "xhigh"
13695
- ]
13696
- }
13698
+ "maxTokens": 128000
13697
13699
  },
13698
13700
  "meta-llama/Llama-3.3-70B-Instruct": {
13699
13701
  "id": "meta-llama/Llama-3.3-70B-Instruct",
@@ -13701,7 +13703,7 @@
13701
13703
  "api": "openai-completions",
13702
13704
  "provider": "coreweave",
13703
13705
  "baseUrl": "https://api.inference.wandb.ai/v1",
13704
- "reasoning": true,
13706
+ "reasoning": false,
13705
13707
  "input": [
13706
13708
  "text"
13707
13709
  ],
@@ -13712,17 +13714,7 @@
13712
13714
  "cacheWrite": 0
13713
13715
  },
13714
13716
  "contextWindow": 128000,
13715
- "maxTokens": 128000,
13716
- "thinking": {
13717
- "mode": "effort",
13718
- "efforts": [
13719
- "minimal",
13720
- "low",
13721
- "medium",
13722
- "high",
13723
- "xhigh"
13724
- ]
13725
- }
13717
+ "maxTokens": 128000
13726
13718
  },
13727
13719
  "meta-llama/Llama-4-Scout-17B-16E-Instruct": {
13728
13720
  "id": "meta-llama/Llama-4-Scout-17B-16E-Instruct",
@@ -13730,7 +13722,7 @@
13730
13722
  "api": "openai-completions",
13731
13723
  "provider": "coreweave",
13732
13724
  "baseUrl": "https://api.inference.wandb.ai/v1",
13733
- "reasoning": true,
13725
+ "reasoning": false,
13734
13726
  "input": [
13735
13727
  "text",
13736
13728
  "image"
@@ -13742,17 +13734,7 @@
13742
13734
  "cacheWrite": 0
13743
13735
  },
13744
13736
  "contextWindow": 64000,
13745
- "maxTokens": 64000,
13746
- "thinking": {
13747
- "mode": "effort",
13748
- "efforts": [
13749
- "minimal",
13750
- "low",
13751
- "medium",
13752
- "high",
13753
- "xhigh"
13754
- ]
13755
- }
13737
+ "maxTokens": 64000
13756
13738
  },
13757
13739
  "microsoft/Phi-4-mini-instruct": {
13758
13740
  "id": "microsoft/Phi-4-mini-instruct",
@@ -13760,7 +13742,7 @@
13760
13742
  "api": "openai-completions",
13761
13743
  "provider": "coreweave",
13762
13744
  "baseUrl": "https://api.inference.wandb.ai/v1",
13763
- "reasoning": true,
13745
+ "reasoning": false,
13764
13746
  "input": [
13765
13747
  "text"
13766
13748
  ],
@@ -13771,17 +13753,7 @@
13771
13753
  "cacheWrite": 0
13772
13754
  },
13773
13755
  "contextWindow": 128000,
13774
- "maxTokens": 128000,
13775
- "thinking": {
13776
- "mode": "effort",
13777
- "efforts": [
13778
- "minimal",
13779
- "low",
13780
- "medium",
13781
- "high",
13782
- "xhigh"
13783
- ]
13784
- }
13756
+ "maxTokens": 128000
13785
13757
  },
13786
13758
  "MiniMaxAI/MiniMax-M2.5": {
13787
13759
  "id": "MiniMaxAI/MiniMax-M2.5",
@@ -13789,7 +13761,7 @@
13789
13761
  "api": "openai-completions",
13790
13762
  "provider": "coreweave",
13791
13763
  "baseUrl": "https://api.inference.wandb.ai/v1",
13792
- "reasoning": false,
13764
+ "reasoning": true,
13793
13765
  "input": [
13794
13766
  "text"
13795
13767
  ],
@@ -13800,7 +13772,16 @@
13800
13772
  "cacheWrite": 0
13801
13773
  },
13802
13774
  "contextWindow": 196608,
13803
- "maxTokens": 196608
13775
+ "maxTokens": 196608,
13776
+ "thinking": {
13777
+ "mode": "effort",
13778
+ "efforts": [
13779
+ "low",
13780
+ "medium",
13781
+ "high"
13782
+ ],
13783
+ "requiresEffort": true
13784
+ }
13804
13785
  },
13805
13786
  "moonshotai/Kimi-K2.5": {
13806
13787
  "id": "moonshotai/Kimi-K2.5",
@@ -13898,7 +13879,7 @@
13898
13879
  "api": "openai-completions",
13899
13880
  "provider": "coreweave",
13900
13881
  "baseUrl": "https://api.inference.wandb.ai/v1",
13901
- "reasoning": false,
13882
+ "reasoning": true,
13902
13883
  "input": [
13903
13884
  "text"
13904
13885
  ],
@@ -13909,7 +13890,17 @@
13909
13890
  "cacheWrite": 0
13910
13891
  },
13911
13892
  "contextWindow": 262144,
13912
- "maxTokens": 262144
13893
+ "maxTokens": 262144,
13894
+ "thinking": {
13895
+ "mode": "effort",
13896
+ "efforts": [
13897
+ "minimal",
13898
+ "low",
13899
+ "medium",
13900
+ "high",
13901
+ "xhigh"
13902
+ ]
13903
+ }
13913
13904
  },
13914
13905
  "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B": {
13915
13906
  "id": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B",
@@ -21734,7 +21725,7 @@
21734
21725
  "cost": {
21735
21726
  "input": 0.075,
21736
21727
  "output": 0.3,
21737
- "cacheRead": 0.037,
21728
+ "cacheRead": 0,
21738
21729
  "cacheWrite": 0
21739
21730
  },
21740
21731
  "contextWindow": 131072,
@@ -22420,13 +22411,13 @@
22420
22411
  "text"
22421
22412
  ],
22422
22413
  "cost": {
22423
- "input": 0,
22424
- "output": 0,
22414
+ "input": 0.25,
22415
+ "output": 0.69,
22425
22416
  "cacheRead": 0,
22426
22417
  "cacheWrite": 0
22427
22418
  },
22428
22419
  "contextWindow": 131072,
22429
- "maxTokens": 65536,
22420
+ "maxTokens": 32768,
22430
22421
  "thinking": {
22431
22422
  "mode": "effort",
22432
22423
  "efforts": [
@@ -25048,7 +25039,7 @@
25048
25039
  "api": "openai-completions",
25049
25040
  "provider": "kilo",
25050
25041
  "baseUrl": "https://api.kilo.ai/api/gateway",
25051
- "reasoning": true,
25042
+ "reasoning": false,
25052
25043
  "input": [
25053
25044
  "text"
25054
25045
  ],
@@ -25059,24 +25050,7 @@
25059
25050
  "cacheWrite": 0
25060
25051
  },
25061
25052
  "contextWindow": 163840,
25062
- "maxTokens": 65536,
25063
- "thinking": {
25064
- "mode": "effort",
25065
- "efforts": [
25066
- "minimal",
25067
- "low",
25068
- "medium",
25069
- "high",
25070
- "xhigh"
25071
- ],
25072
- "effortMap": {
25073
- "minimal": "high",
25074
- "low": "high",
25075
- "medium": "high",
25076
- "high": "high",
25077
- "xhigh": "max"
25078
- }
25079
- }
25053
+ "maxTokens": 65536
25080
25054
  },
25081
25055
  "deepseek/deepseek-chat-v3.1": {
25082
25056
  "id": "deepseek/deepseek-chat-v3.1",
@@ -30816,6 +30790,7 @@
30816
30790
  "supportsStrictMode": false,
30817
30791
  "toolStrictMode": "mixed",
30818
30792
  "stripDeepseekSpecialTokens": false,
30793
+ "streamMarkupHealingPattern": "thinking",
30819
30794
  "reasoningDeltasMayBeCumulative": false,
30820
30795
  "emptyLengthFinishIsContextError": false,
30821
30796
  "usesOpenAIToolCallIdLimit": false,
@@ -54444,6 +54419,36 @@
54444
54419
  "requiresEffort": true
54445
54420
  }
54446
54421
  },
54422
+ "minimaxai/minimax-m3": {
54423
+ "id": "minimaxai/minimax-m3",
54424
+ "name": "MiniMax-M3",
54425
+ "api": "openai-completions",
54426
+ "provider": "nvidia",
54427
+ "baseUrl": "https://integrate.api.nvidia.com/v1",
54428
+ "reasoning": true,
54429
+ "input": [
54430
+ "text",
54431
+ "image"
54432
+ ],
54433
+ "cost": {
54434
+ "input": 0,
54435
+ "output": 0,
54436
+ "cacheRead": 0,
54437
+ "cacheWrite": 0
54438
+ },
54439
+ "contextWindow": 1000000,
54440
+ "maxTokens": 16384,
54441
+ "thinking": {
54442
+ "mode": "effort",
54443
+ "efforts": [
54444
+ "minimal",
54445
+ "low",
54446
+ "medium",
54447
+ "high",
54448
+ "xhigh"
54449
+ ]
54450
+ }
54451
+ },
54447
54452
  "mistralai/codestral-22b-instruct-v0.1": {
54448
54453
  "id": "mistralai/codestral-22b-instruct-v0.1",
54449
54454
  "name": "Codestral 22b Instruct V0.1",
@@ -62195,9 +62200,9 @@
62195
62200
  "image"
62196
62201
  ],
62197
62202
  "cost": {
62198
- "input": 0.66,
62199
- "output": 3.41,
62200
- "cacheRead": 0.144,
62203
+ "input": 0.55,
62204
+ "output": 3.1999999999999997,
62205
+ "cacheRead": 0.11,
62201
62206
  "cacheWrite": 0
62202
62207
  },
62203
62208
  "contextWindow": 262144,
@@ -63522,7 +63527,7 @@
63522
63527
  "api": "openrouter",
63523
63528
  "baseUrl": "https://openrouter.ai/api/v1",
63524
63529
  "provider": "openrouter",
63525
- "reasoning": true,
63530
+ "reasoning": false,
63526
63531
  "input": [
63527
63532
  "text"
63528
63533
  ],
@@ -63533,22 +63538,7 @@
63533
63538
  "cacheWrite": 0
63534
63539
  },
63535
63540
  "contextWindow": 163840,
63536
- "maxTokens": 16384,
63537
- "thinking": {
63538
- "mode": "effort",
63539
- "efforts": [
63540
- "minimal",
63541
- "low",
63542
- "medium",
63543
- "high"
63544
- ],
63545
- "effortMap": {
63546
- "minimal": "high",
63547
- "low": "high",
63548
- "medium": "high",
63549
- "high": "high"
63550
- }
63551
- }
63541
+ "maxTokens": 16384
63552
63542
  },
63553
63543
  "deepseek/deepseek-chat-v3.1": {
63554
63544
  "id": "deepseek/deepseek-chat-v3.1",
@@ -65751,7 +65741,7 @@
65751
65741
  "cacheWrite": 0
65752
65742
  },
65753
65743
  "contextWindow": 131072,
65754
- "maxTokens": 32768
65744
+ "maxTokens": 100352
65755
65745
  },
65756
65746
  "moonshotai/kimi-k2-0905": {
65757
65747
  "id": "moonshotai/kimi-k2-0905",
@@ -65770,7 +65760,7 @@
65770
65760
  "cacheWrite": 0
65771
65761
  },
65772
65762
  "contextWindow": 262144,
65773
- "maxTokens": 262144
65763
+ "maxTokens": 100352
65774
65764
  },
65775
65765
  "moonshotai/kimi-k2-0905:exacto": {
65776
65766
  "id": "moonshotai/kimi-k2-0905:exacto",
@@ -65861,9 +65851,9 @@
65861
65851
  "image"
65862
65852
  ],
65863
65853
  "cost": {
65864
- "input": 0.66,
65865
- "output": 3.41,
65866
- "cacheRead": 0.144,
65854
+ "input": 0.55,
65855
+ "output": 3.1999999999999997,
65856
+ "cacheRead": 0.11,
65867
65857
  "cacheWrite": 0
65868
65858
  },
65869
65859
  "contextWindow": 262144,
@@ -69347,8 +69337,8 @@
69347
69337
  "image"
69348
69338
  ],
69349
69339
  "cost": {
69350
- "input": 0.28850000000000003,
69351
- "output": 2.65,
69340
+ "input": 0.2596,
69341
+ "output": 2.3850000000000002,
69352
69342
  "cacheRead": 0.15,
69353
69343
  "cacheWrite": 0
69354
69344
  },
@@ -69758,13 +69748,13 @@
69758
69748
  "text"
69759
69749
  ],
69760
69750
  "cost": {
69761
- "input": 0.09,
69751
+ "input": 0.09999999999999999,
69762
69752
  "output": 0.3,
69763
69753
  "cacheRead": 0.02,
69764
69754
  "cacheWrite": 0
69765
69755
  },
69766
69756
  "contextWindow": 262144,
69767
- "maxTokens": 16384,
69757
+ "maxTokens": 65536,
69768
69758
  "thinking": {
69769
69759
  "mode": "effort",
69770
69760
  "efforts": [
@@ -70846,8 +70836,8 @@
70846
70836
  "text"
70847
70837
  ],
70848
70838
  "cost": {
70849
- "input": 0.98,
70850
- "output": 3.08,
70839
+ "input": 0.975,
70840
+ "output": 4.300000000000001,
70851
70841
  "cacheRead": 0.182,
70852
70842
  "cacheWrite": 0
70853
70843
  },
@@ -70874,7 +70864,7 @@
70874
70864
  "text"
70875
70865
  ],
70876
70866
  "cost": {
70877
- "input": 0.95,
70867
+ "input": 0.94,
70878
70868
  "output": 3,
70879
70869
  "cacheRead": 0.18,
70880
70870
  "cacheWrite": 0
@@ -71096,7 +71086,7 @@
71096
71086
  "synthetic": {
71097
71087
  "hf:MiniMaxAI/MiniMax-M3": {
71098
71088
  "id": "hf:MiniMaxAI/MiniMax-M3",
71099
- "name": "MiniMaxAI/MiniMax-M3",
71089
+ "name": "MiniMax-M3",
71100
71090
  "api": "openai-completions",
71101
71091
  "provider": "synthetic",
71102
71092
  "baseUrl": "https://api.synthetic.new/openai/v1",
@@ -71111,7 +71101,7 @@
71111
71101
  "cacheRead": 0.6,
71112
71102
  "cacheWrite": 0
71113
71103
  },
71114
- "contextWindow": 262144,
71104
+ "contextWindow": 524288,
71115
71105
  "maxTokens": 65536,
71116
71106
  "thinking": {
71117
71107
  "mode": "effort",
@@ -71126,7 +71116,7 @@
71126
71116
  },
71127
71117
  "hf:moonshotai/Kimi-K2.6": {
71128
71118
  "id": "hf:moonshotai/Kimi-K2.6",
71129
- "name": "moonshotai/Kimi-K2.6",
71119
+ "name": "Kimi K2.6",
71130
71120
  "api": "openai-completions",
71131
71121
  "provider": "synthetic",
71132
71122
  "baseUrl": "https://api.synthetic.new/openai/v1",
@@ -71156,7 +71146,7 @@
71156
71146
  },
71157
71147
  "hf:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4": {
71158
71148
  "id": "hf:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4",
71159
- "name": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4",
71149
+ "name": "Nemotron 3 Super 120B A12B",
71160
71150
  "api": "openai-completions",
71161
71151
  "provider": "synthetic",
71162
71152
  "baseUrl": "https://api.synthetic.new/openai/v1",
@@ -71185,7 +71175,7 @@
71185
71175
  },
71186
71176
  "hf:openai/gpt-oss-120b": {
71187
71177
  "id": "hf:openai/gpt-oss-120b",
71188
- "name": "openai/gpt-oss-120b",
71178
+ "name": "GPT OSS 120B",
71189
71179
  "api": "openai-completions",
71190
71180
  "provider": "synthetic",
71191
71181
  "baseUrl": "https://api.synthetic.new/openai/v1",
@@ -71196,7 +71186,7 @@
71196
71186
  "cost": {
71197
71187
  "input": 0.1,
71198
71188
  "output": 0.1,
71199
- "cacheRead": 0,
71189
+ "cacheRead": 0.1,
71200
71190
  "cacheWrite": 0
71201
71191
  },
71202
71192
  "contextWindow": 131072,
@@ -71212,7 +71202,7 @@
71212
71202
  },
71213
71203
  "hf:Qwen/Qwen3.5-397B-A17B": {
71214
71204
  "id": "hf:Qwen/Qwen3.5-397B-A17B",
71215
- "name": "Qwen/Qwen3.5-397B-A17B",
71205
+ "name": "Qwen3.5 397B-A17B",
71216
71206
  "api": "openai-completions",
71217
71207
  "provider": "synthetic",
71218
71208
  "baseUrl": "https://api.synthetic.new/openai/v1",
@@ -71223,7 +71213,7 @@
71223
71213
  ],
71224
71214
  "cost": {
71225
71215
  "input": 0.6,
71226
- "output": 3,
71216
+ "output": 3.6,
71227
71217
  "cacheRead": 0.6,
71228
71218
  "cacheWrite": 0
71229
71219
  },
@@ -71241,26 +71231,36 @@
71241
71231
  },
71242
71232
  "hf:Qwen/Qwen3.6-27B": {
71243
71233
  "id": "hf:Qwen/Qwen3.6-27B",
71244
- "name": "Qwen/Qwen3.6-27B",
71234
+ "name": "Qwen3.6 27B",
71245
71235
  "api": "openai-completions",
71246
71236
  "provider": "synthetic",
71247
71237
  "baseUrl": "https://api.synthetic.new/openai/v1",
71248
- "reasoning": false,
71238
+ "reasoning": true,
71249
71239
  "input": [
71250
- "text"
71240
+ "text",
71241
+ "image"
71251
71242
  ],
71252
71243
  "cost": {
71253
- "input": 0,
71254
- "output": 0,
71255
- "cacheRead": 0,
71244
+ "input": 0.45,
71245
+ "output": 3.6,
71246
+ "cacheRead": 0.45,
71256
71247
  "cacheWrite": 0
71257
71248
  },
71258
71249
  "contextWindow": 262144,
71259
- "maxTokens": 8192
71250
+ "maxTokens": 65536,
71251
+ "thinking": {
71252
+ "mode": "effort",
71253
+ "efforts": [
71254
+ "minimal",
71255
+ "low",
71256
+ "medium",
71257
+ "high"
71258
+ ]
71259
+ }
71260
71260
  },
71261
71261
  "hf:zai-org/GLM-4.7": {
71262
71262
  "id": "hf:zai-org/GLM-4.7",
71263
- "name": "zai-org/GLM-4.7",
71263
+ "name": "GLM-4.7",
71264
71264
  "api": "openai-completions",
71265
71265
  "provider": "synthetic",
71266
71266
  "baseUrl": "https://api.synthetic.new/openai/v1",
@@ -71269,13 +71269,13 @@
71269
71269
  "text"
71270
71270
  ],
71271
71271
  "cost": {
71272
- "input": 0.55,
71272
+ "input": 0.45,
71273
71273
  "output": 2.19,
71274
- "cacheRead": 0,
71274
+ "cacheRead": 0.45,
71275
71275
  "cacheWrite": 0
71276
71276
  },
71277
71277
  "contextWindow": 202752,
71278
- "maxTokens": 64000,
71278
+ "maxTokens": 65536,
71279
71279
  "thinking": {
71280
71280
  "mode": "effort",
71281
71281
  "efforts": [
@@ -71289,7 +71289,7 @@
71289
71289
  },
71290
71290
  "hf:zai-org/GLM-4.7-Flash": {
71291
71291
  "id": "hf:zai-org/GLM-4.7-Flash",
71292
- "name": "zai-org/GLM-4.7-Flash",
71292
+ "name": "GLM-4.7-Flash",
71293
71293
  "api": "openai-completions",
71294
71294
  "provider": "synthetic",
71295
71295
  "baseUrl": "https://api.synthetic.new/openai/v1",
@@ -71298,9 +71298,9 @@
71298
71298
  "text"
71299
71299
  ],
71300
71300
  "cost": {
71301
- "input": 0.06,
71302
- "output": 0.4,
71303
- "cacheRead": 0.06,
71301
+ "input": 0.1,
71302
+ "output": 0.5,
71303
+ "cacheRead": 0.1,
71304
71304
  "cacheWrite": 0
71305
71305
  },
71306
71306
  "contextWindow": 196608,
@@ -71318,7 +71318,7 @@
71318
71318
  },
71319
71319
  "hf:zai-org/GLM-5.1": {
71320
71320
  "id": "hf:zai-org/GLM-5.1",
71321
- "name": "zai-org/GLM-5.1",
71321
+ "name": "GLM-5.1",
71322
71322
  "api": "openai-completions",
71323
71323
  "provider": "synthetic",
71324
71324
  "baseUrl": "https://api.synthetic.new/openai/v1",
@@ -71347,22 +71347,32 @@
71347
71347
  },
71348
71348
  "hf:zai-org/GLM-5.2": {
71349
71349
  "id": "hf:zai-org/GLM-5.2",
71350
- "name": "zai-org/GLM-5.2",
71350
+ "name": "GLM-5.2",
71351
71351
  "api": "openai-completions",
71352
71352
  "provider": "synthetic",
71353
71353
  "baseUrl": "https://api.synthetic.new/openai/v1",
71354
- "reasoning": false,
71354
+ "reasoning": true,
71355
71355
  "input": [
71356
71356
  "text"
71357
71357
  ],
71358
71358
  "cost": {
71359
- "input": 0,
71360
- "output": 0,
71361
- "cacheRead": 0,
71359
+ "input": 1.4,
71360
+ "output": 4.4,
71361
+ "cacheRead": 1.4,
71362
71362
  "cacheWrite": 0
71363
71363
  },
71364
71364
  "contextWindow": 524288,
71365
- "maxTokens": 8192
71365
+ "maxTokens": 65536,
71366
+ "thinking": {
71367
+ "mode": "effort",
71368
+ "efforts": [
71369
+ "minimal",
71370
+ "low",
71371
+ "medium",
71372
+ "high",
71373
+ "xhigh"
71374
+ ]
71375
+ }
71366
71376
  },
71367
71377
  "syn:large:text": {
71368
71378
  "id": "syn:large:text",
@@ -71682,7 +71692,7 @@
71682
71692
  "api": "openai-completions",
71683
71693
  "provider": "together",
71684
71694
  "baseUrl": "https://api.together.xyz/v1",
71685
- "reasoning": true,
71695
+ "reasoning": false,
71686
71696
  "input": [
71687
71697
  "text",
71688
71698
  "image"
@@ -71694,17 +71704,7 @@
71694
71704
  "cacheWrite": 0.18
71695
71705
  },
71696
71706
  "contextWindow": 10000000,
71697
- "maxTokens": 32768,
71698
- "thinking": {
71699
- "mode": "effort",
71700
- "efforts": [
71701
- "minimal",
71702
- "low",
71703
- "medium",
71704
- "high",
71705
- "xhigh"
71706
- ]
71707
- }
71707
+ "maxTokens": 32768
71708
71708
  },
71709
71709
  "MiniMaxAI/MiniMax-M2.5": {
71710
71710
  "id": "MiniMaxAI/MiniMax-M2.5",
@@ -72381,6 +72381,38 @@
72381
72381
  "escapeBuiltinToolNames": true
72382
72382
  }
72383
72383
  },
72384
+ "umans-glm-5.2-nvfp4": {
72385
+ "id": "umans-glm-5.2-nvfp4",
72386
+ "name": "Umans GLM 5.2 NVFP4 (experimental, short test from Jun 29)",
72387
+ "api": "anthropic-messages",
72388
+ "provider": "umans",
72389
+ "baseUrl": "https://api.code.umans.ai",
72390
+ "reasoning": true,
72391
+ "thinking": {
72392
+ "mode": "anthropic-budget-effort",
72393
+ "efforts": [
72394
+ "high",
72395
+ "xhigh"
72396
+ ],
72397
+ "effortMap": {
72398
+ "xhigh": "max"
72399
+ }
72400
+ },
72401
+ "input": [
72402
+ "text"
72403
+ ],
72404
+ "cost": {
72405
+ "input": 0,
72406
+ "output": 0,
72407
+ "cacheRead": 0,
72408
+ "cacheWrite": 0
72409
+ },
72410
+ "contextWindow": 405504,
72411
+ "maxTokens": 131071,
72412
+ "compat": {
72413
+ "escapeBuiltinToolNames": true
72414
+ }
72415
+ },
72384
72416
  "umans-kimi-k2.7": {
72385
72417
  "id": "umans-kimi-k2.7",
72386
72418
  "name": "Umans Kimi K2.7 Code",
@@ -75747,6 +75779,7 @@
75747
75779
  "supportsForcedToolChoice": true,
75748
75780
  "supportsSamplingParams": true,
75749
75781
  "requiresToolResultId": false,
75782
+ "requiresThinkingEnabled": false,
75750
75783
  "replayUnsignedThinking": false,
75751
75784
  "escapeBuiltinToolNames": false
75752
75785
  }
@@ -80633,7 +80666,7 @@
80633
80666
  },
80634
80667
  "zai/glm-4.5": {
80635
80668
  "id": "zai/glm-4.5",
80636
- "name": "GLM-4.5",
80669
+ "name": "GLM 4.5",
80637
80670
  "api": "anthropic-messages",
80638
80671
  "baseUrl": "https://ai-gateway.vercel.sh",
80639
80672
  "provider": "vercel-ai-gateway",
@@ -82062,6 +82095,14 @@
82062
82095
  },
82063
82096
  "contextWindow": 2000000,
82064
82097
  "maxTokens": 2000000,
82098
+ "compat": {
82099
+ "reasoningEffortMap": {
82100
+ "minimal": "low"
82101
+ },
82102
+ "includeEncryptedReasoning": false,
82103
+ "filterReasoningHistory": true,
82104
+ "omitReasoningEffort": false
82105
+ },
82065
82106
  "thinking": {
82066
82107
  "mode": "effort",
82067
82108
  "efforts": [
@@ -82074,14 +82115,6 @@
82074
82115
  "effortMap": {
82075
82116
  "minimal": "low"
82076
82117
  }
82077
- },
82078
- "compat": {
82079
- "reasoningEffortMap": {
82080
- "minimal": "low"
82081
- },
82082
- "includeEncryptedReasoning": false,
82083
- "filterReasoningHistory": true,
82084
- "omitReasoningEffort": false
82085
82118
  }
82086
82119
  },
82087
82120
  "grok-4.3": {
@@ -82103,6 +82136,14 @@
82103
82136
  },
82104
82137
  "contextWindow": 1000000,
82105
82138
  "maxTokens": 1000000,
82139
+ "compat": {
82140
+ "reasoningEffortMap": {
82141
+ "minimal": "low"
82142
+ },
82143
+ "includeEncryptedReasoning": false,
82144
+ "filterReasoningHistory": true,
82145
+ "omitReasoningEffort": false
82146
+ },
82106
82147
  "thinking": {
82107
82148
  "mode": "effort",
82108
82149
  "efforts": [
@@ -82115,14 +82156,6 @@
82115
82156
  "effortMap": {
82116
82157
  "minimal": "low"
82117
82158
  }
82118
- },
82119
- "compat": {
82120
- "reasoningEffortMap": {
82121
- "minimal": "low"
82122
- },
82123
- "includeEncryptedReasoning": false,
82124
- "filterReasoningHistory": true,
82125
- "omitReasoningEffort": false
82126
82159
  }
82127
82160
  },
82128
82161
  "grok-build": {
@@ -82174,12 +82207,12 @@
82174
82207
  "contextWindow": 256000,
82175
82208
  "maxTokens": 256000,
82176
82209
  "compat": {
82177
- "includeEncryptedReasoning": false,
82178
- "filterReasoningHistory": true,
82179
- "omitReasoningEffort": true,
82180
82210
  "reasoningEffortMap": {
82181
82211
  "minimal": "low"
82182
82212
  },
82213
+ "includeEncryptedReasoning": false,
82214
+ "filterReasoningHistory": true,
82215
+ "omitReasoningEffort": true,
82183
82216
  "supportsReasoningEffort": false
82184
82217
  }
82185
82218
  },
@@ -82223,9 +82256,9 @@
82223
82256
  "text"
82224
82257
  ],
82225
82258
  "cost": {
82226
- "input": 0.1,
82227
- "output": 0.3,
82228
- "cacheRead": 0.01,
82259
+ "input": 0.14,
82260
+ "output": 0.28,
82261
+ "cacheRead": 0.0028,
82229
82262
  "cacheWrite": 0
82230
82263
  },
82231
82264
  "contextWindow": 262144,
@@ -82259,9 +82292,9 @@
82259
82292
  "image"
82260
82293
  ],
82261
82294
  "cost": {
82262
- "input": 0.4,
82263
- "output": 2,
82264
- "cacheRead": 0.08,
82295
+ "input": 0.14,
82296
+ "output": 0.28,
82297
+ "cacheRead": 0.0028,
82265
82298
  "cacheWrite": 0
82266
82299
  },
82267
82300
  "contextWindow": 262144,
@@ -82294,9 +82327,9 @@
82294
82327
  "text"
82295
82328
  ],
82296
82329
  "cost": {
82297
- "input": 1,
82298
- "output": 3,
82299
- "cacheRead": 0.2,
82330
+ "input": 0.435,
82331
+ "output": 0.87,
82332
+ "cacheRead": 0.0036,
82300
82333
  "cacheWrite": 0
82301
82334
  },
82302
82335
  "contextWindow": 1048576,
@@ -82330,9 +82363,9 @@
82330
82363
  "image"
82331
82364
  ],
82332
82365
  "cost": {
82333
- "input": 0.4,
82334
- "output": 2,
82335
- "cacheRead": 0.08,
82366
+ "input": 0.14,
82367
+ "output": 0.28,
82368
+ "cacheRead": 0.0028,
82336
82369
  "cacheWrite": 0
82337
82370
  },
82338
82371
  "contextWindow": 1048576,
@@ -82365,9 +82398,9 @@
82365
82398
  "text"
82366
82399
  ],
82367
82400
  "cost": {
82368
- "input": 1,
82369
- "output": 3,
82370
- "cacheRead": 0.2,
82401
+ "input": 0.435,
82402
+ "output": 0.87,
82403
+ "cacheRead": 0.0036,
82371
82404
  "cacheWrite": 0
82372
82405
  },
82373
82406
  "contextWindow": 1048576,
@@ -803,6 +803,18 @@ export function groqModelManagerOptions(config?: GroqModelManagerConfig): ModelM
803
803
  // 3. Cerebras
804
804
  // ---------------------------------------------------------------------------
805
805
 
806
+ const CEREBRAS_IMAGE_INPUT_MODEL_IDS = new Set(["gemma-4-31b"]);
807
+
808
+ function applyCerebrasDiscoveryOverrides(model: ModelSpec<"openai-completions">): ModelSpec<"openai-completions"> {
809
+ if (!CEREBRAS_IMAGE_INPUT_MODEL_IDS.has(model.id)) {
810
+ return model;
811
+ }
812
+ return {
813
+ ...model,
814
+ input: ["text", "image"],
815
+ };
816
+ }
817
+
806
818
  export interface CerebrasModelManagerConfig {
807
819
  apiKey?: string;
808
820
  baseUrl?: string;
@@ -812,7 +824,27 @@ export interface CerebrasModelManagerConfig {
812
824
  export function cerebrasModelManagerOptions(
813
825
  config?: CerebrasModelManagerConfig,
814
826
  ): ModelManagerOptions<"openai-completions"> {
815
- return createSimpleOpenAICompletionsOptions("cerebras", "https://api.cerebras.ai/v1", config);
827
+ const apiKey = config?.apiKey;
828
+ const baseUrl = config?.baseUrl ?? "https://api.cerebras.ai/v1";
829
+ const references = createBundledReferenceMap<"openai-completions">("cerebras");
830
+ return {
831
+ providerId: "cerebras",
832
+ ...(apiKey && {
833
+ fetchDynamicModels: () =>
834
+ fetchOpenAICompatibleModels({
835
+ api: "openai-completions",
836
+ provider: "cerebras",
837
+ baseUrl,
838
+ apiKey,
839
+ mapModel: (entry, defaults) => {
840
+ const reference = references.get(defaults.id);
841
+ const model = mapWithBundledReference(entry, defaults, reference);
842
+ return applyCerebrasDiscoveryOverrides(model);
843
+ },
844
+ fetch: config?.fetch,
845
+ }),
846
+ }),
847
+ };
816
848
  }
817
849
 
818
850
  // ---------------------------------------------------------------------------
@@ -1294,7 +1326,7 @@ export function clampFireworksKimiMaxTokens(modelId: string, candidate: number |
1294
1326
  export const KIMI_K27_CODE_RECOMMENDED_MAX_TOKENS = 32_768;
1295
1327
 
1296
1328
  export function isKimiK27CodeModelId(modelId: string): boolean {
1297
- return /(?:^|\/)kimi[-._]?k2(?:[._-]?|p)7[-._]?code$/i.test(modelId);
1329
+ return /(?:^|\/)kimi[-._]?k2(?:[._-]?|p)7[-._]?code(?:[-._]?highspeed)?$/i.test(modelId);
1298
1330
  }
1299
1331
 
1300
1332
  export function clampKimiK27CodeMaxTokens(modelId: string, candidate: number): number;
package/src/types.ts CHANGED
@@ -420,6 +420,11 @@ export interface AnthropicCompat {
420
420
  * Default: auto-detected from provider/baseUrl and `model.reasoning`.
421
421
  */
422
422
  replayUnsignedThinking?: boolean;
423
+ /**
424
+ * Whether the endpoint requires `thinking.type: "enabled"` whenever the
425
+ * model reasons. Use for models that reject omitted or disabled thinking.
426
+ */
427
+ requiresThinkingEnabled?: boolean;
423
428
  /**
424
429
  * Prefix Anthropic built-in tool names (`web_search`, `code_execution`, ...)
425
430
  * when they are ordinary client tools. Some Anthropic-compatible gateways