Browse Source

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 <noreply@anthropic.com>
handoff-20260429-1057
shrimbly 5 months ago
parent
commit
880a547bf4
  1. 22
      src/utils/costCalculator.ts

22
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;

Loading…
Cancel
Save