From e8db66c6d56d25f990ed5ab1660d329b2cbdc0e7 Mon Sep 17 00:00:00 2001 From: 134 Date: Fri, 18 Sep 2026 11:09:31 +0800 Subject: [PATCH] Make canvas connections resolve live inputs and respect disconnects --- components/canvas/AudioGenerationComposer.tsx | 13 +- .../canvas/LiblibVideoCanvasReplica.tsx | 218 ++++++++---------- docs/video-canvas-connections-2026-09-18.md | 54 +++++ hooks/use-video-canvas-tasks.ts | 24 +- lib/video-canvas/connections.ts | 116 ++++++++++ playwright.helpers.config.ts | 1 + tests/routes/video-canvas-connections.test.ts | 84 +++++++ 7 files changed, 387 insertions(+), 123 deletions(-) create mode 100644 docs/video-canvas-connections-2026-09-18.md create mode 100644 lib/video-canvas/connections.ts create mode 100644 tests/routes/video-canvas-connections.test.ts diff --git a/components/canvas/AudioGenerationComposer.tsx b/components/canvas/AudioGenerationComposer.tsx index 0c429f849..b605c9ea0 100644 --- a/components/canvas/AudioGenerationComposer.tsx +++ b/components/canvas/AudioGenerationComposer.tsx @@ -9,14 +9,16 @@ import { type Model = { id: string; modelId: string; name: string; kind: string }; export function AudioGenerationComposer({ initial, + connectedText = "", busy, onSubmit, onUpload, onDraft, }: { initial?: Record; + connectedText?: string; busy: boolean; - onSubmit: (params: AudioRequest) => Promise; + onSubmit: (params: AudioRequest, draft: AudioRequest) => Promise; onUpload: (file: File) => Promise; onDraft: (params: Record) => void; }) { @@ -73,6 +75,7 @@ export function AudioGenerationComposer({ if (!model) throw Error("当前模式没有已启用的官方模型"); const params = audioRequestSchema.parse({ ...draft, + text: [draft.text, connectedText].filter(Boolean).join("\n\n"), modelRef: model.id, voice, format, @@ -80,8 +83,9 @@ export function AudioGenerationComposer({ ...(!contract?.instructions ? { instructions: "" } : {}), }); buildAudioRequest(params, model.modelId); - patch(params); - await onSubmit(params); + const savedDraft = { ...params, text: String(draft.text || "") }; + patch(savedDraft); + await onSubmit(params, savedDraft); } catch (e) { setError(e instanceof Error ? e.message : "提交失败"); } finally { @@ -96,6 +100,7 @@ export function AudioGenerationComposer({ >

语音与音乐 · 阿里云官方

+ {connectedText &&

已连接文本:{connectedText}

}
{draft.mode === "tts" ? ( <> -
+