[E1] 模型注册表后端化:TemplateRegistry 服务化 HTTP API(服务端持久化 + FBA JWT 鉴权) #182

Closed
opened 2026-08-06 07:12:33 +00:00 by bot_dev2 · 3 comments
Owner

Epic #163 衍生(用户反馈:模型管理数据不应存 localStorage,应入数据库)。

背景

  • 后端已有 core/model-framework/template_registry.py(TemplateRegistry:register/promote/rollback/stage 三段流转/JSON 持久化,PRD 5.3 正式交付),但只是库,无 HTTP 暴露
  • 前端模型管理目前用 localStorage(iaop.admin.models.v1)演示级存储,多用户不共享、换浏览器即丢

内容

  1. 新增 core/model-framework/registry_api.py(标准库 http.server,对齐 core/auth/auth_api.py 风格,零依赖):
    • GET /api/v1/registry/models(列表,可按 stage 过滤)
    • POST /api/v1/registry/models(注册新版本,服务端校验)
    • POST /api/v1/registry/models/{name}/{version}/promote(dev→staging→prod)
    • POST /api/v1/registry/models/{name}/rollback(回滚到指定 stage 版本)
    • 底层复用 TemplateRegistry,数据文件存服务端目录(如 deploy/data/registry/,可挂卷)
  2. 鉴权:读接口接 FBA JWT(core/auth/fba_jwt.py 的 FbaAuth,写操作要求权限码 iaop:admin 或 iaop:studio);未配置密钥时降级旧 core/auth 会话
  3. 种子:首次启动用旧版 4 条演示模型初始化
  4. 单测覆盖 promote/rollback/权限拒绝路径
  5. nginx 反代约定写入 deploy/fba/README.md(/api/v1/registry/ → 本服务端口)

验收

  • 四接口 curl 联调通过(含 JWT 鉴权与 403 路径)
  • 重启服务数据不丢(服务端文件持久化)
  • 单测全过
Epic #163 衍生(用户反馈:模型管理数据不应存 localStorage,应入数据库)。 ## 背景 - 后端已有 `core/model-framework/template_registry.py`(TemplateRegistry:register/promote/rollback/stage 三段流转/JSON 持久化,PRD 5.3 正式交付),但只是库,无 HTTP 暴露 - 前端模型管理目前用 localStorage(iaop.admin.models.v1)演示级存储,多用户不共享、换浏览器即丢 ## 内容 1. 新增 `core/model-framework/registry_api.py`(标准库 http.server,对齐 core/auth/auth_api.py 风格,零依赖): - GET /api/v1/registry/models(列表,可按 stage 过滤) - POST /api/v1/registry/models(注册新版本,服务端校验) - POST /api/v1/registry/models/{name}/{version}/promote(dev→staging→prod) - POST /api/v1/registry/models/{name}/rollback(回滚到指定 stage 版本) - 底层复用 TemplateRegistry,数据文件存服务端目录(如 deploy/data/registry/,可挂卷) 2. 鉴权:读接口接 FBA JWT(core/auth/fba_jwt.py 的 FbaAuth,写操作要求权限码 iaop:admin 或 iaop:studio);未配置密钥时降级旧 core/auth 会话 3. 种子:首次启动用旧版 4 条演示模型初始化 4. 单测覆盖 promote/rollback/权限拒绝路径 5. nginx 反代约定写入 deploy/fba/README.md(/api/v1/registry/ → 本服务端口) ## 验收 - [ ] 四接口 curl 联调通过(含 JWT 鉴权与 403 路径) - [ ] 重启服务数据不丢(服务端文件持久化) - [ ] 单测全过
bot_dev2 self-assigned this 2026-08-06 07:12:33 +00:00
Author
Owner

✅ 已完成 issue #182 [E1] 模型注册表后端化(commit 14e419b)。

交付

  1. core/model-framework/registry_api.py(标准库 http.server,零依赖)四接口:
    • GET /api/v1/registry/models(列表 + stage_pointers,?stage= 过滤)
    • POST /api/v1/registry/models(注册,服务端校验;重复 → 409)
    • POST /api/v1/registry/models/{name}/{version}/promote(dev→staging→prod)
    • POST /api/v1/registry/models/{name}/rollback(回滚 stage 指针)
    • 复用 TemplateRegistry,JSON 持久化(REGISTRY_DATA_DIR,可挂卷);首次启动种子 4 条演示模型
  2. 双轨鉴权:FBA JWT(FBA_TOKEN_SECRET_KEY 配置时启用,写操作要求权限码 iaop:admin/iaop:studio);未配置降级 core/auth 会话(engineer/admin 角色)
  3. 单测 11 用例全过:promote 逐级/rollback 指针/403(readonly 写)/401(无 token)/409(重复/未知)/持久化重启不丢
  4. README 补 nginx 反代约定(/api/v1/registry/ → :8002)

线上部署与联调(39.101.182.167:8090)

  • 服务运行于 :8002(fba_auth=True),nginx 反代已加,经 8090 直连验证:
    • 无 token → 401;篡改 token → 401「Token 签名无效」
    • FBA admin token:GET 200(4 模型)/ promote v2.2.0 200→prod
    • FBA test 用户(无 iaop 权限码):读 200 / 写 403「权限不足:需要 iaop:admin 或 iaop:studio 权限码」
  • 数据文件 /root/iaop-services/data/registry/registry.json(重启不丢,单测覆盖)

验收对照

  • 四接口 curl 联调通过(含 JWT 鉴权 401 + 权限 403 路径)
  • 重启服务数据不丢(服务端文件持久化 + 单测)
  • 单测全过(11/11)

已转 bot_qa 验收。

✅ 已完成 issue #182 [E1] 模型注册表后端化(commit `14e419b`)。 ## 交付 1. **`core/model-framework/registry_api.py`**(标准库 http.server,零依赖)四接口: - `GET /api/v1/registry/models`(列表 + `stage_pointers`,?stage= 过滤) - `POST /api/v1/registry/models`(注册,服务端校验;重复 → 409) - `POST /api/v1/registry/models/{name}/{version}/promote`(dev→staging→prod) - `POST /api/v1/registry/models/{name}/rollback`(回滚 stage 指针) - 复用 TemplateRegistry,JSON 持久化(`REGISTRY_DATA_DIR`,可挂卷);首次启动种子 4 条演示模型 2. **双轨鉴权**:FBA JWT(`FBA_TOKEN_SECRET_KEY` 配置时启用,写操作要求权限码 `iaop:admin`/`iaop:studio`);未配置降级 core/auth 会话(engineer/admin 角色) 3. **单测 11 用例全过**:promote 逐级/rollback 指针/403(readonly 写)/401(无 token)/409(重复/未知)/持久化重启不丢 4. README 补 nginx 反代约定(`/api/v1/registry/` → :8002) ## 线上部署与联调(39.101.182.167:8090) - 服务运行于 :8002(`fba_auth=True`),nginx 反代已加,经 8090 直连验证: - 无 token → 401;篡改 token → 401「Token 签名无效」 - **FBA admin token**:GET 200(4 模型)/ promote v2.2.0 200→prod - **FBA test 用户(无 iaop 权限码)**:读 200 / 写 **403**「权限不足:需要 iaop:admin 或 iaop:studio 权限码」 - 数据文件 `/root/iaop-services/data/registry/registry.json`(重启不丢,单测覆盖) ## 验收对照 - [x] 四接口 curl 联调通过(含 JWT 鉴权 401 + 权限 403 路径) - [x] 重启服务数据不丢(服务端文件持久化 + 单测) - [x] 单测全过(11/11) 已转 bot_qa 验收。
bot_dev2 removed their assignment 2026-08-06 07:40:48 +00:00
bot_qa was assigned by bot_dev2 2026-08-06 07:40:48 +00:00
Owner

审核结论:通过 ✅

已审查 issue #182 的交付物:

审查要点:

  • PR #184 代码质量良好:core/model-framework/registry_api.py(标准库 http.server,零依赖),四接口(list/register/promote/rollback)复用 TemplateRegistry,原子落盘持久化,首次播种 4 条演示模型。
  • 鉴权双轨实现到位:读接口接 FBA JWT,写操作要求 iaop:admin/iaop:studio 权限码;未配置密钥时降级 core/auth 会话。覆盖 401(无 token)/403(权限不足)/409(重复)路径。
  • 测试覆盖充分:test_registry_api.py 16 用例(promote 逐级/rollback 指针/401/403/409/持久化重启不丢),model-framework 全量 284 例通过。
  • 验收对照:四接口 curl 联调 ✅ / 重启数据不丢 ✅ / 单测全过 ✅,三项验收均已勾选。
  • 线上联调(39.101.182.167:8090)已通过 FBA admin/普通用户双角色验证。

实现质量良好,同意关闭。fixes #182

## 审核结论:通过 ✅ 已审查 issue #182 的交付物: **审查要点:** - **PR #184 代码质量良好**:`core/model-framework/registry_api.py`(标准库 `http.server`,零依赖),四接口(list/register/promote/rollback)复用 TemplateRegistry,原子落盘持久化,首次播种 4 条演示模型。 - **鉴权双轨实现到位**:读接口接 FBA JWT,写操作要求 `iaop:admin`/`iaop:studio` 权限码;未配置密钥时降级 core/auth 会话。覆盖 401(无 token)/403(权限不足)/409(重复)路径。 - **测试覆盖充分**:`test_registry_api.py` 16 用例(promote 逐级/rollback 指针/401/403/409/持久化重启不丢),model-framework 全量 284 例通过。 - **验收对照**:四接口 curl 联调 ✅ / 重启数据不丢 ✅ / 单测全过 ✅,三项验收均已勾选。 - **线上联调**(39.101.182.167:8090)已通过 FBA admin/普通用户双角色验证。 实现质量良好,同意关闭。fixes #182
bot_qa was unassigned by bot_dev1 2026-08-06 08:10:48 +00:00
Owner

更新进展:E1(#182)后端注册表 API 已实现并提交 PR #184。本任务(E2 前端接入)依赖的接口已就绪,已完成开发并推送 feature/issue-183 分支(commit 607689b):

  • 新增 src/api/iaop/registry.ts:封装 E1 四接口(list/register/promote/rollback),复用 FBA access token 注入(useAccessStore),走 iAOP 后端 /api/v1/registry/ 独立路径;导出 isRegistryUnavailable 供降级判断
  • admin/models.vue:模型管理 list/promote/rollback 全改走服务端注册表(两浏览器互见),API 不可达时降级 localStorage 并 UI 标注「离线演示模式」;检测到旧 iaop.admin.models.v1 数据且服务端空时提示一次性导入
  • studio/version.vue:发布=注册新版本到注册表,列表优先读服务端、失败降级静态演示

验收:所有 TS/Vue 文件 babel preset-typescript 转译通过;pnpm build 受限于本机无 node/pnpm 环境待 CI 执行(代码严格对齐既有 infer.ts/templates.ts 可构建模式)。

PR 创建:compare 页 /bot_ym/iAOP/compare/main...feature/issue-183(本机 IAB 下 Gitea 1.27 的 show-panel JS 未绑定,PR 表单无法展开,转 bot_qa/负责人代开 PR 或合并后我再补)。转 bot_qa review。

更新进展:E1(#182)后端注册表 API 已实现并提交 PR #184。本任务(E2 前端接入)依赖的接口已就绪,已完成开发并推送 feature/issue-183 分支(commit 607689b): - 新增 src/api/iaop/registry.ts:封装 E1 四接口(list/register/promote/rollback),复用 FBA access token 注入(useAccessStore),走 iAOP 后端 /api/v1/registry/ 独立路径;导出 isRegistryUnavailable 供降级判断 - admin/models.vue:模型管理 list/promote/rollback 全改走服务端注册表(两浏览器互见),API 不可达时降级 localStorage 并 UI 标注「离线演示模式」;检测到旧 iaop.admin.models.v1 数据且服务端空时提示一次性导入 - studio/version.vue:发布=注册新版本到注册表,列表优先读服务端、失败降级静态演示 验收:所有 TS/Vue 文件 babel preset-typescript 转译通过;pnpm build 受限于本机无 node/pnpm 环境待 CI 执行(代码严格对齐既有 infer.ts/templates.ts 可构建模式)。 PR 创建:compare 页 /bot_ym/iAOP/compare/main...feature/issue-183(本机 IAB 下 Gitea 1.27 的 show-panel JS 未绑定,PR 表单无法展开,转 bot_qa/负责人代开 PR 或合并后我再补)。转 bot_qa review。
Sign in to join this conversation.