@oh-my-pi/pi-catalog 16.3.14 → 16.4.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 +37 -0
- package/dist/types/effort.d.ts +2 -1
- package/dist/types/model-thinking.d.ts +0 -15
- package/dist/types/provider-models/descriptors.d.ts +10 -0
- package/dist/types/provider-models/openai-compat.d.ts +20 -0
- package/dist/types/types.d.ts +9 -0
- package/dist/types/wire/codex.d.ts +9 -0
- package/package.json +3 -3
- package/src/compat/openai.ts +6 -29
- package/src/discovery/codex.ts +3 -0
- package/src/effort.ts +2 -0
- package/src/identity/family.ts +1 -1
- package/src/model-thinking.ts +138 -139
- package/src/models.json +4378 -2124
- package/src/provider-models/descriptors.ts +9 -0
- package/src/provider-models/ollama.ts +1 -2
- package/src/provider-models/openai-compat.ts +164 -18
- package/src/types.ts +9 -0
- package/src/variant-collapse.ts +79 -123
- package/src/wire/codex.ts +9 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,43 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [16.4.0] - 2026-07-10
|
|
6
|
+
|
|
7
|
+
### Breaking Changes
|
|
8
|
+
|
|
9
|
+
- Redesigned reasoning effort ladders to be wire-exact, removing the shifted five-tier effort mapping. Models now expose exactly the effort tiers their upstream APIs accept, mapped 1:1. Removed SHIFTED_FIVE_TIER_EFFORT_MAP, ANTHROPIC_ADAPTIVE_EFFORT_MAP_4_TIER, and per-host xhigh-to-max alias maps. Selecting an unsupported tier now automatically clamps down via clampThinkingLevelForModel. Devin effort routing is now mapped 1:1 onto per-tier siblings.
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Added support for new models: Grok 4.5 family, Dolphin Mistral 24b Venice Edition, GLM5.2-Fast, and Zenmux variants for GPT-5.6 (Luna, Sol, and Terra).
|
|
14
|
+
- Added Novita as a model provider, including public catalog discovery, pricing, limits, modality, reasoning, and tool metadata.
|
|
15
|
+
- Added useResponsesLite to Model and ModelSpec to support the Responses Lite transport, enabled by default for the GPT-5.6 family.
|
|
16
|
+
- Added Effort.Max ("max") as a first-class user-facing thinking level above xhigh.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- Enabled reasoning effort controls for Grok 4.5 and updated support flags for additional Grok variants
|
|
21
|
+
- Standardized reasoning effort levels to use a wire-exact max tier across all model providers, including Devin routing and Ollama configurations.
|
|
22
|
+
- Updated costs and context windows for various models in the catalog.
|
|
23
|
+
|
|
24
|
+
## [16.3.15] - 2026-07-09
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
|
|
28
|
+
- Added support for Grok 4.5 model
|
|
29
|
+
- Added `gpt-5.6` base models and `gpt-5.6-{luna,sol,terra}-pro` variants
|
|
30
|
+
- Added `meta/muse-spark-1.1` model support
|
|
31
|
+
- Added support for thinking modes on `poolside/laguna` models
|
|
32
|
+
- Added generated GPT-5.6 Pro aliases (`gpt-5.6-{luna,sol,terra}-pro`) on the `openai` and `openai-codex` providers: each alias sends the base model id on the wire (`requestModelId`) with the new `reasoningMode: "pro"` marker, and re-derives from the current base rows on every catalog regeneration.
|
|
33
|
+
|
|
34
|
+
### Changed
|
|
35
|
+
|
|
36
|
+
- Updated cache read costs for Grok models
|
|
37
|
+
- Reduced max token limit for Grok 4.3 model
|
|
38
|
+
- Enabled prompt cache affinity for Grok models via the x-grok-conv-id header in OpenAI compatible endpoints
|
|
39
|
+
- Enabled prompt cache affinity for Grok models via the x-grok-conv-id header
|
|
40
|
+
- Marked direct xAI Grok Chat Completions models for `x-grok-conv-id` prompt-cache affinity.
|
|
41
|
+
|
|
5
42
|
## [16.3.14] - 2026-07-09
|
|
6
43
|
|
|
7
44
|
### Added
|
package/dist/types/effort.d.ts
CHANGED
|
@@ -13,21 +13,6 @@ import type { Api, CompatOf, Model, ModelSpec, ThinkingConfig } from "./types.js
|
|
|
13
13
|
* specs and built models.
|
|
14
14
|
*/
|
|
15
15
|
type ApiModel<TApi extends Api = Api> = ModelSpec<TApi> | Model<TApi>;
|
|
16
|
-
/**
|
|
17
|
-
* Effort → wire-value map for a shifted five-tier scale (`low..max`):
|
|
18
|
-
* user-facing efforts shift up one notch so the top tier reaches the genuine
|
|
19
|
-
* "max" and "high" lands on the recommended "xhigh" coding/agentic default.
|
|
20
|
-
* Used by Anthropic adaptive models with a real xhigh tier (Opus 4.7+ and
|
|
21
|
-
* Fable/Mythos 5 on the Messages API) and by GPT-5.6+ wire-effort models,
|
|
22
|
-
* which expose the same genuine `max` tier above `xhigh`.
|
|
23
|
-
*/
|
|
24
|
-
export declare const SHIFTED_FIVE_TIER_EFFORT_MAP: Readonly<Partial<Record<Effort, string>>>;
|
|
25
|
-
/**
|
|
26
|
-
* Effort → wire-value map for the legacy 4-tier adaptive scale (Opus 4.6,
|
|
27
|
-
* Sonnet 4.6+, and every adaptive model on Bedrock Converse). `low..high` pass
|
|
28
|
-
* through verbatim; there is no real "xhigh", so it aliases the top "max" tier.
|
|
29
|
-
*/
|
|
30
|
-
export declare const ANTHROPIC_ADAPTIVE_EFFORT_MAP_4_TIER: Readonly<Partial<Record<Effort, string>>>;
|
|
31
16
|
/**
|
|
32
17
|
* Resolve the canonical thinking metadata for a spec. Called exactly once per
|
|
33
18
|
* model by `buildModel`, after compat resolution.
|
|
@@ -224,6 +224,16 @@ export declare const CATALOG_PROVIDERS: readonly [{
|
|
|
224
224
|
readonly catalogDiscovery: {
|
|
225
225
|
readonly label: "NVIDIA";
|
|
226
226
|
};
|
|
227
|
+
}, {
|
|
228
|
+
readonly id: "novita";
|
|
229
|
+
readonly defaultModel: "moonshotai/kimi-k2.7-code";
|
|
230
|
+
readonly envVars: readonly ["NOVITA_API_KEY"];
|
|
231
|
+
readonly createModelManagerOptions: (config: ModelManagerConfig) => import("../index.js").ModelManagerOptions<"openai-completions", unknown>;
|
|
232
|
+
readonly dynamicModelsAuthoritative: true;
|
|
233
|
+
readonly catalogDiscovery: {
|
|
234
|
+
readonly label: "Novita";
|
|
235
|
+
readonly allowUnauthenticated: true;
|
|
236
|
+
};
|
|
227
237
|
}, {
|
|
228
238
|
readonly id: "ollama";
|
|
229
239
|
readonly defaultModel: "gpt-oss:20b";
|
|
@@ -54,6 +54,18 @@ export interface OpenAIModelManagerConfig {
|
|
|
54
54
|
fetch?: FetchImpl;
|
|
55
55
|
}
|
|
56
56
|
export declare function openaiModelManagerOptions(config?: OpenAIModelManagerConfig): ModelManagerOptions<"openai-responses">;
|
|
57
|
+
/**
|
|
58
|
+
* Re-derive the generated pro-reasoning aliases (`gpt-5.6-*-pro`) for the
|
|
59
|
+
* first-party `openai`/`openai-codex` gpt-5.6 rows. Each alias inherits the
|
|
60
|
+
* base row's metadata, requests the base wire id via `requestModelId`, and
|
|
61
|
+
* sets `reasoningMode: "pro"` so Responses-family request builders emit
|
|
62
|
+
* `reasoning: { mode: "pro" }`. Called by the models.json generator after all
|
|
63
|
+
* sources merge: stale copies of the owned aliases (previous snapshot) are
|
|
64
|
+
* dropped and re-projected from the current base rows so alias metadata always
|
|
65
|
+
* tracks the base, while a real upstream model that occupies an alias id wins
|
|
66
|
+
* and suppresses the projection.
|
|
67
|
+
*/
|
|
68
|
+
export declare function projectOpenAIProReasoningAliases(models: readonly ModelSpec<Api>[]): ModelSpec<Api>[];
|
|
57
69
|
export interface GroqModelManagerConfig {
|
|
58
70
|
apiKey?: string;
|
|
59
71
|
baseUrl?: string;
|
|
@@ -78,6 +90,14 @@ export interface NvidiaModelManagerConfig {
|
|
|
78
90
|
fetch?: FetchImpl;
|
|
79
91
|
}
|
|
80
92
|
export declare function nvidiaModelManagerOptions(config?: NvidiaModelManagerConfig): ModelManagerOptions<"openai-completions">;
|
|
93
|
+
/** Novita OpenAI-compatible discovery configuration. */
|
|
94
|
+
export interface NovitaModelManagerConfig {
|
|
95
|
+
apiKey?: string;
|
|
96
|
+
baseUrl?: string;
|
|
97
|
+
fetch?: FetchImpl;
|
|
98
|
+
}
|
|
99
|
+
/** Builds Novita's public model-discovery manager. */
|
|
100
|
+
export declare function novitaModelManagerOptions(config?: NovitaModelManagerConfig): ModelManagerOptions<"openai-completions">;
|
|
81
101
|
export interface XaiModelManagerConfig {
|
|
82
102
|
apiKey?: string;
|
|
83
103
|
baseUrl?: string;
|
package/dist/types/types.d.ts
CHANGED
|
@@ -563,6 +563,13 @@ export interface Model<TApi extends Api = Api> {
|
|
|
563
563
|
* everything local (selection, caching, usage attribution) keys on `id`.
|
|
564
564
|
*/
|
|
565
565
|
requestModelId?: string;
|
|
566
|
+
/**
|
|
567
|
+
* `reasoning.mode` to send on OpenAI Responses-family requests. Set on
|
|
568
|
+
* generated pro aliases (`gpt-5.6-*-pro` on `openai`/`openai-codex`) that
|
|
569
|
+
* pair a base wire id (`requestModelId`) with OpenAI's pro reasoning
|
|
570
|
+
* serving path. Absent everywhere else; providers omit the wire field.
|
|
571
|
+
*/
|
|
572
|
+
reasoningMode?: "pro";
|
|
566
573
|
name: string;
|
|
567
574
|
api: TApi;
|
|
568
575
|
provider: Provider;
|
|
@@ -623,6 +630,8 @@ export interface Model<TApi extends Api = Api> {
|
|
|
623
630
|
transport?: "pi-native";
|
|
624
631
|
/** Hint that websocket transport should be preferred when supported by the provider implementation. */
|
|
625
632
|
preferWebsockets?: boolean;
|
|
633
|
+
/** Codex Responses Lite transport: send the lite marker and carry instructions/tools as input items (mirrors codex-rs `use_responses_lite`). */
|
|
634
|
+
useResponsesLite?: boolean;
|
|
626
635
|
/** Preferred model to switch to when context promotion is triggered (model id or provider/id). */
|
|
627
636
|
contextPromotionTarget?: string;
|
|
628
637
|
/** Preferred model to use only for compaction (model id or provider/id); the active session model is unchanged. */
|
|
@@ -8,6 +8,15 @@ export declare const OPENAI_HEADERS: {
|
|
|
8
8
|
readonly ORIGINATOR: "originator";
|
|
9
9
|
readonly SESSION_ID: "session_id";
|
|
10
10
|
readonly CONVERSATION_ID: "conversation_id";
|
|
11
|
+
readonly SCOPED_SESSION_ID: "session-id";
|
|
12
|
+
readonly THREAD_ID: "thread-id";
|
|
13
|
+
readonly INSTALLATION_ID: "x-codex-installation-id";
|
|
14
|
+
readonly WINDOW_ID: "x-codex-window-id";
|
|
15
|
+
readonly TURN_METADATA: "x-codex-turn-metadata";
|
|
16
|
+
readonly PARENT_THREAD_ID: "x-codex-parent-thread-id";
|
|
17
|
+
readonly SUBAGENT: "x-openai-subagent";
|
|
18
|
+
/** Responses Lite transport marker (codex-rs `add_responses_lite_header`); value is always `"true"`. */
|
|
19
|
+
readonly RESPONSES_LITE: "x-openai-internal-codex-responses-lite";
|
|
11
20
|
};
|
|
12
21
|
export declare const OPENAI_HEADER_VALUES: {
|
|
13
22
|
readonly BETA_RESPONSES: "responses=experimental";
|
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.
|
|
4
|
+
"version": "16.4.0",
|
|
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.
|
|
37
|
+
"@oh-my-pi/pi-utils": "16.4.0",
|
|
38
38
|
"arktype": "^2.2.0",
|
|
39
39
|
"zod": "^4"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@oh-my-pi/pi-ai": "16.
|
|
42
|
+
"@oh-my-pi/pi-ai": "16.4.0",
|
|
43
43
|
"@types/bun": "^1.3.14"
|
|
44
44
|
},
|
|
45
45
|
"engines": {
|
package/src/compat/openai.ts
CHANGED
|
@@ -71,31 +71,11 @@ const DSML_HEALING_PROVIDERS = new Set([
|
|
|
71
71
|
"openrouter",
|
|
72
72
|
]);
|
|
73
73
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
* builder (not only at discovery) so stale-cached and custom `ollama`-provider
|
|
80
|
-
* specs are backfilled on every `buildModel`, not just on a fresh
|
|
81
|
-
* `omp models refresh`. Custom OpenAI-compatible providers pointed at a local
|
|
82
|
-
* Ollama port under a different provider id are not covered — they must set
|
|
83
|
-
* `compat.reasoningEffortMap` themselves.
|
|
84
|
-
*/
|
|
85
|
-
const OLLAMA_REASONING_EFFORT_MAP: ResolvedOpenAISharedCompat["reasoningEffortMap"] = { minimal: "low", xhigh: "max" };
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Merge the Ollama default effort map under any explicit overrides (overrides
|
|
89
|
-
* win). No-op off the local `ollama` provider or for non-reasoning models.
|
|
90
|
-
*/
|
|
91
|
-
function mergeOllamaReasoningEffortMap(
|
|
92
|
-
compat: ResolvedOpenAISharedCompat,
|
|
93
|
-
provider: string,
|
|
94
|
-
reasoning: boolean | undefined,
|
|
95
|
-
): void {
|
|
96
|
-
if (provider !== "ollama" || !reasoning) return;
|
|
97
|
-
compat.reasoningEffortMap = { ...OLLAMA_REASONING_EFFORT_MAP, ...compat.reasoningEffortMap };
|
|
98
|
-
}
|
|
74
|
+
// Ollama's OpenAI-compatible `reasoning.effort` accepts `high|medium|low|max|none`;
|
|
75
|
+
// `ollama`-provider reasoning models carry the wire-exact `low..max` effort
|
|
76
|
+
// ladder (see getModelDefinedEfforts), so no compat-level remapping is needed.
|
|
77
|
+
// Custom OpenAI-compatible providers pointed at a local Ollama port under a
|
|
78
|
+
// different provider id must set `compat.reasoningEffortMap` themselves.
|
|
99
79
|
|
|
100
80
|
function resolveReasoningDisableMode(
|
|
101
81
|
thinkingFormat: ResolvedOpenAISharedCompat["thinkingFormat"],
|
|
@@ -541,7 +521,7 @@ export function buildOpenAICompat(spec: ModelSpec<"openai-completions">): Resolv
|
|
|
541
521
|
MINIMAX_PROVIDER_OR_ID_PATTERN.test(provider) || MINIMAX_PROVIDER_OR_ID_PATTERN.test(spec.id),
|
|
542
522
|
emptyLengthFinishIsContextError: provider === "ollama",
|
|
543
523
|
usesOpenAIToolCallIdLimit: provider === "openai",
|
|
544
|
-
promptCacheSessionHeader: undefined,
|
|
524
|
+
promptCacheSessionHeader: isGrok ? "x-grok-conv-id" : undefined,
|
|
545
525
|
dropThinkingWhenReasoningEffort: provider === "fireworks",
|
|
546
526
|
};
|
|
547
527
|
|
|
@@ -554,7 +534,6 @@ export function buildOpenAICompat(spec: ModelSpec<"openai-completions">): Resolv
|
|
|
554
534
|
if (spec.compat?.omitReasoningEffort === undefined && !compat.supportsReasoningEffort) {
|
|
555
535
|
compat.omitReasoningEffort = true;
|
|
556
536
|
}
|
|
557
|
-
mergeOllamaReasoningEffortMap(compat, provider, spec.reasoning);
|
|
558
537
|
mergeMimoReasoningEffortMap(compat, isMimoReasoningEffortModel);
|
|
559
538
|
|
|
560
539
|
const whenThinkingPolicy =
|
|
@@ -568,7 +547,6 @@ export function buildOpenAICompat(spec: ModelSpec<"openai-completions">): Resolv
|
|
|
568
547
|
if (whenThinkingPolicy.omitReasoningEffort === undefined && !variant.supportsReasoningEffort) {
|
|
569
548
|
variant.omitReasoningEffort = true;
|
|
570
549
|
}
|
|
571
|
-
mergeOllamaReasoningEffortMap(variant, provider, spec.reasoning);
|
|
572
550
|
mergeMimoReasoningEffortMap(variant, isMimoReasoningEffortModel);
|
|
573
551
|
compat.whenThinking = variant;
|
|
574
552
|
}
|
|
@@ -678,7 +656,6 @@ export function buildOpenAIResponsesCompat(spec: OpenAIResponsesSpecLike): Resol
|
|
|
678
656
|
if (spec.compat?.omitReasoningEffort === undefined && !compat.supportsReasoningEffort) {
|
|
679
657
|
compat.omitReasoningEffort = true;
|
|
680
658
|
}
|
|
681
|
-
mergeOllamaReasoningEffortMap(compat, spec.provider, spec.reasoning);
|
|
682
659
|
return compat;
|
|
683
660
|
}
|
|
684
661
|
|
package/src/discovery/codex.ts
CHANGED
|
@@ -30,6 +30,7 @@ const codexModelEntrySchema = type({
|
|
|
30
30
|
"supported_in_api?": "unknown",
|
|
31
31
|
"priority?": "unknown",
|
|
32
32
|
"prefer_websockets?": "unknown",
|
|
33
|
+
"use_responses_lite?": "unknown",
|
|
33
34
|
});
|
|
34
35
|
|
|
35
36
|
const codexModelsResponseSchema = type({
|
|
@@ -262,6 +263,7 @@ function normalizeCodexModelEntry(entry: unknown, baseUrl: string): NormalizedCo
|
|
|
262
263
|
const reasoning = supportsReasoning(payload.default_reasoning_level, payload.supported_reasoning_levels);
|
|
263
264
|
const input = normalizeInputModalities(payload.input_modalities);
|
|
264
265
|
const preferWebsockets = toBoolean(payload.prefer_websockets) === true;
|
|
266
|
+
const useResponsesLite = toBoolean(payload.use_responses_lite) === true;
|
|
265
267
|
const priority = toFiniteNumber(payload.priority) ?? Number.MAX_SAFE_INTEGER;
|
|
266
268
|
|
|
267
269
|
return {
|
|
@@ -279,6 +281,7 @@ function normalizeCodexModelEntry(entry: unknown, baseUrl: string): NormalizedCo
|
|
|
279
281
|
contextWindow,
|
|
280
282
|
maxTokens,
|
|
281
283
|
...(preferWebsockets ? { preferWebsockets: true } : {}),
|
|
284
|
+
...(useResponsesLite ? { useResponsesLite: true } : {}),
|
|
282
285
|
...(priority !== Number.MAX_SAFE_INTEGER ? { priority } : {}),
|
|
283
286
|
},
|
|
284
287
|
};
|
package/src/effort.ts
CHANGED
|
@@ -5,6 +5,7 @@ export const enum Effort {
|
|
|
5
5
|
Medium = "medium",
|
|
6
6
|
High = "high",
|
|
7
7
|
XHigh = "xhigh",
|
|
8
|
+
Max = "max",
|
|
8
9
|
}
|
|
9
10
|
|
|
10
11
|
export const THINKING_EFFORTS: readonly Effort[] = [
|
|
@@ -13,4 +14,5 @@ export const THINKING_EFFORTS: readonly Effort[] = [
|
|
|
13
14
|
Effort.Medium,
|
|
14
15
|
Effort.High,
|
|
15
16
|
Effort.XHigh,
|
|
17
|
+
Effort.Max,
|
|
16
18
|
];
|
package/src/identity/family.ts
CHANGED
|
@@ -78,7 +78,7 @@ export const isMimoModelIdOrName = memo((value: string): boolean => {
|
|
|
78
78
|
return value.toLowerCase().includes("mimo");
|
|
79
79
|
});
|
|
80
80
|
|
|
81
|
-
const GROK_EFFORT_CAPABLE_PREFIXES = ["grok-3-mini", "grok-4.20-multi-agent", "grok-4.3"] as const;
|
|
81
|
+
const GROK_EFFORT_CAPABLE_PREFIXES = ["grok-3-mini", "grok-4.20-multi-agent", "grok-4.3", "grok-4.5"] as const;
|
|
82
82
|
|
|
83
83
|
/**
|
|
84
84
|
* Grok SKUs that expose the wire `reasoning.effort` dial. Other Grok reasoners
|