feat(bedrock): 新增 Amazon Bedrock 供应商支持(双鉴权路径 + 评审修复) - #1374
Conversation
relay_switch.switch_relay_profile_in_home 之前依赖 BedrockConfig.auth_mode
== AwsProfile 显式绕过 configured 检查——把针对单一供应商的耦合塞进了
通用切换器。改为在 relay_config_status_from_home 内部完成通用兜底:只要
config.toml 中存在与顶层 model_provider 对应的 [model_providers.<id>]
或 [model_providers.<id>.<sub>] 表段,即视为 configured;OpenAI 兼容的
requires_openai_auth + base_url + Bearer/API Key 严格校验路径保留不变。
- 抽出 has_model_provider_section 私有 helper,识别 provider 直接表段
与任意子表段(例如 Amazon Bedrock AWS Profile 的
[model_providers.amazon-bedrock.aws])
- relay_switch.rs 移除 BedrockAuthMode/LaunchMode 引用与
is_bedrock_aws_profile 分支;同时跟随上游 v1.2.33 删除
launch_mode_for_relay_profile(切换 profile 时不再强制覆盖 launch_mode)
- 新增两条集成测试:
* reports_native_provider_configured_via_child_table_only 覆盖
Bedrock AWS Profile 形态
* reports_not_configured_when_provider_section_missing 防止过度放宽兜底
Bedrock 数据模型 (BedrockConfig / BedrockAuthMode) 仍保留在 settings.rs
与 relay_config.rs 的生成分支,属于 Bedrock 内部实现细节;relay_switch
不再感知具体供应商。未来新增仅使用子表段的原生 provider(Vertex、
SageMaker 等)无需再改 relay_switch。
sim: BigPizzaV3#1374
同步 upstream/main (23bbf13) 到本 fork。关键上游变更: - upstream 已删除 relay_switch.rs 里的 launch_mode_for_relay_profile - upstream 引入 relay_environment / relay_latency 等新模块 - upstream 引入 model_catalog 相关修复、桌宠、V2 广告回退等改动 Bedrock 相关代码(BedrockConfig、Bedrock 编辑器、双路径生成)与 upstream 新增功能均沿各自模块保留,通过 relay_config_status_from_home 的通用化 兜底解耦,不再对 relay_switch 造成耦合。 sim: BigPizzaV3#1374
Bedrock 编辑器此前把"会写入 config.toml 的字段"与"仅用于拼接 CLI 示例 命令的参数"混排在一起,容易让用户误以为示例区里的输入也会影响配置。 本次按语义重排两条鉴权路径的字段布局: - 新增带说明文字的分隔线(BedrockCliExamplesDivider):横线中间标注 "以下为命令行生成示例,不影响实际配置",把配置区与示例区视觉隔开 - 模型(model)会写入 config.toml,归入配置区,移到分隔线上方 - IAM 用户名 / Long-Term Key 有效期仅作为 bedrockLongTermApiKeyCommand 的 --user-name / --credential-age-days 参数,不参与 config 生成,移到 分隔线下方的示例区,并补 field-hint 明确"不写入配置" - AWS Profile 分支同样把 AWS SSO 命令示例收到分隔线下方 纯 UI 布局调整,不改变数据流:所有字段仍绑定原有 bedrock.* 状态并照常 持久化到 settings.json。styles.css 新增 .bedrock-cli-divider 伪元素横线 样式,深浅色主题均适配。 验证:tsc --noEmit 干净;前端 node --test 全通过;npm run build (cargo release + tauri build)成功。 sim: BigPizzaV3#1374
|
已经合并了最新的代码,无冲突 |
|
Codex++ maintainer review note 当前 main 下这个 PR 仍存在 merge conflict,暂时不能合并。请先 rebase 到最新 main 并解决冲突;更新后我们会重新跑针对性测试再复审。 This PR currently conflicts with main, so it is not mergeable yet. Please rebase onto the latest main and resolve the conflicts, then we can review and test it again. |
relay_switch.switch_relay_profile_in_home 之前依赖 BedrockConfig.auth_mode
== AwsProfile 显式绕过 configured 检查——把针对单一供应商的耦合塞进了
通用切换器。改为在 relay_config_status_from_home 内部完成通用兜底:只要
config.toml 中存在与顶层 model_provider 对应的 [model_providers.<id>]
或 [model_providers.<id>.<sub>] 表段,即视为 configured;OpenAI 兼容的
requires_openai_auth + base_url + Bearer/API Key 严格校验路径保留不变。
- 抽出 has_model_provider_section 私有 helper,识别 provider 直接表段
与任意子表段(例如 Amazon Bedrock AWS Profile 的
[model_providers.amazon-bedrock.aws])
- relay_switch.rs 移除 BedrockAuthMode/LaunchMode 引用与
is_bedrock_aws_profile 分支;同时跟随上游 v1.2.33 删除
launch_mode_for_relay_profile(切换 profile 时不再强制覆盖 launch_mode)
- 新增两条集成测试:
* reports_native_provider_configured_via_child_table_only 覆盖
Bedrock AWS Profile 形态
* reports_not_configured_when_provider_section_missing 防止过度放宽兜底
Bedrock 数据模型 (BedrockConfig / BedrockAuthMode) 仍保留在 settings.rs
与 relay_config.rs 的生成分支,属于 Bedrock 内部实现细节;relay_switch
不再感知具体供应商。未来新增仅使用子表段的原生 provider(Vertex、
SageMaker 等)无需再改 relay_switch。
sim: BigPizzaV3#1374
Bedrock 编辑器此前把"会写入 config.toml 的字段"与"仅用于拼接 CLI 示例 命令的参数"混排在一起,容易让用户误以为示例区里的输入也会影响配置。 本次按语义重排两条鉴权路径的字段布局: - 新增带说明文字的分隔线(BedrockCliExamplesDivider):横线中间标注 "以下为命令行生成示例,不影响实际配置",把配置区与示例区视觉隔开 - 模型(model)会写入 config.toml,归入配置区,移到分隔线上方 - IAM 用户名 / Long-Term Key 有效期仅作为 bedrockLongTermApiKeyCommand 的 --user-name / --credential-age-days 参数,不参与 config 生成,移到 分隔线下方的示例区,并补 field-hint 明确"不写入配置" - AWS Profile 分支同样把 AWS SSO 命令示例收到分隔线下方 纯 UI 布局调整,不改变数据流:所有字段仍绑定原有 bedrock.* 状态并照常 持久化到 settings.json。styles.css 新增 .bedrock-cli-divider 伪元素横线 样式,深浅色主题均适配。 验证:tsc --noEmit 干净;前端 node --test 全通过;npm run build (cargo release + tauri build)成功。 sim: BigPizzaV3#1374
已经合并了最新的代码,无冲突 |
relay_switch.switch_relay_profile_in_home 之前依赖 BedrockConfig.auth_mode
== AwsProfile 显式绕过 configured 检查——把针对单一供应商的耦合塞进了
通用切换器。改为在 relay_config_status_from_home 内部完成通用兜底:只要
config.toml 中存在与顶层 model_provider 对应的 [model_providers.<id>]
或 [model_providers.<id>.<sub>] 表段,即视为 configured;OpenAI 兼容的
requires_openai_auth + base_url + Bearer/API Key 严格校验路径保留不变。
- 抽出 has_model_provider_section 私有 helper,识别 provider 直接表段
与任意子表段(例如 Amazon Bedrock AWS Profile 的
[model_providers.amazon-bedrock.aws])
- relay_switch.rs 移除 BedrockAuthMode/LaunchMode 引用与
is_bedrock_aws_profile 分支;同时跟随上游 v1.2.33 删除
launch_mode_for_relay_profile(切换 profile 时不再强制覆盖 launch_mode)
- 新增两条集成测试:
* reports_native_provider_configured_via_child_table_only 覆盖
Bedrock AWS Profile 形态
* reports_not_configured_when_provider_section_missing 防止过度放宽兜底
Bedrock 数据模型 (BedrockConfig / BedrockAuthMode) 仍保留在 settings.rs
与 relay_config.rs 的生成分支,属于 Bedrock 内部实现细节;relay_switch
不再感知具体供应商。未来新增仅使用子表段的原生 provider(Vertex、
SageMaker 等)无需再改 relay_switch。
sim: BigPizzaV3#1374
Bedrock 编辑器此前把"会写入 config.toml 的字段"与"仅用于拼接 CLI 示例 命令的参数"混排在一起,容易让用户误以为示例区里的输入也会影响配置。 本次按语义重排两条鉴权路径的字段布局: - 新增带说明文字的分隔线(BedrockCliExamplesDivider):横线中间标注 "以下为命令行生成示例,不影响实际配置",把配置区与示例区视觉隔开 - 模型(model)会写入 config.toml,归入配置区,移到分隔线上方 - IAM 用户名 / Long-Term Key 有效期仅作为 bedrockLongTermApiKeyCommand 的 --user-name / --credential-age-days 参数,不参与 config 生成,移到 分隔线下方的示例区,并补 field-hint 明确"不写入配置" - AWS Profile 分支同样把 AWS SSO 命令示例收到分隔线下方 纯 UI 布局调整,不改变数据流:所有字段仍绑定原有 bedrock.* 状态并照常 持久化到 settings.json。styles.css 新增 .bedrock-cli-divider 伪元素横线 样式,深浅色主题均适配。 验证:tsc --noEmit 干净;前端 node --test 全通过;npm run build (cargo release + tauri build)成功。 sim: BigPizzaV3#1374
|
|
支持双鉴权路径(Bedrock API Key / AWS Profile SSO),前后端各自实现 生成与识别端并通过 property test 保证契约;同时把评审中提出的 10 项 问题(P0/P1/P2/P3)一并修复。 主要改动: - 生成端:complete_bedrock_bearer_token_config / complete_bedrock_aws_profile_config - 识别端:bedrock_config_from_config_text(Rust/TS 双端保持契约一致) - 前端:BedrockRelayProfileEditor(名称、Provider 标识符、Region、 API Key、IAM 用户名、AWS Profile 等字段),并提供 Long-Term / Short-Term Key 与 AWS SSO 的 CLI 命令示例 - 供应商预设:ProviderPresetSelector 里 Bedrock 入口归入「第三方」 分组、排在 Azure OpenAI 前面;搜索命中 aws / bedrock / amazon 时 也可见 - 常量:BEDROCK_MANTLE_URL_PREFIX / SUFFIX 提取给 Rust/TS 两端参照 - 测试:proptest 覆盖 10 条属性 + regression 覆盖脏字段残留 / 表段感知 / 保留字冲突去重 / 天数校验 评审修复清单: - P0-1 保留字冲突时 inline 与底部错误提示去重 - P0-2 bedrockValidationError 注释与实现对齐 - P1-3 ensure_root_scalars_precede_tables 加入表段感知,忽略注释行 - P1-4 tomlStringAssignment / Bool 对 key 做 escapeRegExp - P2-5 Bearer Token 分支改为整表替换,避免同名旧 provider 表脏字段残留 - P2-6 BEDROCK_MANTLE_URL_PREFIX / SUFFIX 提取常量,Rust/TS 同步 - P3-7 IAM 用户名字段 label 精简,长括号说明改到 field-hint - P3-8 bedrockLongTermApiKeyCommand 拒绝非法天数(fallback 90) - P3-9 require_non_empty label 统一中文("AWS 区域") - UI 补齐:Bedrock 编辑器新增「名称」字段,修复无法改名的问题
relay_switch.switch_relay_profile_in_home 之前依赖 BedrockConfig.auth_mode
== AwsProfile 显式绕过 configured 检查——把针对单一供应商的耦合塞进了
通用切换器。改为在 relay_config_status_from_home 内部完成通用兜底:只要
config.toml 中存在与顶层 model_provider 对应的 [model_providers.<id>]
或 [model_providers.<id>.<sub>] 表段,即视为 configured;OpenAI 兼容的
requires_openai_auth + base_url + Bearer/API Key 严格校验路径保留不变。
- 抽出 has_model_provider_section 私有 helper,识别 provider 直接表段
与任意子表段(例如 Amazon Bedrock AWS Profile 的
[model_providers.amazon-bedrock.aws])
- relay_switch.rs 移除 BedrockAuthMode/LaunchMode 引用与
is_bedrock_aws_profile 分支;同时跟随上游 v1.2.33 删除
launch_mode_for_relay_profile(切换 profile 时不再强制覆盖 launch_mode)
- 新增两条集成测试:
* reports_native_provider_configured_via_child_table_only 覆盖
Bedrock AWS Profile 形态
* reports_not_configured_when_provider_section_missing 防止过度放宽兜底
Bedrock 数据模型 (BedrockConfig / BedrockAuthMode) 仍保留在 settings.rs
与 relay_config.rs 的生成分支,属于 Bedrock 内部实现细节;relay_switch
不再感知具体供应商。未来新增仅使用子表段的原生 provider(Vertex、
SageMaker 等)无需再改 relay_switch。
sim: BigPizzaV3#1374
Bedrock 编辑器此前把"会写入 config.toml 的字段"与"仅用于拼接 CLI 示例 命令的参数"混排在一起,容易让用户误以为示例区里的输入也会影响配置。 本次按语义重排两条鉴权路径的字段布局: - 新增带说明文字的分隔线(BedrockCliExamplesDivider):横线中间标注 "以下为命令行生成示例,不影响实际配置",把配置区与示例区视觉隔开 - 模型(model)会写入 config.toml,归入配置区,移到分隔线上方 - IAM 用户名 / Long-Term Key 有效期仅作为 bedrockLongTermApiKeyCommand 的 --user-name / --credential-age-days 参数,不参与 config 生成,移到 分隔线下方的示例区,并补 field-hint 明确"不写入配置" - AWS Profile 分支同样把 AWS SSO 命令示例收到分隔线下方 纯 UI 布局调整,不改变数据流:所有字段仍绑定原有 bedrock.* 状态并照常 持久化到 settings.json。styles.css 新增 .bedrock-cli-divider 伪元素横线 样式,深浅色主题均适配。 验证:tsc --noEmit 干净;前端 node --test 全通过;npm run build (cargo release + tauri build)成功。 sim: BigPizzaV3#1374
rebase 到 upstream/main (3328072) 后,按主仓库现行设计修订本 feature 分支: configured 判定 - 上游在 v1.2.45 自行放宽了 relay_config_status_from_home 的严格路径 (移除 requires_openai_auth 条件,因为 PureApi 不再写该字段)。原生 provider 兜底的守卫随之从 !requires_openai_auth 改为 !has_base_url: 「有 base_url」才是 OpenAI 兼容形状的判据,没有 base_url 的原生 provider(Bedrock AWS Profile)走表段存在性兜底。 - 同步更新 relay_switch.rs 与测试里失效的注释描述。 - 新增 reports_not_configured_when_openai_compatible_provider_lacks_api_key 守护新边界:声明了 base_url 但缺 Key 不能被表段存在救回。 测试与工具链约定 - 两个 *.test.ts 从 src/components/ 移到 src/:package.json 的 test script glob 只覆盖 src/*.test.ts,放在子目录等于不会被 npm test 执行。 移动后 npm test 从 68 条增至 83 条。 - tools/i18n-verify.mjs 的 SRC_FILES 补上 BedrockRelayProfileEditor.tsx (此前只改了 i18n-codemod.mjs,两份列表不一致)。 - 补齐 25 条英文翻译,使 i18n-verify 的缺失清单与上游基线完全一致, 本 PR 不再新增 i18n 债务。 其他 - .gitignore 移除与本 feature 无关的 .kiro(本地 IDE 目录,改为 .git/info/exclude)。 - cargo fmt 格式化本分支新增代码;上游既存的 2 处未格式化位置保持原样 不动,避免污染 PR diff。 验证:cargo test --workspace 878 通过 0 失败;npm test 83/83; tsc --noEmit 干净;cargo clippy 无新增警告。
`requires_openai_auth` 的语义是"此 provider 走 OpenAI 鉴权语义(ChatGPT
登录态)",不是"用 OpenAI 兼容协议"。上游据此只在混合 / 官方模式下写入:
- `complete_relay_profile_config` 里 `RelayMode::PureApi` 被显式排除
- `upsert_model_provider_config` 的入参在两条 apply 路径上分别取值:
`apply_relay_config_to_home_with_protocol`(混合)传 true,
`apply_pure_api_config_to_home_with_protocol`(纯 API)传 false
Bedrock Bearer Token 用的是自带的 Bedrock API Key(写进
`experimental_bearer_token`),不依赖 OpenAI 登录态,profile 的
`relayMode` 也是 `pureApi`,因此本就不该写这个字段。原实现硬写
`true` 与上游约定相悖。
生成端
- `complete_bedrock_bearer_token_config` 去掉该字段。整表替换语义顺带
保证:种子 config 里遗留的 `requires_openai_auth = true` 会被清掉。
识别端(Rust / TS 两侧对称修改)
- `bedrock_config_from_config_text` 与 `deriveBedrockConfigFromConfigText`
改为只以 `base_url` 是否匹配 bedrock-mantle 模板为判据。
`bedrock-mantle.<region>.api.aws` 是 AWS 独占域名,本身已足够唯一;
继续把 `requires_openai_auth` 当作前置门反而会漏掉生成端的新产出。
- 随之 `codexProviderBoolFromConfig` / `tomlBoolAssignment` 成为死代码,
一并移除(无外部引用、无测试覆盖)。
测试
- 生成端断言反转为 `!contains("requires_openai_auth")`:单测、
property 1、以及 relay_switch 的端到端切换测试。
- fixture 同步为新形态(Rust property 8 往返测试与 TS property 8、
`resolveBedrockAfterDerive` 的 bedrockMantleConfig)。
- 新增升级路径兼容测试(Rust + TS 各一条):旧版本写出的、带
`requires_openai_auth = true` 的 Bedrock config 仍必须被识别,
避免老用户升级后已保存的 profile 退化成普通中转。
验证:cargo test --workspace 879 通过 0 失败;npm test 84/84;
tsc --noEmit 干净;cargo clippy 0 error。
预设模型从 openai.gpt-5.5 更新为 GPT-5.6 系列: - 默认模型 `openai.gpt-5.6-sol` - `modelList` 列入三款:sol[1M] / terra / luna `[1M]` 是 CodexPlusPlus 的窗口后缀语法。sol 支持 1M 上下文,而 codex 内置元数据(assets/gpt56-model-metadata-compat.json)三款都按 272k 记录, 因此在 sol 上显式声明后缀,由本工具生成 per-model catalog 覆盖内置值; terra / luna 不带后缀,沿用内置的 272k。 端到端实测(AWS Profile 预设 → 切换 → 落盘)确认: - config.toml 得到 `model = "openai.gpt-5.6-sol"` 与 catalog 指针 - catalog 内 sol ctx=1000000,terra / luna 各 272000 模型 ID 收敛到单一定义 - 新增 `BEDROCK_DEFAULT_MODEL` / `BEDROCK_DEFAULT_MODEL_LIST` 两个常量到 bedrock-config.ts,App.tsx 的预设与编辑器 placeholder 都引用它们, 避免模型 ID 散落在三处各自漂移。 - 新增 3 条测试锁住预设内容(默认模型、三款清单与 1M 后缀位置、 每条都带 Mantle 要求的 `openai.` 前缀)。此前预设值只存在于 App.tsx, 没有任何测试保护。 同步更新编辑器的模型提示文案与对应英文翻译。 验证:cargo test --workspace 879 通过 0 失败;npm test 87/87; tsc --noEmit 干净;i18n-verify 与上游基线一致、无新增债务。
依据官方文档核实 GPT-5.6 三款规格(2026-07-13 GA): https://docs.aws.amazon.com/bedrock/latest/userguide/model-cards-openai.html 修正两处与官方规格不符的地方: 1. 三款都是 1M 上下文,不只 sol 官方 model card 对 Sol / Terra / Luna 均标注「Context window: 1M tokens」。上一版只给 sol 加了 `[1M]` 后缀,terra / luna 会沿用 codex 内置元数据的 272k,等于把两款的可用窗口砍掉 73%。现在三条都带后缀。 2. 预设 region 从 us-east-2 改为 us-east-1 官方区域可用性: Sol — us-east-1、us-east-2 Terra — us-east-1、us-east-2、us-west-2 Luna — us-east-1、us-east-2、us-west-2 us-east-2 对三款都可用,原值并非错误;改用 us-east-1 是因为它是 官方 model card 示例代码统一采用的区域,且同样落在三款交集内。 新增 BEDROCK_DEFAULT_REGION 常量与一条测试,守住「预设 region 必须 在三款交集内」——默认模型是 Sol,若 region 漂移到 us-west-2, Sol 直接不可用。 顺带澄清 web_search 的注释:Bedrock 侧 Web Search 已于 2026-08 对 GPT-5.4/5.5/5.6 GA,此前注释只写「端点不提供」并不准确。但它要求显式传 `external_web_access: false`(GA 阶段强制 cache-only),codex 自带的 web_search 开关不会带该参数,形状与 Mantle 要求不符,因此维持 `web_search = "disabled"` 的现有行为不变,仅补充理由。 端到端实测确认 catalog 内三款 ctx 均为 1000000,region 为 us-east-1。 模型 ID / 窗口 / region 的依据(含官方链接)集中记在 bedrock-config.ts 的常量注释里,测试数 87 → 89。 验证:cargo test --workspace 879 通过 0 失败;npm test 89/89; tsc --noEmit 干净;i18n-verify 与上游基线一致。
摘要
新增 Amazon Bedrock 供应商,支持 Bedrock API Key (Bearer Token) 与 AWS Profile (SSO) 双鉴权路径。前后端各自实现生成与识别端并通过 property test 保证契约。
本 PR 已 rebase 到
upstream/main(v1.2.46)并按主仓库现行设计对齐,另包含代码评审提出的 10 项问题(P0/P1/P2/P3)修复。默认模型依据官方 model card 采用 GPT-5.6 三款。主要改动
后端(Rust /
codex-plus-core)complete_bedrock_bearer_token_config/complete_bedrock_aws_profile_configbedrock_config_from_config_text(与 TS 端保持契约一致)RelayProfile.bedrock: Option<BedrockConfig>,包含auth_mode/provider_id/region/aws_profile/iam_user_name/iam_key_validity_days六个字段;bedrock: None不序列化(旧 settings.json 落盘格式不变)relay_config_status_from_home的configured判定做了通用化——OpenAI 兼容形状(有base_url)走严格路径,原生 provider(无base_url,如 Bedrock AWS Profile 只写[model_providers.amazon-bedrock.aws]子表)走"表段存在即已配置"的兜底。relay_switch内不含任何供应商特判BEDROCK_MANTLE_URL_PREFIX/BEDROCK_MANTLE_URL_SUFFIX提取到模块顶部,供生成端与识别端共同引用前端(TypeScript / Tauri manager)
BedrockRelayProfileEditor:名称、Provider 标识符、Region、API Key、IAM 用户名、AWS Profile 等字段;提供 Long-Term / Short-Term Key 与 AWS SSO 的 CLI 命令示例ProviderPresetSelector:Bedrock 入口归入「第三方」分组,排在 Azure OpenAI 前面;搜索命中aws/bedrock/amazon时也可见bedrock-config.ts:与 Rust 契约对齐的解析/校验/命令生成纯函数测试
proptest覆盖 10 条属性(Bearer Token / AWS Profile 生成正确性、region 必填、保留字冲突、Base URL 一致性、生成 → 识别往返 等)src/bedrock-config.test.ts/src/BedrockRelayProfileEditor.test.ts/src/ProviderPresetSelector.test.ts用 Node--test+ fast-check 属性测试代码评审修复(P0/P1/P2/P3)
bedrockValidationErrorForBottom)bedrockValidationError注释与实现对齐ensure_root_scalars_precede_tables加入表段感知,忽略注释行;同步 property test 生成器tomlStringAssignment对 key 做escapeRegExp(当时同步修复的tomlBoolAssignment已随识别端改造移除,见下文「与上游对齐」)env_key/http_headers等杂字段残留BEDROCK_MANTLE_URL_PREFIX/SUFFIX提取常量,Rust / TS 双端同步field-hintbedrockLongTermApiKeyCommand拒绝非法天数(非正整数、前导零、字母、负号统一 fallback 到90)require_non_empty调用点 label 统一为中文("AWS 区域"),消除"region 不能为空"半中半英与上游对齐(rebase 后追加)
分支已 rebase 到
upstream/main(v1.2.46)。上游在 v1.2.45 期间独立改动了若干相关机制,本 PR 按主仓库现行设计做了对齐:configured判定:上游自行放宽了relay_config_status_from_home的严格路径(移除requires_openai_auth条件,因为 PureApi 不再写该字段)。原生 provider 兜底的守卫随之从!requires_openai_auth改为!has_base_url——「有base_url」才是 OpenAI 兼容形状的判据。新增回归测试守住新边界:声明了base_url但缺 Key 不能被表段存在性救回。requires_openai_auth:该字段语义是「走 OpenAI 鉴权语义(ChatGPT 登录态)」,上游仅在混合 / 官方模式下写入(见upsert_model_provider_config在两条 apply 路径上分别传true/false)。Bedrock Bearer Token 自带 Bedrock API Key,属纯 API 形态,因此不写。识别端(Rust / TS 两侧)改为只以base_url是否匹配 bedrock-mantle 模板为判据——该域名本身已足够唯一。附带升级路径兼容测试:旧版本写出的、带requires_openai_auth = true的配置仍必须被识别,避免老用户 profile 退化成普通中转。*.test.ts从src/components/移到src/,因为package.json的 test glob 只覆盖src/*.test.ts,放在子目录等于不会被npm test执行。tools/i18n-verify.mjs的SRC_FILES(此前只改了 codemod,两份列表不一致)。默认模型:GPT-5.6
预设默认模型为
openai.gpt-5.6-sol,model_list列入三款并均带[1M]窗口后缀。依据 官方 model card(2026-07-13 GA):openai.gpt-5.6-solopenai.gpt-5.6-terraopenai.gpt-5.6-luna三款官方均标注 1M,而 codex 内置元数据(
assets/gpt56-model-metadata-compat.json)都按 272k 记录,因此三条都需要后缀,由本工具生成 per-model catalog 覆盖内置值。预设 region 取us-east-1——必须落在三款交集内,否则默认模型 Sol 不可用(Sol 不支持 us-west-2),并有测试守住这个约束。模型 ID / 窗口 / region 的定义与依据集中在
bedrock-config.ts的常量注释,避免散落多处漂移。验证
cargo test --workspace:879 passed / 0 failed--lib221 通过(含 10 条 property test 与新增 regression)--test relay_switch73 通过、--test launcher8 通过(含 Bedrock 两条鉴权路径的完整写入路径集成测试)--test installers11 通过npm test(node --test "src/*.test.ts"):89 passed / 0 failedtsc --noEmit:干净cargo clippy --workspace --all-targets:0 error,改动文件无新增警告cargo fmt --check:仅剩 2 处上游既存未格式化位置(本 PR 刻意不动,避免污染 diff)node tools/i18n-verify.mjs:缺失清单与upstream/main基线完全一致,本 PR 不新增 i18n 债务openai/amazon-bedrock等)只在 Provider ID 下方展示 inline 红字,底部不再重复abc/-5/090均 fallback 到90~/.codex/config.toml生成的[model_providers.*]段落干净、无脏字段残留已知限制 / 备注
tauri.conf.json里bundle.active = false,本 PR 不涉及.app/.dmg打包变化。BEDROCK_MANTLE_URL_PREFIX/SUFFIX仍需 Rust / TS 两端手动同步;若未来 endpoint 模板改变,两处需同时更新。web_search = "disabled"。Bedrock 侧 Web Search 虽已对 GPT-5.4/5.5/5.6 GA,但要求显式传tools=[{"type": "web_search", "external_web_access": false}](GA 阶段强制 cache-only),codex 自带的 web_search 开关不带该参数、形状与 Mantle 要求不符,因此保持关闭。若要支持应作为独立特性走 tools 注入。model_context_window、model_auto_compact_token_limit与 per-model catalog 在 apply 流程里是在 Bedrock 配置生成之后统一施加的,因此后端对 Bedrock 完全生效(本 PR 的[1M]后缀正是走这条链路),只是编辑器暂未提供对应输入框。