@oh-my-pi/pi-catalog 18.4.3 → 18.4.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,23 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [18.4.4] - 2026-09-29
6
+
7
+ ### Added
8
+
9
+ - Added `compat.bedrockMessagesApi` for `anthropic-messages` models: detected from a Bedrock `/anthropic` base URL under any provider id, it drops tool `strict`, fits `metadata.user_id` to Bedrock's pattern, and enables on-demand compaction; set it in `models.yml` to opt a proxy or an `ANTHROPIC_BASE_URL` reroute in, or `false` to opt out ([#13311](https://github.com/can1357/oh-my-pi/pull/13311)).
10
+ - Added GPT-6.1 Sol pricing for `openai-codex` (`gpt-6.1-sol`, `gpt-6.1-sol-wm`: $2 input, $10 output, $0.10 cached input), so Codex usage shows cost instead of $0 ([#13782](https://github.com/can1357/oh-my-pi/pull/13782) by [@H4vC](https://github.com/H4vC)).
11
+ - Added `Model.serviceTiers`, the service tiers a provider advertises for a model; Codex discovery fills it from `service_tiers` (e.g. `priority`, `ultrafast`) ([#13782](https://github.com/can1357/oh-my-pi/pull/13782) by [@H4vC](https://github.com/H4vC)).
12
+ - Added the documented 922K input maximum for `openai-codex/gpt-6.1-sol` with extended context on (Codex reports a stale 872K), matching GPT-6 Astra; the default window stays 272K ([#13782](https://github.com/can1357/oh-my-pi/pull/13782) by [@H4vC](https://github.com/H4vC)).
13
+
14
+ ### Fixed
15
+
16
+ - Fixed `openai-codex/gpt-6.1-sol` not appearing in Codex discovery even on accounts where the Codex CLI lists it: the backend hides it from client version 0.155.1, so Codex requests now report 0.159.0, the current Codex CLI release ([#13782](https://github.com/can1357/oh-my-pi/pull/13782) by [@H4vC](https://github.com/H4vC)).
17
+ - Fixed on-demand compaction staying off for Claude models on the `amazon-bedrock` and `bedrock-mantle` providers when they use Bedrock's `/anthropic` routes ([#13311](https://github.com/can1357/oh-my-pi/pull/13311) by [@mustafaabidali](https://github.com/mustafaabidali)).
18
+ - Fixed Claude models on Bedrock's `/anthropic` routes resolving `compat.disableStrictTools: false`, although those routes reject the tool `strict` field ([#13311](https://github.com/can1357/oh-my-pi/pull/13311) by [@mustafaabidali](https://github.com/mustafaabidali)).
19
+ - Fixed Bedrock's FIPS (`bedrock-runtime-fips`) and AWS PrivateLink (`vpce-….vpce.amazonaws.com`) hostnames, and Mantle's documented `/v1` OpenAI base, not being recognized as Bedrock routes, which left them without native compaction and the `/anthropic` request fixes ([#13311](https://github.com/can1357/oh-my-pi/pull/13311) by [@mustafaabidali](https://github.com/mustafaabidali)).
20
+ - Added `supportsBetweenToolsThinking` Anthropic compat flag (`supports-between-tools-thinking` KDL axis), enabled for Claude Sonnet 5.5
21
+
5
22
  ## [18.4.3] - 2026-09-28
6
23
 
7
24
  ### Added
@@ -6,6 +6,12 @@
6
6
  * prefix check would accept lookalikes like `https://api.anthropic.com.evil.com`.
7
7
  */
8
8
  export declare function isOfficialAnthropicApiUrl(baseUrl?: string): boolean;
9
+ /**
10
+ * Amazon Bedrock's Anthropic Messages API: the `/anthropic` path on the
11
+ * bedrock-runtime or bedrock-mantle endpoint. It rejects the tool `strict`
12
+ * field and enforces Anthropic signatures on replay.
13
+ */
14
+ export declare function isBedrockAnthropicRoute(baseUrl?: string): boolean;
9
15
  /**
10
16
  * Azure AI Inference / Foundry Anthropic route
11
17
  * (`<resource>.inference.ai.azure.com`, `<resource>.services.ai.azure.com`).
@@ -165,5 +165,18 @@ export declare function isVertexExpressOpenAIUrl(baseUrl: string): boolean;
165
165
  export declare function isVertexRawPredictUrl(baseUrl: string): boolean;
166
166
  /** Azure OpenAI deployment-scoped path (`…/deployments/<name>/…`). */
167
167
  export declare function isAzureDeploymentsUrl(baseUrl: string): boolean;
168
+ /**
169
+ * Amazon Bedrock API route on a bedrock-runtime or bedrock-mantle endpoint
170
+ * (public, FIPS, or PrivateLink hostname):
171
+ * - `anthropic`: the Anthropic Messages API under `/anthropic`.
172
+ * - `openai`: the OpenAI-compatible APIs under `/openai`, plus Mantle's
173
+ * documented `/v1` base (`https://bedrock-mantle.<region>.api.aws/v1`).
174
+ *
175
+ * Hostnames are parsed strictly so proxies that embed these hosts in a path
176
+ * do not match.
177
+ */
178
+ export declare function isBedrockRouteUrl(baseUrl: string | undefined, route: "openai" | "anthropic"): boolean;
179
+ /** Amazon Bedrock's OpenAI-compatible routes; see {@link isBedrockRouteUrl}. */
180
+ export declare function isBedrockOpenAIUrl(baseUrl: string | undefined): boolean;
168
181
  /** Alibaba DashScope consumer `compatible-mode` endpoint (rejects multimodal arrays for some text-only SKUs). */
169
182
  export declare function isDashscopeCompatibleModeUrl(baseUrl: string): boolean;
@@ -481,6 +481,15 @@ export interface AnthropicCompat {
481
481
  * `tools.<n>.custom.strict: Extra inputs are not permitted`.
482
482
  */
483
483
  disableStrictTools?: boolean;
484
+ /**
485
+ * The endpoint is Amazon Bedrock's Anthropic Messages API (`/anthropic` on
486
+ * bedrock-runtime or bedrock-mantle). Requests drop tool `strict`, fit
487
+ * `metadata.user_id` to Bedrock's request-metadata pattern, and may use
488
+ * on-demand compaction. Detected from the model `baseUrl`; set it in
489
+ * models.yml `compat` for a route the URL check cannot see (a proxy, an
490
+ * `ANTHROPIC_BASE_URL` reroute) or to `false` to opt out.
491
+ */
492
+ bedrockMessagesApi?: boolean;
484
493
  /**
485
494
  * Map adaptive thinking (`thinking: { type: "adaptive" }`) to
486
495
  * `{ type: "enabled", budget_tokens }`. Vertex AI rejects the `adaptive`
@@ -508,6 +517,13 @@ export interface AnthropicCompat {
508
517
  * `input_transformations` under the thinking-binding-controls beta.
509
518
  */
510
519
  supportsThinkingBindingControls?: boolean;
520
+ /**
521
+ * Whether the model replaces `thinking: { type: "disabled" }` with
522
+ * `thinking: { type: "between_tools" }` (Claude Sonnet 5.5). The disabled
523
+ * form is rejected with a 400; `between_tools` skips up-front thinking and
524
+ * only allows progress updates between tool calls.
525
+ */
526
+ supportsBetweenToolsThinking?: boolean;
511
527
  /**
512
528
  * Whether the model accepts a forced `tool_choice` (`{ type: "any" }` or
513
529
  * `{ type: "tool", name }`). Claude Fable/Mythos 5 reject forced tool use
@@ -804,9 +820,15 @@ export interface ResolvedOpenAIResponsesCompat extends ResolvedOpenAISharedCompa
804
820
  */
805
821
  export type ResolvedOpenRouterCompat = ResolvedOpenAICompat & ResolvedOpenAIResponsesCompat;
806
822
  /** Fully-resolved anthropic-messages compat view (same contract as `ResolvedOpenAICompat`). */
807
- export type ResolvedAnthropicCompat = Required<Omit<AnthropicCompat, "streamIdleTimeoutMs" | "thinkingLoopGuard">> & {
823
+ export type ResolvedAnthropicCompat = Required<Omit<AnthropicCompat, "streamIdleTimeoutMs" | "thinkingLoopGuard" | "bedrockMessagesApi">> & {
808
824
  /** Thinking-loop watchdog guard family applied to streamed reasoning. */
809
825
  thinkingLoopGuard?: AnthropicCompat["thinkingLoopGuard"];
826
+ /**
827
+ * Bedrock's Anthropic Messages API (see {@link AnthropicCompat.bedrockMessagesApi}).
828
+ * `true` when detected or configured; otherwise unset, so rows baked before
829
+ * this field keep matching.
830
+ */
831
+ bedrockMessagesApi?: boolean;
810
832
  /**
811
833
  * Stream-watchdog idle-timeout fallback in ms for slow reasoning hosts; 0 disables the idle watchdog.
812
834
  * Undefined defers to `PI_STREAM_IDLE_TIMEOUT_MS`, then the legacy
@@ -1143,6 +1165,12 @@ export interface Model<TApi extends Api = Api> {
1143
1165
  useResponsesLite?: boolean;
1144
1166
  /** Codex Code Mode restriction: model expects tools routed through a programmatic exec surface (mirrors codex-rs `tool_mode`). */
1145
1167
  toolMode?: "code_mode_only";
1168
+ /**
1169
+ * Service-tier ids the provider advertises for this model (Codex discovery
1170
+ * `service_tiers[].id`, e.g. `priority`, `ultrafast`). Absent when the
1171
+ * provider publishes no per-model tier list.
1172
+ */
1173
+ serviceTiers?: readonly string[];
1146
1174
  /** Preferred model to switch to when context promotion is triggered (model id or provider/id). */
1147
1175
  contextPromotionTarget?: string;
1148
1176
  /** Preferred model to use only for compaction (model id or provider/id); the active session model is unchanged. */
@@ -7,10 +7,12 @@ export declare const CODEX_BASE_URL = "https://chatgpt.com/backend-api";
7
7
  * Updated from npm by `bun run check-spoofed-versions --update`.
8
8
  *
9
9
  * The backend version-gates model availability against this value on both
10
- * `/models?client_version=` and `/responses`; 0.155.1 exposes GPT-6 Sol and Luna.
11
- * An older pin silently hides newer SKUs from discovery.
10
+ * `/models?client_version=` and `/responses`, independently of a model's
11
+ * declared `minimal_client_version`: GPT-6.1 Sol declares 0.153.0 yet is
12
+ * omitted from `/models` at 0.155.1 and listed at 0.159.0. An older pin
13
+ * silently hides newer SKUs from discovery.
12
14
  */
13
- export declare const CODEX_CLIENT_VERSION = "0.155.1";
15
+ export declare const CODEX_CLIENT_VERSION = "0.159.0";
14
16
  export declare const OPENAI_HEADERS: {
15
17
  readonly BETA: "OpenAI-Beta";
16
18
  /** Codex feature-negotiation header; values identify opt-in wire protocols. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oh-my-pi/pi-catalog",
3
- "version": "18.4.3",
3
+ "version": "18.4.4",
4
4
  "description": "Model catalog for omp: bundled model database, provider discovery descriptors, model identity, classification, and equivalence",
5
5
  "keywords": [
6
6
  "ai",
@@ -93,12 +93,12 @@
93
93
  "gen:proto": "bun scripts/generate-protocols.ts"
94
94
  },
95
95
  "dependencies": {
96
- "@oh-my-pi/omptype": "18.4.3",
97
- "@oh-my-pi/pi-utils": "18.4.3"
96
+ "@oh-my-pi/omptype": "18.4.4",
97
+ "@oh-my-pi/pi-utils": "18.4.4"
98
98
  },
99
99
  "devDependencies": {
100
100
  "@bgotink/kdl": "0.4.0",
101
- "@oh-my-pi/pi-ai": "18.4.3",
101
+ "@oh-my-pi/pi-ai": "18.4.4",
102
102
  "@types/bun": "^1.3.14"
103
103
  },
104
104
  "engines": {
@@ -5,7 +5,7 @@
5
5
  * pi-ai both consume these; URL matching is the one detection surface that
6
6
  * stays in code.
7
7
  */
8
- import { hostMatchesUrl } from "../hosts";
8
+ import { hostMatchesUrl, isBedrockRouteUrl } from "../hosts";
9
9
 
10
10
  const OFFICIAL_ANTHROPIC_URL = "https://api.anthropic.com";
11
11
 
@@ -27,6 +27,15 @@ const VERTEX_ANTHROPIC_URL_MARKER = /aiplatform\.googleapis\.com\/.+\/publishers
27
27
  const BEDROCK_ANTHROPIC_URL_MARKER = /(?:^|\/\/|\.)bedrock-runtime\.[a-z0-9-]+\.amazonaws\.com/i;
28
28
  const AZURE_ANTHROPIC_URL_MARKER = /(?:^|\/\/|\.)[a-z0-9-]+\.(?:inference|services)\.ai\.azure\.com/i;
29
29
 
30
+ /**
31
+ * Amazon Bedrock's Anthropic Messages API: the `/anthropic` path on the
32
+ * bedrock-runtime or bedrock-mantle endpoint. It rejects the tool `strict`
33
+ * field and enforces Anthropic signatures on replay.
34
+ */
35
+ export function isBedrockAnthropicRoute(baseUrl?: string): boolean {
36
+ return isBedrockRouteUrl(baseUrl, "anthropic");
37
+ }
38
+
30
39
  /**
31
40
  * Azure AI Inference / Foundry Anthropic route
32
41
  * (`<resource>.inference.ai.azure.com`, `<resource>.services.ai.azure.com`).
@@ -53,6 +62,7 @@ export function isAnthropicSigningProxyUrl(baseUrl?: string): boolean {
53
62
  (CLOUDFLARE_ANTHROPIC_GATEWAY_URL_MARKER.test(baseUrl) ||
54
63
  VERTEX_ANTHROPIC_URL_MARKER.test(baseUrl) ||
55
64
  BEDROCK_ANTHROPIC_URL_MARKER.test(baseUrl))) ||
65
+ isBedrockAnthropicRoute(baseUrl) ||
56
66
  isAzureAnthropicRoute(baseUrl)
57
67
  );
58
68
  }
@@ -190,6 +190,7 @@ export const AXES: Readonly<Record<string, AxisDef>> = {
190
190
  "zai-reasoning-effort-dialect": wire("zaiReasoningEffortDialect", ["openai"]),
191
191
 
192
192
  // ── wire: anthropic-messages ──
193
+ "bedrock-messages-api": wire("bedrockMessagesApi", ["anthropic"]),
193
194
  "allow-anthropic-header-overrides": wire("allowAnthropicHeaderOverrides", ["anthropic"]),
194
195
  "disable-adaptive-thinking": wire("disableAdaptiveThinking", ["anthropic"]),
195
196
  "disable-strict-tools": wire("disableStrictTools", ["anthropic"]),
@@ -209,6 +210,7 @@ export const AXES: Readonly<Record<string, AxisDef>> = {
209
210
  "supports-mid-conversation-tool-changes": wire("supportsMidConversationToolChanges", ["anthropic"]),
210
211
  "supports-per-message-effort": wire("supportsPerMessageEffort", ["anthropic"]),
211
212
  "supports-server-compaction": wire("supportsServerCompaction", ["anthropic"]),
213
+ "supports-between-tools-thinking": wire("supportsBetweenToolsThinking", ["anthropic"]),
212
214
  "supports-thinking-binding-controls": wire("supportsThinkingBindingControls", ["anthropic"]),
213
215
  "supports-turn-scoped-system": wire("supportsTurnScopedSystem", ["anthropic"]),
214
216
 
@@ -31,7 +31,12 @@ import type {
31
31
  ResolvedOpenAISharedCompat,
32
32
  ThinkingConfig,
33
33
  } from "../types";
34
- import { isAnthropicSigningProxyUrl, isAzureAnthropicRoute, isOfficialAnthropicApiUrl } from "./anthropic";
34
+ import {
35
+ isAnthropicSigningProxyUrl,
36
+ isAzureAnthropicRoute,
37
+ isBedrockAnthropicRoute,
38
+ isOfficialAnthropicApiUrl,
39
+ } from "./anthropic";
35
40
  import { applyCompatOverrides } from "./apply";
36
41
  import { API_COMPAT_RECORDS, AXES, type CompatRecordName } from "./axes";
37
42
  import { hasModelScopedEffortsRule, resolveCascade } from "./cascade";
@@ -853,7 +858,9 @@ function resolveAnthropicPolicy(
853
858
  const isCopilot = modelMatchesHost(spec, "githubCopilot");
854
859
  const isZenmux = modelMatchesHost(spec, "zenmux");
855
860
  const requiresThinkingEnabled = modelMatchesHost(spec, "moonshotNative") && facts.kimiMandatoryThinking;
856
- const isAzure = isAzureAnthropicRoute(baseUrl);
861
+ const bedrockMessagesApi = isBedrockAnthropicRoute(baseUrl);
862
+ // Both routes reject the top-level tool `strict` field.
863
+ const rejectsStrictTools = isAzureAnthropicRoute(baseUrl) || bedrockMessagesApi;
857
864
  const signingEndpoint = official || isCopilot || isZenmux || isAnthropicSigningProxyUrl(baseUrl);
858
865
  const compat: ResolvedAnthropicCompat = {
859
866
  officialEndpoint: official,
@@ -862,7 +869,9 @@ function resolveAnthropicPolicy(
862
869
  supportsServerCompaction: false,
863
870
  firstPartyProvider: false,
864
871
  supportsOutputEffort: true,
865
- disableStrictTools: isAzure,
872
+ disableStrictTools: rejectsStrictTools,
873
+ // Present as a key so models.yml `compat` can set it; unset unless detected.
874
+ bedrockMessagesApi: bedrockMessagesApi || undefined,
866
875
  disableAdaptiveThinking: false,
867
876
  allowAnthropicHeaderOverrides: false,
868
877
  supportsEagerToolInputStreaming: official,
@@ -872,6 +881,7 @@ function resolveAnthropicPolicy(
872
881
  supportsMidConversationToolChanges: false,
873
882
  supportsPerMessageEffort: false,
874
883
  supportsThinkingBindingControls: false,
884
+ supportsBetweenToolsThinking: false,
875
885
  supportsForcedToolChoice: !requiresThinkingEnabled && !facts.family("fable", "mythos"),
876
886
  supportsSamplingParams: !facts.anthropicAdaptiveGenAtLeast("4.7"),
877
887
  requiresToolResultId: false,
@@ -7,11 +7,11 @@ class "anthropic" {
7
7
  thinking-prefix-binding #true
8
8
  }
9
9
  }
10
- // On-demand compaction (compact-2026-09-04) is available on the Claude
11
- // API and Vertex, not Amazon Bedrock or unverified gateway deployments.
10
+ // On-demand compaction (compact-2026-09-04) works on the Claude API, Vertex,
11
+ // and Amazon Bedrock's `/anthropic` routes, not Bedrock Converse.
12
12
  // Foundry / Claude Platform on AWS are first-party Anthropic routes whose
13
13
  // effective URLs are checked at request time.
14
- on "anthropic" "google-vertex" {
14
+ on "anthropic" "google-vertex" "amazon-bedrock" "bedrock-mantle" {
15
15
  family "fable" {
16
16
  revision ">=5" {
17
17
  supports-server-compaction #true
@@ -68,6 +68,10 @@ class "anthropic" {
68
68
  family "sonnet" {
69
69
  revision ">=5.5 <6" {
70
70
  supports-forced-tool-choice #false
71
+ // `thinking: {type: "disabled"}` is a 400; `between_tools` is the
72
+ // lowest thinking setting.
73
+ // https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#turn-off-up-front-thinking
74
+ supports-between-tools-thinking #true
71
75
  // Signed thinking is bound to the exact preceding conversation.
72
76
  thinking-prefix-binding #true
73
77
  }
@@ -89,6 +89,23 @@ provider "openai-codex" {
89
89
  cache-write 0
90
90
  }
91
91
  }
92
+ // GPT-6.1 Sol keeps GPT-6 Sol's $2/$10 list price but halves cached input
93
+ // to $0.10 (OpenAI API docs, 2026-09-29). Like Astra, Codex reports a 272K
94
+ // default and an 872K maximum while OpenAI documents 922K max input (1.05M
95
+ // total); the curated maximum applies only with extended context on, and a
96
+ // higher live maximum still wins.
97
+ models "gpt-6.1-sol" "gpt-6.1-sol-wm" {
98
+ cost-patch {
99
+ input 2.0
100
+ output 10.0
101
+ cache-read 0.1
102
+ cache-write 0
103
+ }
104
+ limits-patch {
105
+ context-window 272000
106
+ }
107
+ max-context-window 922000
108
+ }
92
109
  models "gpt-6-luna" "gpt-6-luna-wm" {
93
110
  cost-patch {
94
111
  input 0.1