mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-29 10:42:44 +00:00
add pricing for new ByteDance node (#5481)
This commit is contained in:
@@ -1511,6 +1511,32 @@ const apiNodeCosts: Record<string, { displayPrice: string | PricingFunction }> =
|
|||||||
return 'Token-based'
|
return 'Token-based'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
ByteDanceSeedreamNode: {
|
||||||
|
displayPrice: (node: LGraphNode): string => {
|
||||||
|
const sequentialGenerationWidget = node.widgets?.find(
|
||||||
|
(w) => w.name === 'sequential_image_generation'
|
||||||
|
) as IComboWidget
|
||||||
|
const maxImagesWidget = node.widgets?.find(
|
||||||
|
(w) => w.name === 'max_images'
|
||||||
|
) as IComboWidget
|
||||||
|
|
||||||
|
if (!sequentialGenerationWidget || !maxImagesWidget)
|
||||||
|
return '$0.03/Run ($0.03 for one output image)'
|
||||||
|
|
||||||
|
if (
|
||||||
|
String(sequentialGenerationWidget.value).toLowerCase() === 'disabled'
|
||||||
|
) {
|
||||||
|
return '$0.03/Run'
|
||||||
|
}
|
||||||
|
|
||||||
|
const maxImages = Number(maxImagesWidget.value)
|
||||||
|
if (maxImages === 1) {
|
||||||
|
return '$0.03/Run'
|
||||||
|
}
|
||||||
|
const cost = (0.03 * maxImages).toFixed(2)
|
||||||
|
return `$${cost}/Run ($0.03 for one output image)`
|
||||||
|
}
|
||||||
|
},
|
||||||
ByteDanceTextToVideoNode: {
|
ByteDanceTextToVideoNode: {
|
||||||
displayPrice: byteDanceVideoPricingCalculator
|
displayPrice: byteDanceVideoPricingCalculator
|
||||||
},
|
},
|
||||||
@@ -1613,6 +1639,11 @@ export const useNodePricing = () => {
|
|||||||
// ByteDance
|
// ByteDance
|
||||||
ByteDanceImageNode: ['model'],
|
ByteDanceImageNode: ['model'],
|
||||||
ByteDanceImageEditNode: ['model'],
|
ByteDanceImageEditNode: ['model'],
|
||||||
|
ByteDanceSeedreamNode: [
|
||||||
|
'model',
|
||||||
|
'sequential_image_generation',
|
||||||
|
'max_images'
|
||||||
|
],
|
||||||
ByteDanceTextToVideoNode: ['model', 'duration', 'resolution'],
|
ByteDanceTextToVideoNode: ['model', 'duration', 'resolution'],
|
||||||
ByteDanceImageToVideoNode: ['model', 'duration', 'resolution'],
|
ByteDanceImageToVideoNode: ['model', 'duration', 'resolution'],
|
||||||
ByteDanceFirstLastFrameNode: ['model', 'duration', 'resolution'],
|
ByteDanceFirstLastFrameNode: ['model', 'duration', 'resolution'],
|
||||||
|
|||||||
@@ -1781,6 +1781,38 @@ describe('useNodePricing', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('dynamic pricing - ByteDanceSeedreamNode', () => {
|
||||||
|
it('should return fallback when widgets are missing', () => {
|
||||||
|
const { getNodeDisplayPrice } = useNodePricing()
|
||||||
|
const node = createMockNode('ByteDanceSeedreamNode', [])
|
||||||
|
|
||||||
|
const price = getNodeDisplayPrice(node)
|
||||||
|
expect(price).toBe('$0.03/Run ($0.03 for one output image)')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should return $0.03/Run when sequential generation is disabled', () => {
|
||||||
|
const { getNodeDisplayPrice } = useNodePricing()
|
||||||
|
const node = createMockNode('ByteDanceSeedreamNode', [
|
||||||
|
{ name: 'sequential_image_generation', value: 'disabled' },
|
||||||
|
{ name: 'max_images', value: 5 }
|
||||||
|
])
|
||||||
|
|
||||||
|
const price = getNodeDisplayPrice(node)
|
||||||
|
expect(price).toBe('$0.03/Run')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should multiply by max_images when sequential generation is enabled', () => {
|
||||||
|
const { getNodeDisplayPrice } = useNodePricing()
|
||||||
|
const node = createMockNode('ByteDanceSeedreamNode', [
|
||||||
|
{ name: 'sequential_image_generation', value: 'enabled' },
|
||||||
|
{ name: 'max_images', value: 4 }
|
||||||
|
])
|
||||||
|
|
||||||
|
const price = getNodeDisplayPrice(node)
|
||||||
|
expect(price).toBe('$0.12/Run ($0.03 for one output image)')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
describe('dynamic pricing - ByteDance Seedance video nodes', () => {
|
describe('dynamic pricing - ByteDance Seedance video nodes', () => {
|
||||||
it('should return base 10s range for PRO 1080p on ByteDanceTextToVideoNode', () => {
|
it('should return base 10s range for PRO 1080p on ByteDanceTextToVideoNode', () => {
|
||||||
const { getNodeDisplayPrice } = useNodePricing()
|
const { getNodeDisplayPrice } = useNodePricing()
|
||||||
|
|||||||
Reference in New Issue
Block a user