export type Workload = { requestsPerSecond: number meanInputTokens: number meanOutputTokens: number meanOccupiedSeconds: number burstMultiplier: number } function positive(name: string, value: number): number { if (!Number.isFinite(value) || value <= 0) throw new Error(name + " must be positive") return value } export function tokenDemandPerSecond(workload: Workload): number { positive("requestsPerSecond", workload.requestsPerSecond) positive("meanInputTokens", workload.meanInputTokens) positive("meanOutputTokens", workload.meanOutputTokens) positive("burstMultiplier", workload.burstMultiplier) return ( workload.requestsPerSecond * (workload.meanInputTokens + workload.meanOutputTokens) * workload.burstMultiplier ) } export function expectedConcurrency(workload: Workload): number { positive("requestsPerSecond", workload.requestsPerSecond) positive("meanOccupiedSeconds", workload.meanOccupiedSeconds) positive("burstMultiplier", workload.burstMultiplier) return workload.requestsPerSecond * workload.meanOccupiedSeconds * workload.burstMultiplier } export function estimatedHourlyCost( workload: Workload, inputUsdPerMillion: number, outputUsdPerMillion: number ): number { if (inputUsdPerMillion < 0 || outputUsdPerMillion < 0) { throw new Error("prices must be non-negative") } const requestsPerHour = workload.requestsPerSecond * 3600 * workload.burstMultiplier return ( (requestsPerHour * workload.meanInputTokens * inputUsdPerMillion) / 1_000_000 + (requestsPerHour * workload.meanOutputTokens * outputUsdPerMillion) / 1_000_000 ) }