Skip to content

Commit a672f17

Browse files
committed
Add input/output multipliers
1 parent 1de5966 commit a672f17

2 files changed

Lines changed: 21 additions & 11 deletions

File tree

apps/sim/app/api/billing/update-cost/route.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ const UpdateCostSchema = z.object({
1616
input: z.number().min(0, 'Input tokens must be a non-negative number'),
1717
output: z.number().min(0, 'Output tokens must be a non-negative number'),
1818
model: z.string().min(1, 'Model is required'),
19-
multiplier: z.number().min(0),
19+
inputMultiplier: z.number().min(0),
20+
outputMultiplier: z.number().min(0),
2021
})
2122

2223
/**
@@ -75,14 +76,15 @@ export async function POST(req: NextRequest) {
7576
)
7677
}
7778

78-
const { userId, input, output, model, multiplier } = validation.data
79+
const { userId, input, output, model, inputMultiplier, outputMultiplier } = validation.data
7980

8081
logger.info(`[${requestId}] Processing cost update`, {
8182
userId,
8283
input,
8384
output,
8485
model,
85-
multiplier,
86+
inputMultiplier,
87+
outputMultiplier,
8688
})
8789

8890
const finalPromptTokens = input
@@ -95,7 +97,8 @@ export async function POST(req: NextRequest) {
9597
finalPromptTokens,
9698
finalCompletionTokens,
9799
false,
98-
multiplier
100+
inputMultiplier,
101+
outputMultiplier
99102
)
100103

101104
logger.info(`[${requestId}] Cost calculation result`, {
@@ -104,7 +107,8 @@ export async function POST(req: NextRequest) {
104107
promptTokens: finalPromptTokens,
105108
completionTokens: finalCompletionTokens,
106109
totalTokens: totalTokens,
107-
multiplier,
110+
inputMultiplier,
111+
outputMultiplier,
108112
costResult,
109113
})
110114

apps/sim/providers/utils.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,8 @@ export function calculateCost(
444444
promptTokens = 0,
445445
completionTokens = 0,
446446
useCachedInput = false,
447-
customMultiplier?: number
447+
inputMultiplier?: number,
448+
outputMultiplier?: number
448449
) {
449450
// First check if it's an embedding model
450451
let pricing = getEmbeddingModelPricing(model)
@@ -479,13 +480,18 @@ export function calculateCost(
479480
: pricing.input / 1_000_000)
480481

481482
const outputCost = completionTokens * (pricing.output / 1_000_000)
482-
const totalCost = inputCost + outputCost
483483

484-
const costMultiplier = customMultiplier ?? getCostMultiplier()
484+
logger.info('Input multiplier', { inputMultiplier })
485+
logger.info('Output multiplier', { outputMultiplier })
485486

486-
const finalInputCost = inputCost * costMultiplier
487-
const finalOutputCost = outputCost * costMultiplier
488-
const finalTotalCost = totalCost * costMultiplier
487+
const finalInputCost = inputCost * (inputMultiplier ?? 1)
488+
const finalOutputCost = outputCost * (outputMultiplier ?? 1)
489+
const finalTotalCost = finalInputCost + finalOutputCost
490+
491+
logger.info('Final input cost', { finalInputCost })
492+
logger.info('Final output cost', { finalOutputCost })
493+
logger.info('Final total cost', { finalTotalCost })
494+
489495

490496
return {
491497
input: Number.parseFloat(finalInputCost.toFixed(8)), // Use 8 decimal places for small costs

0 commit comments

Comments
 (0)