mirror of
https://github.com/Sea-Haven-Industries/open-swe.git
synced 2026-10-01 10:53:14 +00:00
66 lines
1.9 KiB
TypeScript
66 lines
1.9 KiB
TypeScript
|
|
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,
|
||
|
|
};
|
||
|
|
}
|