|
51 | 51 | - 子菜单顺序: |
52 | 52 | 1. `codex` |
53 | 53 | 2. `openai-compatible` |
| 54 | +- 子菜单恢复规则优先级: |
| 55 | + 1. 若存在明确子菜单路由或显式导航目标,优先使用该目标 |
| 56 | + 2. 否则读取本地持久化的上次子菜单选择 |
| 57 | + 3. 若以上都不存在,默认回到 `codex` |
| 58 | +- 父级 `账号池` 折叠后再次展开时,保留上一次子菜单选中态,不重置到默认值 |
54 | 59 |
|
55 | 60 | #### 子级 1:codex |
56 | 61 |
|
|
62 | 67 | - `重新登录` |
63 | 68 | - `额度观察` |
64 | 69 | - `轮动设置` |
| 70 | +- 当前 `Codex API Key` 资产没有正式“验证 provider 配置”链路;若后续补验证,只能视为过渡方案,不代表最终信息架构 |
65 | 71 |
|
66 | 72 | #### 子级 2:openai-compatible |
67 | 73 |
|
68 | 74 | - 新增一个面向 provider 的子工作区 |
69 | 75 | - 其核心对象不是“单个 key”,而是“provider” |
| 76 | +- 第一阶段使用独立的 provider 列表模型,不强行进入现有 `AccountRecord` 主列表,也不伪装成 `Codex API Key` 卡片 |
70 | 77 | - provider 最小字段: |
71 | 78 | - `name` |
72 | 79 | - `baseUrl` |
73 | 80 | - `apiKeyEntries[0].apiKey` |
74 | 81 | - `prefix(可选)` |
| 82 | +- provider 标识规则: |
| 83 | + - 第一阶段以 `name` 作为产品层主标识 |
| 84 | + - `name` 必须唯一 |
| 85 | + - 新增或编辑时若与现有 provider 重名,必须阻止保存并给出冲突提示 |
75 | 86 | - 后续增强字段: |
76 | 87 | - `headers` |
77 | 88 | - `apiKeyEntries[]` |
78 | 89 | - `models[]` |
| 90 | +- 空状态规则: |
| 91 | + - 当列表中没有任何 openai-compatible provider 时,页面必须展示明确空状态 |
| 92 | + - 空状态需要解释“这里管理的是 provider,而不是单个 API key 账号” |
| 93 | + - 空状态主 CTA 为“新增 openai-compatible provider” |
| 94 | +- provider 验证规则: |
| 95 | + - “验证”针对的是 provider 配置可用性,不是单个资产卡片是否存在 |
| 96 | + - 第一阶段验证对象至少覆盖: |
| 97 | + - `baseUrl` |
| 98 | + - `apiKey` |
| 99 | + - `headers(可选)` |
| 100 | + - `model(可选,但建议支持)` |
| 101 | + - 第一阶段验证结果状态至少覆盖: |
| 102 | + - `idle` |
| 103 | + - `loading` |
| 104 | + - `success` |
| 105 | + - `error` |
| 106 | + - `error` 状态需要保留最近一次失败原因,便于用户在第一跳看到验证失败信息 |
79 | 107 |
|
80 | 108 | ### BDD 场景 |
81 | 109 |
|
|
168 | 196 | - And 第一阶段至少支持修改 `name`、`baseUrl`、首个 `apiKey entry` 与 `prefix` |
169 | 197 | - And 后续阶段可继续扩展 `headers`、多 `apiKey entries` 与 `models` |
170 | 198 |
|
171 | | -#### 场景 11:删除 openai-compatible provider |
| 199 | +#### 场景 11:验证 openai-compatible provider 配置 |
| 200 | + |
| 201 | +- Given 用户已进入 `openai-compatible` 子菜单 |
| 202 | +- And 页面中已有一个 provider 容器 |
| 203 | +- When 用户在 provider 详情或编辑面板触发“验证” |
| 204 | +- Then 应用应以 provider 配置为输入发起验证,而不是复用 `codex quota` 链路 |
| 205 | +- And 最小验证入参至少包括 `baseUrl`、`apiKey`、可选 `headers` 与 `model` |
| 206 | +- And 页面应展示最近一次验证结果状态:`idle / loading / success / error` |
| 207 | +- And 当验证失败时,页面应保留失败原因,不能只显示一个无上下文的失败提示 |
| 208 | + |
| 209 | +#### 场景 12:删除 openai-compatible provider |
172 | 210 |
|
173 | 211 | - Given 用户已进入 `openai-compatible` 子菜单 |
174 | 212 | - And 页面中已有一个 provider 容器 |
175 | 213 | - When 用户执行删除操作 |
176 | 214 | - Then 删除粒度应是整个 provider |
177 | 215 | - And 不应误实现为“只删除 provider 里的某一个 key 但保留残缺容器” |
178 | 216 |
|
179 | | -#### 场景 12:子菜单状态保持 |
| 217 | +#### 场景 13:codex API Key 的过渡性验证 |
| 218 | + |
| 219 | +- Given 用户当前位于 `codex` 子菜单 |
| 220 | +- And 页面中已有 `Codex API Key` 资产 |
| 221 | +- When 产品选择先补一个过渡性的验证动作 |
| 222 | +- Then 必须明确该动作只代表“单条 codex api key 的临时验证方案” |
| 223 | +- And 不得把它定义成最终统一的 provider 验证架构 |
| 224 | +- And 后续 `openai-compatible` provider 工作区上线后,应以 provider 级验证作为正式能力归属 |
| 225 | + |
| 226 | +#### 场景 14:子菜单状态保持 |
180 | 227 |
|
181 | 228 | - Given 用户已进入 `账号池` 下的任意子菜单 |
182 | 229 | - When 用户刷新页面或切换到其他主导航后再返回 |
183 | | -- Then 应用应能恢复上一次使用的子菜单,或按约定回到默认子菜单 |
| 230 | +- Then 应用应按优先级恢复子菜单:显式导航目标 > 本地持久化 > 默认 `codex` |
184 | 231 | - And 不应出现父级高亮、子级选中、主体内容三者不一致 |
| 232 | +- And 父级折叠后再展开时,应保留上次子菜单选中态 |
185 | 233 |
|
186 | 234 | ## 验收标准 |
187 | 235 | - 已存在 `docs-linhay/spaces/account-pool/README.md` |
|
192 | 240 | - 已定义 `账号池` 父级与 `codex / openai-compatible` 子菜单的信息架构 |
193 | 241 | - 已定义 `codex` OAuth 登录与过期恢复的验收场景 |
194 | 242 | - 已定义 `openai-compatible` provider 的最小闭环场景 |
| 243 | +- 已明确定义子菜单恢复规则:显式目标 > 本地持久化 > 默认 `codex` |
| 244 | +- 已明确定义 `openai-compatible provider` 的唯一性与主标识规则 |
| 245 | +- 已明确定义 `openai-compatible` 第一阶段采用独立 provider 列表模型 |
| 246 | +- 已明确定义 `openai-compatible` 的空状态与默认主 CTA |
| 247 | +- 已明确定义“验证”归属为 provider 配置验证,而不是简单给现有 API key 卡片补按钮 |
| 248 | +- 已明确定义 provider 验证最小入参与结果状态模型 |
195 | 249 | - 实现后至少覆盖后端 bridge 测试与前端账号动作测试 |
196 | 250 | - 过期 `codex` 账号不再只是显示失败原因,而是可直接触发重新登录 |
197 | 251 | - 成功重登后默认回填原账号资产,不新增重复账号 |
|
0 commit comments