50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
|
|
export const TOKENS_PER_MILLION = 1_000_000
|
||
|
|
|
||
|
|
interface TokenPriceFormatOptions {
|
||
|
|
fractionDigits?: number
|
||
|
|
withCurrencySymbol?: boolean
|
||
|
|
emptyValue?: string
|
||
|
|
}
|
||
|
|
|
||
|
|
function isFiniteNumber(value: unknown): value is number {
|
||
|
|
return typeof value === 'number' && Number.isFinite(value)
|
||
|
|
}
|
||
|
|
|
||
|
|
export function calculateTokenUnitPrice(
|
||
|
|
cost: number | null | undefined,
|
||
|
|
tokens: number | null | undefined
|
||
|
|
): number | null {
|
||
|
|
if (!isFiniteNumber(cost) || !isFiniteNumber(tokens) || tokens <= 0) {
|
||
|
|
return null
|
||
|
|
}
|
||
|
|
|
||
|
|
return cost / tokens
|
||
|
|
}
|
||
|
|
|
||
|
|
export function calculateTokenPricePerMillion(
|
||
|
|
cost: number | null | undefined,
|
||
|
|
tokens: number | null | undefined
|
||
|
|
): number | null {
|
||
|
|
const unitPrice = calculateTokenUnitPrice(cost, tokens)
|
||
|
|
if (unitPrice == null) {
|
||
|
|
return null
|
||
|
|
}
|
||
|
|
|
||
|
|
return unitPrice * TOKENS_PER_MILLION
|
||
|
|
}
|
||
|
|
|
||
|
|
export function formatTokenPricePerMillion(
|
||
|
|
cost: number | null | undefined,
|
||
|
|
tokens: number | null | undefined,
|
||
|
|
options: TokenPriceFormatOptions = {}
|
||
|
|
): string {
|
||
|
|
const pricePerMillion = calculateTokenPricePerMillion(cost, tokens)
|
||
|
|
if (pricePerMillion == null) {
|
||
|
|
return options.emptyValue ?? '-'
|
||
|
|
}
|
||
|
|
|
||
|
|
const fractionDigits = options.fractionDigits ?? 4
|
||
|
|
const formatted = pricePerMillion.toFixed(fractionDigits)
|
||
|
|
return options.withCurrencySymbol == false ? formatted : `$${formatted}`
|
||
|
|
}
|