feat(core): 火山人像素材库审核(绿/红盾)接入 + 端到端验证

- assets_client.py:照搬 AirDrama,volcengine SDK + AK/SK 签名(凭证走 settings.ASSETS_API)。
- review.py:真人资产送审/轮询编排。一团队一组(AssetReviewGroup,OneToOne),全 best-effort 不破坏主流程。
- 模型:AssetReviewGroup + Asset.review_status/review_remote_id/review_error(迁移 assets/0003)。
- 集成:真人基础资产生成后 transaction.on_commit 静默送审(services.generate_base_asset kind==person)。
- 端点 poll-reviews + 序列化暴露 review_status;前端基础资产趴每8s轮询、人物卡渲染 审核✓(绿)/审核✗·重生(红)/审核中,审核终态后停轮询。
- e2e 已验:送审→建组→processing→active(真拿到火山绿盾)。

对抗式交叉验证(2审查员,0 critical)修复:
- get_or_create_team_group 并发竞态:DB 唯一约束去重 + select_for_update 串行化远程建组,杜绝重复建组/丢送审。
- create_asset 返回空 Id 不再标 processing(否则卡死黄);processing 超 15 分钟兜底判 failed,未知 Status 记日志,防永久 processing + 无限轮询。

凭证暂借 AirDrama,.env 改 ASSETS_API_* 两行即可换;ASSETS_API_ENABLED=false 可一键关停。回归 18/18 过。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
seaislee1209
2026-06-17 10:51:23 +08:00
co-authored by Claude Opus 4.8
parent 521f5f4535
commit b30eaed838
14 changed files with 375 additions and 14 deletions
+11 -12
View File
@@ -40,7 +40,7 @@ npm install && npm run dev
| 多模型 seed(豆包/GPT-5.5/Gemini + gpt-image-2 + Seedance) | ✅ 已完成 | 数据迁移 0006,`get_default_model` 选取正确 |
| 模特库生成器(9:16氛围图→16:9白底三视图) | ✅ 已完成·已验证 | 跑通 1 个,三视图角色一致性极好(截图 `_qa_shots/model_threeview.png`) |
| 前端脚本趴(流式工具卡+思考流+模型下拉+改稿) | ✅ 已完成·**浏览器视觉验证** | 见 `_qa_shots/01..03` |
| **火山人像素材库审核(绿/红标)** | 🟡 **设计完成·未接线** | 见 §6,AirDrama 有现成代码可照搬,AK/SK 已备好 |
| **火山人像素材库审核(绿/红标)** | ✅ 已完成·**端到端验证** | 真人资产送审→建组→轮询拿到绿盾(active);前端绿/红徽章 + 8s 轮询 |
| 计费(按 token 精确扣) | 🟡 沿用现有(每次调用扣 unit_price) | 真 token 计量是后续优化项 |
---
@@ -113,20 +113,19 @@ npm install && npm run dev
---
## 6. 🟡 火山人像素材库审核(绿/红标)—— 待接线
## 6. 火山人像素材库审核(绿/红标)—— 已接入并验证
**目标:** 真人素材进火山素材库审核,前端只显示绿盾(active)/红标(failed,提示改提示词重生)。一团队一素材组(单组 500 万)。
**目标(已实现):** 真人素材进火山素材库审核,前端只显示绿盾(active)/红标(failed,提示改提示词重生)。一团队一素材组(单组 500 万)。
**现成代码在 AirDrama,直接照搬:**
- `C:\Airlabs_Project\Airflow Studio\AirDrama\video-shuoshan\backend\utils\assets_client.py``create_asset_group / create_asset / get_asset`(volcengine SDK,AK/SK 签名,异步审核状态轮询 active/failed/processing)
- 对应 `AssetGroup(team, remote_group_id)` + `Asset(group, remote_asset_id, status, url, error_message)` 模型 + `asset_poll_status_view`
**已落地:**
- `apps/assets/assets_client.py` — 照搬 AirDrama,volcengine SDK + AK/SK 签名(`create_asset_group / create_asset / get_asset`),凭证走 `settings.ASSETS_API`
- `apps/assets/review.py` — 编排:`submit_asset_for_review`(建组若无→传素材→标 processing)/ `poll_asset_review`(查状态)/ `poll_team_reviews`全 best-effort,未配/出错不影响主流程。
- 模型:`AssetReviewGroup(team OneToOne, remote_group_id)`(一团队一组)+ `Asset.review_status/review_remote_id/review_error`(迁移 `assets/0003`)。
- 集成:真人基础资产生成后 `transaction.on_commit` **静默送审**(`services.generate_base_asset``kind==person`)。
- 端点:`POST /api/projects/{id}/poll-reviews/``{reviews:{asset_id:status}}`;前端基础资产趴每 8s 轮询,人物卡渲染 **审核✓(绿)/ 审核✗·重生(红)/ 审核中**
- **e2e 已验:送审→建组(group-...)→轮询 processing→active,真从火山拿到绿盾。**
**接线步骤(给你的 Claude):**
1. `requirements.txt``volcengine` SDK 并安装(**当前 AirShelf 没装**)。
2. 照搬 `assets_client.py``apps/assets/`,改 import。
3.`AssetGroup` / 给 `Asset``remote_asset_id/audit_status/audit_error` 字段 + 迁移。
4. 生成人物基础资产后**静默自动上传**到团队素材组,前端轮询 audit_status 渲染绿/红标。
5. env 已备好:`ASSETS_API_ACCESS_KEY / ASSETS_API_SECRET_KEY / ASSETS_API_ENABLED / ASSETS_API_PROJECT_NAME`
🔴 **唯一待办:** `.env``ASSETS_API_ACCESS_KEY/SECRET_KEY` 是**借 AirDrama 已邀测账号**,AirShelf 自有火山账号开通人像素材库后**只换这两行**(独立于 `TOS_*`)。`ASSETS_API_ENABLED=false` 即可整体关停审核(不影响生图)。
---