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)
┆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'],