fix(video): 真人参考图走素材库 asset:// 引用,根治 Seedance 锁脸全错

根因:Seedance 2.0 对写实人脸的原始直链直接 400(InputImageSensitiveContentDetected),
旧代码静默退纯文生视频 → 任务假成功、人物/场景全错(脚本是文本所以对)。

- 视频参考图:已过审(active+素材库 ID)的人物 + 分镜图换成 asset://{review_remote_id},
  场景/商品(无脸、未送审)保持原始直链(_video_reference_images / _seedance_ref_url)
- 临时:VIDEO_ARK_API_KEY 让 Seedance 借 AirDrama 火山账号,与真人素材库同账号 → asset:// 可解析;
  仅覆盖 VIDEO 能力,图像/文本仍用自有 key。待自有账号开通素材库后删此项即回落
- 删掉静默文生兜底:火山报错经 _raise_volcano_error 抽出真实 code+message 抛出,
  落 error_message → 前端如实显示,绝不再假装成功出没锁脸的视频

真实接口验证:同图旧路 400,新路(asset://+AirDrama key)Seedance ACCEPTED 正常出片。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
seaislee1209
2026-06-23 13:16:30 +08:00
co-authored by Claude Opus 4.8
parent dbd1382fb1
commit 6916f9c877
4 changed files with 60 additions and 29 deletions
+18 -2
View File
@@ -11,6 +11,22 @@ from django.conf import settings
from .base import AIProviderResult
def _raise_volcano_error(response: requests.Response) -> None:
"""火山非 2xx:抽出真实报错(error.code / error.message)抛成可读异常,
供上层落 error_message → 前端如实显示真实报错参数,不再被通用「HTTP 400」吞掉细节。"""
if response.ok:
return
code = message = ""
try:
err = (response.json() or {}).get("error") or {}
code, message = str(err.get("code") or ""), str(err.get("message") or "")
except Exception:
pass
if code or message:
raise RuntimeError(f"火山报错 [{code}] {message}".strip())
raise RuntimeError(f"火山接口 {response.status_code}: {(response.text or '')[:300]}")
@dataclass
class VolcanoArkProvider:
api_key: str | None = None
@@ -196,7 +212,7 @@ class VolcanoArkProvider:
json=body,
timeout=120,
)
response.raise_for_status()
_raise_volcano_error(response)
return response.json()
def poll_video_task(self, *, endpoint: str, provider_task_id: str) -> dict[str, Any]:
@@ -207,7 +223,7 @@ class VolcanoArkProvider:
headers={"Authorization": f"Bearer {self.api_key}"},
timeout=60,
)
response.raise_for_status()
_raise_volcano_error(response)
return response.json()
@staticmethod