@oh-my-pi/pi-catalog 16.3.15 → 16.4.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 CHANGED
@@ -2,6 +2,43 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [16.4.1] - 2026-07-10
6
+
7
+ ### Added
8
+
9
+ - Added GPT-5.6 Luna, Sol, and Terra models
10
+ - Added perplexity-academic-researcher model
11
+
12
+ ### Changed
13
+
14
+ - Updated context windows for multiple GPT-5.6 models
15
+ - Increased max tokens for several models
16
+ - Updated cache write costs for GPT-5.6 variants
17
+ - Reduced pricing for select models
18
+
19
+ ### Removed
20
+
21
+ - Removed the generated GPT-5.6 pro-reasoning aliases (`gpt-5.6-{luna,sol,terra}-pro`) from the `openai-codex` subscription provider — pro reasoning is not offered on subscriptions; the `openai` API-key aliases remain
22
+
23
+ ## [16.4.0] - 2026-07-10
24
+
25
+ ### Breaking Changes
26
+
27
+ - 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.
28
+
29
+ ### Added
30
+
31
+ - 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).
32
+ - Added Novita as a model provider, including public catalog discovery, pricing, limits, modality, reasoning, and tool metadata.
33
+ - Added useResponsesLite to Model and ModelSpec to support the Responses Lite transport, enabled by default for the GPT-5.6 family.
34
+ - Added Effort.Max ("max") as a first-class user-facing thinking level above xhigh.
35
+
36
+ ### Changed
37
+
38
+ - Enabled reasoning effort controls for Grok 4.5 and updated support flags for additional Grok variants
39
+ - Standardized reasoning effort levels to use a wire-exact max tier across all model providers, including Devin routing and Ollama configurations.
40
+ - Updated costs and context windows for various models in the catalog.
41
+
5
42
  ## [16.3.15] - 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";
@@ -56,14 +56,14 @@ export interface OpenAIModelManagerConfig {
56
56
  export declare function openaiModelManagerOptions(config?: OpenAIModelManagerConfig): ModelManagerOptions<"openai-responses">;
57
57
  /**
58
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
59
+ * first-party `openai` gpt-5.6 rows. Each alias inherits the base row's
60
+ * metadata, requests the base wire id via `requestModelId`, and sets
61
+ * `reasoningMode: "pro"` so Responses-family request builders emit
62
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.
63
+ * sources merge: stale copies of the owned aliases (previous snapshot,
64
+ * including retired `openai-codex` rows) are dropped and re-projected from the
65
+ * current base rows so alias metadata always tracks the base, while a real
66
+ * upstream model that occupies an alias id wins and suppresses the projection.
67
67
  */
68
68
  export declare function projectOpenAIProReasoningAliases(models: readonly ModelSpec<Api>[]): ModelSpec<Api>[];
69
69
  export interface GroqModelManagerConfig {
@@ -90,6 +90,14 @@ export interface NvidiaModelManagerConfig {
90
90
  fetch?: FetchImpl;
91
91
  }
92
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">;
93
101
  export interface XaiModelManagerConfig {
94
102
  apiKey?: string;
95
103
  baseUrl?: string;
@@ -630,6 +630,8 @@ export interface Model<TApi extends Api = Api> {
630
630
  transport?: "pi-native";
631
631
  /** Hint that websocket transport should be preferred when supported by the provider implementation. */
632
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;
633
635
  /** Preferred model to switch to when context promotion is triggered (model id or provider/id). */
634
636
  contextPromotionTarget?: string;
635
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.15",
4
+ "version": "16.4.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.0",
37
- "@oh-my-pi/pi-utils": "16.3.15",
37
+ "@oh-my-pi/pi-utils": "16.4.1",
38
38
  "arktype": "^2.2.0",
39
39
  "zod": "^4"
40
40
  },
41
41
  "devDependencies": {
42
- "@oh-my-pi/pi-ai": "16.3.15",
42
+ "@oh-my-pi/pi-ai": "16.4.1",
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"],
@@ -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
  ];