|
12 | 12 | - 账号池截图归档到 `screenshots/` |
13 | 13 | - 账号池多 agent 讨论归档到 `debate/` |
14 | 14 | - `nolon/chatgpt(codex)` OAuth 登录与账号过期恢复集成 |
| 15 | +- 账号池信息架构与子菜单导航 |
| 16 | +- `openai-compatible` provider 资产入口与管理范围 |
15 | 17 |
|
16 | 18 | ## 非目标 |
17 | 19 | - 在本次操作中直接定义账号池的详细产品方案或技术实现 |
|
20 | 22 |
|
21 | 23 | ## 当前需求 |
22 | 24 |
|
23 | | -### 目标 |
| 25 | +### 完全体目标 |
24 | 26 |
|
25 | | -在当前账号池中,为 `nolon/chatgpt(codex)` 账号补齐两条闭环: |
| 27 | +账号池在完全体状态下不再是一个单平面页面,而是一个带子菜单的父级工作区: |
26 | 28 |
|
27 | | -1. 应用内发起 OAuth 登录,替代纯手工导入 `auth.json` |
28 | | -2. 当账号过期或失效时,用户可以直接从失败卡片触发重新登录,而不是只看到失败原因 |
| 29 | +1. 用户点击侧边栏 `账号池` 后,`账号池` 下方展开两个子菜单: |
| 30 | + - `codex` |
| 31 | + - `openai-compatible` |
| 32 | +2. `codex` 子菜单承接现有 `ChatGPT OAuth auth-file + Codex API Key + quota + reauth + rotation` 的完整闭环。 |
| 33 | +3. `openai-compatible` 子菜单承接通用 OpenAI 兼容 provider 的新增、查看、编辑、删除与配置工作台。 |
| 34 | +4. 父级 `账号池` 负责统一入口、统一导航状态和统一空间命名;两个子菜单分别承接各自的业务模型,不强行压成同一种“账号卡”心智。 |
29 | 35 |
|
30 | 36 | ### 已知边界 |
31 | 37 |
|
32 | 38 | 1. 当前 GetTokens 已能把 `nolon chatgptAccount` 类 auth 文件识别为 `codex` |
33 | 39 | 2. 当前导入链路已能把 legacy `codex/nolon` auth 清洗成 sidecar 真正消费的最小字段结构 |
34 | 40 | 3. 当前失败原因已能从 sidecar `statusMessage` 透传到账号卡片 |
35 | | -4. 当前前端入口仍以“上传文件 / 粘贴 JSON / API Key 录入”为主,没有 OAuth bridge |
| 41 | +4. 当前前端入口仍以“上传文件 / 粘贴 JSON / API Key 录入”为主,`codex` 已有 OAuth bridge,但 `openai-compatible` 还没有正式产品入口 |
36 | 42 | 5. 当前桌面应用不是单一全局登录应用,不能把单个账号失效等同于整个应用登出 |
| 43 | +6. 参考 sidecar 的 `openai-compatible` 协议是 `provider 容器 + api-key-entries + models`,不是单个 API key 资产 |
| 44 | + |
| 45 | +### 信息架构 |
| 46 | + |
| 47 | +#### 父级:账号池 |
| 48 | + |
| 49 | +- 侧边栏主项:`账号池` |
| 50 | +- 交互:点击后展开/聚焦子菜单,而不是直接只展示单一列表 |
| 51 | +- 子菜单顺序: |
| 52 | + 1. `codex` |
| 53 | + 2. `openai-compatible` |
| 54 | + |
| 55 | +#### 子级 1:codex |
| 56 | + |
| 57 | +- 继续保留并增强现有 `codex` 账号池能力: |
| 58 | + - `ChatGPT 登录` |
| 59 | + - `导入 Auth File` |
| 60 | + - `粘贴 Auth 内容` |
| 61 | + - `添加 Codex API Key` |
| 62 | + - `重新登录` |
| 63 | + - `额度观察` |
| 64 | + - `轮动设置` |
| 65 | + |
| 66 | +#### 子级 2:openai-compatible |
| 67 | + |
| 68 | +- 新增一个面向 provider 的子工作区 |
| 69 | +- 其核心对象不是“单个 key”,而是“provider” |
| 70 | +- provider 最小字段: |
| 71 | + - `name` |
| 72 | + - `baseUrl` |
| 73 | + - `apiKeyEntries[0].apiKey` |
| 74 | + - `prefix(可选)` |
| 75 | +- 后续增强字段: |
| 76 | + - `headers` |
| 77 | + - `apiKeyEntries[]` |
| 78 | + - `models[]` |
37 | 79 |
|
38 | 80 | ### BDD 场景 |
39 | 81 |
|
40 | | -#### 场景 1:新增 ChatGPT 账号 |
| 82 | +#### 场景 1:进入账号池父级后看到子菜单 |
| 83 | + |
| 84 | +- Given 用户已进入桌面应用主界面 |
| 85 | +- When 用户点击侧边栏 `账号池` |
| 86 | +- Then `账号池` 下方展开两个子菜单:`codex` 与 `openai-compatible` |
| 87 | +- And 当前页面主体展示默认子菜单对应的内容 |
| 88 | +- And 父级高亮与子级选中态保持一致 |
| 89 | + |
| 90 | +#### 场景 2:切换到 codex 子菜单 |
| 91 | + |
| 92 | +- Given 用户已展开 `账号池` 子菜单 |
| 93 | +- When 用户点击 `codex` |
| 94 | +- Then 页面进入 `codex` 账号池视图 |
| 95 | +- And 用户可以看到 `ChatGPT 登录`、`导入 Auth File`、`粘贴 Auth 内容`、`添加 Codex API Key` |
| 96 | +- And 现有 quota、reauth、rotation 等 codex 专属能力仍保留在该子菜单内 |
| 97 | + |
| 98 | +#### 场景 3:切换到 openai-compatible 子菜单 |
| 99 | + |
| 100 | +- Given 用户已展开 `账号池` 子菜单 |
| 101 | +- When 用户点击 `openai-compatible` |
| 102 | +- Then 页面进入 `openai-compatible` provider 视图 |
| 103 | +- And 主体对象是 provider 列表或 provider 容器 |
| 104 | +- And 页面不再误用 `添加 Codex API Key` 作为主入口 |
| 105 | + |
| 106 | +#### 场景 4:新增 ChatGPT 账号 |
41 | 107 |
|
42 | 108 | - Given sidecar 已就绪,账号池页面可操作 |
| 109 | +- And 当前位于 `codex` 子菜单 |
43 | 110 | - When 用户点击 `ChatGPT 登录` |
44 | 111 | - Then 应用调用 sidecar OAuth 起始接口并弹出登录确认框 |
45 | 112 | - And 确认框展示登录 URL,并提供 `复制`、`在浏览器中打开`、`关闭` |
46 | 113 | - And 前端显示登录进行中状态 |
47 | 114 | - When sidecar OAuth 流程完成 |
48 | 115 | - Then 账号池刷新并出现新的 `codex` 账号记录 |
49 | 116 |
|
50 | | -#### 场景 2:过期账号重新登录 |
| 117 | +#### 场景 5:过期账号重新登录 |
51 | 118 |
|
52 | | -- Given 账号池中已有一个 `codex` auth-file 账号,状态异常且存在失败原因 |
| 119 | +- Given 当前位于 `codex` 子菜单 |
| 120 | +- And 账号池中已有一个 `codex` auth-file 账号,状态异常且存在失败原因 |
53 | 121 | - When 用户点击该卡片上的 `重新登录` |
54 | 122 | - Then 应用发起新的 OAuth 流程 |
55 | 123 | - When OAuth 成功且检测到新的 `codex` auth 文件 |
56 | 124 | - Then 应用将新 auth 内容回填到原账号资产 |
57 | 125 | - And 刷新后原账号 ID 仍以原文件名存在 |
58 | 126 | - And 临时生成的新 auth 文件不会作为重复账号残留 |
59 | 127 |
|
60 | | -#### 场景 3:OAuth 失败或超时 |
| 128 | +#### 场景 6:OAuth 失败或超时 |
61 | 129 |
|
62 | 130 | - Given 用户已发起 `ChatGPT 登录` 或 `重新登录` |
63 | 131 | - When sidecar 返回 `error` 状态或超时 |
64 | 132 | - Then 前端保留错误提示 |
65 | 133 | - And 不修改现有账号内容 |
66 | 134 | - And 用户可以再次触发登录 |
67 | 135 |
|
68 | | -#### 场景 4:登录 URL 手动操作 |
| 136 | +#### 场景 7:登录 URL 手动操作 |
69 | 137 |
|
70 | 138 | - Given 用户已发起 `ChatGPT 登录` 或 `重新登录` |
71 | 139 | - When 前端展示登录确认框 |
72 | 140 | - Then 用户可以复制登录 URL |
73 | 141 | - And 用户可以手动打开浏览器继续登录 |
74 | 142 | - And 用户可以关闭确认框而不影响后续列表刷新 |
75 | 143 |
|
76 | | -#### 场景 5:账号失效后的可恢复性 |
| 144 | +#### 场景 8:账号失效后的可恢复性 |
77 | 145 |
|
78 | 146 | - Given `codex` auth-file 账号状态不是 `ACTIVE / CONFIGURED / DISABLED / LOCAL` |
79 | 147 | - When 用户查看账号卡片 |
80 | 148 | - Then 卡片除失败原因外,还应暴露 `重新登录` 动作 |
81 | 149 | - And 该动作只作用于当前账号,不影响其他账号和应用整体路由 |
82 | 150 |
|
| 151 | +#### 场景 9:新增 openai-compatible provider |
| 152 | + |
| 153 | +- Given 用户已进入 `openai-compatible` 子菜单 |
| 154 | +- When 用户点击新增 provider |
| 155 | +- Then 页面展示 provider 级表单 |
| 156 | +- And 表单至少要求填写 `name`、`baseUrl`、`apiKey` |
| 157 | +- And `prefix` 作为可选字段出现 |
| 158 | +- When 用户保存成功 |
| 159 | +- Then 页面出现新的 openai-compatible provider 容器 |
| 160 | +- And 该容器不被错误地渲染成 `Codex API Key` |
| 161 | + |
| 162 | +#### 场景 10:编辑 openai-compatible provider |
| 163 | + |
| 164 | +- Given 用户已进入 `openai-compatible` 子菜单 |
| 165 | +- And 页面中已有一个 provider 容器 |
| 166 | +- When 用户打开该 provider 的详情或编辑面板 |
| 167 | +- Then 用户可以查看并修改基础字段 |
| 168 | +- And 第一阶段至少支持修改 `name`、`baseUrl`、首个 `apiKey entry` 与 `prefix` |
| 169 | +- And 后续阶段可继续扩展 `headers`、多 `apiKey entries` 与 `models` |
| 170 | + |
| 171 | +#### 场景 11:删除 openai-compatible provider |
| 172 | + |
| 173 | +- Given 用户已进入 `openai-compatible` 子菜单 |
| 174 | +- And 页面中已有一个 provider 容器 |
| 175 | +- When 用户执行删除操作 |
| 176 | +- Then 删除粒度应是整个 provider |
| 177 | +- And 不应误实现为“只删除 provider 里的某一个 key 但保留残缺容器” |
| 178 | + |
| 179 | +#### 场景 12:子菜单状态保持 |
| 180 | + |
| 181 | +- Given 用户已进入 `账号池` 下的任意子菜单 |
| 182 | +- When 用户刷新页面或切换到其他主导航后再返回 |
| 183 | +- Then 应用应能恢复上一次使用的子菜单,或按约定回到默认子菜单 |
| 184 | +- And 不应出现父级高亮、子级选中、主体内容三者不一致 |
| 185 | + |
83 | 186 | ## 验收标准 |
84 | 187 | - 已存在 `docs-linhay/spaces/account-pool/README.md` |
85 | 188 | - 已存在 `docs-linhay/spaces/account-pool/plans/` |
86 | 189 | - 已存在 `docs-linhay/spaces/account-pool/screenshots/` |
87 | 190 | - 已存在 `docs-linhay/spaces/account-pool/debate/` |
88 | 191 | - 后续账号池相关文档默认优先落到该 space |
| 192 | +- 已定义 `账号池` 父级与 `codex / openai-compatible` 子菜单的信息架构 |
89 | 193 | - 已定义 `codex` OAuth 登录与过期恢复的验收场景 |
| 194 | +- 已定义 `openai-compatible` provider 的最小闭环场景 |
90 | 195 | - 实现后至少覆盖后端 bridge 测试与前端账号动作测试 |
91 | 196 | - 过期 `codex` 账号不再只是显示失败原因,而是可直接触发重新登录 |
92 | 197 | - 成功重登后默认回填原账号资产,不新增重复账号 |
93 | 198 | - 登录入口改为手动确认框,不再无提示直接拉起系统浏览器 |
| 199 | +- `openai-compatible` 第一阶段不要求完整 AI Provider 后台,但必须以 provider 为主对象,而不是复用 `Codex API Key` 单条资产心智 |
| 200 | +- 左侧导航、父级高亮、子菜单选中态与主体内容必须一致 |
94 | 201 |
|
95 | 202 | ## 相关链接 |
96 | 203 | - [docs-linhay 文档入口](/Users/linhey/Desktop/linhay-open-sources/GetTokens/docs-linhay/README.md) |
97 | 204 | - [spaces 结构治理](/Users/linhey/Desktop/linhay-open-sources/GetTokens/docs-linhay/dev/20260424-spaces-structure-governance.md) |
| 205 | +- [OpenAI-Compatible 评估与边界](/Users/linhey/Desktop/linhay-open-sources/GetTokens/docs-linhay/spaces/20260427-deepseek-provider-support/README.md) |
| 206 | +- [OpenAI-Compatible Debate](/Users/linhey/Desktop/linhay-open-sources/GetTokens/docs-linhay/spaces/20260427-deepseek-provider-support/debate/20260427/accounts/20260427-openai-compatible-provider-support-v01.md) |
98 | 207 |
|
99 | 208 | ## 当前状态 |
100 | 209 | - 状态:in-progress |
101 | | -- 最近更新:2026-04-26 |
102 | | -- 最近变更:启动 `nolon/chatgpt(codex)` OAuth 登录与过期恢复集成,先收敛为账号池内局部动作,不引入全局登录页。 |
| 210 | +- 最近更新:2026-04-27 |
| 211 | +- 最近变更:账号池需求已升级为完全体信息架构,父级 `账号池` 下明确收敛两个子菜单 `codex / openai-compatible`;`codex` 继续承接 OAuth 与 quota 闭环,`openai-compatible` 改为 provider 级心智,不复用单条 `Codex API Key` 交互。 |
0 commit comments