@oh-my-pi/pi-catalog 16.3.11 → 16.3.13

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,30 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [16.3.13] - 2026-07-09
6
+
7
+ ### Added
8
+
9
+ - Added support for Grok 4.5 across multiple providers
10
+ - Added support for GPT-5.6 series models (Luna, Sol, Terra)
11
+ - Added Aion 3.0 and 3.0 Mini models
12
+ - Added Kuaishou KAT-Coder v2.5 models
13
+ - Added Nex-N2-Mini and SWE-1.7 series models
14
+ - Added Hy3 models and free variants
15
+
16
+ ### Changed
17
+
18
+ - Updated cost and token configurations for various models across providers
19
+ - Renamed several models for consistency (e.g., MiniMax M3, Gemma 4 31B, Qwen variants)
20
+
21
+ ## [16.3.12] - 2026-07-08
22
+
23
+ ### Fixed
24
+
25
+ - Fixed LiteLLM discovery stopping at `/model_group/info` when that endpoint omitted `supports_vision`; it now continues to `/model/info` and preserves `model_info.supports_vision=true` for vision-capable proxy models. ([#4747](https://github.com/can1357/oh-my-pi/issues/4747))
26
+ - Fixed LiteLLM discovery to fall back to bundled catalog metadata when `models.dev` lacks a model reference, preserving reasoning and thinking support for models such as `glm-5.2`. ([#4695](https://github.com/can1357/oh-my-pi/issues/4695))
27
+ - Detected Azure AI Inference / Foundry Anthropic routes as strict-tool-incompatible so resolved Anthropic compat disables strict tools before request construction ([#4679](https://github.com/can1357/oh-my-pi/issues/4679)).
28
+
5
29
  ## [16.3.11] - 2026-07-06
6
30
 
7
31
  ### Added
@@ -24,7 +24,7 @@ export interface ModelManagerOptions<TApi extends Api = Api, TModelsDevPayload =
24
24
  cacheDbPath?: string;
25
25
  /** Optional provider id override for cache namespacing. Defaults to providerId. */
26
26
  cacheProviderId?: string;
27
- /** Maximum cache age in milliseconds before considered stale. Default: 24h. */
27
+ /** Maximum cache age in milliseconds before considered stale. Default: 2h (`DEFAULT_CACHE_TTL_MS`). */
28
28
  cacheTtlMs?: number;
29
29
  /** When true, a successful dynamic fetch is the complete provider catalog and prunes static-only models. */
30
30
  dynamicModelsAuthoritative?: boolean;
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.11",
4
+ "version": "16.3.13",
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.11",
37
+ "@oh-my-pi/pi-utils": "16.3.13",
38
38
  "arktype": "^2.2.0",
39
39
  "zod": "^4"
40
40
  },
41
41
  "devDependencies": {
42
- "@oh-my-pi/pi-ai": "16.3.11",
42
+ "@oh-my-pi/pi-ai": "16.3.13",
43
43
  "@types/bun": "^1.3.14"
44
44
  },
45
45
  "engines": {
@@ -99,18 +99,15 @@ export function buildAnthropicCompat(spec: ModelSpec<"anthropic-messages">): Res
99
99
  // (issue #4192).
100
100
  const isZenmux = modelMatchesHost(spec, "zenmux");
101
101
  const requiresThinkingEnabled = modelMatchesHost(spec, "moonshotNative") && matchesKimiK27CodeFamily(spec);
102
+ const isVertex = isVertexAnthropicRoute(baseUrl);
103
+ const isBedrock = isBedrockAnthropicRoute(baseUrl);
104
+ const isAzure = isAzureAnthropicRoute(baseUrl);
102
105
  const signingEndpoint =
103
- official ||
104
- isCopilot ||
105
- isZenmux ||
106
- isCloudflareAnthropicGateway(baseUrl) ||
107
- isVertexAnthropicRoute(baseUrl) ||
108
- isBedrockAnthropicRoute(baseUrl) ||
109
- isAzureAnthropicRoute(baseUrl);
106
+ official || isCopilot || isZenmux || isCloudflareAnthropicGateway(baseUrl) || isVertex || isBedrock || isAzure;
110
107
  const compat: ResolvedAnthropicCompat = {
111
108
  officialEndpoint: official,
112
109
  signingEndpoint,
113
- disableStrictTools: false,
110
+ disableStrictTools: isAzure,
114
111
  disableAdaptiveThinking: false,
115
112
  supportsEagerToolInputStreaming: !isCopilot,
116
113
  // Long cache retention is only sent to the official API by default;
@@ -13,6 +13,13 @@ const CURSOR_GET_USABLE_MODELS_PATH = "/agent.v1.AgentService/GetUsableModels";
13
13
  const DEFAULT_CONTEXT_WINDOW = 200_000;
14
14
  const DEFAULT_MAX_TOKENS = 64_000;
15
15
 
16
+ /**
17
+ * Model-id families whose native catalogs (anthropic, openai/openai-codex,
18
+ * google) are multimodal. Cursor-only or text-only families (`composer-*`,
19
+ * `grok-code-*`) intentionally stay outside this pattern.
20
+ */
21
+ const CURSOR_MULTIMODAL_ID_PATTERN = /claude|gemini|gpt-|codex/;
22
+
16
23
  const OptionalDisplayNameSchema = type("unknown").pipe(raw => (typeof raw === "string" ? raw : undefined));
17
24
  const CursorAliasesSchema = type("unknown").pipe(raw => {
18
25
  if (Array.isArray(raw)) {
@@ -292,7 +299,7 @@ function normalizeCursorModel(
292
299
  provider: "cursor",
293
300
  baseUrl: baseUrlOverride ?? CURSOR_DEFAULT_BASE_URL,
294
301
  reasoning,
295
- input: ["text"],
302
+ input: inferInputFromCursorId(id),
296
303
  cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
297
304
  contextWindow: DEFAULT_CONTEXT_WINDOW,
298
305
  maxTokens: DEFAULT_MAX_TOKENS,
@@ -312,3 +319,18 @@ function pickModelDisplayName(model: CursorModelDetailsValue, fallbackId: string
312
319
  }
313
320
  return fallbackId;
314
321
  }
322
+
323
+ /**
324
+ * Infers input modalities for Cursor models without a bundled reference.
325
+ *
326
+ * `GetUsableModels` carries no per-model modality metadata, so classification
327
+ * falls back to the model family: families that are multimodal in OMP's own
328
+ * native catalogs accept images, everything else stays text-only. Mirrors
329
+ * `inferInputFromGeminiId` in ./gemini.ts.
330
+ */
331
+ function inferInputFromCursorId(id: string): ("text" | "image")[] {
332
+ if (CURSOR_MULTIMODAL_ID_PATTERN.test(id.toLowerCase())) {
333
+ return ["text", "image"];
334
+ }
335
+ return ["text"];
336
+ }
@@ -35,7 +35,7 @@ export interface ModelManagerOptions<TApi extends Api = Api, TModelsDevPayload =
35
35
  cacheDbPath?: string;
36
36
  /** Optional provider id override for cache namespacing. Defaults to providerId. */
37
37
  cacheProviderId?: string;
38
- /** Maximum cache age in milliseconds before considered stale. Default: 24h. */
38
+ /** Maximum cache age in milliseconds before considered stale. Default: 2h (`DEFAULT_CACHE_TTL_MS`). */
39
39
  cacheTtlMs?: number;
40
40
  /** When true, a successful dynamic fetch is the complete provider catalog and prunes static-only models. */
41
41
  dynamicModelsAuthoritative?: boolean;