Table of Contents
- 产品需求总览
- 2026-08-22 范围变更:完全移除用户点数
- 本页用途
- 事实来源边界
- 当前需求索引
- 登记规则
- 原型与设计资产
- 状态规则
- 更新时机
- 最小验收清单
- 2026-08-22 Provider 凭据需求变更
- #24 管理端交付状态(2026-08-22,已验收)
- #25 portal 提交契约交付状态(2026-08-23,已验收)
- #26 portal 用户界面交付状态(2026-08-23,已验收)
- #27 MVP-1 集成验收状态(2026-08-24,已验收)
- #19 MVP-1 汇总验收状态(2026-08-24,已验收)
- MVP-2 API 开放与治理(2026-08-24,设计与原型已确认)
- 用户端仅账号登录(#50)
- MVP-2 集成验收完成状态(2026-08-25)
- 生成记录耗时与信息边界(#65)
- 管理员创建受控终端用户(#73)
- Portal 可控自助注册(#75 / #76,2026-08-29)
产品需求总览
2026-08-22 范围变更:完全移除用户点数
用户已确认完全移除用户点数。数据库、接口、生成链路、管理端和用户端均不包含点数、余额、扣费、退款、充值、发放或配额;未来确需增加时必须建立新 Epic 并重新确认。设计变更工单 #31 与快照 prototypes/31/v1/index.html 已于 2026-08-22 经用户验收;#24 的设计门禁已解除,可按确认范围恢复实施。
本页用途
本页是产品需求的统一导航入口,帮助项目负责人、Agent 和初级维护者快速回答:项目有哪些长期需求、当前状态是什么、详细规则和实施证据在哪里。
本页只保存稳定摘要、状态和链接,不复制完整工单、主题文档或聊天内容。需求详情仍在对应事实来源维护,避免形成两份不一致的正式需求。
事实来源边界
| 信息 | 唯一事实来源 | 本页怎样记录 |
|---|---|---|
| 项目目标、用户、范围和技术基线 | Project-Profile | 链接和一句话摘要 |
| 长期功能需求、业务规则和系统边界 | 对应 Wiki 主题页 | 需求领域和详情链接 |
| 单次实现范围、变化和验收标准 | Gitea 单元任务工单 | 工单编号和当前状态 |
| 已完成方案、测试、提交和遗留问题 | Gitea 单元任务工单 | 验收入口 |
| 与版本绑定的原型、设计图或交互稿 | Git 中的 design/ 或 prototypes/ |
路径、版本和确认状态 |
| 外部原型 | 原型平台 | 链接、版本或确认日期;重要版本保留可追溯快照 |
不保存完整聊天记录、Agent 内部推理、密码、令牌、个人数据或生产数据。
当前需求索引
工单 #1 已完成长期技术基线整理和验收。项目由 Epic #3 统一跟踪;MVP-0 #4 已于 2026-08-21 验收完成。MVP-1 #19 的设计门禁已完成:技术设计 #16 已于 2026-08-21 验收通过;管理端原型 #17 的 prototypes/17/v1/index.html 已于 2026-08-21 通过用户验收,用户端原型 #18 的 prototypes/18/v1/index.html 已于 2026-08-21 通过用户验收。生产实现与集成验收单元工单已建立:#20~#28。#20、#21、#22、#23 和 #28 已于 2026-08-21~2026-08-22 验收完成;#24 已于 2026-08-22 验收交付;#25 已于 2026-08-23 验收交付;#26 已于 2026-08-23 通过用户验收;#27 及集成验收发现的 #32、#33、#34 已于 2026-08-24 通过用户验收;MVP-1 已于 2026-08-24 通过汇总工单 #19 的用户验收。其中 #23 已交付管理 API 基线;#24 按 #30 风险决策改为明文凭据与单条回显,并完成固定 go-admin-ui 页面、Casbin/菜单集成、脱敏审计和默认禁用的连通性探测门禁;portal 的 MVP-1 提交契约与游标已由 #25 验收交付,用户页面已由 #26 于 2026-08-23 验收交付。
| 需求领域 | 用户与场景 | 需求状态 | MVP | 详细说明 | 实施工单 | 设计证据 |
|---|---|---|---|---|---|---|
| 核心生成域与单上游 | 用户提交提示词/原图得到结果 | 已交付(#6~#10、#13、#15 已验收) | MVP-0 #4 | 架构、业务规则 | #6 迁移、#7 core、#8 platform、#9 queue、#10 worker | 架构/数据/状态设计已确认 |
| 用户端生成页 | 种子用户登录并完成一次异步生成 | 已交付(#11~#13 已验收) | MVP-0 #4 | 本页“用户端布局与状态” | #11 portal 后端、#12 用户界面 | 原型设计 #2;prototypes/2/v1/index.html,2026-08-20 用户已确认 |
| 默认 prompt template | 系统以数据配置而非硬编码合成提示词 | 已交付(#7/#13 已验收) | MVP-0 #4 | 业务规则 | #7 | 2026-08-20 已确认中性模板与 {{.UserPrompt}} |
| 多 Provider 路由与故障转移 | 单上游故障时继续服务 | 已交付(#27 已验收) | MVP-1 #19 | 架构、业务规则 | #16 技术设计 | #16 架构/API/数据/状态设计于 2026-08-21 已确认 |
| 管理端配置与记录 | 运营配置模型、路由池并排障 | 已交付(#24 已验收) | MVP-1 #19 | 本页“管理端页面” | #17 管理端原型 | prototypes/17/v1/index.html,v1,2026-08-21 用户已确认 |
| 图片角色编辑 | 用户编辑 role_rule、角色、备注与顺序 | 后端与页面均已交付(#25、#26 已验收) | MVP-1 #19 | 业务规则“提示词与上传” | #18 用户端原型 | prototypes/18/v1/index.html,v1,2026-08-21 用户已确认 |
| API Key 与程序调用 | 外部程序提交与查询任务 | 已确认 | MVP-2 | 本页“程序化调用” | 待建 | API/权限设计 |
| 限流、保留期、公开注册 | 治理滥用和磁盘;决定是否开放用户获取 | 待确认(阈值/流程) | MVP-2 或后续 | 业务规则“需要补充什么” | 待建 | 安全/运维/认证设计 |
MVP 分期
原则:先完成可观测、可恢复、安全的单上游闭环,再增加可用性与运营能力,最后开放治理能力。前一期的验收门禁未通过,不进入下一期。
MVP-0:最小闭环
范围:
- 可逆迁移:
users、providers、provider_models、prompt_templates、generations、generation_inputs、generation_outputs,含明确索引、外键和唯一约束。 - core 仅使用 GORM/标准库;platform 提供安全 HTTP、本地存储、缩略图和 AES-GCM 实现。
chat与images_edits;唯一启用 ProviderModel,不做多家故障转移。- SKIP LOCKED、lease owner/token/until、过期 running 原子重领、最终 CAS、attempt/error 落库。
prompt_templates提供已确认的默认配置;第一张图片自动 primary,其余 reference。- portal 只提供受控种子用户登录、桌面双栏与移动单列、异步提交、HTMX 轮询和鉴权结果访问。
- worker 在 portal 内运行并优雅退出;配置使用可重复种子命令,自动测试连接 mock 上游。
MVP-0 非目标:
- 公开注册、找回密码和邮件验证;
- 图片角色/备注编辑与拖拽排序;
- API Key 导航/功能;
- 多 Provider、熔断、故障转移、
images、gemini; - admin/admin-ui、无限滚动、移动抽屉、限流、清理任务。
验收:
- 文本和图片各成功一次;pending/running/终态界面正确且终态停止轮询。
rendered_prompt、attempts、latency 或失败 error 字段完整。- 相同用户幂等重放不创建第二条任务;不同用户不可读取对方任务或文件。
- 过期 running 被新 token 原子重领,旧 worker 最终写入影响 0 行且不覆盖结果。
- 400/401/策略拒绝立即失败;429/5xx/超时/连接错误分类正确(MVP-0 不换家)。
- 私网、IPv6、redirect、代理和恶意结果 URL 被 SSRF 策略覆盖。
- Provider Key 按当前已确认风险决策保存;列表、日志和普通响应不含完整值,单条读取禁止缓存;浏览器写请求有 CSRF,会话安全。
- 图片输出通过鉴权访问且有缩略图;文件原子落位。
- 375/768/1024/1440 无主区域横向滚动,所有主要操作可用键盘和 44px 触控目标完成。
- 迁移在空 MySQL 8 完成 up/down/up;Go 构建、vet、测试和浏览器 E2E 通过。
MVP-1:可用性与运营
汇总工单为 #19,设计门禁与 #20~#26、#28 的单元验收已完成;#27 集成验收及其发现的 #32~#34 已于 2026-08-24 通过用户验收;MVP-1 已于 2026-08-24 通过 #19 汇总验收:
- #16 路由、Provider、迁移、API、状态和测试设计(2026-08-21 验收通过);
- #17 固定 go-admin/go-admin-ui 的 CRUD 与三个定制页原型(
prototypes/17/v1/index.html,2026-08-21 用户验收通过); - #18 文生图、图片 role_rule/role/note/排序与历史无限滚动原型(
prototypes/18/v1/index.html,2026-08-21 用户验收通过)。
稳定范围仍包括加权路由、gobreaker、最多 N 家故障转移、images/gemini、受审计有冷却的单次真实连通性测试和完整 retryable 测试。技术设计与两个原型均已确认;生产工单已按数据库、路由/worker、协议、安全管理端、portal 和集成验收完成拆分与实现;#28 以仓库外环境变量和显式 bootstrap 命令安全初始化管理员账号。#27 已在隔离 MySQL 8 与 mock 上游覆盖 images、images_edits、gemini 全链路,并完成管理端与 portal 浏览器回归;未获单独授权,因此没有调用真实 Provider。
MVP-2:治理与开放
- API Key/openapi;
- 用户和 Provider 维度限流、配置审计;
- 经确认的保留期与清理任务;
- 移动端历史抽屉;
- 公开注册只有在注册、验证、找回、反滥用和赠送策略单独确认后才进入范围,不能默认随 MVP-2 开放。
已锁定决策
- Go 重写,只迁移设计,不复用 cmhub Django 代码。
- 管理端来源固定为:
- go-admin
f06540883b41d03782bb6b2c4150f298f328c6b6 - go-admin-ui
67d393d713877572fab0b897296a4c1d525fc81d - go-admin-doc
424855aacf6905f3fde860c3331385cb25529a0d
- go-admin
- go-admin-ui 实际是 Vue 3.5.41 + Element Plus 2.14.4 + Vue CLI 5.0.9,不按 Vue 2/Vite 设计。
- 生产表结构、
sys_*和菜单/API 种子全部经可逆 migrations;AutoMigrate 仅可在隔离可丢弃库作研究参考。 - 管理端代码生成采用“SQL → 隔离库 → 导表 → 预览/生成 → 人工审查 → 配置转可逆 SQL”;生产无 dev-tools。
- 用户端采用 html/template + HTMX + Alpine + Tailwind;不做 SPA。
- core 只依赖 GORM/标准库,gobreaker/imaging 在 platform。
- 不引入 Redis/MQ,使用 MySQL 8 SKIP LOCKED + token/CAS。
- 项目不包含用户点数、余额、扣费、退款、充值、发放或配额;管理员和终端用户分表。
- 生成同步提交不调用上游,所有上游调用只在 worker。
api_type和协议能力归 ProviderModel,不归 Provider。
用户端布局与状态
桌面(>=1024px)采用历史列表 + 主工作区双栏;平板可收窄历史区;MVP-0 手机使用单列顺序布局,不依赖尚未实现的抽屉。首屏必须能看到当前结果/状态和输入动作,固定元素不能遮住滚动内容。
MVP-0 导航只显示已实现的生成入口、必要账户操作和退出;API Key 不显示空入口。图片区只显示上传顺序,第一张自动主体,其余参考,不展示不可用的角色/拖拽控件。
| 状态 | 必须呈现 |
|---|---|
| 首次/空历史 | 可直接开始的输入区和简洁空状态,不伪造示例结果 |
| 上传校验失败 | 对应文件、明确原因、修正方式;焦点到首个错误 |
| pending | “排队中”,可区分尚未执行 |
| running | “生成中”,轮询更新但布局不跳动 |
| succeeded image | 缩略图、查看/下载;原图访问经鉴权 |
| succeeded text | 可读文本和复制动作,复制结果有反馈 |
| failed | 脱敏错误、是否可重试的明确操作 |
| 轮询网络错误 | 保留当前内容,提示重试,不把任务误标 failed |
| 认证过期 | 停止轮询,引导重新登录,登录后返回原上下文 |
| 历史到底 | 明确结束,不持续显示 loading |
交互验收:
- 375、768、1024px 和桌面宽屏均无不合理横向滚动、遮挡和文字溢出;
- 交互目标至少 44×44px,输入有持久 label,错误不只靠颜色;正文对比度至少 4.5:1,非文本控件/焦点边界至少 3:1;
- 图标按钮使用既有 Lucide/Element Plus 图标并有可访问名称;
- 所有功能可键盘操作;MVP-1 拖拽提供上移/下移等价操作;
- 路由/片段替换后管理焦点,状态更新使用合适的
aria-live,toast 不抢焦点; - 动效尊重
prefers-reduced-motion,loading 不造成布局位移; - 页面实现前必须完成版本化 HTML 原型并由用户确认状态、响应式、权限和异常覆盖。
管理端页面
代码生成基于固定 go-admin-ui 的既有表导入:
- CRUD:providers、provider_models、prompt_templates、users;api_keys 到对应 MVP 再生成。
- 定制页:路由池编排、Provider 健康、生成记录详情。
- 标准 CRUD 可用一个明确复用固定 go-admin 视觉/交互的代表性原型覆盖同类页面;定制页分别覆盖加载、空、错误、权限和边界状态。
- 生成记录默认不展示 API Key、完整敏感错误或不必要的真实用户输入。
- 定制页数量明显超过三个时重新评估维护成本,但不以先前错误的前端版本判断作为依据。
Provider 连通性测试是明确的运营动作:保存配置后由授权管理员点击,发出一次最小低成本请求,显示脱敏结果,记录审计并限制冷却;它不是保存时自动触发,也不用于 CI。
程序化调用
MVP-2 的 API Key 存哈希、身份仍属于 users。提交、查询、幂等、错误码、限流和跨用户授权在独立 API 设计工单确认;浏览器 Cookie/CSRF 与 API Key 认证链不得混用。
明确不做
计费扣点、充值与支付回调、汇率、软件授权与设备绑定、内容审核、cmshopee 专用端点、每日生成配额。
风险与待定
- 上传数量/大小/MIME/像素、超时/lease/worker、限流的生产值;
- 首个真实 Provider/模型和连通性测试最小请求;
- 生成物保留期、备份、磁盘告警、RPO/RTO;
- 未来公开注册及账号验证/找回/反滥用流程;
- 固定 go-admin 版本后续升级策略;升级必须重新审查生成器权限和技术栈,不能静默漂移。
登记规则
每一行代表一项长期需求或稳定需求领域,不代表一个普通 Bug。至少填写:
- 清楚、稳定的需求名称;
- 谁在什么场景下需要它;
- 当前状态和所属版本、MVP 或发布范围;
- 唯一的详细 Wiki 页面;
- 当前或主要实施工单;
- 原型状态或明确写“无”;
- 已交付时的 Gitea 工单与验收入口。
需求正文、接口细节、业务规则和验收标准只在各自事实来源修改。本页使用一至两句话摘要并链接过去,不复制大段内容。
原型与设计资产
原型门禁
先选择最低成本、足以确认需求的设计证据:
| 修改类型 | 是否建单 | 原型或替代证据 |
|---|---|---|
| 纯界面显示文案,且不改变语义、流程、权限、状态、接口、高风险文字、国际化键、程序标识符、布局或可访问性 | 否 | 无原型,只做最小界面检查 |
| 现有界面的小范围样式或布局调整 | 是 | 标注截图、低保真图或明确复用的现有规范 |
| 新组件但沿用现有设计体系 | 是 | 组件状态和边界说明,按需提供低保真图 |
| 新页面、独立用户功能、重大交互或导航变化 | 是 | Quant-UX 或其他工具制作并经用户确认的可审阅原型 |
| 后端、接口、数据或定时任务 | 是 | 架构、API、数据、状态或流程设计,不强制 UI 原型 |
| 恢复既有确认行为的 Bug | 是 | 原设计、截图、复现步骤或已有验收证据 |
“文字豁免”只指用户看到的显示文案,不包括代码组件名、类名、变量、API 字段、数据库字段或国际化键。任何条件不明确时都要建单。
新增页面、独立用户功能、重大交互或导航变化的顺序固定为:确认文字需求 → 制作可审阅原型 → 用户确认原型和覆盖范围 → 建立或放行实现工单 → 编写生产代码。原型发生影响页面结构、主要流程、状态、权限、异常处理或验收结果的变化时,必须重新确认。
线上原型与按需 HTML 快照
需要完整原型门禁的新页面、独立用户功能、重大交互或导航变化,默认直接通过 Quant-UX 或等效设计工具的线上版本审核。可编辑设计源仍以原设计工具为准,工单记录可访问链接、版本/revision、复制版本或确认日期、审核版本识别方式、确认人、确认时间和覆盖范围。
线上链接无法访问或无法区分审核版本时停止审核,等待用户确认等效方案;不能为了节省时间把不稳定链接直接当作已确认原型。页面结构、流程、状态、权限、异常处理或验收结果变化时更新线上版本并重新确认。
只有用户明确要求 导出原型 #N、导出全部原型,或项目专用规则要求离线交付时,才把确认版本导出到 prototypes/<工单号>/<版本>/index.html。资源使用相对路径,导出后检查入口、主要交互和资源完整性;已确认快照不得原位覆盖,新版本使用新目录。导出不自动提交,也不顺带扩大到未请求的原型。
设计工具无法生成用户明确要求的可用 HTML 时,工单记录限制并停止该导出或离线交付,等待用户确认等效方案;只要线上原型仍可访问且版本明确,不因此阻塞线上审核。已有本地快照继续作为历史审核证据,不反向替代可编辑设计源。
原型确认记录
原型或替代设计证据至少记录线上链接、访问检查、版本/revision、复制版本或确认日期、审核版本识别方式、状态、确认人、确认时间和覆盖范围。只有显式导出时才记录本地路径、版本和资源检查结果。没有 UI 原型时,记录采用的技术设计或无需原型的原因。
- 与代码版本绑定的图片、HTML 交互稿和设计源文件放入 Git 的
design/或prototypes/,不要手工放入 Wiki 镜像目录docs/。 - #17 管理端运营原型:
prototypes/17/v1/index.html,v1,2026-08-21,状态“已确认”;由用户于 2026-08-21 验收通过,覆盖四类标准 CRUD、路由池编排、Provider 健康/主动探测、生成记录详情,以及加载、空、错误、无权限和边界状态。 - #18 用户端增强原型:
prototypes/18/v1/index.html,v1,2026-08-21,状态“已确认”;由用户于 2026-08-21 验收通过,覆盖文生图、图片编辑、role_rule 覆盖、每图 role/note/order、键盘排序与历史增量加载/失败恢复/到底状态。 - 外部 Quant-UX、Figma 等原型记录可访问链接、审核版本识别方式、负责人和适用需求;只有用户或项目专用规则明确要求时才保存本地快照。
- 原型必须标记“草稿、已确认、已废弃”之一。草稿不能作为正式实现依据;已废弃原型保留状态和替代入口,不让 Agent 误用。
- 原型只表达界面和交互意图,不能代替文字业务规则、安全边界、异常处理和验收标准。
- 没有原型时写“无”和原因,不创建空图片、空目录或占位原型。
- 原型包含账号、个人信息或生产数据时必须先脱敏;凭据不得进入原型或截图。
状态规则
需求状态使用:待确认、已确认、开发中、待验收、已交付、已停止。
- 方案未确认时为“待确认”;用户确认后才能进入“已确认”。
- 开始执行单元任务后为“开发中”;实现完成并等待用户确认时为“待验收”。
- 用户明确验收后改为“已交付”。
- 需求取消或被替代时改为“已停止”,并链接原因和替代需求,不删除历史记录。
- 一个需求领域包含多个任务时,以尚未完成的关键任务决定状态,并在状态中简短说明。
更新时机
以下情况必须更新本页:
- 用户确认新的长期产品需求或新需求领域;
- 需求进入开发、待验收、已交付或已停止;
- 需求的正式 Wiki、主要工单、原型或验收入口变化;
- 原型从草稿变为已确认或已废弃;
- MVP、版本范围或用户场景发生变化。
普通内部重构、小缺陷和不改变长期能力的任务只保留在工单,不必进入本页。
最小验收清单
- 新成员能从本页找到每项长期需求的详细说明。
- 状态与相关 Gitea 工单一致。
- 每项已交付需求具有验收入口。
- 原型具有路径或链接、版本和确认状态,或者明确写“无”。
- 本页没有复制完整工单或主题文档。
- 草稿原型没有被描述为正式需求。
- 不包含凭据、个人数据或生产数据。
2026-08-22 Provider 凭据需求变更
用户在获知明文存储和回显风险后明确接受风险:Provider API Key 保存后允许管理员在单个 Provider 编辑页主动查看和隐藏,目标存储形式改为明文。列表仍只展示是否已配置,不批量读取完整密钥;读取失败、无权限、加载和无凭据状态必须可恢复且可访问。
设计变更由 #30 跟踪,新快照 prototypes/30/v1/index.html 已于 2026-08-22 通过用户验收。原 #17 v1 的“API Key 只写不可回显”部分被本变更取代,其余管理端设计继续有效。原型确认门禁已通过;#24 已按本节边界完成生产存储、接口和管理页面并通过验收。
#24 管理端交付状态(2026-08-22,已验收)
固定 go-admin-ui 已导入仓库并实现 Provider、ProviderModel、PromptTemplate、Users CRUD,以及路由池、Provider 健康/主动探测和生成详情页面。Provider Key 按 #30 明文落库并仅在单条页面主动回显;用户页按 #31 完全移除点数、余额和配额。实现已通过 Go build/vet/test、前端 lint/32 个单测/生产构建、MySQL 8 migration up/down/up、管理 API 集成测试和真实账号密码/菜单/API 联调;浏览器实例不可用,未生成生产页面自动化截图,用户于 2026-08-22 完成人工验收并确认 #24 通过。
#25 portal 提交契约交付状态(2026-08-23,已验收)
portal 已按 #16/#18 实现活动路由与模板快照、image_generate/image_edit metadata、一一对应的图片角色备注、固定 Prompt 覆盖顺序,以及 user_id 作用域的 HMAC 游标历史。实现不调用上游,不包含用户点数,也不改变登录和页面交互;后者继续由 #26 负责。实现已通过 Go build/vet/test/race 和本机 MySQL 8.4.8 隔离集成测试,用户于 2026-08-23 明确确认 #25 验收通过。
#26 portal 用户界面交付状态(2026-08-23,已验收)
portal 已按 #18 v1 原型实现文生图与图片编辑切换、role_rule、每图 primary/reference 角色、备注、拖动及键盘等价排序、Prompt 构成说明,以及基于 #25 HMAC 游标的历史无限加载。提交继续保持同步落库且不调用上游,不包含用户点数。候选已通过前端生产构建、Go build/vet/test/race、本机 MySQL 8.4.8 隔离集成,以及 375/768/1024/1440 Playwright E2E;浏览器覆盖提交、角色顺序与备注落库、增量历史失败恢复、终态、认证失效、44px 目标、reduced-motion 和无横向溢出。#26 已于 2026-08-23 通过用户验收;MVP-1 跨模块集成验收由 #27 收口。
#27 MVP-1 集成验收状态(2026-08-24,已验收)
#27 已使用 admin/config/settings.yml 只读派生的固定隔离库 chorus_test,完成 MVP-0 数据 up/down/up、根模块和 admin 模块 build/vet/test、worker race、admin-ui 正式构建与 Chromium 登录、portal 多视口 Playwright、Harness 严格检查。新增 MySQL + mock worker 覆盖 images、images_edits、gemini,并核对 generation、attempt、output、对象归属、权限和敏感信息边界。集成验收发现的 admin-ui 验证码残留 #32、生产 runtime 缺失 #33、SCSS 运行时导入白屏 #34 均已单独建单、最小修复并通过回归,于 2026-08-24 与 #27 一并通过用户验收。MVP-1 已于 2026-08-24 通过 #19 汇总验收。未调用真实 Provider;该项只有在用户单独授权后才能执行。
#19 MVP-1 汇总验收状态(2026-08-24,已验收)
MVP-1 的设计、生产实现、变更工单和跨模块集成验收均已完成;用户于 2026-08-24 明确确认 #19 验收通过。交付范围包括多 Provider 路由/熔断/故障转移、多协议 mock 链路、运营管理端、portal 图片角色编辑与历史体验。真实 Provider 连通性仍未执行,后续如需验证必须单独授权。
MVP-2 API 开放与治理(2026-08-24,设计与原型已确认)
用户已确认 MVP-2 面向现有受控用户交付安全的 API Key、OpenAPI 生成接口、用户/API Key/Provider 限流、审计和必要的用户端/管理端页面;不开放注册,不实施自动数据删除,不增加计费、点数或每日配额。汇总工单为 #35。用户于 2026-08-24 验收通过技术设计 #36 和界面原型 #37;已确认快照为 prototypes/37/v1/index.html。
生产实现拆单门禁已经解除,但功能尚未实现或交付。下一步按 #36 的认证、API、数据、限流、审计和迁移设计,以及 #37 v1 的页面结构、权限、流程和异常状态,建立生产实现单元工单并按依赖顺序实施。
用户端仅账号登录(#50)
用户于 2026-08-24 确认终端用户 Portal 直接停用邮箱登录,只保留独立账号和密码。users.username 是规范化后唯一的登录标识,历史用户迁移为 user_<id>;邮箱继续作为资料显示但不参与认证。不开放注册、找回密码、账号自助修改或管理员/终端用户凭据复用。
MVP-2 集成验收完成状态(2026-08-25)
MVP-2 的 API Key、OpenAPI v1、三维限流、安全审计、Portal 页面和管理页面已完成单元交付,#47 已执行跨模块集成验收,已于 2026-08-25 通过人工验收。范围仍不包含公开注册、自动数据删除、计费、点数、余额或每日配额。
集成验收使用可丢弃 MySQL 8 chorus_test、构造用户、构造文件和 mock Provider,覆盖迁移 up/down/up、数据库哈希与一次性 Key 回显、撤销立即生效、OpenAPI 鉴权/幂等/越权、429 与 Retry-After、Provider 延后队列、审计脱敏、管理员治理和四视口 Portal E2E。未调用真实 Provider,也未使用生产或真实用户数据。
验收发现并修复两个阻塞缺陷:#52 统一首次与重复管理撤销的数据库时间精度;#53 按外键顺序清理 Portal E2E 产生的安全审计。两项均已提交并通过人工验收。 MVP-2 父工单 #35 仍等待用户单独确认后关闭;本节只记录 #47 跨模块集成验收及其缺陷 #52、#53 已通过。
生成记录耗时与信息边界(#65)
- Portal 生成历史以“状态 · 耗时 · 相对时间”展示:终态显示固定总耗时,pending 显示实时已等待,running 显示实时已用时;当前结果头部采用相同口径。
- Portal 图片结果显示格式、分辨率和文件大小。终端用户侧不展示 Provider、模型、attempt、内部错误码或渲染 Prompt。
- Admin 生成记录默认只显示全宽列表;双击记录或点击“查看”后从右侧抽屉显示详情,桌面约占 45%,窄屏接近全宽,关闭后不保留空详情区域。列表显示用户账号、中文生成类型、总耗时和创建时间;详情派生总耗时、排队耗时、处理耗时与 Provider 上游耗时,并显示提交、开始、完成的本地时间。
- Admin 时间线把 lease、本地限流等标记为系统事件,不占 Provider 尝试序号;Provider 尝试显示持久化序号、Provider/模型名称、单次耗时和状态。
- 旧记录的缺失、畸形或逆序时间采用安全兜底,不显示负耗时,也不导致页面异常。耗时只从既有时间戳和
latency_ms派生,不持久化重复字段。
管理员创建受控终端用户(#73)
为减少日常通过 seed 或数据库建号的操作,管理端增加受控终端用户创建和密码重置能力;Portal 继续不开放注册、找回密码或邮件验证。该能力复用现有终端用户页和对话框规范,保持管理员与终端用户分表,创建与密码重置受 JWT/Casbin 保护并写脱敏审计。工单 #73 已于 2026-08-28 通过用户验收并交付。
Portal 可控自助注册(#75 / #76,2026-08-29)
Portal 在现有受控用户模式上增加可由管理员开关的账号自助注册。迁移后的默认状态是关闭;关闭时登录页不显示注册入口,注册页返回 404,注册接口返回 403。管理员在“用户与访问 → 终端用户”开启后,访客可使用账号、昵称、密码和密码确认注册,不要求邮箱;注册成功立即建立 Portal 会话。密码长度统一为 6–1024 个 Unicode 字符。
该开关只影响访客自助注册,不影响已有终端用户登录,也不影响管理员创建、停用或重置终端用户密码。项目仍不开放邮箱登录,不合并管理员与终端用户账号表,不增加计费、点数、每日配额或公开用户目录。注册页面和管理开关沿用 #78 v1 原型;生产候选实现由 #79–#83 交付并等待用户集成验收。