@sogni-ai/sogni-intelligence-client 4.10.2 → 4.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/SogniClientWrapper.d.ts.map +1 -1
- package/dist/client/SogniClientWrapper.js +23 -5
- package/dist/client/SogniClientWrapper.js.map +1 -1
- package/dist/contracts/index.d.ts +1 -1
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +3 -2
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/toolPromptMarkers.d.ts +1 -0
- package/dist/contracts/toolPromptMarkers.d.ts.map +1 -1
- package/dist/contracts/toolPromptMarkers.js +2 -1
- package/dist/contracts/toolPromptMarkers.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -2
- package/dist/index.js.map +1 -1
- package/dist/media/index.d.ts +2 -0
- package/dist/media/index.d.ts.map +1 -1
- package/dist/media/index.js +2 -0
- package/dist/media/index.js.map +1 -1
- package/dist/media/modelConsentRequired.d.ts +21 -0
- package/dist/media/modelConsentRequired.d.ts.map +1 -0
- package/dist/media/modelConsentRequired.js +98 -0
- package/dist/media/modelConsentRequired.js.map +1 -0
- package/dist/media/modelNotYetAvailable.d.ts +15 -0
- package/dist/media/modelNotYetAvailable.d.ts.map +1 -0
- package/dist/media/modelNotYetAvailable.js +98 -0
- package/dist/media/modelNotYetAvailable.js.map +1 -0
- package/dist/media/videoSettings.d.ts +1 -1
- package/dist/media/videoSettings.d.ts.map +1 -1
- package/dist/media/videoSettings.js +9 -0
- package/dist/media/videoSettings.js.map +1 -1
- package/dist/openai-tools/_manifests.generated.d.ts.map +1 -1
- package/dist/openai-tools/_manifests.generated.js +19 -14
- package/dist/openai-tools/_manifests.generated.js.map +1 -1
- package/dist/openai-tools/generation-tools.json +19 -14
- package/dist/public-skill-runtime/index.d.ts +16 -1
- package/dist/public-skill-runtime/index.d.ts.map +1 -1
- package/dist/public-skill-runtime/index.js +50 -6
- package/dist/public-skill-runtime/index.js.map +1 -1
- package/dist/schemas/tools/animate_photo.schema.json +1 -1
- package/dist/schemas/tools/edit_image.schema.json +1 -1
- package/dist/schemas/tools/extend_video.schema.json +3 -2
- package/dist/schemas/tools/generate_image.schema.json +1 -1
- package/dist/schemas/tools/generate_video.schema.json +4 -3
- package/dist/schemas/tools/replace_video_segment.schema.json +3 -2
- package/dist/schemas/tools/sound_to_video.schema.json +3 -2
- package/dist/schemas/tools/video_to_video.schema.json +5 -4
- package/dist/tools/definitions/animate-photo/definition.js +1 -1
- package/dist/tools/definitions/animate-photo/definition.js.map +1 -1
- package/dist/tools/definitions/extend-video/definition.js +2 -2
- package/dist/tools/definitions/extend-video/definition.js.map +1 -1
- package/dist/tools/definitions/generate-video/definition.d.ts.map +1 -1
- package/dist/tools/definitions/generate-video/definition.js +5 -3
- package/dist/tools/definitions/generate-video/definition.js.map +1 -1
- package/dist/tools/definitions/replace-video-segment/definition.js +2 -2
- package/dist/tools/definitions/replace-video-segment/definition.js.map +1 -1
- package/dist/tools/definitions/sound-to-video/definition.d.ts.map +1 -1
- package/dist/tools/definitions/sound-to-video/definition.js +4 -2
- package/dist/tools/definitions/sound-to-video/definition.js.map +1 -1
- package/dist/tools/definitions/video-to-video/definition.d.ts.map +1 -1
- package/dist/tools/definitions/video-to-video/definition.js +5 -4
- package/dist/tools/definitions/video-to-video/definition.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +20 -18
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/shared/_catalogs.generated.d.ts.map +1 -1
- package/dist/tools/shared/_catalogs.generated.js +6 -0
- package/dist/tools/shared/_catalogs.generated.js.map +1 -1
- package/dist/tools/shared/errorClassification.d.ts.map +1 -1
- package/dist/tools/shared/errorClassification.js +2 -1
- package/dist/tools/shared/errorClassification.js.map +1 -1
- package/dist/tools/shared/modelRegistry.d.ts.map +1 -1
- package/dist/tools/shared/modelRegistry.js +3 -0
- package/dist/tools/shared/modelRegistry.js.map +1 -1
- package/dist/tools/shared/seedancePolicyErrors.d.ts +2 -2
- package/dist/tools/shared/seedancePolicyErrors.d.ts.map +1 -1
- package/dist/tools/shared/seedancePolicyErrors.js +6 -0
- package/dist/tools/shared/seedancePolicyErrors.js.map +1 -1
- package/dist/utils/errors.d.ts +12 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +40 -2
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/helpers.d.ts.map +1 -1
- package/dist/utils/helpers.js +1 -1
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/seedanceModelIds.d.ts +2 -0
- package/dist/utils/seedanceModelIds.d.ts.map +1 -1
- package/dist/utils/seedanceModelIds.js +13 -1
- package/dist/utils/seedanceModelIds.js.map +1 -1
- package/dist/workflows/executor.d.ts.map +1 -1
- package/dist/workflows/executor.js +5 -4
- package/dist/workflows/executor.js.map +1 -1
- package/dist-esm/client/SogniClientWrapper.js +24 -6
- package/dist-esm/client/SogniClientWrapper.js.map +1 -1
- package/dist-esm/contracts/index.js +1 -1
- package/dist-esm/contracts/index.js.map +1 -1
- package/dist-esm/contracts/toolPromptMarkers.js +1 -0
- package/dist-esm/contracts/toolPromptMarkers.js.map +1 -1
- package/dist-esm/index.js +4 -2
- package/dist-esm/index.js.map +1 -1
- package/dist-esm/media/index.js +2 -0
- package/dist-esm/media/index.js.map +1 -1
- package/dist-esm/media/modelConsentRequired.js +92 -0
- package/dist-esm/media/modelConsentRequired.js.map +1 -0
- package/dist-esm/media/modelNotYetAvailable.js +92 -0
- package/dist-esm/media/modelNotYetAvailable.js.map +1 -0
- package/dist-esm/media/videoSettings.js +9 -0
- package/dist-esm/media/videoSettings.js.map +1 -1
- package/dist-esm/openai-tools/_manifests.generated.js +19 -14
- package/dist-esm/openai-tools/_manifests.generated.js.map +1 -1
- package/dist-esm/openai-tools/generation-tools.json +19 -14
- package/dist-esm/public-skill-runtime/index.js +51 -7
- package/dist-esm/public-skill-runtime/index.js.map +1 -1
- package/dist-esm/schemas/tools/animate_photo.schema.json +1 -1
- package/dist-esm/schemas/tools/edit_image.schema.json +1 -1
- package/dist-esm/schemas/tools/extend_video.schema.json +3 -2
- package/dist-esm/schemas/tools/generate_image.schema.json +1 -1
- package/dist-esm/schemas/tools/generate_video.schema.json +4 -3
- package/dist-esm/schemas/tools/replace_video_segment.schema.json +3 -2
- package/dist-esm/schemas/tools/sound_to_video.schema.json +3 -2
- package/dist-esm/schemas/tools/video_to_video.schema.json +5 -4
- package/dist-esm/tools/definitions/animate-photo/definition.js +1 -1
- package/dist-esm/tools/definitions/animate-photo/definition.js.map +1 -1
- package/dist-esm/tools/definitions/extend-video/definition.js +2 -2
- package/dist-esm/tools/definitions/extend-video/definition.js.map +1 -1
- package/dist-esm/tools/definitions/generate-video/definition.js +6 -4
- package/dist-esm/tools/definitions/generate-video/definition.js.map +1 -1
- package/dist-esm/tools/definitions/replace-video-segment/definition.js +2 -2
- package/dist-esm/tools/definitions/replace-video-segment/definition.js.map +1 -1
- package/dist-esm/tools/definitions/sound-to-video/definition.js +5 -3
- package/dist-esm/tools/definitions/sound-to-video/definition.js.map +1 -1
- package/dist-esm/tools/definitions/video-to-video/definition.js +6 -5
- package/dist-esm/tools/definitions/video-to-video/definition.js.map +1 -1
- package/dist-esm/tools/index.js +1 -0
- package/dist-esm/tools/index.js.map +1 -1
- package/dist-esm/tools/shared/_catalogs.generated.js +6 -0
- package/dist-esm/tools/shared/_catalogs.generated.js.map +1 -1
- package/dist-esm/tools/shared/errorClassification.js +2 -1
- package/dist-esm/tools/shared/errorClassification.js.map +1 -1
- package/dist-esm/tools/shared/modelRegistry.js +3 -0
- package/dist-esm/tools/shared/modelRegistry.js.map +1 -1
- package/dist-esm/tools/shared/seedancePolicyErrors.js +7 -1
- package/dist-esm/tools/shared/seedancePolicyErrors.js.map +1 -1
- package/dist-esm/utils/errors.js +35 -1
- package/dist-esm/utils/errors.js.map +1 -1
- package/dist-esm/utils/helpers.js +2 -2
- package/dist-esm/utils/helpers.js.map +1 -1
- package/dist-esm/utils/seedanceModelIds.js +12 -1
- package/dist-esm/utils/seedanceModelIds.js.map +1 -1
- package/dist-esm/workflows/executor.js +5 -4
- package/dist-esm/workflows/executor.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { GATING_POLICIES, REPAIR_RECIPES, PROMPT_CONTRACTS, } from '../contracts/data/index.js';
|
|
2
2
|
import { normalizeSignalSource } from '../contracts/turnPolicy.js';
|
|
3
|
-
import { isSeedanceVideoModelId, SEEDANCE_VIDEO_MODEL_IDS, } from '../utils/seedanceModelIds.js';
|
|
3
|
+
import { isSeedance25VideoModelId, isSeedanceVideoModelId, SEEDANCE_VIDEO_MODEL_IDS, } from '../utils/seedanceModelIds.js';
|
|
4
4
|
import { resolveRegisteredVideoModelFamily } from '../utils/videoModelIds.js';
|
|
5
5
|
import { resolveRegisteredImageReferenceModelId } from '../utils/imageReferenceModelIds.js';
|
|
6
6
|
import { isGptImageModel, normalizeGptImageModelAlias } from '../media/gptImage.js';
|
|
7
7
|
import { WAN22_MAX_VIDEO_PIXELS } from '../media/videoSettings.js';
|
|
8
|
+
import { modelConsentRequiredPayloadFromError } from '../media/modelConsentRequired.js';
|
|
9
|
+
import { modelNotYetAvailablePayloadFromError } from '../media/modelNotYetAvailable.js';
|
|
8
10
|
import { MINIMAX_H3_KEYFRAMES_GUIDANCE } from '../contracts/toolPromptMarkers.js';
|
|
9
11
|
function isLtxWorkflow(workflow) {
|
|
10
12
|
return workflow === 't2v' || workflow === 'i2v' || workflow === 'ia2v' || workflow === 'a2v' || workflow === 'v2v';
|
|
@@ -267,6 +269,24 @@ function codeEquals(code, expected) {
|
|
|
267
269
|
return String(code).toLowerCase() === String(expected).toLowerCase();
|
|
268
270
|
}
|
|
269
271
|
export function classifySkillError(error) {
|
|
272
|
+
const consentPayload = modelConsentRequiredPayloadFromError(error);
|
|
273
|
+
if (consentPayload) {
|
|
274
|
+
return {
|
|
275
|
+
error_type: 'PERMISSION_REQUIRED',
|
|
276
|
+
category: 'permission_required',
|
|
277
|
+
message: consentPayload.message,
|
|
278
|
+
retryable: false,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
const notYetAvailablePayload = modelNotYetAvailablePayloadFromError(error);
|
|
282
|
+
if (notYetAvailablePayload) {
|
|
283
|
+
return {
|
|
284
|
+
error_type: 'MODEL_UNAVAILABLE',
|
|
285
|
+
category: 'model_unavailable',
|
|
286
|
+
message: notYetAvailablePayload.message,
|
|
287
|
+
retryable: false,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
270
290
|
const message = skillErrorMessage(error);
|
|
271
291
|
const lower = message.toLowerCase();
|
|
272
292
|
const code = skillErrorCode(error);
|
|
@@ -661,11 +681,12 @@ export const IMAGE_EDITING_SKILL = {
|
|
|
661
681
|
export const VIDEO_GENERATION_SKILL = {
|
|
662
682
|
id: 'video_generation',
|
|
663
683
|
name: 'Video generation',
|
|
664
|
-
description: 'Text-to-video synthesis with LTX, Wan, Seedance, HappyHorse, and MiniMax H3, including Wan 3.0 Enhanced through MuleRouter. Use when the user wants a new video clip generated from a prompt or loose reference set.',
|
|
684
|
+
description: 'Text-to-video synthesis with LTX, Wan, Seedance, HappyHorse, and MiniMax H3, including Wan 3.0 Enhanced through MuleRouter and Seedance 2.5 Uncensored. Use when the user wants a new video clip generated from a prompt or loose reference set.',
|
|
665
685
|
toolNames: ['generate_video'],
|
|
666
686
|
constraints: [
|
|
667
687
|
'For My Personas video requests, default to image_editing first to produce a conditioned scene image before animation. Use direct video only when the user explicitly asks to animate an existing persona image/reference or no source image is available for a voice-only request.',
|
|
668
688
|
'Wan 3.0 Enhanced uses exact Sogni model id wan3.0-spicy-video (MuleRouter provider id w3.0-video): 2-30 seconds at 30 fps, 480p/720p/1080p, native audio, prompt expansion, adaptive/fixed ratios, and up to 10 image/5 video/5 audio references. First/last-frame mode and loose-reference mode are mutually exclusive. It has no document/web context, watermark, negative prompt, source-video edit, or extend mode.',
|
|
689
|
+
'Seedance 2.5 Uncensored uses selector seedance2-5-uncensored (Sogni model id seedance-2-5-uncensored): the same modes, 480p/720p/1080p, 4-30 seconds at 24 fps, reference limits, MOV and last-frame options as seedance2-5. Use it only when the user asks for Seedance 2.5 Uncensored, Seedance Uncensored, or Seedance Spicy, and never swap it for seedance2-5. Each account must accept a one-time likeness and consent agreement in the Sogni app first; error 4103 means it has not, so tell the user to accept it there and do not retry.',
|
|
669
690
|
'MiniMax H3 two-stage: 1080p and 2K H3 delivery is its own selector, not an option. minimax-h3-fasth3-t2v-turbo-2stage on generate_video (animate_photo carries minimax-h3-fasth3-i2v-turbo-2stage and minimax-h3-fasth3-flf2v-turbo-2stage) renders the FastH3 canvas, then the worker enlarges it 2x and refines it, so the clip is delivered at twice the canvas with the same length and audio. targetResolution names the delivered class: 1080 renders a 544px short-edge canvas (960x544 becomes 1920x1088) for 10 Spark per second, 1440 or omitted renders the 768p canvas for 2K (1344x768 becomes 2688x1536) for 16 Spark per second, and 720 renders a 384px canvas (672x384 becomes 1344x768) for the regular FastH3 price of 4 Spark per second. Choose it when the user asks for 1080p, 1440p or 2K H3 output, for two-stage output, or for the sharpest/best H3 quality, and send the same prompt contract, durations and LoRAs as the matching FastH3 selector; keep ordinary 768p FastH3 output on the regular FastH3 selector at targetResolution 768. Reference-to-video has its own two-stage selectors on generate_video: minimax-h3-r2v-2stage (Standard, 20 steps) and minimax-h3-r2v-balanced-2stage (Balanced, 8 steps) take exactly the references, prompt contract, durations and LoRAs of minimax-h3-r2v and minimax-h3-r2v-balanced, deliver twice the canvas, and read targetResolution the same way; each bills its tier\'s rate plus the two-stage surcharge of the delivered class. Keep the one-stage R2V selectors for ordinary 768p output.',
|
|
670
691
|
`${MINIMAX_H3_KEYFRAMES_GUIDANCE} On generate_video only the MiniMax H3 reference-to-video selectors take keyframes, never text-to-video; the keyframe images are not references and do not go in referenceImageIndices.`,
|
|
671
692
|
],
|
|
@@ -907,6 +928,8 @@ function publicSeedanceVideoModelFromInput(input) {
|
|
|
907
928
|
const resolved = resolveVideoModelAlias(requestedModelId, 't2v');
|
|
908
929
|
if (resolved === SEEDANCE_WORKFLOW_MODELS.t2v25)
|
|
909
930
|
return 'seedance2-5';
|
|
931
|
+
if (resolved === SEEDANCE_WORKFLOW_MODELS.t2v25Uncensored)
|
|
932
|
+
return 'seedance2-5-uncensored';
|
|
910
933
|
if (resolved === SEEDANCE_WORKFLOW_MODELS.t2vMini)
|
|
911
934
|
return 'seedance2-mini';
|
|
912
935
|
if (resolved === SEEDANCE_WORKFLOW_MODELS.t2v)
|
|
@@ -925,7 +948,7 @@ const PUBLIC_SEEDANCE_ADAPTER = {
|
|
|
925
948
|
prompt: compileStoryboardImagePromptFromProject(storyboard),
|
|
926
949
|
args: {
|
|
927
950
|
videoModel,
|
|
928
|
-
...(videoModel
|
|
951
|
+
...(isSeedance25VideoModelId(videoModel) ? { targetResolution: 1080 } : {}),
|
|
929
952
|
aspectRatio: storyboard.targetVideoAspectRatio,
|
|
930
953
|
skipPromptProcessing: true,
|
|
931
954
|
expandPrompt: false,
|
|
@@ -935,14 +958,14 @@ const PUBLIC_SEEDANCE_ADAPTER = {
|
|
|
935
958
|
if (input.stage === 'scene_clip') {
|
|
936
959
|
const scene = requireStoryboardScene('SEEDANCE_ADAPTER', input);
|
|
937
960
|
const referenceTag = input.primaryReferenceTag ?? formatModelRef('seedance', 1, 'image');
|
|
938
|
-
const maxDuration = videoModel
|
|
961
|
+
const maxDuration = isSeedance25VideoModelId(videoModel) ? 30 : 15;
|
|
939
962
|
const duration = Math.max(4, Math.min(maxDuration, Math.round(scene.durationSec ?? 5)));
|
|
940
963
|
return {
|
|
941
964
|
stage: 'scene_clip',
|
|
942
965
|
prompt: compileSeedanceSceneClipPromptFromProject(storyboard, scene, referenceTag),
|
|
943
966
|
args: {
|
|
944
967
|
videoModel,
|
|
945
|
-
...(videoModel
|
|
968
|
+
...(isSeedance25VideoModelId(videoModel) ? { targetResolution: 1080 } : {}),
|
|
946
969
|
duration,
|
|
947
970
|
aspectRatio: storyboard.targetVideoAspectRatio,
|
|
948
971
|
skipPromptProcessing: true,
|
|
@@ -1269,7 +1292,8 @@ export const SEEDANCE_WORKFLOW_MODELS = Object.freeze({
|
|
|
1269
1292
|
t2vMini: SEEDANCE_VIDEO_MODEL_IDS.mini,
|
|
1270
1293
|
ia2v: SEEDANCE_VIDEO_MODEL_IDS.standard,
|
|
1271
1294
|
v2v: SEEDANCE_VIDEO_MODEL_IDS.standard,
|
|
1272
|
-
t2v25: SEEDANCE_VIDEO_MODEL_IDS.v25
|
|
1295
|
+
t2v25: SEEDANCE_VIDEO_MODEL_IDS.v25,
|
|
1296
|
+
t2v25Uncensored: SEEDANCE_VIDEO_MODEL_IDS.v25Uncensored
|
|
1273
1297
|
});
|
|
1274
1298
|
export const HAPPYHORSE_WORKFLOW_MODELS = Object.freeze({
|
|
1275
1299
|
t2v: 'happyhorse-1.1-t2v',
|
|
@@ -1514,6 +1538,20 @@ export const VIDEO_MODEL_REGISTRY = Object.freeze({
|
|
|
1514
1538
|
maxFrames: 721,
|
|
1515
1539
|
supportsNativeAudio: true
|
|
1516
1540
|
},
|
|
1541
|
+
[SEEDANCE_WORKFLOW_MODELS.t2v25Uncensored]: {
|
|
1542
|
+
workflow: 't2v',
|
|
1543
|
+
family: 'seedance2',
|
|
1544
|
+
defaultWidth: 1280,
|
|
1545
|
+
defaultHeight: 720,
|
|
1546
|
+
minDimension: 1,
|
|
1547
|
+
maxDimension: 2206,
|
|
1548
|
+
dimensionMultiple: 1,
|
|
1549
|
+
fps: 24,
|
|
1550
|
+
frameStep: 1,
|
|
1551
|
+
minFrames: 97,
|
|
1552
|
+
maxFrames: 721,
|
|
1553
|
+
supportsNativeAudio: true
|
|
1554
|
+
},
|
|
1517
1555
|
[WAN3_WORKFLOW_MODEL]: {
|
|
1518
1556
|
workflow: 't2v',
|
|
1519
1557
|
family: 'wan3',
|
|
@@ -1653,6 +1691,12 @@ export const VIDEO_MODEL_ALIASES = Object.freeze({
|
|
|
1653
1691
|
'seedance2-5-t2v': SEEDANCE_WORKFLOW_MODELS.t2v25,
|
|
1654
1692
|
'seedance2-5-ia2v': SEEDANCE_WORKFLOW_MODELS.t2v25,
|
|
1655
1693
|
'seedance2-5-v2v': SEEDANCE_WORKFLOW_MODELS.t2v25,
|
|
1694
|
+
'seedance2-5-uncensored': SEEDANCE_WORKFLOW_MODELS.t2v25Uncensored,
|
|
1695
|
+
'seedance2-5-uncensored-t2v': SEEDANCE_WORKFLOW_MODELS.t2v25Uncensored,
|
|
1696
|
+
'seedance2-5-uncensored-ia2v': SEEDANCE_WORKFLOW_MODELS.t2v25Uncensored,
|
|
1697
|
+
'seedance2-5-uncensored-v2v': SEEDANCE_WORKFLOW_MODELS.t2v25Uncensored,
|
|
1698
|
+
'seedance-uncensored': SEEDANCE_WORKFLOW_MODELS.t2v25Uncensored,
|
|
1699
|
+
'seedance-spicy': SEEDANCE_WORKFLOW_MODELS.t2v25Uncensored,
|
|
1656
1700
|
wan3: WAN3_WORKFLOW_MODEL,
|
|
1657
1701
|
'wan3.0': WAN3_WORKFLOW_MODEL,
|
|
1658
1702
|
'wan3-video': WAN3_WORKFLOW_MODEL,
|
|
@@ -7278,7 +7322,7 @@ export function buildStoryboardVideoHostedToolSequenceInput(options) {
|
|
|
7278
7322
|
const imageQuality = options.imageQuality ?? 'high';
|
|
7279
7323
|
const imageOutputFormat = options.imageOutputFormat ?? 'png';
|
|
7280
7324
|
const videoModel = options.videoModel ?? 'seedance2-5';
|
|
7281
|
-
const videoMaximumDuration = videoModel
|
|
7325
|
+
const videoMaximumDuration = isSeedance25VideoModelId(videoModel) ? 30 : 15;
|
|
7282
7326
|
const requestedVideoDuration = options.videoDurationSec ?? project.durationSec ?? 5;
|
|
7283
7327
|
const videoDuration = Math.max(4, Math.min(videoMaximumDuration, Math.round(requestedVideoDuration)));
|
|
7284
7328
|
const videoTargetResolution = options.videoTargetResolution ?? (videoModel === 'seedance2-mini' ? 720 : 1080);
|