diff --git a/video-gen-api/app/api/v1/generation.py b/video-gen-api/app/api/v1/generation.py index 7605d454..feca3e71 100644 --- a/video-gen-api/app/api/v1/generation.py +++ b/video-gen-api/app/api/v1/generation.py @@ -27,7 +27,11 @@ from app.services.generation.pipeline.db_lock_service import ( execute_with_lock_timeout, ) from app.services.video_url import validate_and_get_record_id, get_video_stream_url -from app.services.private_portrait.reference_resolver import batch_resolve_private_portrait_reference_display_urls, resolve_private_portrait_reference_display_urls +from app.services.private_portrait.reference_resolver import ( + batch_resolve_private_portrait_reference_display_urls, + resolve_private_portrait_reference_display_urls, + resolve_private_portrait_references, +) from app.services.resource_signed_url_service import build_resource_signed_url from app.services.resource_capacity_service import assert_user_resource_capacity_available from app.services.upload_resource import delete_unbound_upload_resource, upload_reference_file, cleanup_upload_resource_files_after_commit @@ -405,6 +409,24 @@ async def generate_record_resource( else: await get_image_engine(db, record.engine_id) frozen_engine = _frozen_engine_view(record) + + # 触发生成前兜底:私域素材在 GenerationRecord 创建时可能未走 resolve_private_portrait_references, + # 导致入库 url 存的是前端预览地址而非供应商需要的 asset://。这里强制重新解析, + # 确保供应商侧拿到正确的 remote_asset_id / asset:// URI。 + try: + raw_refs = json.loads(record.media_references) if record.media_references else None + except (TypeError, ValueError): + raw_refs = None + if raw_refs: + resolved_refs = await resolve_private_portrait_references( + db, + user_id=user_id_snapshot, + media_references=raw_refs, + gen_type=record.gen_type, + ) + if resolved_refs is not None: + record.media_references = json.dumps(resolved_refs, ensure_ascii=False) + reference_usage = calculate_media_reference_usage( record.media_references, include=bool(record.include_media_references), @@ -547,6 +569,22 @@ async def retry_generation( else: await get_image_engine(db, record.engine_id) frozen_engine = _frozen_engine_view(record) + + # 重试前兜底:私域素材 url 可能仍然是预览地址,重新解析确保供应商拿到 asset:// + try: + raw_refs = json.loads(record.media_references) if record.media_references else None + except (TypeError, ValueError): + raw_refs = None + if raw_refs: + resolved_refs = await resolve_private_portrait_references( + db, + user_id=user_id_snapshot, + media_references=raw_refs, + gen_type=record.gen_type, + ) + if resolved_refs is not None: + record.media_references = json.dumps(resolved_refs, ensure_ascii=False) + reference_usage = calculate_media_reference_usage( record.media_references, include=bool(record.include_media_references),