Skip to content

feat(bedrock): 新增 Amazon Bedrock 供应商支持(双鉴权路径 + 评审修复) - #1374

Open
yourlin wants to merge 7 commits into
BigPizzaV3:mainfrom
yourlin:main
Open

feat(bedrock): 新增 Amazon Bedrock 供应商支持(双鉴权路径 + 评审修复)#1374
yourlin wants to merge 7 commits into
BigPizzaV3:mainfrom
yourlin:main

Conversation

@yourlin

@yourlin yourlin commented Jul 8, 2026

Copy link
Copy Markdown

摘要

新增 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_config
  • 识别端:bedrock_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_homeconfigured 判定做了通用化——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 契约对齐的解析/校验/命令生成纯函数
  • 磁盘 config 有 Bedrock 特征时以推导结果为准;没有特征但 UI 已 patch bedrock(例如刚点入口按钮的中间态)时保留 UI 值,避免"点了 Amazon Bedrock 按钮但界面没有切换"

测试

  • proptest 覆盖 10 条属性(Bearer Token / AWS Profile 生成正确性、region 必填、保留字冲突、Base URL 一致性、生成 → 识别往返 等)
  • 新增 regression:脏字段残留、表段感知、注释行忽略、保留字冲突去重、天数校验
  • 前端 src/bedrock-config.test.ts / src/BedrockRelayProfileEditor.test.ts / src/ProviderPresetSelector.test.ts 用 Node --test + fast-check 属性测试

代码评审修复(P0/P1/P2/P3)

  • P0-1 保留字冲突时 inline 与底部错误提示去重(新增 bedrockValidationErrorForBottom
  • P0-2 bedrockValidationError 注释与实现对齐
  • P1-3 ensure_root_scalars_precede_tables 加入表段感知,忽略注释行;同步 property test 生成器
  • P1-4 tomlStringAssignment 对 key 做 escapeRegExp(当时同步修复的 tomlBoolAssignment 已随识别端改造移除,见下文「与上游对齐」)
  • P2-5 Bearer Token 分支改为整表替换,避免同名旧 provider 表下的 env_key / http_headers 等杂字段残留
  • 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 区域"),消除"region 不能为空"半中半英
  • UI 补齐:Bedrock 编辑器新增「名称」字段,修复原来 profile.name 无法编辑的问题

与上游对齐(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 不能被表段存在性救回。
  • Bearer Token 不再写 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.tssrc/components/ 移到 src/,因为 package.json 的 test glob 只覆盖 src/*.test.ts,放在子目录等于不会被 npm test 执行。
  • i18n:补齐英文翻译并修正 tools/i18n-verify.mjsSRC_FILES(此前只改了 codemod,两份列表不一致)。

默认模型:GPT-5.6

预设默认模型为 openai.gpt-5.6-solmodel_list 列入三款并均带 [1M] 窗口后缀。依据 官方 model card(2026-07-13 GA):

模型 ID 上下文窗口 区域
openai.gpt-5.6-sol 1M us-east-1, us-east-2
openai.gpt-5.6-terra 1M us-east-1, us-east-2, us-west-2
openai.gpt-5.6-luna 1M us-east-1, us-east-2, us-west-2

三款官方均标注 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 --workspace879 passed / 0 failed
    • --lib 221 通过(含 10 条 property test 与新增 regression)
    • --test relay_switch 73 通过、--test launcher 8 通过(含 Bedrock 两条鉴权路径的完整写入路径集成测试)
    • --test installers 11 通过
  • 前端 npm testnode --test "src/*.test.ts"):89 passed / 0 failed
  • tsc --noEmit:干净
  • cargo clippy --workspace --all-targets:0 error,改动文件无新增警告
  • cargo fmt --check:仅剩 2 处上游既存未格式化位置(本 PR 刻意不动,避免污染 diff)
  • node tools/i18n-verify.mjs:缺失清单与 upstream/main 基线完全一致,本 PR 不新增 i18n 债务
  • macOS 15 上手动验证:
    • Bedrock 编辑器名称字段可编辑
    • Bearer Token / AWS Profile 两条鉴权路径 UI 切换正常
    • 保留字冲突(openai / amazon-bedrock 等)只在 Provider ID 下方展示 inline 红字,底部不再重复
    • Long-Term Key 命令区输入 abc / -5 / 090 均 fallback 到 90
    • 供应商预设「第三方」分组中 Bedrock 显示在 Azure OpenAI 前面
    • 保存/切换 profile 后 ~/.codex/config.toml 生成的 [model_providers.*] 段落干净、无脏字段残留

已知限制 / 备注

  • tauri.conf.jsonbundle.active = false,本 PR 不涉及 .app / .dmg 打包变化。
  • 常量 BEDROCK_MANTLE_URL_PREFIX / SUFFIX 仍需 Rust / TS 两端手动同步;若未来 endpoint 模板改变,两处需同时更新。
  • Bedrock 配置无条件写入 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 注入。
  • Bedrock 走专用编辑器,通用编辑器的「上游协议 / 模型列表 / 上下文大小 / VLM / Provider Doctor」等字段不渲染。其中 model_context_windowmodel_auto_compact_token_limit 与 per-model catalog 在 apply 流程里是 Bedrock 配置生成之后统一施加的,因此后端对 Bedrock 完全生效(本 PR 的 [1M] 后缀正是走这条链路),只是编辑器暂未提供对应输入框。
  • AWS Profile 模式下「测试供应商」按钮禁用:该测试走内置 HTTP 客户端、只带 Bearer Token,不具备 SigV4 签名与 SSO 凭据链解析能力,请在真实 Codex 会话中验证。

yourlin added a commit to yourlin/CodexPlusPlus that referenced this pull request Jul 13, 2026
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
yourlin added a commit to yourlin/CodexPlusPlus that referenced this pull request Jul 13, 2026
同步 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
yourlin added a commit to yourlin/CodexPlusPlus that referenced this pull request Jul 13, 2026
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
@yourlin

yourlin commented Jul 14, 2026

Copy link
Copy Markdown
Author

已经合并了最新的代码,无冲突

@BigPizzaV3

Copy link
Copy Markdown
Owner

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.

yourlin added a commit to yourlin/CodexPlusPlus that referenced this pull request Jul 27, 2026
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
yourlin added a commit to yourlin/CodexPlusPlus that referenced this pull request Jul 27, 2026
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
@yourlin

yourlin commented Jul 27, 2026

Copy link
Copy Markdown
Author

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.

已经合并了最新的代码,无冲突

yourlin added a commit to yourlin/CodexPlusPlus that referenced this pull request Aug 11, 2026
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
yourlin added a commit to yourlin/CodexPlusPlus that referenced this pull request Aug 11, 2026
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
@BigPizzaV3

Copy link
Copy Markdown
Owner

main 已更新到 7385664。请 rebase 当前 relay/settings/Manager 结构,保持 Bedrock API Key 与 AWS Profile 两条鉴权路径互斥且不把凭据写入日志或前端状态;补 region/model ARN、临时凭据过期、SSO 未登录、导入 round-trip 和现有非 Bedrock provider 不变测试,并跑三平台 CI。

支持双鉴权路径(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 与上游基线一致。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants