@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 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
@@ -4,6 +4,7 @@ export declare const enum Effort {
4
4
  Low = "low",
5
5
  Medium = "medium",
6
6
  High = "high",
7
- XHigh = "xhigh"
7
+ XHigh = "xhigh",
8
+ Max = "max"
8
9
  }
9
10
  export declare const THINKING_EFFORTS: readonly Effort[];
@@ -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;
@@ -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.3.14",
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.3.14",
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.3.14",
42
+ "@oh-my-pi/pi-ai": "16.4.0",
43
43
  "@types/bun": "^1.3.14"
44
44
  },
45
45
  "engines": {
@@ -71,31 +71,11 @@ const DSML_HEALING_PROVIDERS = new Set([
71
71
  "openrouter",
72
72
  ]);
73
73
 
74
- /**
75
- * Ollama's OpenAI-compatible `reasoning.effort` only accepts
76
- * `high|medium|low|max|none`; OMP's `minimal`/`xhigh` levels make the server
77
- * reject the turn with HTTP 400 `invalid reasoning value`. Map the two
78
- * unsupported levels onto the closest accepted ones. Stamped in the compat
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
 
@@ -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
  ];
@@ -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