open-swe/packages/shared/src/caching.ts

66 lines
1.9 KiB
TypeScript
Raw Normal View History

import { CacheMetrics } from "./open-swe/types.js";
export function calculateCostSavings(metrics: CacheMetrics): {
totalSavings: number;
totalCost: number;
totalTokens: number;
totalInputTokens: number;
totalOutputTokens: number;
totalOutputTokensCost: number;
} {
const SONNET_4_BASE_RATE = 3.0 / 1_000_000; // $3 per MTok
const SONNET_4_OUTPUT_RATE = 15.0 / 1_000_000; // $15 per MTok
const CACHE_WRITE_MULTIPLIER = 1.25;
const CACHE_READ_MULTIPLIER = 0.1;
const cacheWriteCost =
metrics.cacheCreationInputTokens *
SONNET_4_BASE_RATE *
CACHE_WRITE_MULTIPLIER;
const cacheReadCost =
metrics.cacheReadInputTokens * SONNET_4_BASE_RATE * CACHE_READ_MULTIPLIER;
const regularInputCost = metrics.inputTokens * SONNET_4_BASE_RATE;
const totalOutputTokensCost = metrics.outputTokens * SONNET_4_OUTPUT_RATE;
// Cost without caching (all tokens at base rate)
const totalInputTokens =
metrics.cacheCreationInputTokens +
metrics.cacheReadInputTokens +
metrics.inputTokens;
const totalTokens = totalInputTokens + metrics.outputTokens;
const costWithoutCaching = totalInputTokens * SONNET_4_BASE_RATE;
// Actual cost with caching
const actualCost = cacheWriteCost + cacheReadCost + regularInputCost;
return {
totalSavings: costWithoutCaching - actualCost,
totalCost: actualCost,
totalTokens,
totalInputTokens,
totalOutputTokens: metrics.outputTokens,
totalOutputTokensCost,
};
}
export function tokenDataReducer(
state: CacheMetrics | undefined,
update: CacheMetrics,
): CacheMetrics {
if (!state) {
return update;
}
return {
cacheCreationInputTokens:
state.cacheCreationInputTokens + update.cacheCreationInputTokens,
cacheReadInputTokens:
state.cacheReadInputTokens + update.cacheReadInputTokens,
inputTokens: state.inputTokens + update.inputTokens,
outputTokens: state.outputTokens + update.outputTokens,
};
}