|
|
@ -7,6 +7,7 @@ |
|
|
|
|
|
|
|
|
import type { |
|
|
import type { |
|
|
NanoBananaNodeData, |
|
|
NanoBananaNodeData, |
|
|
|
|
|
Resolution, |
|
|
SelectedModel, |
|
|
SelectedModel, |
|
|
} from "@/types"; |
|
|
} from "@/types"; |
|
|
import { calculateGenerationCost } from "@/utils/costCalculator"; |
|
|
import { calculateGenerationCost } from "@/utils/costCalculator"; |
|
|
@ -46,6 +47,12 @@ export interface NanoBananaOptions { |
|
|
useStoredFallback?: boolean; |
|
|
useStoredFallback?: boolean; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const GEMINI_RESOLUTIONS: Resolution[] = ["512", "1K", "2K", "4K"]; |
|
|
|
|
|
|
|
|
|
|
|
function normalizeGeminiResolution(value: string): Resolution { |
|
|
|
|
|
return GEMINI_RESOLUTIONS.includes(value as Resolution) ? (value as Resolution) : "2K"; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
function isProviderOverloadError(error: unknown): boolean { |
|
|
function isProviderOverloadError(error: unknown): boolean { |
|
|
const message = error instanceof Error ? error.message : String(error); |
|
|
const message = error instanceof Error ? error.message : String(error); |
|
|
return /provider is temporarily overloaded|system\s+disk\s+overloaded/i.test(message); |
|
|
return /provider is temporarily overloaded|system\s+disk\s+overloaded/i.test(message); |
|
|
@ -376,7 +383,7 @@ export async function executeNanoBanana( |
|
|
if (modelToUse.provider === "fal" && modelToUse.pricing) { |
|
|
if (modelToUse.provider === "fal" && modelToUse.pricing) { |
|
|
addIncurredCost(modelToUse.pricing.amount); |
|
|
addIncurredCost(modelToUse.pricing.amount); |
|
|
} else if (modelToUse.provider === "gemini") { |
|
|
} else if (modelToUse.provider === "gemini") { |
|
|
const generationCost = calculateGenerationCost(nodeData.model, nodeConfig.resolution); |
|
|
const generationCost = calculateGenerationCost(nodeData.model, normalizeGeminiResolution(nodeConfig.resolution)); |
|
|
addIncurredCost(generationCost); |
|
|
addIncurredCost(generationCost); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|