Fix cache token accounting and tiered pricing

This commit is contained in:
elky
2026-07-10 15:13:12 +08:00
parent 736fc76345
commit 4bf5d4c044
19 changed files with 506 additions and 264 deletions
@@ -0,0 +1,23 @@
import { describe, expect, it } from 'vitest'
import {
cacheMultiplierFromPrice,
cachePriceFromInputMultiplier,
} from '../tiered-pricing-multipliers'
describe('cache input multipliers', () => {
it('converts an input multiplier to an actual cache price', () => {
expect(cachePriceFromInputMultiplier(4, 1.25)).toBe(5)
expect(cachePriceFromInputMultiplier(4, 0.1)).toBe(0.4)
expect(cachePriceFromInputMultiplier(4, 0)).toBe(0)
})
it('derives a multiplier from an existing cache price', () => {
expect(cacheMultiplierFromPrice(4, 5, 1.25)).toBe(1.25)
expect(cacheMultiplierFromPrice(4, 0.4, 0.1)).toBe(0.1)
})
it('uses the fallback when a multiplier cannot be derived', () => {
expect(cacheMultiplierFromPrice(0, 5, 1.25)).toBe(1.25)
expect(cacheMultiplierFromPrice(4, undefined, 0.1)).toBe(0.1)
})
})
@@ -0,0 +1,17 @@
export function roundTierPrice(value: number): number {
return Number.parseFloat(Math.max(0, value).toFixed(6))
}
export function cachePriceFromInputMultiplier(inputPrice: number, multiplier: number): number {
const normalizedMultiplier = Number.isFinite(multiplier) && multiplier >= 0 ? multiplier : 0
return roundTierPrice(inputPrice * normalizedMultiplier)
}
export function cacheMultiplierFromPrice(
inputPrice: number,
cachePrice: number | undefined,
fallback: number,
): number {
if (cachePrice == null || inputPrice <= 0) return fallback
return roundTierPrice(cachePrice / inputPrice)
}