@oh-my-pi/pi-catalog 16.5.2 → 17.0.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 +28 -0
- package/dist/types/identity/family.d.ts +12 -0
- package/dist/types/types.d.ts +12 -2
- package/package.json +3 -3
- package/src/compat/anthropic.ts +1 -1
- package/src/compat/openai.ts +12 -5
- package/src/identity/family.ts +26 -0
- package/src/models.json +1027 -273
- package/src/provider-models/openai-compat.ts +9 -2
- package/src/types.ts +12 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,34 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [17.0.1] - 2026-07-16
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Added GPT-5.6 Luna, Sol, and Terra entries for Amazon Bedrock, Azure, and Cloudflare
|
|
10
|
+
- Added KAT-Coder Air/Pro V2.5 entries across Kilo, OpenRouter, NanoGPT, and Vercel
|
|
11
|
+
- Added Inkling model entries for Baseten and Vercel AI Gateway
|
|
12
|
+
- Added Umans DeepSeek V4 Pro DSpark as an experimental model listing
|
|
13
|
+
- Added Claude Opus 4.7 Fast and 4.8 Fast on Vercel AI Gateway
|
|
14
|
+
- Added Workers AI GLM-5.2, Muse Spark 1.1, Stealth GPT-5.6 Sol, and nano-gpt-help entries
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- Added image input and reasoning support to several existing Codeium and Kilo GPT-5.6 models
|
|
19
|
+
- Enabled image input and reasoning for Gemini Flash Latest and Grok 4.5
|
|
20
|
+
- Renamed many model labels for consistency, including Claude, Grok, DeepSeek, GLM, and Gemini names
|
|
21
|
+
- Updated pricing for many existing models, including input, output, and cache cost values
|
|
22
|
+
- Updated context window and max token limits for many catalog models across providers
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
|
|
26
|
+
- Fixed Z.AI (GLM) coding-plan token costs all showing as "Free" in `/models`: the `zai` provider descriptor sourced the models.dev `zai-coding-plan` key (all-$0 subscription rates) instead of the `zai` pay-as-you-go key, which carries the real per-token rates for the identical GLM ids ([#5598](https://github.com/can1357/oh-my-pi/issues/5598)).
|
|
27
|
+
- Fixed custom Anthropic endpoints receiving the first-party-only `eager_input_streaming` tool field by default ([#5572](https://github.com/can1357/oh-my-pi/issues/5572)).
|
|
28
|
+
- Added resolved OpenAI sampling-parameter compatibility metadata for o-series and GPT-5+ models.
|
|
29
|
+
- Fixed GitHub Copilot `mai-code-1-flash-picker` (and other `mai-*` models) to route through the `/responses` endpoint instead of `/chat/completions`, which rejected them with `400 unsupported_api_for_model` ([#5612](https://github.com/can1357/oh-my-pi/issues/5612)).
|
|
30
|
+
- Extended the reasoning `streamIdleTimeoutMs` floor (300s) to native Kimi K2.7 Code (`kimi-k2.7-code` / `kimi-k2.7-code-highspeed`), which previously fell through to the 120s default and aborted on long reasoning turns ([#4836](https://github.com/can1357/oh-my-pi/issues/4836)).
|
|
31
|
+
- Fixed GLM-5.x coding-plan streams via the OpenCode Go/Zen gateways (`opencode.ai/zen/…`) timing out with `OpenAI completions stream stalled while waiting for the next event` during slow plan-writing/reasoning phases. The 600s idle-timeout floor for GLM coding-plan SKUs was gated to the native Z.AI/Zhipu hosts only, so OpenCode-fronted GLM fell back to the 120s default watchdog. ([#4758](https://github.com/can1357/oh-my-pi/issues/4758))
|
|
32
|
+
|
|
5
33
|
## [16.5.2] - 2026-07-14
|
|
6
34
|
|
|
7
35
|
### Fixed
|
|
@@ -76,6 +76,18 @@ export declare const supportsAllTurnsReasoningContext: (modelId: string) => bool
|
|
|
76
76
|
* the human-readable summary stream.
|
|
77
77
|
*/
|
|
78
78
|
export declare const supportsCodexReasoningSummary: (modelId: string) => boolean;
|
|
79
|
+
/**
|
|
80
|
+
* OpenAI proprietary models whose serving path rejects explicit sampling
|
|
81
|
+
* parameters (`temperature`, `top_p`, `top_k`, …) with
|
|
82
|
+
* `400 Unsupported parameter: 'temperature' is not supported with this model`.
|
|
83
|
+
* Covers the o-series and the entire gpt-5+ generation — base, `mini`, `nano`,
|
|
84
|
+
* `codex*`, the `luna`/`sol`/`terra` SKUs, and the `-chat-latest` variants,
|
|
85
|
+
* since even the non-reasoning gpt-5 chat models reject sampling params (see
|
|
86
|
+
* litellm#13781). Holds regardless of which OpenAI-serving host proxies the
|
|
87
|
+
* model (official, Azure, GitHub Copilot). Version floor (not an allowlist) so
|
|
88
|
+
* 6.x inherits automatically. Issue #5606.
|
|
89
|
+
*/
|
|
90
|
+
export declare const isOpenAISamplingRestrictedModelId: (modelId: string) => boolean;
|
|
79
91
|
/**
|
|
80
92
|
* Reasoning-capable GLM coding SKUs: glm-4.5 and up on the base / `-air` /
|
|
81
93
|
* `-turbo` lines. Excludes the vision (`…v`) shape, the non-reasoning
|
package/dist/types/types.d.ts
CHANGED
|
@@ -289,6 +289,15 @@ export interface OpenAICompat {
|
|
|
289
289
|
toolStrictMode?: "all_strict" | "none";
|
|
290
290
|
/** Whether request shaping may send reasoning params at all. Default: auto-detected (disabled for GitHub Copilot chat-completions). */
|
|
291
291
|
supportsReasoningParams?: boolean;
|
|
292
|
+
/**
|
|
293
|
+
* Whether the endpoint accepts explicit sampling parameters (`temperature`,
|
|
294
|
+
* `top_p`, `top_k`, `min_p`, penalties). OpenAI proprietary reasoning models
|
|
295
|
+
* (o-series, gpt-5+) reject them with `400 Unsupported parameter:
|
|
296
|
+
* 'temperature' is not supported with this model` on every serving host
|
|
297
|
+
* (official, Azure, GitHub Copilot). When unset, auto-detected from the
|
|
298
|
+
* model id. Default: true. Issue #5606.
|
|
299
|
+
*/
|
|
300
|
+
supportsSamplingParams?: boolean;
|
|
292
301
|
/** Always send a max-token field when the caller did not provide one. Default: auto-detected (Kimi-family models derive TPM limits from max_tokens). */
|
|
293
302
|
alwaysSendMaxTokens?: boolean;
|
|
294
303
|
/** Whether Responses-API tool-call/result history must be strictly paired. Default: auto-detected (Azure OpenAI, GitHub Copilot). */
|
|
@@ -333,7 +342,7 @@ export interface AnthropicCompat {
|
|
|
333
342
|
* tags: 'disabled', 'enabled'`.
|
|
334
343
|
*/
|
|
335
344
|
disableAdaptiveThinking?: boolean;
|
|
336
|
-
/** Whether tools may include Anthropic's per-tool eager_input_streaming flag. Default: true. */
|
|
345
|
+
/** Whether tools may include Anthropic's per-tool eager_input_streaming flag. Default: true for the canonical Anthropic API. */
|
|
337
346
|
supportsEagerToolInputStreaming?: boolean;
|
|
338
347
|
/** Whether long prompt-cache retention (`ttl: "1h"`) is supported. Default: true for canonical Anthropic API. */
|
|
339
348
|
supportsLongCacheRetention?: boolean;
|
|
@@ -421,6 +430,7 @@ export interface ResolvedOpenAISharedCompat {
|
|
|
421
430
|
supportsReasoningEffort: boolean;
|
|
422
431
|
reasoningEffortMap: Partial<Record<Effort, string>>;
|
|
423
432
|
supportsReasoningParams: boolean;
|
|
433
|
+
supportsSamplingParams: boolean;
|
|
424
434
|
thinkingFormat: OpenAIReasoningFormat;
|
|
425
435
|
reasoningDisableMode: OpenAIReasoningDisableMode;
|
|
426
436
|
omitReasoningEffort: boolean;
|
|
@@ -464,7 +474,7 @@ export interface ResolvedOpenAISharedCompat {
|
|
|
464
474
|
* `buildModel`; request handlers read fields and never detect, resolve, or
|
|
465
475
|
* allocate.
|
|
466
476
|
*/
|
|
467
|
-
export type ResolvedOpenAICompat = ResolvedOpenAISharedCompat & Required<Omit<OpenAICompat, "supportsDeveloperRole" | "supportsReasoningEffort" | "reasoningEffortMap" | "supportsReasoningParams" | "thinkingFormat" | "reasoningDisableMode" | "omitReasoningEffort" | "includeEncryptedReasoning" | "filterReasoningHistory" | "disableReasoningOnForcedToolChoice" | "disableReasoningOnToolChoice" | "supportsToolChoice" | "supportsForcedToolChoice" | "supportsNamedToolChoice" | "reasoningContentField" | "requiresReasoningContentForToolCalls" | "requiresReasoningContentForAllAssistantTurns" | "allowsSyntheticReasoningContentForToolCalls" | "replayReasoningContent" | "qwenPreserveThinking" | "requiresThinkingAsText" | "requiresMistralToolIds" | "requiresToolResultName" | "requiresAssistantAfterToolResult" | "requiresAssistantContentForToolCalls" | "stripDeepseekSpecialTokens" | "streamMarkupHealingPattern" | "reasoningDeltasMayBeCumulative" | "emptyLengthFinishIsContextError" | "usesOpenAIToolCallIdLimit" | "promptCacheSessionHeader" | "openRouterRouting" | "isOpenRouterHost" | "supportsStrictMode" | "supportsLongPromptCacheRetention" | "alwaysSendMaxTokens" | "wireModelIdMode" | "vercelGatewayRouting" | "extraBody" | "toolStrictMode" | "toolSchemaFlavor" | "streamIdleTimeoutMs" | "cacheControlFormat" | "thinkingKeep" | "strictResponsesPairing" | "supportsImageDetailOriginal" | "enableGeminiThinkingLoopGuard" | "whenThinking">> & {
|
|
477
|
+
export type ResolvedOpenAICompat = ResolvedOpenAISharedCompat & Required<Omit<OpenAICompat, "supportsDeveloperRole" | "supportsReasoningEffort" | "reasoningEffortMap" | "supportsReasoningParams" | "supportsSamplingParams" | "thinkingFormat" | "reasoningDisableMode" | "omitReasoningEffort" | "includeEncryptedReasoning" | "filterReasoningHistory" | "disableReasoningOnForcedToolChoice" | "disableReasoningOnToolChoice" | "supportsToolChoice" | "supportsForcedToolChoice" | "supportsNamedToolChoice" | "reasoningContentField" | "requiresReasoningContentForToolCalls" | "requiresReasoningContentForAllAssistantTurns" | "allowsSyntheticReasoningContentForToolCalls" | "replayReasoningContent" | "qwenPreserveThinking" | "requiresThinkingAsText" | "requiresMistralToolIds" | "requiresToolResultName" | "requiresAssistantAfterToolResult" | "requiresAssistantContentForToolCalls" | "stripDeepseekSpecialTokens" | "streamMarkupHealingPattern" | "reasoningDeltasMayBeCumulative" | "emptyLengthFinishIsContextError" | "usesOpenAIToolCallIdLimit" | "promptCacheSessionHeader" | "openRouterRouting" | "isOpenRouterHost" | "supportsStrictMode" | "supportsLongPromptCacheRetention" | "alwaysSendMaxTokens" | "wireModelIdMode" | "vercelGatewayRouting" | "extraBody" | "toolStrictMode" | "toolSchemaFlavor" | "streamIdleTimeoutMs" | "cacheControlFormat" | "thinkingKeep" | "strictResponsesPairing" | "supportsImageDetailOriginal" | "enableGeminiThinkingLoopGuard" | "whenThinking">> & {
|
|
468
478
|
vercelGatewayRouting?: OpenAICompat["vercelGatewayRouting"];
|
|
469
479
|
extraBody?: OpenAICompat["extraBody"];
|
|
470
480
|
cacheControlFormat?: OpenAICompat["cacheControlFormat"];
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@oh-my-pi/pi-catalog",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "17.0.1",
|
|
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.1",
|
|
37
|
-
"@oh-my-pi/pi-utils": "
|
|
37
|
+
"@oh-my-pi/pi-utils": "17.0.1",
|
|
38
38
|
"arktype": "2.2.3",
|
|
39
39
|
"zod": "^4"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@oh-my-pi/pi-ai": "
|
|
42
|
+
"@oh-my-pi/pi-ai": "17.0.1",
|
|
43
43
|
"@types/bun": "^1.3.14"
|
|
44
44
|
},
|
|
45
45
|
"engines": {
|
package/src/compat/anthropic.ts
CHANGED
|
@@ -109,7 +109,7 @@ export function buildAnthropicCompat(spec: ModelSpec<"anthropic-messages">): Res
|
|
|
109
109
|
signingEndpoint,
|
|
110
110
|
disableStrictTools: isAzure,
|
|
111
111
|
disableAdaptiveThinking: false,
|
|
112
|
-
supportsEagerToolInputStreaming:
|
|
112
|
+
supportsEagerToolInputStreaming: official,
|
|
113
113
|
// Long cache retention is only sent to the official API by default;
|
|
114
114
|
// proxies opt in explicitly via `compat.supportsLongCacheRetention: true`.
|
|
115
115
|
supportsLongCacheRetention: official,
|
package/src/compat/openai.ts
CHANGED
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
isKimiK26ModelId,
|
|
19
19
|
isKimiModelId,
|
|
20
20
|
isMimoModelIdOrName,
|
|
21
|
+
isOpenAISamplingRestrictedModelId,
|
|
21
22
|
isQwenModelId,
|
|
22
23
|
modelFamilyToken,
|
|
23
24
|
} from "../identity/family";
|
|
@@ -37,8 +38,8 @@ const GLM_CODING_PLAN_MODEL_PATTERN = /(^|\/)glm-5(?:[.-]|$)/i;
|
|
|
37
38
|
const GLM_CODING_PLAN_STREAM_IDLE_TIMEOUT_MS = 600_000;
|
|
38
39
|
/** Direct DeepSeek reasoning models stall between thinking and answer phases. */
|
|
39
40
|
const DEEPSEEK_REASONING_STREAM_IDLE_TIMEOUT_MS = 300_000;
|
|
40
|
-
/** Kimi K2.6 can spend several minutes reasoning before the first visible token. */
|
|
41
|
-
const
|
|
41
|
+
/** Kimi K2.6 and native K2.7 Code can spend several minutes reasoning before the first visible token. */
|
|
42
|
+
const KIMI_REASONING_STREAM_IDLE_TIMEOUT_MS = 300_000;
|
|
42
43
|
/**
|
|
43
44
|
* Native Kimi K2.7 Code requires `thinking.type: "enabled"` and rejects
|
|
44
45
|
* disabled thinking. Match the public id, its Fast variant, and the
|
|
@@ -357,14 +358,14 @@ export function buildOpenAICompat(spec: ModelSpec<"openai-completions">): Resolv
|
|
|
357
358
|
// for minutes while reasoning or cold-loading weights; widen the idle
|
|
358
359
|
// timeout so warm-ups stop aborting and retrying.
|
|
359
360
|
const streamIdleTimeoutMs =
|
|
360
|
-
GLM_CODING_PLAN_MODEL_PATTERN.test(spec.id) && (isZai || isZhipu)
|
|
361
|
+
GLM_CODING_PLAN_MODEL_PATTERN.test(spec.id) && (isZai || isZhipu || isOpenCodeHost)
|
|
361
362
|
? GLM_CODING_PLAN_STREAM_IDLE_TIMEOUT_MS
|
|
362
363
|
: provider === "alibaba-coding-plan"
|
|
363
364
|
? ALIBABA_CODING_PLAN_STREAM_IDLE_TIMEOUT_MS
|
|
364
365
|
: isXiaomiMimo
|
|
365
366
|
? XIAOMI_MIMO_STREAM_IDLE_TIMEOUT_MS
|
|
366
|
-
: spec.reasoning && isKimiK26ModelId(spec.id)
|
|
367
|
-
?
|
|
367
|
+
: spec.reasoning && (isKimiK26ModelId(spec.id) || (isMoonshotKimi && matchesKimiK27CodeFamily(spec)))
|
|
368
|
+
? KIMI_REASONING_STREAM_IDLE_TIMEOUT_MS
|
|
368
369
|
: spec.reasoning && isDirectDeepseekApi
|
|
369
370
|
? DEEPSEEK_REASONING_STREAM_IDLE_TIMEOUT_MS
|
|
370
371
|
: isLocalOpenAICompatBackend
|
|
@@ -409,6 +410,9 @@ export function buildOpenAICompat(spec: ModelSpec<"openai-completions">): Resolv
|
|
|
409
410
|
supportsReasoningEffort: !isGrok && !isXiaomiMimo && (!(isZai || isZhipu) || supportsZaiReasoningEffort),
|
|
410
411
|
// GitHub Copilot's chat-completions endpoint rejects reasoning params wholesale.
|
|
411
412
|
supportsReasoningParams: provider !== "github-copilot",
|
|
413
|
+
// OpenAI proprietary reasoning models (o-series, gpt-5+) reject explicit
|
|
414
|
+
// temperature/top_p/… with a 400 on every serving host (#5606).
|
|
415
|
+
supportsSamplingParams: !isOpenAISamplingRestrictedModelId(spec.id),
|
|
412
416
|
reasoningEffortMap: isMimoReasoningEffortModel ? MIMO_REASONING_EFFORT_MAP : {},
|
|
413
417
|
supportsUsageInStreaming: !isCerebras,
|
|
414
418
|
// pi-ai's thinking-loop guard is gemini-only; default the flag from the
|
|
@@ -604,6 +608,9 @@ export function buildOpenAIResponsesCompat(spec: OpenAIResponsesSpecLike): Resol
|
|
|
604
608
|
spec.provider !== "xai-oauth" && !modelMatchesHost({ provider: spec.provider, baseUrl }, "githubCopilot"),
|
|
605
609
|
reasoningEffortMap: {},
|
|
606
610
|
supportsReasoningParams: true,
|
|
611
|
+
// OpenAI proprietary reasoning models (o-series, gpt-5+) reject explicit
|
|
612
|
+
// temperature/top_p/… with a 400 on every serving host (#5606).
|
|
613
|
+
supportsSamplingParams: !isOpenAISamplingRestrictedModelId(id),
|
|
607
614
|
thinkingFormat,
|
|
608
615
|
reasoningDisableMode: resolveReasoningDisableMode(thinkingFormat),
|
|
609
616
|
omitReasoningEffort: false,
|
package/src/identity/family.ts
CHANGED
|
@@ -163,6 +163,32 @@ export const supportsAllTurnsReasoningContext = isOpenAIWireGen54Plus;
|
|
|
163
163
|
*/
|
|
164
164
|
export const supportsCodexReasoningSummary = isOpenAIWireGen54Plus;
|
|
165
165
|
|
|
166
|
+
/** OpenAI proprietary reasoning families keyed off the parsed gpt version (gpt-5+). */
|
|
167
|
+
const isOpenAIWireGen5Plus = memo((modelId: string): boolean => {
|
|
168
|
+
const parsed = parseOpenAIModel(bareModelId(modelId));
|
|
169
|
+
if (!parsed) return false;
|
|
170
|
+
return semverGte(parsed.version, "5");
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
/** o-series reasoning ids (`o1`, `o1-pro`, `o3`, `o3-mini`, `o4-mini`, `openai/o3`, …). */
|
|
174
|
+
const O_SERIES_REASONING_RE = /(^|\/)o[134](?:[-.]|$)/i;
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* OpenAI proprietary models whose serving path rejects explicit sampling
|
|
178
|
+
* parameters (`temperature`, `top_p`, `top_k`, …) with
|
|
179
|
+
* `400 Unsupported parameter: 'temperature' is not supported with this model`.
|
|
180
|
+
* Covers the o-series and the entire gpt-5+ generation — base, `mini`, `nano`,
|
|
181
|
+
* `codex*`, the `luna`/`sol`/`terra` SKUs, and the `-chat-latest` variants,
|
|
182
|
+
* since even the non-reasoning gpt-5 chat models reject sampling params (see
|
|
183
|
+
* litellm#13781). Holds regardless of which OpenAI-serving host proxies the
|
|
184
|
+
* model (official, Azure, GitHub Copilot). Version floor (not an allowlist) so
|
|
185
|
+
* 6.x inherits automatically. Issue #5606.
|
|
186
|
+
*/
|
|
187
|
+
export const isOpenAISamplingRestrictedModelId = memo((modelId: string): boolean => {
|
|
188
|
+
const bare = bareModelId(modelId);
|
|
189
|
+
return isOpenAIWireGen5Plus(modelId) || O_SERIES_REASONING_RE.test(bare);
|
|
190
|
+
});
|
|
191
|
+
|
|
166
192
|
/**
|
|
167
193
|
* Reasoning-capable GLM coding SKUs: glm-4.5 and up on the base / `-air` /
|
|
168
194
|
* `-turbo` lines. Excludes the vision (`…v`) shape, the non-reasoning
|