From 7993435704cfa297734fb392c4959897e0a10f95 Mon Sep 17 00:00:00 2001 From: Stringadmin Date: Wed, 3 Jun 2026 23:52:25 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E7=94=9F=E6=88=90=20API=20=E8=B0=83=E7=94=A8=E9=93=BE=E8=B7=AF?= =?UTF-8?q?=EF=BC=8C=E7=A1=AE=E4=BF=9D=E5=8F=82=E8=80=83=E5=9B=BE=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE=E4=BC=A0=E9=80=92=E5=88=B0=E5=90=84=E9=98=B6=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 生图阶段:将用户上传的产品图作为 referenceUrls 传给生图模型 - 生视频阶段:同时传递用户原图 + 分镜图给视频模型 - 完整链路:参考图→视觉分析→分镜文本→(文本+原图)→分镜图→(文本+原图+分镜图)→视频 Co-Authored-By: Claude Opus 4.7 --- src/features/ecommerce/EcommerceVideoWorkspace.tsx | 6 +++--- src/features/ecommerce/ecommerceVideoService.ts | 8 ++++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/features/ecommerce/EcommerceVideoWorkspace.tsx b/src/features/ecommerce/EcommerceVideoWorkspace.tsx index 897a37c..9e7cafe 100644 --- a/src/features/ecommerce/EcommerceVideoWorkspace.tsx +++ b/src/features/ecommerce/EcommerceVideoWorkspace.tsx @@ -426,7 +426,7 @@ export default function EcommerceVideoWorkspace({ persistScenes(currentScenes.map((s) => s.sceneId === scene.sceneId ? { ...s, status: "pending", error: undefined } : s)); try { await renderSceneImage( - { sceneId: scene.sceneId, prompt: scene.prompt, aspectRatio: ratio }, + { sceneId: scene.sceneId, prompt: scene.prompt, aspectRatio: ratio, productImageUrls: sourceImageUrls }, { onSceneImageSubmitted: (id, taskId) => { persistScenes(currentScenes.map((s) => s.sceneId === id ? { ...s, imageTaskId: taskId, status: "running" } : s)); @@ -481,7 +481,7 @@ export default function EcommerceVideoWorkspace({ persistScenes(currentScenes.map((s) => s.sceneId === scene.sceneId ? { ...s, status: "pending", error: undefined } : s)); try { await renderScene( - { sceneId: scene.sceneId, prompt: scene.prompt, durationSeconds: scene.durationSeconds, imageUrl: scene.imageUrl, aspectRatio, resolution: quality }, + { sceneId: scene.sceneId, prompt: scene.prompt, durationSeconds: scene.durationSeconds, imageUrl: scene.imageUrl, productImageUrls: sourceImageUrls, aspectRatio, resolution: quality }, { onSceneSubmitted: (id, taskId) => { persistScenes(currentScenes.map((s) => s.sceneId === id ? { ...s, taskId, status: "running" } : s)); @@ -524,7 +524,7 @@ export default function EcommerceVideoWorkspace({ setScenes((prev) => prev.map((s) => s.sceneId === scene.sceneId ? { ...s, status: "pending", error: undefined } : s)); try { await renderScene( - { sceneId: scene.sceneId, prompt: scene.prompt, durationSeconds: scene.durationSeconds, imageUrl: scene.imageUrl!, aspectRatio, resolution: mapResolutionToQuality(resolution) }, + { sceneId: scene.sceneId, prompt: scene.prompt, durationSeconds: scene.durationSeconds, imageUrl: scene.imageUrl!, productImageUrls: sourceImageUrls, aspectRatio, resolution: mapResolutionToQuality(resolution) }, { onSceneSubmitted: (id, taskId) => setScenes((prev) => prev.map((s) => s.sceneId === id ? { ...s, taskId, status: "running" } : s)), onSceneProgress: (id, progress) => setScenes((prev) => prev.map((s) => s.sceneId === id ? { ...s, progress } : s)), diff --git a/src/features/ecommerce/ecommerceVideoService.ts b/src/features/ecommerce/ecommerceVideoService.ts index 3ea489d..3cb8ccc 100644 --- a/src/features/ecommerce/ecommerceVideoService.ts +++ b/src/features/ecommerce/ecommerceVideoService.ts @@ -152,6 +152,7 @@ export interface RenderSceneImageInput { sceneId: number; prompt: string; aspectRatio: string; + productImageUrls: string[]; } export interface RenderImageCallbacks { @@ -171,6 +172,7 @@ export async function renderSceneImage( prompt: input.prompt, ratio: input.aspectRatio, quality: "2K", + referenceUrls: input.productImageUrls, }); callbacks.onSceneImageSubmitted(input.sceneId, taskId); @@ -192,6 +194,7 @@ export interface RenderSceneInput { prompt: string; durationSeconds: number; imageUrl: string; + productImageUrls: string[]; aspectRatio: string; resolution: string; model?: string; @@ -209,9 +212,10 @@ export async function renderScene( callbacks: RenderCallbacks, abortRef: { current: boolean }, ): Promise { + const allReferenceUrls = [...input.productImageUrls, input.imageUrl]; const model = resolveVideoRequestModel({ model: input.model || "happyhorse-1.0", - referenceUrls: [input.imageUrl], + referenceUrls: allReferenceUrls, }); const { taskId } = await aiGenerationClient.createVideoTask({ @@ -222,7 +226,7 @@ export async function renderScene( quality: input.resolution, resolution: input.resolution, frameMode: "start-end", - referenceUrls: [input.imageUrl], + referenceUrls: allReferenceUrls, hasReferenceVideo: false, });