/** * Cost tracking. * * MiniMax doesn't expose an OpenRouter-style `/generation` endpoint for * authoritative cost lookup, so we compute cost locally from token * counts using the user-configured price per 1M tokens. Pricing is * intentionally user-overridable so the same package works as MiniMax * revises their rates. */ import type { CostSummary, Usage } from "./types.js"; export function computeCost( usage: Usage, priceInputPer1M: number, priceOutputPer1M: number, ): CostSummary { const inputUsd = (usage.inputTokens / 1_000_000) * priceInputPer1M; const outputUsd = (usage.outputTokens / 1_000_000) * priceOutputPer1M; return { inputUsd, outputUsd, totalUsd: round4(inputUsd + outputUsd), }; } export function aggregateUsage(usages: Usage[]): Usage { const out: Usage = { inputTokens: 0, outputTokens: 0 }; for (const u of usages) { out.inputTokens += u.inputTokens; out.outputTokens += u.outputTokens; if (u.cachedInputTokens) out.cachedInputTokens = (out.cachedInputTokens ?? 0) + u.cachedInputTokens; } out.totalTokens = out.inputTokens + out.outputTokens; return out; } export function aggregateCost(summaries: CostSummary[]): CostSummary { return summaries.reduce( (acc, s) => ({ inputUsd: acc.inputUsd + s.inputUsd, outputUsd: acc.outputUsd + s.outputUsd, totalUsd: round4(acc.totalUsd + s.totalUsd), }), { inputUsd: 0, outputUsd: 0, totalUsd: 0 }, ); } function round4(n: number): number { return Math.round(n * 10_000) / 10_000; }