fix gateway loopback validation chains

This commit is contained in:
2026-05-11 08:48:02 +08:00
parent ff666b1ece
commit ca7e76e815
42 changed files with 1641 additions and 129 deletions
+19 -1
View File
@@ -36,6 +36,19 @@
状态约定:`未执行``执行中``成功``失败``阻塞`
### 本次自动化回环记录
| 项目 | 结果 |
| --- | --- |
| 测试批次 | `loopback-20260511-integration` |
| 执行方式 | `httptest` 本地服务 + 独立 PostgreSQL 测试库 `easyai_ai_gateway_test_codex` |
| 已通过验证 | 注册 / 登录 / API Key、API Key scopes 拦截、管理员接口拒绝 API Key、模型候选路由、真实 Chat / 兼容 Chat / 文生图 / 图生图 / 文生视频 / 图生视频 / 首尾帧视频、任务详情、任务列表、事件流、callback outbox、重试、运行策略限流、降级、自动禁用、计费规则集绑定、钱包扣费和交易流水 |
| 核心修复验证 | `base_model_catalog.model_type``platform_models.model_type` 均为 JSONB 数组;`doubao-4.5图像编辑` 同时包含 `image_generate` / `image_edit``豆包Seedance-1.5-pro` 同时包含 `video_generate` / `image_to_video`;运行时候选查询只用 `model_type` 命中 |
| 真实外部链路 | 已使用主库 `Playground API Key` 和已配置平台 KEY 验证通过;Chat=`qwen-plus`,图像=`doubao-4.5图像编辑`,视频=`豆包Seedance-1.5-pro` |
| 真实任务证据 | Chat `6b454b1f-29b8-48ef-8ebb-740062d2e8b4`;文生图 `2db64a7e-f01d-424c-a5eb-027ef58cacde`;图生图 `af4cae00-c6d7-4c70-8477-64326c5d5cfc`;文生视频 `2436e7aa-3518-442b-8559-1e48a9cb3462`;图生视频 `80cc9655-4c87-466d-b263-5df23d23c157`;首尾帧视频 `5353a0cf-efa8-4fbc-90fd-60d1897fd012` |
| 验证命令 | `AI_GATEWAY_TEST_DATABASE_URL=... go test ./...``pnpm --filter @easyai-ai-gateway/web typecheck``pnpm test``git diff --check` |
| 结论 | 本地自动化覆盖项和真实外部模型链路均为 `成功` |
## 3. 测试数据准备
| ID | 任务 | 接口 / 方式 | 成功判定 | 状态 | 结果记录 |
@@ -98,6 +111,7 @@
| HISTORY-03 | 事件记录保存 | `gateway_task_events` | 事件包含接收、运行、重试、完成或失败,`simulated` 标记准确 | 未执行 | 事件摘要待填写 |
| HISTORY-04 | 回调 outbox 保存 | `gateway_task_callback_outbox`,开启回调配置时验证 | 每个 task event 写入幂等 outbox`task_id + seq + callback_url` 唯一 | 未执行 | outbox 数量待填写 |
| HISTORY-05 | API Key 身份保存 | 任务详情或数据库字段 | `apiKeyId``apiKeyName``apiKeyPrefix` 可追溯到发起 Key | 未执行 | key 信息待填写 |
| HISTORY-06 | 前端任务记录 | `GET /api/v1/tasks` + 工作台“任务记录”页 | 页面从服务端任务列表读取历史记录,不依赖当前会话里刚运行的单条 taskResult | 成功 | 已新增任务列表接口和前端列表渲染;自动化断言 task list 包含已完成任务 |
## 6. 定价规则绑定与扣费计算
@@ -109,6 +123,7 @@
| PRICE-02 | 绑定规则集到平台模型 | `POST /api/v1/platforms/{platformID}/models` 或更新模型 | 平台模型返回 `pricingRuleSetId=loopback-pricing-*``billingConfigOverride` 生效 | 未执行 | platformModelId 待填写 |
| PRICE-03 | Chat 预估计费 | `POST /api/v1/pricing/estimate`Chat 请求体 | 返回 `resolver=effective-pricing-v1``text_input``text_output` 金额按 tokens 计算 | 未执行 | estimate items 待填写 |
| PRICE-04 | Chat 最终扣费 | 执行 Chat 成功任务 | `finalChargeAmount=sum(billings.amount)`,输入/输出 token 数与 usage 对齐 | 未执行 | usage、billings、finalChargeAmount 待填写 |
| PRICE-04B | 钱包实际扣费 | 执行 Chat 成功任务后读取钱包 | `gateway_wallet_accounts.balance``finalChargeAmount` 扣减,`gateway_wallet_transactions` 写入 `task_billing` 幂等流水 | 成功 | 集成测试断言 100 -> 99.972,交易 amount=0.028 |
| PRICE-05 | 文生图扣费 | 执行文生图成功任务 | `resourceType=image`,数量、尺寸、质量权重参与计算 | 未执行 | billings 待填写 |
| PRICE-06 | 图生图扣费 | 执行图生图成功任务 | `resourceType=image_edit`,优先使用编辑价格,缺省时回退图片价格 | 未执行 | billings 待填写 |
| PRICE-07 | 视频扣费 | 执行文生视频、图生视频、首尾帧视频成功任务 | `resourceType=video`,数量、分辨率或时长权重按规则计算,三类视频请求均有计费记录 | 未执行 | billings 待填写 |
@@ -175,7 +190,10 @@
| 时间 | 用例 ID | 失败现象 | 初步原因 | 修复位置 | 重跑结果 |
| --- | --- | --- | --- | --- | --- |
| 待填写 | 待填写 | 待填写 | 待填写 | 待填写 | 待填写 |
| 2026-05-11 | TASK-IMAGE-01 | `doubao-4.5图像编辑` 使用 `1024x1024` 返回 `http_400`,提示像素不足 | 测试参数不符合真实模型最小尺寸约束 | 调整真实验证请求为 `2048x2048` | 文生图任务 `2db64a7e-f01d-424c-a5eb-027ef58cacde` 成功 |
| 2026-05-11 | TASK-VIDEO-02 | 图生视频传 `image` 时上游按 `r2v` 处理并返回不支持 `Seedance-1.5-pro` | Volces 适配层把通用 `image` 映射成 `reference_image`,而非图生视频首帧 | `apps/api/internal/clients/volces.go`,将 `image` 默认映射为 `first_frame`,显式 `reference_image` 才走参考图 | 图生视频任务 `80cc9655-4c87-466d-b263-5df23d23c157` 成功 |
| 2026-05-11 | TASK-VIDEO-02 / TASK-VIDEO-03 | 带图片的视频请求任务 `modelType` 仍记录为 `video_generate` | `videos.generations` 未根据请求体区分文生视频和图生视频 | `apps/api/internal/runner/service.go` / `pricing.go`,带图片、首帧或尾帧时使用 `image_to_video` | 图生视频与首尾帧视频均以 `modelType=image_to_video` 成功 |
| 2026-05-11 | HISTORY-06 | 前端“任务记录”没有任何记录 | 前端只展示本地 `taskResult`,后端没有当前用户任务列表接口 | `GET /api/v1/tasks``ListTasks`、工作台任务列表状态和渲染 | 集成测试验证任务列表返回已完成任务;前端 typecheck 成功 |
## 12. 清理清单