diff --git a/apps/sim/app/api/billing/update-cost/route.ts b/apps/sim/app/api/billing/update-cost/route.ts index 27681bd128..0eab65f85b 100644 --- a/apps/sim/app/api/billing/update-cost/route.ts +++ b/apps/sim/app/api/billing/update-cost/route.ts @@ -16,7 +16,8 @@ const UpdateCostSchema = z.object({ input: z.number().min(0, 'Input tokens must be a non-negative number'), output: z.number().min(0, 'Output tokens must be a non-negative number'), model: z.string().min(1, 'Model is required'), - multiplier: z.number().min(0), + inputMultiplier: z.number().min(0), + outputMultiplier: z.number().min(0), }) /** @@ -75,14 +76,15 @@ export async function POST(req: NextRequest) { ) } - const { userId, input, output, model, multiplier } = validation.data + const { userId, input, output, model, inputMultiplier, outputMultiplier } = validation.data logger.info(`[${requestId}] Processing cost update`, { userId, input, output, model, - multiplier, + inputMultiplier, + outputMultiplier, }) const finalPromptTokens = input @@ -95,7 +97,8 @@ export async function POST(req: NextRequest) { finalPromptTokens, finalCompletionTokens, false, - multiplier + inputMultiplier, + outputMultiplier ) logger.info(`[${requestId}] Cost calculation result`, { @@ -104,7 +107,8 @@ export async function POST(req: NextRequest) { promptTokens: finalPromptTokens, completionTokens: finalCompletionTokens, totalTokens: totalTokens, - multiplier, + inputMultiplier, + outputMultiplier, costResult, }) diff --git a/apps/sim/providers/utils.ts b/apps/sim/providers/utils.ts index 5a71dd4cc6..c9e8dba601 100644 --- a/apps/sim/providers/utils.ts +++ b/apps/sim/providers/utils.ts @@ -444,7 +444,8 @@ export function calculateCost( promptTokens = 0, completionTokens = 0, useCachedInput = false, - customMultiplier?: number + inputMultiplier?: number, + outputMultiplier?: number ) { // First check if it's an embedding model let pricing = getEmbeddingModelPricing(model) @@ -479,13 +480,18 @@ export function calculateCost( : pricing.input / 1_000_000) const outputCost = completionTokens * (pricing.output / 1_000_000) - const totalCost = inputCost + outputCost - const costMultiplier = customMultiplier ?? getCostMultiplier() + logger.info('Input multiplier', { inputMultiplier }) + logger.info('Output multiplier', { outputMultiplier }) - const finalInputCost = inputCost * costMultiplier - const finalOutputCost = outputCost * costMultiplier - const finalTotalCost = totalCost * costMultiplier + const finalInputCost = inputCost * (inputMultiplier ?? 1) + const finalOutputCost = outputCost * (outputMultiplier ?? 1) + const finalTotalCost = finalInputCost + finalOutputCost + + logger.info('Final input cost', { finalInputCost }) + logger.info('Final output cost', { finalOutputCost }) + logger.info('Final total cost', { finalTotalCost }) + return { input: Number.parseFloat(finalInputCost.toFixed(8)), // Use 8 decimal places for small costs