From 880a547bf477222e892cae911e5970cbdb1cba04 Mon Sep 17 00:00:00 2001 From: shrimbly Date: Fri, 27 Feb 2026 06:38:24 +1300 Subject: [PATCH] feat: add nano-banana-2 pricing to cost calculator Add per-resolution pricing for nano-banana-2 (512/1K/2K/4K). Add 512px tier to all model pricing tables. Use MODEL_DISPLAY_NAMES lookup instead of ternaries. Add getPricing fallback for nano-banana-2 / gemini-3.1-flash-image-preview. Co-Authored-By: Claude Opus 4.6 --- src/utils/costCalculator.ts | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/utils/costCalculator.ts b/src/utils/costCalculator.ts index 03170021..fd39f19c 100644 --- a/src/utils/costCalculator.ts +++ b/src/utils/costCalculator.ts @@ -1,25 +1,33 @@ -import { ModelType, Resolution, NanoBananaNodeData, GenerateVideoNodeData, Generate3DNodeData, SplitGridNodeData, WorkflowNode, ProviderType } from "@/types"; +import { ModelType, Resolution, MODEL_DISPLAY_NAMES, NanoBananaNodeData, GenerateVideoNodeData, Generate3DNodeData, SplitGridNodeData, WorkflowNode, ProviderType } from "@/types"; // Pricing in USD per image (Gemini API) export const PRICING = { "nano-banana": { + "512": 0.039, "1K": 0.039, "2K": 0.039, // nano-banana only supports 1K "4K": 0.039, }, "nano-banana-pro": { + "512": 0.134, "1K": 0.134, "2K": 0.134, "4K": 0.24, }, + "nano-banana-2": { + "512": 0.045, + "1K": 0.067, + "2K": 0.101, + "4K": 0.151, + }, } as const; export function calculateGenerationCost(model: ModelType, resolution: Resolution): number { - // nano-banana only supports 1K resolution + // nano-banana only supports 1K resolution (flat pricing) if (model === "nano-banana") { return PRICING["nano-banana"]["1K"]; } - return PRICING["nano-banana-pro"][resolution]; + return PRICING[model][resolution]; } /** @@ -153,6 +161,10 @@ export function calculatePredictedCost( const res = resolution || "1K"; return { unitCost: PRICING["nano-banana-pro"][res], unit: "image" }; } + if (modelId === "nano-banana-2" || modelId === "gemini-3.1-flash-image-preview") { + const res = resolution || "1K"; + return { unitCost: PRICING["nano-banana-2"][res], unit: "image" }; + } } // No pricing available (e.g., Replicate) @@ -178,7 +190,7 @@ export function calculatePredictedCost( // Legacy Gemini-only model provider = "gemini"; modelId = data.model; - modelName = data.model === "nano-banana" ? "Nano Banana" : "Nano Banana Pro"; + modelName = MODEL_DISPLAY_NAMES[data.model] || data.model; } const resolution = data.model === "nano-banana" ? "1K" : data.resolution; @@ -215,7 +227,7 @@ export function calculatePredictedCost( if (data.isConfigured && data.targetCount > 0) { const model = data.generateSettings.model; const resolution = model === "nano-banana" ? "1K" : data.generateSettings.resolution; - const modelName = model === "nano-banana" ? "Nano Banana" : "Nano Banana Pro"; + const modelName = MODEL_DISPLAY_NAMES[model] || model; const pricing = getPricing("gemini", model, resolution); const unitCost = pricing?.unitCost ?? null;