环境
- CCSwitchMulti:
v3.19.2-16.2
- macOS
- 当前 Codex Provider:
codex-multirouter-company(MultiRouter Pro 公司)
- 目标供应商:Bitto
- 涉及功能:Codex Sub-Agent V2 保存流程
症状
在 V2 子 Agent 页面点击“保存 V2 子 Agent 配置”后,前端提示:
数据库保存看起来已经发生,但 Agent 文件投影与回读校验不一致。
我定位到的根因
-
写入阶段和回读阶段使用了不同的 Provider 上下文。
finish_codex_subagent_v2_mutation 调用 codex_subagent_v2_write_verification,验证时通过 codex_provider_classification_context 传入 ProviderClassificationContext。
- 但
publish_codex_multirouter_projection 仍调用 prepare_codex_config_text_with_model_catalog_without_provider_context,即写入 Agent 文件时没有传入 Provider 上下文。
- 对于
mode=all 路由,或模型没有命中 raw matchPrefixes 的情况(例如 glm-5.3、deepseek-v4-flash-vision),写入阶段可能把模型判为不可路由、不生成角色文件;回读校验阶段却根据 target provider 目录判为可路由、要求文件存在,于是返回失败。
-
投影后的 modelCatalog 没有写回数据库,V2 编译仍只读数据库里的原始 modelCatalog。
- 前端
saveSpawnAgentCandidates / handleSaveRoutingRoutes 保存时不会把 selectedProjectedCatalog 写回 Provider 的 settingsConfig.modelCatalog。
codex_catalog_model_specs 仍从 settings.modelCatalog 读取,而投影后的聚合 catalog 只写到 Live 文件。
- 因此 Bitto 新增的
deepseek-v4-flash-vision 已出现在 ~/.codex/cc-switch-model-catalog.json 和 UI 投影中,但不会自动出现在当前 MultiRouter 的 V2 后端模型列表里。
本机证据(手动修复前)
- Bitto Provider 的
modelCatalog 有:
- 当前 MultiRouter 的
settingsConfig.modelCatalog 之前没有 deepseek-v4-flash-vision
- 当前 MultiRouter 的
codexRouting.subagentV2.profiles 之前没有 deepseek-v4-flash-vision
- 实际生成的 Live catalog 有
deepseek-v4-flash-vision
~/.codex/agents 缺少 glm-5-3.toml,因为 Bitto 路由 matchPrefixes 没有 glm
- 手动把模型名规范化为
deepseek-v4-flash-bitto、并给 Bitto 路由补上 glm 后,glm-5-3.toml、deepseek-v4-flash-bitto.toml、gpt-5-6-luna.toml、gpt-5-6-sol.toml 均能生成且内容与预期一致
关联问题 / PR
建议修复方向
- 让 Agent 文件写入和回读校验使用同一份 Provider 上下文;例如
publish_codex_multirouter_projection 也接收 ProviderClassificationContext,或统一由投影设置编译。
- 保存 MultiRouter 路由/子 Agent 候选后,把投影生成的
modelCatalog 写回 Provider DB 的 settingsConfig.modelCatalog;或让 codex_catalog_model_specs 从 codex_multirouter::projection 生成模型列表。
- 补回归测试:
mode=all 且 matchPrefixes 为空/未命中时,写入与验证一致;
- 目标供应商新增加模型后,刷新/保存 V2 列表能自动加入;
- 保存 V2 后
verification.role_files_status == verified。
如果需要,我可以提供本机修复前后的数据库备份路径和日志证据。
环境
v3.19.2-16.2codex-multirouter-company(MultiRouter Pro 公司)症状
在 V2 子 Agent 页面点击“保存 V2 子 Agent 配置”后,前端提示:
数据库保存看起来已经发生,但 Agent 文件投影与回读校验不一致。
我定位到的根因
写入阶段和回读阶段使用了不同的 Provider 上下文。
finish_codex_subagent_v2_mutation调用codex_subagent_v2_write_verification,验证时通过codex_provider_classification_context传入ProviderClassificationContext。publish_codex_multirouter_projection仍调用prepare_codex_config_text_with_model_catalog_without_provider_context,即写入 Agent 文件时没有传入 Provider 上下文。mode=all路由,或模型没有命中 rawmatchPrefixes的情况(例如glm-5.3、deepseek-v4-flash-vision),写入阶段可能把模型判为不可路由、不生成角色文件;回读校验阶段却根据 target provider 目录判为可路由、要求文件存在,于是返回失败。投影后的 modelCatalog 没有写回数据库,V2 编译仍只读数据库里的原始 modelCatalog。
saveSpawnAgentCandidates/handleSaveRoutingRoutes保存时不会把selectedProjectedCatalog写回 Provider 的settingsConfig.modelCatalog。codex_catalog_model_specs仍从settings.modelCatalog读取,而投影后的聚合 catalog 只写到 Live 文件。deepseek-v4-flash-vision已出现在~/.codex/cc-switch-model-catalog.json和 UI 投影中,但不会自动出现在当前 MultiRouter 的 V2 后端模型列表里。本机证据(手动修复前)
modelCatalog有:deepseek-v4-flash-visionsettingsConfig.modelCatalog之前没有deepseek-v4-flash-visioncodexRouting.subagentV2.profiles之前没有deepseek-v4-flash-visiondeepseek-v4-flash-vision~/.codex/agents缺少glm-5-3.toml,因为 Bitto 路由matchPrefixes没有glmdeepseek-v4-flash-bitto、并给 Bitto 路由补上glm后,glm-5-3.toml、deepseek-v4-flash-bitto.toml、gpt-5-6-luna.toml、gpt-5-6-sol.toml均能生成且内容与预期一致关联问题 / PR
1c2e4cae解决了其中一部分,但我在 PR fix(codex): MultiRouter routing match semantics — include gate, fail-closed, mode=all catalog #35 head 上仍看到publish_codex_multirouter_projection使用without_provider_context,且saveSpawnAgentCandidates仍未把投影 modelCatalog 写回 DB建议修复方向
publish_codex_multirouter_projection也接收ProviderClassificationContext,或统一由投影设置编译。modelCatalog写回 Provider DB 的settingsConfig.modelCatalog;或让codex_catalog_model_specs从codex_multirouter::projection生成模型列表。mode=all且matchPrefixes为空/未命中时,写入与验证一致;verification.role_files_status == verified。如果需要,我可以提供本机修复前后的数据库备份路径和日志证据。