@oh-my-pi/pi-catalog 17.2.4 → 17.2.6

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,24 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [17.2.6] - 2026-08-03
6
+
7
+ ### Added
8
+
9
+ - Added the `bedrock-mantle` provider with authenticated model discovery for OpenAI GPT-5.4, GPT-5.5, and GPT-5.6 models (including Luna and Terra variants with corrected pricing) served through Amazon Bedrock's Responses endpoint.
10
+
11
+ ### Fixed
12
+
13
+ - Fixed dynamic discovery for the `deepseek-v4` model family (such as `deepseek-v4-flash-0731`) under `alibaba-token-plan` missing reasoning configuration and maximum thinking effort.
14
+ - Fixed GitHub Copilot dynamic discovery retaining stale bundled prices for default-context models instead of using the provider's reported default-tier prices.
15
+
16
+ ## [17.2.5] - 2026-08-03
17
+
18
+ ### Fixed
19
+
20
+ - Fixed an issue where newly advertised chat models were dropped during dynamic discovery for the `alibaba-token-plan` provider.
21
+ - Fixed a `400` error when forcing a specific tool with DeepSeek reasoning models on OpenCode Zen/Go gateways by automatically downgrading the tool selection mode to `auto` while keeping the tool advertised.
22
+
5
23
  ## [17.2.4] - 2026-08-01
6
24
 
7
25
  ### Added
@@ -5,6 +5,8 @@ export type ModelManagerConfig = {
5
5
  apiKey?: string;
6
6
  baseUrl?: string;
7
7
  fetch?: FetchImpl;
8
+ /** The supplied fetch already applies provider-specific authentication. */
9
+ authenticated?: boolean;
8
10
  };
9
11
  /** Catalog discovery configuration for providers that support endpoint-based model listing. */
10
12
  export interface CatalogDiscoveryConfig {
@@ -53,6 +53,12 @@ export declare const CATALOG_PROVIDERS: readonly [{
53
53
  }, {
54
54
  readonly id: "amazon-bedrock";
55
55
  readonly defaultModel: "us.anthropic.claude-opus-4-8";
56
+ }, {
57
+ readonly id: "bedrock-mantle";
58
+ readonly defaultModel: "openai.gpt-5.6-terra";
59
+ readonly envVars: readonly ["AWS_BEARER_TOKEN_BEDROCK"];
60
+ readonly createModelManagerOptions: (config: ModelManagerConfig) => import("../index.js").ModelManagerOptions<"openai-responses", unknown>;
61
+ readonly dynamicModelsAuthoritative: true;
56
62
  }, {
57
63
  readonly id: "anthropic";
58
64
  readonly defaultModel: "claude-opus-4-8";
@@ -2,6 +2,7 @@ import type { ModelManagerOptions } from "../model-manager.js";
2
2
  import { getBundledModels } from "../models.js";
3
3
  import type { Api, FetchImpl, ModelSpec, Provider } from "../types.js";
4
4
  import { ALIBABA_TOKEN_PLAN_BASE_URL } from "../wire/alibaba-token-plan.js";
5
+ import type { ModelManagerConfig } from "./descriptor-types.js";
5
6
  export interface ModelsDevModel {
6
7
  id?: string;
7
8
  name?: string;
@@ -424,6 +425,12 @@ export interface CoreWeaveModelManagerConfig {
424
425
  }
425
426
  export declare function coreWeaveModelManagerOptions(config?: CoreWeaveModelManagerConfig): ModelManagerOptions<"openai-completions">;
426
427
  export declare const META_MUSE_STATIC_MODELS: readonly ModelSpec<"openai-responses">[];
428
+ /**
429
+ * OpenAI frontier models served exclusively through Bedrock Mantle's Responses
430
+ * endpoint. Pricing is per million tokens from the Amazon Bedrock pricing page.
431
+ */
432
+ export declare const BEDROCK_MANTLE_STATIC_MODELS: readonly ModelSpec<"openai-responses">[];
433
+ export declare function bedrockMantleModelManagerOptions(config?: ModelManagerConfig): ModelManagerOptions<"openai-responses">;
427
434
  export interface MetaModelManagerConfig {
428
435
  apiKey?: string;
429
436
  baseUrl?: string;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@oh-my-pi/pi-catalog",
4
- "version": "17.2.4",
4
+ "version": "17.2.6",
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",
@@ -35,12 +35,12 @@
35
35
  },
36
36
  "dependencies": {
37
37
  "@bufbuild/protobuf": "^2.12.1",
38
- "@oh-my-pi/pi-utils": "17.2.4",
38
+ "@oh-my-pi/pi-utils": "17.2.6",
39
39
  "arktype": "2.2.3",
40
40
  "zod": "^4"
41
41
  },
42
42
  "devDependencies": {
43
- "@oh-my-pi/pi-ai": "17.2.4",
43
+ "@oh-my-pi/pi-ai": "17.2.6",
44
44
  "@types/bun": "^1.3.14"
45
45
  },
46
46
  "engines": {
@@ -318,7 +318,8 @@ export function buildOpenAICompat(spec: ModelSpec<"openai-completions">): Resolv
318
318
  isDeepseekModelIdOrName(spec.name ?? "") ||
319
319
  isOpenCodeDeepseekAlias;
320
320
  const isDirectDeepseekApi = modelMatchesHost(hostModel, "deepseekDirect");
321
- const isDirectDeepseekReasoning = isDirectDeepseekApi && isDeepseekFamily && Boolean(spec.reasoning);
321
+ const isDeepseekReasoning = isDeepseekFamily && Boolean(spec.reasoning);
322
+ const isDirectDeepseekReasoning = isDirectDeepseekApi && isDeepseekReasoning;
322
323
  const isGrok = modelMatchesHost(hostModel, "xai");
323
324
  const isMistral = modelMatchesHost(hostModel, "mistral");
324
325
  const isOpenCodeHost = modelMatchesHost(hostModel, "opencode");
@@ -490,7 +491,12 @@ export function buildOpenAICompat(spec: ModelSpec<"openai-completions">): Resolv
490
491
  disableReasoningOnForcedToolChoice: (isKimiModel && !isMoonshotKimiK3) || isAnthropicModel,
491
492
  disableReasoningOnToolChoice: isDeepseekFamily && Boolean(spec.reasoning) && !isOpenRouter,
492
493
  supportsToolChoice: !isDirectDeepseekReasoning,
493
- supportsForcedToolChoice: !requiresEnabledThinking,
494
+ // DeepSeek reasoning models on OpenCode Zen/Go 400 with
495
+ // "Thinking mode does not support this tool_choice" when a specific
496
+ // function is forced while the gateway's default thinking mode is active.
497
+ // Downgrade only on those gateways: other hosts can turn thinking off via
498
+ // disableReasoningOnToolChoice and must retain hard tool selection.
499
+ supportsForcedToolChoice: !requiresEnabledThinking && !(isOpenCodeHost && isDeepseekReasoning),
494
500
  supportsNamedToolChoice: STRING_ONLY_NAMED_TOOL_CHOICE_PROVIDERS[provider] !== true,
495
501
  maxTokensField: useMaxTokens ? "max_tokens" : "max_completion_tokens",
496
502
  requiresToolResultName: isMistral,
package/src/models.json CHANGED
@@ -10186,155 +10186,6 @@
10186
10186
  ]
10187
10187
  }
10188
10188
  },
10189
- "openai.gpt-5.4": {
10190
- "id": "openai.gpt-5.4",
10191
- "name": "GPT-5.4",
10192
- "api": "bedrock-converse-stream",
10193
- "provider": "amazon-bedrock",
10194
- "baseUrl": "https://bedrock-runtime.us-east-1.amazonaws.com",
10195
- "reasoning": true,
10196
- "input": [
10197
- "text",
10198
- "image"
10199
- ],
10200
- "cost": {
10201
- "input": 2.75,
10202
- "output": 16.5,
10203
- "cacheRead": 0.275,
10204
- "cacheWrite": 0
10205
- },
10206
- "contextWindow": 272000,
10207
- "maxTokens": 128000,
10208
- "thinking": {
10209
- "mode": "budget",
10210
- "efforts": [
10211
- "low",
10212
- "medium",
10213
- "high",
10214
- "xhigh"
10215
- ]
10216
- }
10217
- },
10218
- "openai.gpt-5.5": {
10219
- "id": "openai.gpt-5.5",
10220
- "name": "GPT-5.5",
10221
- "api": "bedrock-converse-stream",
10222
- "provider": "amazon-bedrock",
10223
- "baseUrl": "https://bedrock-runtime.us-east-1.amazonaws.com",
10224
- "reasoning": true,
10225
- "input": [
10226
- "text",
10227
- "image"
10228
- ],
10229
- "cost": {
10230
- "input": 5.5,
10231
- "output": 33,
10232
- "cacheRead": 0.55,
10233
- "cacheWrite": 0
10234
- },
10235
- "contextWindow": 272000,
10236
- "maxTokens": 128000,
10237
- "thinking": {
10238
- "mode": "budget",
10239
- "efforts": [
10240
- "low",
10241
- "medium",
10242
- "high",
10243
- "xhigh"
10244
- ]
10245
- },
10246
- "contextPromotionTarget": "amazon-bedrock/openai.gpt-5.4"
10247
- },
10248
- "openai.gpt-5.6-luna": {
10249
- "id": "openai.gpt-5.6-luna",
10250
- "name": "GPT-5.6 Luna",
10251
- "api": "bedrock-converse-stream",
10252
- "provider": "amazon-bedrock",
10253
- "baseUrl": "https://bedrock-runtime.us-east-1.amazonaws.com",
10254
- "reasoning": true,
10255
- "input": [
10256
- "text",
10257
- "image"
10258
- ],
10259
- "cost": {
10260
- "input": 0.22,
10261
- "output": 1.32,
10262
- "cacheRead": 0.022,
10263
- "cacheWrite": 0.275
10264
- },
10265
- "contextWindow": 272000,
10266
- "maxTokens": 128000,
10267
- "thinking": {
10268
- "mode": "budget",
10269
- "efforts": [
10270
- "low",
10271
- "medium",
10272
- "high",
10273
- "xhigh",
10274
- "max"
10275
- ]
10276
- }
10277
- },
10278
- "openai.gpt-5.6-sol": {
10279
- "id": "openai.gpt-5.6-sol",
10280
- "name": "GPT-5.6 Sol",
10281
- "api": "bedrock-converse-stream",
10282
- "provider": "amazon-bedrock",
10283
- "baseUrl": "https://bedrock-runtime.us-east-1.amazonaws.com",
10284
- "reasoning": true,
10285
- "input": [
10286
- "text",
10287
- "image"
10288
- ],
10289
- "cost": {
10290
- "input": 5.5,
10291
- "output": 33,
10292
- "cacheRead": 0.55,
10293
- "cacheWrite": 6.88
10294
- },
10295
- "contextWindow": 272000,
10296
- "maxTokens": 128000,
10297
- "thinking": {
10298
- "mode": "budget",
10299
- "efforts": [
10300
- "low",
10301
- "medium",
10302
- "high",
10303
- "xhigh",
10304
- "max"
10305
- ]
10306
- }
10307
- },
10308
- "openai.gpt-5.6-terra": {
10309
- "id": "openai.gpt-5.6-terra",
10310
- "name": "GPT-5.6 Terra",
10311
- "api": "bedrock-converse-stream",
10312
- "provider": "amazon-bedrock",
10313
- "baseUrl": "https://bedrock-runtime.us-east-1.amazonaws.com",
10314
- "reasoning": true,
10315
- "input": [
10316
- "text",
10317
- "image"
10318
- ],
10319
- "cost": {
10320
- "input": 2.2,
10321
- "output": 13.2,
10322
- "cacheRead": 0.22,
10323
- "cacheWrite": 2.75
10324
- },
10325
- "contextWindow": 272000,
10326
- "maxTokens": 128000,
10327
- "thinking": {
10328
- "mode": "budget",
10329
- "efforts": [
10330
- "low",
10331
- "medium",
10332
- "high",
10333
- "xhigh",
10334
- "max"
10335
- ]
10336
- }
10337
- },
10338
10189
  "openai.gpt-oss-120b": {
10339
10190
  "id": "openai.gpt-oss-120b",
10340
10191
  "name": "gpt-oss-120b",
@@ -13666,6 +13517,157 @@
13666
13517
  "supportsComputerUseConfig": false
13667
13518
  }
13668
13519
  },
13520
+ "bedrock-mantle": {
13521
+ "openai.gpt-5.4": {
13522
+ "id": "openai.gpt-5.4",
13523
+ "name": "GPT-5.4",
13524
+ "api": "openai-responses",
13525
+ "provider": "bedrock-mantle",
13526
+ "baseUrl": "https://bedrock-mantle.{region}.api.aws/openai/v1",
13527
+ "reasoning": true,
13528
+ "input": [
13529
+ "text",
13530
+ "image"
13531
+ ],
13532
+ "cost": {
13533
+ "input": 2.75,
13534
+ "output": 16.5,
13535
+ "cacheRead": 0.275,
13536
+ "cacheWrite": 0
13537
+ },
13538
+ "contextWindow": 272000,
13539
+ "maxTokens": 128000,
13540
+ "thinking": {
13541
+ "mode": "effort",
13542
+ "efforts": [
13543
+ "low",
13544
+ "medium",
13545
+ "high",
13546
+ "xhigh"
13547
+ ]
13548
+ }
13549
+ },
13550
+ "openai.gpt-5.5": {
13551
+ "id": "openai.gpt-5.5",
13552
+ "name": "GPT-5.5",
13553
+ "api": "openai-responses",
13554
+ "provider": "bedrock-mantle",
13555
+ "baseUrl": "https://bedrock-mantle.{region}.api.aws/openai/v1",
13556
+ "reasoning": true,
13557
+ "input": [
13558
+ "text",
13559
+ "image"
13560
+ ],
13561
+ "cost": {
13562
+ "input": 5.5,
13563
+ "output": 33,
13564
+ "cacheRead": 0.55,
13565
+ "cacheWrite": 0
13566
+ },
13567
+ "contextWindow": 272000,
13568
+ "maxTokens": 128000,
13569
+ "thinking": {
13570
+ "mode": "effort",
13571
+ "efforts": [
13572
+ "low",
13573
+ "medium",
13574
+ "high",
13575
+ "xhigh"
13576
+ ]
13577
+ },
13578
+ "contextPromotionTarget": "bedrock-mantle/openai.gpt-5.4"
13579
+ },
13580
+ "openai.gpt-5.6-luna": {
13581
+ "id": "openai.gpt-5.6-luna",
13582
+ "name": "GPT-5.6 Luna",
13583
+ "api": "openai-responses",
13584
+ "provider": "bedrock-mantle",
13585
+ "baseUrl": "https://bedrock-mantle.{region}.api.aws/openai/v1",
13586
+ "reasoning": true,
13587
+ "input": [
13588
+ "text",
13589
+ "image"
13590
+ ],
13591
+ "cost": {
13592
+ "input": 0.22,
13593
+ "output": 1.32,
13594
+ "cacheRead": 0.022,
13595
+ "cacheWrite": 0.275
13596
+ },
13597
+ "contextWindow": 272000,
13598
+ "maxTokens": 128000,
13599
+ "thinking": {
13600
+ "mode": "effort",
13601
+ "efforts": [
13602
+ "low",
13603
+ "medium",
13604
+ "high",
13605
+ "xhigh",
13606
+ "max"
13607
+ ]
13608
+ }
13609
+ },
13610
+ "openai.gpt-5.6-sol": {
13611
+ "id": "openai.gpt-5.6-sol",
13612
+ "name": "GPT-5.6 Sol",
13613
+ "api": "openai-responses",
13614
+ "provider": "bedrock-mantle",
13615
+ "baseUrl": "https://bedrock-mantle.{region}.api.aws/openai/v1",
13616
+ "reasoning": true,
13617
+ "input": [
13618
+ "text",
13619
+ "image"
13620
+ ],
13621
+ "cost": {
13622
+ "input": 5.5,
13623
+ "output": 33,
13624
+ "cacheRead": 0.55,
13625
+ "cacheWrite": 6.88
13626
+ },
13627
+ "contextWindow": 272000,
13628
+ "maxTokens": 128000,
13629
+ "thinking": {
13630
+ "mode": "effort",
13631
+ "efforts": [
13632
+ "low",
13633
+ "medium",
13634
+ "high",
13635
+ "xhigh",
13636
+ "max"
13637
+ ]
13638
+ }
13639
+ },
13640
+ "openai.gpt-5.6-terra": {
13641
+ "id": "openai.gpt-5.6-terra",
13642
+ "name": "GPT-5.6 Terra",
13643
+ "api": "openai-responses",
13644
+ "provider": "bedrock-mantle",
13645
+ "baseUrl": "https://bedrock-mantle.{region}.api.aws/openai/v1",
13646
+ "reasoning": true,
13647
+ "input": [
13648
+ "text",
13649
+ "image"
13650
+ ],
13651
+ "cost": {
13652
+ "input": 2.2,
13653
+ "output": 13.2,
13654
+ "cacheRead": 0.22,
13655
+ "cacheWrite": 2.75
13656
+ },
13657
+ "contextWindow": 272000,
13658
+ "maxTokens": 128000,
13659
+ "thinking": {
13660
+ "mode": "effort",
13661
+ "efforts": [
13662
+ "low",
13663
+ "medium",
13664
+ "high",
13665
+ "xhigh",
13666
+ "max"
13667
+ ]
13668
+ }
13669
+ }
13670
+ },
13669
13671
  "cerebras": {
13670
13672
  "gemma-4-31b": {
13671
13673
  "id": "gemma-4-31b",
@@ -2,7 +2,13 @@ import type { ModelManagerOptions } from "../model-manager";
2
2
  import type { Api, FetchImpl } from "../types";
3
3
 
4
4
  /** Config passed to a provider's runtime model-manager factory. */
5
- export type ModelManagerConfig = { apiKey?: string; baseUrl?: string; fetch?: FetchImpl };
5
+ export type ModelManagerConfig = {
6
+ apiKey?: string;
7
+ baseUrl?: string;
8
+ fetch?: FetchImpl;
9
+ /** The supplied fetch already applies provider-specific authentication. */
10
+ authenticated?: boolean;
11
+ };
6
12
 
7
13
  /** Catalog discovery configuration for providers that support endpoint-based model listing. */
8
14
  export interface CatalogDiscoveryConfig {
@@ -15,6 +15,7 @@ import {
15
15
  alibabaTokenPlanModelManagerOptions,
16
16
  anthropicModelManagerOptions,
17
17
  basetenModelManagerOptions,
18
+ bedrockMantleModelManagerOptions,
18
19
  cerebrasModelManagerOptions,
19
20
  cloudflareAiGatewayModelManagerOptions,
20
21
  coreWeaveModelManagerOptions,
@@ -109,6 +110,13 @@ export const CATALOG_PROVIDERS = [
109
110
  id: "amazon-bedrock",
110
111
  defaultModel: "us.anthropic.claude-opus-4-8",
111
112
  },
113
+ {
114
+ id: "bedrock-mantle",
115
+ defaultModel: "openai.gpt-5.6-terra",
116
+ envVars: ["AWS_BEARER_TOKEN_BEDROCK"],
117
+ createModelManagerOptions: (config: ModelManagerConfig) => bedrockMantleModelManagerOptions(config),
118
+ dynamicModelsAuthoritative: true,
119
+ },
112
120
  {
113
121
  id: "anthropic",
114
122
  defaultModel: "claude-opus-4-8",
@@ -31,6 +31,7 @@ import {
31
31
  } from "../wire/github-copilot";
32
32
  import { createBundledReferenceMap, createReferenceResolver, toModelSpec } from "./bundled-references";
33
33
  import { getDefaultModelDiscoveryBaseUrl, resolveModelCacheProviderId } from "./cache-provider-id";
34
+ import type { ModelManagerConfig } from "./descriptor-types";
34
35
 
35
36
  const MODELS_DEV_URL = "https://catalog.stencil.so/models.json.zstd";
36
37
 
@@ -2833,6 +2834,22 @@ export const ALIBABA_TOKEN_PLAN_STATIC_MODELS: readonly ModelSpec<"openai-comple
2833
2834
  },
2834
2835
  ];
2835
2836
 
2837
+ const ALIBABA_TOKEN_PLAN_NON_CHAT_MODEL_PREFIXES = [
2838
+ "fun-asr",
2839
+ "happyhorse-",
2840
+ "qwen-audio-",
2841
+ "qwen-image-",
2842
+ "text-embedding-",
2843
+ "wan2.7-",
2844
+ ] as const;
2845
+
2846
+ function isAlibabaTokenPlanChatModelId(id: string): boolean {
2847
+ const normalized = id.trim().toLowerCase();
2848
+ return (
2849
+ normalized.length > 0 && !ALIBABA_TOKEN_PLAN_NON_CHAT_MODEL_PREFIXES.some(prefix => normalized.startsWith(prefix))
2850
+ );
2851
+ }
2852
+
2836
2853
  export interface AlibabaTokenPlanModelManagerConfig {
2837
2854
  apiKey?: string;
2838
2855
  baseUrl?: string;
@@ -2859,19 +2876,30 @@ export function alibabaTokenPlanModelManagerOptions(
2859
2876
  provider: "alibaba-token-plan",
2860
2877
  baseUrl,
2861
2878
  apiKey,
2862
- filterModel: (_entry, model) =>
2863
- ALIBABA_TOKEN_PLAN_STATIC_MODELS.some(reference => reference.id === model.id),
2879
+ filterModel: (_entry, model) => isAlibabaTokenPlanChatModelId(model.id),
2864
2880
  mapModel: (_entry, defaults) => {
2865
2881
  const reference = ALIBABA_TOKEN_PLAN_STATIC_MODELS.find(model => model.id === defaults.id);
2866
- return reference
2867
- ? {
2868
- ...reference,
2869
- id: defaults.id,
2870
- api: defaults.api,
2871
- provider: defaults.provider,
2872
- baseUrl: defaults.baseUrl,
2873
- }
2874
- : defaults;
2882
+ if (reference) {
2883
+ return {
2884
+ ...reference,
2885
+ id: defaults.id,
2886
+ api: defaults.api,
2887
+ provider: defaults.provider,
2888
+ baseUrl: defaults.baseUrl,
2889
+ };
2890
+ }
2891
+ // DeepSeek V4 family models discovered dynamically need reasoning config
2892
+ if (defaults.id.startsWith("deepseek-v4")) {
2893
+ return {
2894
+ ...defaults,
2895
+ reasoning: true,
2896
+ thinking: {
2897
+ mode: "effort" as const,
2898
+ efforts: [Effort.High, Effort.Max],
2899
+ },
2900
+ };
2901
+ }
2902
+ return defaults;
2875
2903
  },
2876
2904
  fetch: config?.fetch,
2877
2905
  }),
@@ -3607,6 +3635,126 @@ export const META_MUSE_STATIC_MODELS: readonly ModelSpec<"openai-responses">[] =
3607
3635
  },
3608
3636
  ];
3609
3637
 
3638
+ // ---------------------------------------------------------------------------
3639
+ // 15.76 Amazon Bedrock Mantle
3640
+ // ---------------------------------------------------------------------------
3641
+
3642
+ const BEDROCK_MANTLE_BASE_URL = "https://bedrock-mantle.{region}.api.aws/openai/v1";
3643
+ const BEDROCK_MANTLE_GPT_5_X_THINKING: ThinkingConfig = {
3644
+ mode: "effort",
3645
+ efforts: [Effort.Low, Effort.Medium, Effort.High, Effort.XHigh],
3646
+ };
3647
+ const BEDROCK_MANTLE_GPT_5_6_THINKING: ThinkingConfig = {
3648
+ mode: "effort",
3649
+ efforts: [Effort.Low, Effort.Medium, Effort.High, Effort.XHigh, Effort.Max],
3650
+ };
3651
+
3652
+ /**
3653
+ * OpenAI frontier models served exclusively through Bedrock Mantle's Responses
3654
+ * endpoint. Pricing is per million tokens from the Amazon Bedrock pricing page.
3655
+ */
3656
+ export const BEDROCK_MANTLE_STATIC_MODELS: readonly ModelSpec<"openai-responses">[] = [
3657
+ {
3658
+ id: "openai.gpt-5.4",
3659
+ name: "GPT-5.4",
3660
+ api: "openai-responses",
3661
+ provider: "bedrock-mantle",
3662
+ baseUrl: BEDROCK_MANTLE_BASE_URL,
3663
+ reasoning: true,
3664
+ input: ["text", "image"],
3665
+ cost: { input: 2.75, output: 16.5, cacheRead: 0.275, cacheWrite: 0 },
3666
+ contextWindow: 272_000,
3667
+ maxTokens: 128_000,
3668
+ thinking: BEDROCK_MANTLE_GPT_5_X_THINKING,
3669
+ },
3670
+ {
3671
+ id: "openai.gpt-5.5",
3672
+ name: "GPT-5.5",
3673
+ api: "openai-responses",
3674
+ provider: "bedrock-mantle",
3675
+ baseUrl: BEDROCK_MANTLE_BASE_URL,
3676
+ reasoning: true,
3677
+ input: ["text", "image"],
3678
+ cost: { input: 5.5, output: 33, cacheRead: 0.55, cacheWrite: 0 },
3679
+ contextWindow: 272_000,
3680
+ maxTokens: 128_000,
3681
+ thinking: BEDROCK_MANTLE_GPT_5_X_THINKING,
3682
+ },
3683
+ {
3684
+ id: "openai.gpt-5.6-luna",
3685
+ name: "GPT-5.6 Luna",
3686
+ api: "openai-responses",
3687
+ provider: "bedrock-mantle",
3688
+ baseUrl: BEDROCK_MANTLE_BASE_URL,
3689
+ reasoning: true,
3690
+ input: ["text", "image"],
3691
+ cost: { input: 0.22, output: 1.32, cacheRead: 0.022, cacheWrite: 0.275 },
3692
+ contextWindow: 272_000,
3693
+ maxTokens: 128_000,
3694
+ thinking: BEDROCK_MANTLE_GPT_5_6_THINKING,
3695
+ },
3696
+ {
3697
+ id: "openai.gpt-5.6-sol",
3698
+ name: "GPT-5.6 Sol",
3699
+ api: "openai-responses",
3700
+ provider: "bedrock-mantle",
3701
+ baseUrl: BEDROCK_MANTLE_BASE_URL,
3702
+ reasoning: true,
3703
+ input: ["text", "image"],
3704
+ cost: { input: 5.5, output: 33, cacheRead: 0.55, cacheWrite: 6.88 },
3705
+ contextWindow: 272_000,
3706
+ maxTokens: 128_000,
3707
+ thinking: BEDROCK_MANTLE_GPT_5_6_THINKING,
3708
+ },
3709
+ {
3710
+ id: "openai.gpt-5.6-terra",
3711
+ name: "GPT-5.6 Terra",
3712
+ api: "openai-responses",
3713
+ provider: "bedrock-mantle",
3714
+ baseUrl: BEDROCK_MANTLE_BASE_URL,
3715
+ reasoning: true,
3716
+ input: ["text", "image"],
3717
+ cost: { input: 2.2, output: 13.2, cacheRead: 0.22, cacheWrite: 2.75 },
3718
+ contextWindow: 272_000,
3719
+ maxTokens: 128_000,
3720
+ thinking: BEDROCK_MANTLE_GPT_5_6_THINKING,
3721
+ },
3722
+ ];
3723
+
3724
+ const BEDROCK_MANTLE_MODEL_BY_ID: Partial<Record<string, ModelSpec<"openai-responses">>> = Object.fromEntries(
3725
+ BEDROCK_MANTLE_STATIC_MODELS.map(model => [model.id, model]),
3726
+ );
3727
+
3728
+ export function bedrockMantleModelManagerOptions(
3729
+ config: ModelManagerConfig = {},
3730
+ ): ModelManagerOptions<"openai-responses"> {
3731
+ const inferenceBaseUrl = config.baseUrl ?? BEDROCK_MANTLE_BASE_URL;
3732
+ const discoveryBaseUrl = inferenceBaseUrl.replace(/\/openai\/v1\/?$/, "/v1");
3733
+ return {
3734
+ providerId: "bedrock-mantle",
3735
+ staticModels: BEDROCK_MANTLE_STATIC_MODELS,
3736
+ // The bearer-scoped /v1/models response lists only the models enabled for
3737
+ // the account; a successful fetch replaces the static seed instead of
3738
+ // merging, so disabled models are not selectable.
3739
+ dynamicModelsAuthoritative: true,
3740
+ ...(config.authenticated && {
3741
+ fetchDynamicModels: () =>
3742
+ fetchOpenAICompatibleModels({
3743
+ api: "openai-responses",
3744
+ provider: "bedrock-mantle",
3745
+ baseUrl: discoveryBaseUrl,
3746
+ fetch: config.fetch,
3747
+ mapModel: (entry, defaults) =>
3748
+ mapWithBundledReference(
3749
+ entry,
3750
+ { ...defaults, baseUrl: BEDROCK_MANTLE_BASE_URL },
3751
+ BEDROCK_MANTLE_MODEL_BY_ID[defaults.id],
3752
+ ),
3753
+ }),
3754
+ }),
3755
+ };
3756
+ }
3757
+
3610
3758
  export interface MetaModelManagerConfig {
3611
3759
  apiKey?: string;
3612
3760
  baseUrl?: string;
@@ -5035,6 +5183,11 @@ export function githubCopilotModelManagerOptions(config?: GithubCopilotModelMana
5035
5183
  }
5036
5184
  : {}),
5037
5185
  };
5186
+ const defaultCost = copilotTierCost(tokenPrices.defaultTier);
5187
+ if (defaultCost) {
5188
+ // Cache writes are not reported per tier; retain the bundled provider rate.
5189
+ base.cost = { ...defaultCost, cacheWrite: base.cost.cacheWrite };
5190
+ }
5038
5191
  const variant = createCopilotLongContextVariant(
5039
5192
  base,
5040
5193
  contextWindow,