From 84978368114e3f55842ce3c972bbc3e924dda931 Mon Sep 17 00:00:00 2001 From: Alexander Piskun <13381981+bigcat88@users.noreply.github.com> Date: Thu, 15 Jan 2026 02:14:12 +0200 Subject: [PATCH] feat(price-badges): add ByteDance SeeDance 1.5 prices (#8046) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Added prices for `seedance-1-5-pro` model ## Screenshots (if applicable) Screenshot From 2026-01-14 18-09-18 ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-8046-feat-price-badges-add-ByteDance-SeeDance-1-5-prices-2e86d73d3650814cb988dc94cfb48993) by [Unito](https://www.unito.io) --- src/composables/node/useNodePricing.ts | 54 ++++++++++++++++++++------ 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/src/composables/node/useNodePricing.ts b/src/composables/node/useNodePricing.ts index 6f1184b6a..95c432747 100644 --- a/src/composables/node/useNodePricing.ts +++ b/src/composables/node/useNodePricing.ts @@ -220,13 +220,24 @@ const byteDanceVideoPricingCalculator = (node: LGraphNode): string => { const resolutionWidget = node.widgets?.find( (w) => w.name === 'resolution' ) as IComboWidget + const generateAudioWidget = node.widgets?.find( + (w) => w.name === 'generate_audio' + ) as IComboWidget | undefined if (!modelWidget || !durationWidget || !resolutionWidget) return 'Token-based' const model = String(modelWidget.value).toLowerCase() const resolution = String(resolutionWidget.value).toLowerCase() const seconds = parseFloat(String(durationWidget.value)) + const generateAudio = + generateAudioWidget && + String(generateAudioWidget.value).toLowerCase() === 'true' const priceByModel: Record> = { + 'seedance-1-5-pro': { + '480p': [0.12, 0.12], + '720p': [0.26, 0.26], + '1080p': [0.58, 0.59] + }, 'seedance-1-0-pro': { '480p': [0.23, 0.24], '720p': [0.51, 0.56], @@ -244,13 +255,15 @@ const byteDanceVideoPricingCalculator = (node: LGraphNode): string => { } } - const modelKey = model.includes('seedance-1-0-pro-fast') - ? 'seedance-1-0-pro-fast' - : model.includes('seedance-1-0-pro') - ? 'seedance-1-0-pro' - : model.includes('seedance-1-0-lite') - ? 'seedance-1-0-lite' - : '' + const modelKey = model.includes('seedance-1-5-pro') + ? 'seedance-1-5-pro' + : model.includes('seedance-1-0-pro-fast') + ? 'seedance-1-0-pro-fast' + : model.includes('seedance-1-0-pro') + ? 'seedance-1-0-pro' + : model.includes('seedance-1-0-lite') + ? 'seedance-1-0-lite' + : '' const resKey = resolution.includes('1080') ? '1080p' @@ -266,8 +279,10 @@ const byteDanceVideoPricingCalculator = (node: LGraphNode): string => { const [min10s, max10s] = baseRange const scale = seconds / 10 - const minCost = min10s * scale - const maxCost = max10s * scale + const audioMultiplier = + modelKey === 'seedance-1-5-pro' && generateAudio ? 2 : 1 + const minCost = min10s * scale * audioMultiplier + const maxCost = max10s * scale * audioMultiplier if (minCost === maxCost) return formatCreditsLabel(minCost) return formatCreditsRangeLabel(minCost, maxCost) @@ -2623,9 +2638,24 @@ export const useNodePricing = () => { 'sequential_image_generation', 'max_images' ], - ByteDanceTextToVideoNode: ['model', 'duration', 'resolution'], - ByteDanceImageToVideoNode: ['model', 'duration', 'resolution'], - ByteDanceFirstLastFrameNode: ['model', 'duration', 'resolution'], + ByteDanceTextToVideoNode: [ + 'model', + 'duration', + 'resolution', + 'generate_audio' + ], + ByteDanceImageToVideoNode: [ + 'model', + 'duration', + 'resolution', + 'generate_audio' + ], + ByteDanceFirstLastFrameNode: [ + 'model', + 'duration', + 'resolution', + 'generate_audio' + ], ByteDanceImageReferenceNode: ['model', 'duration', 'resolution'], WanTextToVideoApi: ['duration', 'size'], WanImageToVideoApi: ['duration', 'resolution'],