fix(video): 创作台视频 - 修正同步音频参数与万有引力结果下载地址 (#554)

Original-Commit: e85e78fb898be7ef1fcd2027b62ab43c00dfaa2c
fix(video): 创作台视频 - 修正同步音频参数与万有引力结果下载地址
This commit is contained in:
Codex
2026-09-20 20:01:51 +08:00
committed by ddCat
parent 6d0a459c4f
commit 0edde0a64b
8 changed files with 255 additions and 12 deletions

View File

@@ -0,0 +1,26 @@
import { modelCapabilityConfigFor, normalizeVideoValue } from "@/lib/model-capabilities";
import { resolveModelVideoBooleanOptions } from "@/lib/model-selection";
import type { AiConfig } from "@/stores/use-config-store";
import type { CreationSettings } from "./creation-types";
// 创作台没有音频和水印开关;报价与提交共用所选模型的默认值和能力限制。
export function creationVideoConfig(config: AiConfig, model: string, settings: Pick<CreationSettings, "ratio" | "seconds" | "videoQuality">): AiConfig {
const profile = modelCapabilityConfigFor(config, model).video!;
const normalized = normalizeVideoValue(profile, {
ratio: settings.ratio,
seconds: settings.seconds,
resolution: settings.videoQuality,
});
return {
...config,
model,
videoModel: model,
size: normalized.ratio,
videoSeconds: normalized.seconds,
vquality: normalized.resolution.replace(/p$/i, ""),
...resolveModelVideoBooleanOptions(config, model, {}, {
videoGenerateAudio: config.videoGenerateAudio,
videoWatermark: config.videoWatermark,
}),
};
}

View File

@@ -34,6 +34,7 @@ import { attachCreationTaskContexts, completedCreationGenerationTask, conversati
import { CreationComposer, CreationEmptySuggest, CreationFeaturedWorks, CreationHistoryDrawer, CreationMessageView, CreationModeTabs, CreationWorkspaceToolbar, creationAssetCategoryLabels } from "./creation-workspace";
import { CreationAgentEntry } from "./creation-agent-entry";
import { createCreationSubmitGate } from "./creation-submit-gate";
import { creationVideoConfig } from "./creation-generation-config";
const AssetLibraryPickerModal = lazy(() => import("@/components/assets/asset-library-picker-modal").then((module) => ({ default: module.AssetLibraryPickerModal })));
const loadCreationRuntime = () => import("./creation-runtime");
@@ -142,10 +143,13 @@ export default function CreatePage() {
options: mode === "image"
? { size: ratio, quality, count: Number(count), transparentBackground: config.transparentBackground === "true" }
: mode === "video"
? { size: ratio, videoSeconds: Number(seconds), vquality: videoQuality, videoGenerateAudio: config.videoGenerateAudio === "true", videoWatermark: config.videoWatermark === "true" }
? { size: ratio, videoSeconds: Number(seconds), vquality: videoQuality }
: {},
}), [attachments, config.transparentBackground, config.videoGenerateAudio, config.videoWatermark, count, hasPrompt, mode, quality, ratio, seconds, videoQuality]);
}), [attachments, config.transparentBackground, count, hasPrompt, mode, quality, ratio, seconds, videoQuality]);
const selectedModel = resolveCompatibleModel(config, preferredModel, modelRequirements) || preferredModel;
const generationConfig = useMemo(() => mode === "video"
? creationVideoConfig(config, selectedModel, { ratio, seconds, videoQuality })
: config, [config, mode, ratio, seconds, selectedModel, videoQuality]);
const imageProfile = useMemo(() => modelCapabilityConfigFor(config, selectedModel).image!, [config, selectedModel]);
const videoProfile = useMemo(() => modelCapabilityConfigFor(config, selectedModel).video!, [config, selectedModel]);
const maxReferences = mode === "video" ? videoProfile.operations.includes("image_to_video") ? videoProfile.references.maxImages : 0 : mode === "image" ? imageProfile.references.maxImages : 6;
@@ -628,18 +632,15 @@ export default function CreatePage() {
const requestLifecycle = runtime.beginGenerationConsumer(controller.signal);
abortRef.current = controller;
const normalizedImage = mode === "image" ? normalizeImageValue(imageProfile, { size: ratio, quality, count }) : undefined;
const normalizedVideo = mode === "video" ? normalizeVideoValue(videoProfile, { seconds, ratio, resolution: videoQuality }) : undefined;
const requestConfig = {
...config,
...generationConfig,
model: selectedModel,
imageModel: selectedModel,
videoModel: selectedModel,
textModel: selectedModel,
...(mode === "image"
? { size: normalizedImage?.size || ratio, quality: normalizedImage?.quality || quality, count: normalizedImage?.count || count, videoSeconds: config.videoSeconds }
: mode === "video"
? { size: normalizedVideo?.ratio ?? ratio, videoSeconds: normalizedVideo?.seconds || seconds, vquality: (normalizedVideo?.resolution ?? videoQuality).replace(/p$/i, "") }
: {}),
: {}),
};
try {
if (mode === "text") {
@@ -957,7 +958,7 @@ export default function CreatePage() {
modelRequirements,
imageProfile,
videoProfile,
config,
config: generationConfig,
onModelChange: (value: string) => updateConfig(mode === "text" ? "textModel" : mode === "image" ? "imageModel" : "videoModel", value),
ratio,
setRatio: setComposerRatio,