@oh-my-pi/pi-catalog 16.3.2 → 16.3.4

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,29 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [16.3.4] - 2026-07-03
6
+
7
+ ### Added
8
+
9
+ - Added Baseten as a supported model provider
10
+ - Added support for new models from Baseten, including DeepSeek V4 Pro and Kimi series
11
+ - Added new Devin agent models: Claude 5 Fable variants
12
+ - Added new Github Copilot models: Kimi K2.7 Code and MAI-Code-1-Flash
13
+ - Added Poolside Laguna XS 2.1 models via Kilo and OpenRouter providers
14
+ - Added support for Claude Fable 5 (Free) via Zenmux provider
15
+
16
+ ### Changed
17
+
18
+ - Updated priority ordering to include Baseten
19
+ - Updated pricing and limits for various existing models in the catalog
20
+
21
+ ## [16.3.3] - 2026-07-02
22
+
23
+ ### Fixed
24
+
25
+ - Extended Anthropic-compatible signing-endpoint recognition to Cloudflare AI Gateway, Google Vertex, AWS Bedrock, and Azure AI Inference / Foundry to ensure consistent reasoning-replay and signature-stripping behavior, and exposed ResolvedAnthropicCompat.signingEndpoint in the public API.
26
+ - Fixed Zhipu Coding Plan runtime discovery to prioritize account-scoped model lists over bundled fallback models, preventing routing errors for valid non-z.ai keys.
27
+
5
28
  ## [16.3.2] - 2026-07-02
6
29
 
7
30
  ### Fixed
@@ -86,6 +86,10 @@ export declare const KNOWN_HOSTS: {
86
86
  readonly providers: readonly ["together"];
87
87
  readonly urlMarkers: readonly ["api.together.xyz"];
88
88
  };
89
+ readonly baseten: {
90
+ readonly providers: readonly ["baseten"];
91
+ readonly urlMarkers: readonly ["baseten.co"];
92
+ };
89
93
  /** URL-only on purpose: the `fireworks`/`firepass` providers route per-model and not every model is Fireworks-shaped. */
90
94
  readonly fireworks: {
91
95
  readonly urlMarkers: readonly ["fireworks.ai"];
@@ -23,6 +23,15 @@ export declare const CATALOG_PROVIDERS: readonly [{
23
23
  readonly catalogDiscovery: {
24
24
  readonly label: "Alibaba Coding Plan";
25
25
  };
26
+ }, {
27
+ readonly id: "baseten";
28
+ readonly defaultModel: "moonshotai/Kimi-K2.7-Code";
29
+ readonly envVars: readonly ["BASETEN_API_KEY"];
30
+ readonly createModelManagerOptions: (config: ModelManagerConfig) => import("..").ModelManagerOptions<"openai-completions", unknown>;
31
+ readonly dynamicModelsAuthoritative: true;
32
+ readonly catalogDiscovery: {
33
+ readonly label: "Baseten";
34
+ };
26
35
  }, {
27
36
  readonly id: "amazon-bedrock";
28
37
  readonly defaultModel: "us.anthropic.claude-opus-4-8";
@@ -414,9 +423,10 @@ export declare const CATALOG_PROVIDERS: readonly [{
414
423
  };
415
424
  }, {
416
425
  readonly id: "zhipu-coding-plan";
417
- readonly defaultModel: "glm-5.2";
426
+ readonly defaultModel: "glm-5.1";
418
427
  readonly envVars: readonly ["ZHIPU_API_KEY"];
419
428
  readonly createModelManagerOptions: (config: ModelManagerConfig) => import("..").ModelManagerOptions<"openai-completions", unknown>;
429
+ readonly dynamicModelsAuthoritative: true;
420
430
  readonly catalogDiscovery: {
421
431
  readonly label: "Zhipu Coding Plan";
422
432
  };
@@ -303,6 +303,12 @@ export interface VeniceModelManagerConfig {
303
303
  fetch?: FetchImpl;
304
304
  }
305
305
  export declare function veniceModelManagerOptions(config?: VeniceModelManagerConfig): ModelManagerOptions<"openai-completions">;
306
+ export interface BasetenModelManagerConfig {
307
+ apiKey?: string;
308
+ baseUrl?: string;
309
+ fetch?: FetchImpl;
310
+ }
311
+ export declare function basetenModelManagerOptions(config?: BasetenModelManagerConfig): ModelManagerOptions<"openai-completions">;
306
312
  export interface TogetherModelManagerConfig {
307
313
  apiKey?: string;
308
314
  baseUrl?: string;
@@ -492,6 +492,17 @@ export type ResolvedAnthropicCompat = Required<AnthropicCompat> & {
492
492
  * env headers, and cache-TTL shaping without per-request URL parsing.
493
493
  */
494
494
  officialEndpoint: boolean;
495
+ /**
496
+ * The configured endpoint enforces Anthropic's signature protocol on
497
+ * replayed thinking blocks — either the official API itself or a proxy
498
+ * that forwards to it (GitHub Copilot, ZenMux, Cloudflare AI Gateway's
499
+ * `/anthropic` route, Google Vertex's `publishers/anthropic/…`).
500
+ * Downstream transforms strip stale cross-model thinking signatures on
501
+ * these endpoints so the signing proxy doesn't 400 with
502
+ * `Invalid signature in thinking block` (#4297). Superset of
503
+ * {@link officialEndpoint}.
504
+ */
505
+ signingEndpoint: boolean;
495
506
  };
496
507
  /**
497
508
  * Compatibility settings for the devin-agent (Codeium Cascade) API. Cascade
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.2",
4
+ "version": "16.3.4",
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.2",
37
+ "@oh-my-pi/pi-utils": "16.3.4",
38
38
  "arktype": "^2.2.0",
39
39
  "zod": "^4"
40
40
  },
41
41
  "devDependencies": {
42
- "@oh-my-pi/pi-ai": "16.3.2",
42
+ "@oh-my-pi/pi-ai": "16.3.4",
43
43
  "@types/bun": "^1.3.14"
44
44
  },
45
45
  "engines": {
@@ -36,6 +36,52 @@ function matchesKimiK27CodeFamily(spec: ModelSpec<"anthropic-messages">): boolea
36
36
  return spec.id === "kimi-for-coding" && /k2\.?7 code/i.test(spec.name ?? "");
37
37
  }
38
38
 
39
+ const CLOUDFLARE_ANTHROPIC_GATEWAY_URL_MARKER = /gateway\.ai\.cloudflare\.com\/.+\/anthropic(?:\/|$)/i;
40
+ const VERTEX_ANTHROPIC_URL_MARKER = /aiplatform\.googleapis\.com\/.+\/publishers\/anthropic\//i;
41
+ const BEDROCK_ANTHROPIC_URL_MARKER = /(?:^|\/\/|\.)bedrock-runtime\.[a-z0-9-]+\.amazonaws\.com/i;
42
+ const AZURE_ANTHROPIC_URL_MARKER = /(?:^|\/\/|\.)[a-z0-9-]+\.(?:inference|services)\.ai\.azure\.com/i;
43
+
44
+ /**
45
+ * Cloudflare AI Gateway's `/anthropic` route forwards to signature-enforcing
46
+ * Anthropic (same failure class as GitHub Copilot #2851 / ZenMux #4192).
47
+ * Detection is by baseUrl marker rather than provider id: users routinely
48
+ * declare `provider: "custom"` (or other free-form ids) in `models.yml` for
49
+ * their own Cloudflare gateway account.
50
+ */
51
+ function isCloudflareAnthropicGateway(baseUrl?: string): boolean {
52
+ return baseUrl !== undefined && CLOUDFLARE_ANTHROPIC_GATEWAY_URL_MARKER.test(baseUrl);
53
+ }
54
+
55
+ /**
56
+ * Google Vertex's `publishers/anthropic/models/…:streamRawPredict` route
57
+ * proxies Claude through Google's identity layer and returns full thinking
58
+ * signatures, so it is a SIGNING endpoint.
59
+ */
60
+ function isVertexAnthropicRoute(baseUrl?: string): boolean {
61
+ return baseUrl !== undefined && VERTEX_ANTHROPIC_URL_MARKER.test(baseUrl);
62
+ }
63
+
64
+ /**
65
+ * AWS Bedrock's Anthropic route (`bedrock-runtime.<region>.amazonaws.com`)
66
+ * forwards Claude requests through Anthropic's signature protocol. Users can
67
+ * front Bedrock with a custom `anthropic-messages` provider entry in
68
+ * `models.yml`; the URL marker makes those signing by default without
69
+ * requiring a provider-id list.
70
+ */
71
+ function isBedrockAnthropicRoute(baseUrl?: string): boolean {
72
+ return baseUrl !== undefined && BEDROCK_ANTHROPIC_URL_MARKER.test(baseUrl);
73
+ }
74
+
75
+ /**
76
+ * Azure AI Inference / Foundry Anthropic route
77
+ * (`<resource>.inference.ai.azure.com`, `<resource>.services.ai.azure.com`).
78
+ * Fronts Claude behind Azure identity and enforces Anthropic signatures on
79
+ * replay.
80
+ */
81
+ function isAzureAnthropicRoute(baseUrl?: string): boolean {
82
+ return baseUrl !== undefined && AZURE_ANTHROPIC_URL_MARKER.test(baseUrl);
83
+ }
84
+
39
85
  /** Build the resolved anthropic-messages compat record for a model spec. */
40
86
  export function buildAnthropicCompat(spec: ModelSpec<"anthropic-messages">): ResolvedAnthropicCompat {
41
87
  const baseUrl = spec.baseUrl;
@@ -53,8 +99,17 @@ export function buildAnthropicCompat(spec: ModelSpec<"anthropic-messages">): Res
53
99
  // (issue #4192).
54
100
  const isZenmux = modelMatchesHost(spec, "zenmux");
55
101
  const requiresThinkingEnabled = modelMatchesHost(spec, "moonshotNative") && matchesKimiK27CodeFamily(spec);
102
+ const signingEndpoint =
103
+ official ||
104
+ isCopilot ||
105
+ isZenmux ||
106
+ isCloudflareAnthropicGateway(baseUrl) ||
107
+ isVertexAnthropicRoute(baseUrl) ||
108
+ isBedrockAnthropicRoute(baseUrl) ||
109
+ isAzureAnthropicRoute(baseUrl);
56
110
  const compat: ResolvedAnthropicCompat = {
57
111
  officialEndpoint: official,
112
+ signingEndpoint,
58
113
  disableStrictTools: false,
59
114
  disableAdaptiveThinking: false,
60
115
  supportsEagerToolInputStreaming: !isCopilot,
@@ -73,26 +128,23 @@ export function buildAnthropicCompat(spec: ModelSpec<"anthropic-messages">): Res
73
128
  // into a class that reads `.id`.
74
129
  requiresToolResultId: isZai,
75
130
  requiresThinkingEnabled,
76
- // Official Anthropic enforces signature-based thinking-chain integrity, so
77
- // unsigned thinking blocks must stay text there. Anthropic-compatible
78
- // reasoning endpoints commonly emit unsigned thinking blocks while still
79
- // expecting them back as `type: "thinking"` on continuation; demoting them
80
- // loses the reasoning chain and can destabilize the next tool-call
81
- // arguments (#2005). Known non-signing hosts (Z.AI, DeepSeek) are also
82
- // preserved for compatibility.
131
+ // Official Anthropic and Anthropic-compatible signing proxies enforce
132
+ // signature-based thinking-chain integrity, so unsigned thinking blocks
133
+ // must stay text there. Every other `anthropic-messages` reasoning
134
+ // endpoint replays unsigned thinking natively so the reasoning chain
135
+ // survives continuation and doesn't destabilize the next tool-call
136
+ // arguments (#2005, #2257, #2265, #3288, #3433, #3434). Opaque custom
137
+ // signing proxies remain the reporter's responsibility to mark with
138
+ // `compat.replayUnsignedThinking: false`; the transport surfaces a
139
+ // pointed remediation the first time the signing 400 fires (#4297).
83
140
  //
84
- // GitHub Copilot's `anthropic-messages` proxy and ZenMux's Anthropic route
85
- // are excluded: both forward to signature-enforcing Anthropic and return
86
- // full thinking signatures, so they are SIGNING endpoints. Replaying a
87
- // stripped/unsigned thinking block as `signature: ""` there 400s the whole
88
- // request ("Invalid signature") most visibly when a checkpoint/branch-
89
- // return turn's end_turn-bound signature is stripped on replay (issues
90
- // #2851, #4192). Treating them like official Anthropic degrades such
91
- // blocks to text instead, which the API accepts.
92
- replayUnsignedThinking:
93
- !isCopilot &&
94
- !isZenmux &&
95
- (isZai || modelMatchesHost(spec, "deepseekFamily") || (spec.reasoning && !official)),
141
+ // Known signing Anthropic-messages hosts (Copilot, ZenMux, Cloudflare
142
+ // AI Gateway `/anthropic`, Google Vertex `publishers/anthropic`, AWS
143
+ // Bedrock `bedrock-runtime.<region>.amazonaws.com`, and Azure
144
+ // AI Inference / Foundry `<res>.(inference|services).ai.azure.com`)
145
+ // are excluded automatically because they can be recognised by provider
146
+ // id or baseUrl marker.
147
+ replayUnsignedThinking: !signingEndpoint && (Boolean(spec.reasoning) || modelMatchesHost(spec, "deepseekFamily")),
96
148
  escapeBuiltinToolNames: modelMatchesHost(spec, "umans"),
97
149
  };
98
150
  applyCompatOverrides(compat, spec.compat);
package/src/hosts.ts CHANGED
@@ -47,6 +47,7 @@ export const KNOWN_HOSTS = {
47
47
  xai: { providers: ["xai"], urlMarkers: ["api.x.ai"] },
48
48
  mistral: { providers: ["mistral"], urlMarkers: ["mistral.ai"] },
49
49
  together: { providers: ["together"], urlMarkers: ["api.together.xyz"] },
50
+ baseten: { providers: ["baseten"], urlMarkers: ["baseten.co"] },
50
51
  /** URL-only on purpose: the `fireworks`/`firepass` providers route per-model and not every model is Fireworks-shaped. */
51
52
  fireworks: { urlMarkers: ["fireworks.ai"] },
52
53
  groq: { providers: ["groq"], urlMarkers: ["api.groq.com"] },
@@ -20,6 +20,7 @@ const DEFAULT_MODEL_PROVIDER_ORDER = [
20
20
  // High-quality aggregators / hosted inference providers.
21
21
  "fireworks",
22
22
  "cerebras",
23
+ "baseten",
23
24
  "openrouter",
24
25
  "aimlapi",
25
26
  "together",