Skip to content

Commit f23a94b

Browse files
[fix] update API node pricing for multiple providers
- Add Kontext Image Pro/Max pricing display (/bin/bash.04//bin/bash.08) - Fix Rodin node pricing to /bin/bash.4/run for all variants - Update Ideogram V1/V2 with turbo pricing support - Fix PikaScene pricing display issues - Update Luma Image node pricing (photon models) - Update Gemini pricing to match Google Cloud docs - Fix IdeogramV3 quality pricing (/bin/bash.09 for quality mode) - Update tests to match new pricing logic
1 parent 7fe4c07 commit f23a94b

File tree

2 files changed

+121
-87
lines changed

2 files changed

+121
-87
lines changed

src/composables/node/useNodePricing.ts

Lines changed: 42 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -110,15 +110,27 @@ const apiNodeCosts: Record<string, { displayPrice: string | PricingFunction }> =
110110
FluxProUltraImageNode: {
111111
displayPrice: '$0.06/Run'
112112
},
113+
FluxProKontextProNode: {
114+
displayPrice: '$0.04/Run'
115+
},
116+
FluxProKontextMaxNode: {
117+
displayPrice: '$0.08/Run'
118+
},
113119
IdeogramV1: {
114120
displayPrice: (node: LGraphNode): string => {
115121
const numImagesWidget = node.widgets?.find(
116122
(w) => w.name === 'num_images'
117123
) as IComboWidget
118-
if (!numImagesWidget) return '$0.06 x num_images/Run'
124+
const turboWidget = node.widgets?.find(
125+
(w) => w.name === 'turbo'
126+
) as IComboWidget
127+
128+
if (!numImagesWidget) return '$0.02-0.06 x num_images/Run'
119129

120130
const numImages = Number(numImagesWidget.value) || 1
121-
const cost = (0.06 * numImages).toFixed(2)
131+
const turbo = String(turboWidget?.value).toLowerCase() === 'true'
132+
const basePrice = turbo ? 0.02 : 0.06
133+
const cost = (basePrice * numImages).toFixed(2)
122134
return `$${cost}/Run`
123135
}
124136
},
@@ -127,10 +139,16 @@ const apiNodeCosts: Record<string, { displayPrice: string | PricingFunction }> =
127139
const numImagesWidget = node.widgets?.find(
128140
(w) => w.name === 'num_images'
129141
) as IComboWidget
130-
if (!numImagesWidget) return '$0.08 x num_images/Run'
142+
const turboWidget = node.widgets?.find(
143+
(w) => w.name === 'turbo'
144+
) as IComboWidget
145+
146+
if (!numImagesWidget) return '$0.05-0.08 x num_images/Run'
131147

132148
const numImages = Number(numImagesWidget.value) || 1
133-
const cost = (0.08 * numImages).toFixed(2)
149+
const turbo = String(turboWidget?.value).toLowerCase() === 'true'
150+
const basePrice = turbo ? 0.05 : 0.08
151+
const cost = (basePrice * numImages).toFixed(2)
134152
return `$${cost}/Run`
135153
}
136154
},
@@ -651,10 +669,10 @@ const apiNodeCosts: Record<string, { displayPrice: string | PricingFunction }> =
651669

652670
if (duration.includes('5')) {
653671
if (resolution.includes('720p')) return '$0.3/Run'
654-
if (resolution.includes('1080p')) return '~$0.3/Run'
672+
if (resolution.includes('1080p')) return '$0.5/Run'
655673
} else if (duration.includes('10')) {
656-
if (resolution.includes('720p')) return '$0.25/Run'
657-
if (resolution.includes('1080p')) return '$1.0/Run'
674+
if (resolution.includes('720p')) return '$0.4/Run'
675+
if (resolution.includes('1080p')) return '$1.5/Run'
658676
}
659677

660678
return '$0.3/Run'
@@ -678,9 +696,9 @@ const apiNodeCosts: Record<string, { displayPrice: string | PricingFunction }> =
678696

679697
if (duration.includes('5')) {
680698
if (resolution.includes('720p')) return '$0.2/Run'
681-
if (resolution.includes('1080p')) return '~$0.45/Run'
699+
if (resolution.includes('1080p')) return '$0.3/Run'
682700
} else if (duration.includes('10')) {
683-
if (resolution.includes('720p')) return '$0.6/Run'
701+
if (resolution.includes('720p')) return '$0.25/Run'
684702
if (resolution.includes('1080p')) return '$1.0/Run'
685703
}
686704

@@ -896,18 +914,11 @@ const apiNodeCosts: Record<string, { displayPrice: string | PricingFunction }> =
896914
}
897915

898916
const model = String(modelWidget.value)
899-
const aspectRatio = String(aspectRatioWidget.value)
900917

901918
if (model.includes('photon-flash-1')) {
902-
if (aspectRatio.includes('1:1')) return '$0.0045/Run'
903-
if (aspectRatio.includes('16:9')) return '$0.0045/Run'
904-
if (aspectRatio.includes('4:3')) return '$0.0046/Run'
905-
if (aspectRatio.includes('21:9')) return '$0.0047/Run'
919+
return '$0.0019/Run'
906920
} else if (model.includes('photon-1')) {
907-
if (aspectRatio.includes('1:1')) return '$0.0172/Run'
908-
if (aspectRatio.includes('16:9')) return '$0.0172/Run'
909-
if (aspectRatio.includes('4:3')) return '$0.0176/Run'
910-
if (aspectRatio.includes('21:9')) return '$0.0182/Run'
921+
return '$0.0073/Run'
911922
}
912923

913924
return '$0.0172/Run'
@@ -918,31 +929,17 @@ const apiNodeCosts: Record<string, { displayPrice: string | PricingFunction }> =
918929
const modelWidget = node.widgets?.find(
919930
(w) => w.name === 'model'
920931
) as IComboWidget
921-
const aspectRatioWidget = node.widgets?.find(
922-
(w) => w.name === 'aspect_ratio'
923-
) as IComboWidget
924932

925933
if (!modelWidget) {
926-
return '$0.0045-0.0182/Run (varies with model & aspect ratio)'
934+
return '$0.0019-0.0073/Run (varies with model)'
927935
}
928936

929937
const model = String(modelWidget.value)
930-
const aspectRatio = aspectRatioWidget
931-
? String(aspectRatioWidget.value)
932-
: null
933938

934939
if (model.includes('photon-flash-1')) {
935-
if (!aspectRatio) return '$0.0045/Run'
936-
if (aspectRatio.includes('1:1')) return '~$0.0045/Run'
937-
if (aspectRatio.includes('16:9')) return '~$0.0045/Run'
938-
if (aspectRatio.includes('4:3')) return '~$0.0046/Run'
939-
if (aspectRatio.includes('21:9')) return '~$0.0047/Run'
940+
return '$0.0019/Run'
940941
} else if (model.includes('photon-1')) {
941-
if (!aspectRatio) return '$0.0172/Run'
942-
if (aspectRatio.includes('1:1')) return '~$0.0172/Run'
943-
if (aspectRatio.includes('16:9')) return '~$0.0172/Run'
944-
if (aspectRatio.includes('4:3')) return '~$0.0176/Run'
945-
if (aspectRatio.includes('21:9')) return '~$0.0182/Run'
942+
return '$0.0073/Run'
946943
}
947944

948945
return '$0.0172/Run'
@@ -1053,10 +1050,10 @@ const apiNodeCosts: Record<string, { displayPrice: string | PricingFunction }> =
10531050
displayPrice: '$0.4/Run'
10541051
},
10551052
Rodin3D_Detail: {
1056-
displayPrice: '$1.2/Run'
1053+
displayPrice: '$0.4/Run'
10571054
},
10581055
Rodin3D_Smooth: {
1059-
displayPrice: '$1.2/Run'
1056+
displayPrice: '$0.4/Run'
10601057
},
10611058
Rodin3D_Sketch: {
10621059
displayPrice: '$0.4/Run'
@@ -1151,9 +1148,9 @@ const apiNodeCosts: Record<string, { displayPrice: string | PricingFunction }> =
11511148
if (model.includes('veo-2.0')) {
11521149
return '$0.5/second'
11531150
} else if (model.includes('gemini-2.5-pro-preview-05-06')) {
1154-
return '$0.0035/$0.0008 per 1K tokens'
1151+
return '$0.00016/$0.0006 per 1K tokens'
11551152
} else if (model.includes('gemini-2.5-flash-preview-04-17')) {
1156-
return '$0.0015/$0.0004 per 1K tokens'
1153+
return '$0.00125/$0.01 per 1K tokens'
11571154
}
11581155
// For other Gemini models, show token-based pricing info
11591156
return 'Token-based'
@@ -1233,9 +1230,11 @@ export const useNodePricing = () => {
12331230
OpenAIDalle3: ['size', 'quality'],
12341231
OpenAIDalle2: ['size', 'n'],
12351232
OpenAIGPTImage1: ['quality', 'n'],
1236-
IdeogramV1: ['num_images'],
1237-
IdeogramV2: ['num_images'],
1233+
IdeogramV1: ['num_images', 'turbo'],
1234+
IdeogramV2: ['num_images', 'turbo'],
12381235
IdeogramV3: ['rendering_speed', 'num_images'],
1236+
FluxProKontextProNode: [],
1237+
FluxProKontextMaxNode: [],
12391238
VeoVideoGenerationNode: ['duration_seconds'],
12401239
LumaVideoNode: ['model', 'resolution', 'duration'],
12411240
LumaImageToVideoNode: ['model', 'resolution', 'duration'],
@@ -1269,8 +1268,8 @@ export const useNodePricing = () => {
12691268
RunwayImageToVideoNodeGen4: ['duration'],
12701269
RunwayFirstLastFrameNode: ['duration'],
12711270
// Tripo nodes
1272-
TripoTextToModelNode: ['model', 'model_version', 'texture_quality'],
1273-
TripoImageToModelNode: ['model', 'model_version', 'texture_quality'],
1271+
TripoTextToModelNode: ['quad', 'style', 'texture', 'texture_quality'],
1272+
TripoImageToModelNode: ['quad', 'style', 'texture', 'texture_quality'],
12741273
TripoTextureNode: ['texture_quality'],
12751274
// Google/Gemini nodes
12761275
GeminiNode: ['model'],

0 commit comments

Comments
 (0)