backend/internal/domain 新增 GroupCodexModelsManifestConfig{Enabled, AccountIDs, FallbackToScheduler},JSON 键为 enabled、account_ids、fallback_to_schedulerbackend/ent/schema/group.go 新增 JSONB 字段 codex_models_manifest_config(默认空结构体),执行 go generate ./entbackend/migrations/234_group_codex_models_manifest_config.sql(ADD COLUMN IF NOT EXISTS ... JSONB NOT NULL DEFAULT '{}'::jsonb)service.Group 新增 CodexModelsManifestConfig 字段并添加类型别名;group_repo.go 创建与更新两处 setter 写入该字段api_key_repo.go:分组字段投影列表与 groupEntityToService 加入新字段api_key_auth_cache.go 快照结构体与 api_key_auth_cache_impl.go 两处映射加入新字段admin_group_duplicate.go 复制分组时将该配置重置为关闭且账号列表为空backend/internal/service/group_codex_models_manifest.go:normalizeCodexModelsManifestConfig(非 openai 平台归零、去重保序)与 validateCodexModelsManifestConfig(开启时非空、≤10、全部为分组内 active 的 openai 账号),错误码 INVALID_CODEX_MODELS_MANIFEST_CONFIGadmin_service.go 的 CreateGroupInput/UpdateGroupInput 与 admin_group.go 创建、更新路径接入归一化与校验;创建路径 enabled=true 返回 400handler/admin/group_handler.go 的创建与更新请求结构体、dto/types.go 响应结构体、dto/mappers.go 增加 codex_models_manifest_configadmin_service_group_test.go 增加测试:开启但空列表被拒、非成员或非 openai 账号被拒、超过 10 个被拒、非 openai 平台被归零、重复 ID 去重保序、创建时开启被拒codexModelsManifestCacheTTL 调整为 60 秒,保持 codexModelsManifestCacheStaleTTL 为 5 分钟,将 codexModelsManifestCacheMaxEntries 提高到 512,并更新常量注释说明三段时效与容量依据fetchCachedAPIKeyCodexModelsManifest/refreshCachedAPIKeyCodexModelsManifest 泛化为接受 fetch 闭包的 fetchCachedCodexModelsManifest/refreshCachedCodexModelsManifestFetchCodexModelsManifest 的 OAuth 分支改为经缓存调用,闭包内保留 agent identity 任务恢复逻辑,错误时仍调用 handleCodexModelsManifestAccountAuthErroropenai_codex_models_service_test.go 增加或调整测试:OAuth 账号新鲜期内零上游请求、乐观期返回旧值且单飞后台刷新、超期后同步等待并写回、超期上游失败返回错误、令牌变化后缓存未命中、If-None-Match 基于缓存 ETag 返回 304、同一账号被两个分组同时请求时只发一次上游请求且各分组过滤互不影响backend/internal/service/openai_codex_models_pinned.go:mergeCodexModelsManifestBodies 纯函数(第一个信封为基底、models 按 slug 并集且先出现者优先)FetchPinnedCodexModelsManifest(ctx, group, clientVersion):ListByGroup 取成员、按配置顺序筛选可用账号(active、Schedulable、未过期;忽略限流与过载)、errgroup 并发拉取与补全、按下标收集结果、部分失败记录 slog.Warn、全部不可用返回 ErrNoPinnedCodexModelsAccounts、全部失败返回最后一个错误、成功时设置合并体 ETag 并返回首个成功账号openai_codex_models_handler.go:本地生成分支之后加入固定账号分支,成功时 setOpsSelectedAccount 后调用 MergeGroupConfiguredCodexModels 并写响应;按 FallbackToScheduler 决定回退调度器循环或返回 503 / 上游错误openai_codex_models_handler_test.go 增加测试:两个账号返回不同模型时客户端收到并集且未调用调度器、限流账号仍被使用、停用账号被跳过、不在分组的 ID 被跳过、部分失败仍 200、全部不可用时默认 503、开启回退时走调度器、自定义模型列表过滤仍生效、ETag 匹配返回 304frontend/src/types/index.ts 新增 CodexModelsManifestConfig 类型,并加入 AdminGroup、创建与更新请求类型frontend/src/components/admin/group/CodexManifestAccountsField.vue:开关、已选账号标签、带防抖的搜索下拉(adminAPI.accounts.list 按 platform=openai 与 group 过滤)、回退子开关GroupsView.vue 编辑对话框 OpenAI 区块挂载组件;打开编辑时解析已存账号名称(失败显示 #<id>);提交时开关打开且列表为空则提示并阻止;更新请求携带该字段;创建请求固定发送关闭状态overview.ts 的 admin.groups.codexModelsManifest.*):标题、开关文案、启用与未启用提示、账号标签、搜索占位、回退开关文案、至少选择一个账号的错误提示cd backend && go test -tags=unit ./... 与 golangci-lint run ./... 通过cd backend && go test -tags=integration ./internal/repository/... 通过(含投影对账测试)cd frontend && pnpm test 与类型检查通过/v1/models 与 /models 接入固定账号逻辑,中英文 UI 文案覆盖两个入口