66 lines
1.8 KiB
TypeScript
66 lines
1.8 KiB
TypeScript
/**
|
|
* Utilitário de preços de tokens do Gemini e cálculo de custo por requisição
|
|
* Baseado em preços públicos aproximados para o modelo `gemini-2.5-flash`.
|
|
* Valores podem variar; mantenha sob revisão se houver mudança na tabela oficial.
|
|
*/
|
|
|
|
export interface UsageMetadata {
|
|
promptTokenCount?: number;
|
|
candidatesTokenCount?: number;
|
|
totalTokenCount?: number;
|
|
}
|
|
|
|
export interface TokenCostBreakdown {
|
|
inputTokens: number;
|
|
outputTokens: number;
|
|
totalTokens: number;
|
|
inputUsd: number;
|
|
outputUsd: number;
|
|
totalUsd: number;
|
|
}
|
|
|
|
type PricingTable = {
|
|
[model: string]: {
|
|
inputPerMillionTextImageVideo: number; // USD por 1M tokens de entrada (text/image/video)
|
|
outputPerMillion: number; // USD por 1M tokens de saída
|
|
};
|
|
};
|
|
|
|
// Tabela simplificada; ajuste se usar outros modelos no futuro
|
|
export const TOKEN_PRICING: PricingTable = {
|
|
"gemini-2.5-flash": {
|
|
inputPerMillionTextImageVideo: 0.15, // USD
|
|
outputPerMillion: 1.25, // USD
|
|
},
|
|
};
|
|
|
|
/**
|
|
* Calcula custo em USD baseado em usageMetadata retornado pela API Gemini.
|
|
*/
|
|
export function calculateTokenCost(
|
|
model: keyof typeof TOKEN_PRICING,
|
|
usage: UsageMetadata | null | undefined,
|
|
): TokenCostBreakdown {
|
|
const pricing = TOKEN_PRICING[model] ?? TOKEN_PRICING["gemini-2.5-flash"];
|
|
const inputTokens = Math.max(0, Number(usage?.promptTokenCount || 0));
|
|
const outputTokens = Math.max(0, Number(usage?.candidatesTokenCount || 0));
|
|
const totalTokens = Math.max(
|
|
0,
|
|
Number(usage?.totalTokenCount || inputTokens + outputTokens),
|
|
);
|
|
|
|
const inputUsd =
|
|
(inputTokens / 1_000_000) * pricing.inputPerMillionTextImageVideo;
|
|
const outputUsd = (outputTokens / 1_000_000) * pricing.outputPerMillion;
|
|
const totalUsd = inputUsd + outputUsd;
|
|
|
|
return {
|
|
inputTokens,
|
|
outputTokens,
|
|
totalTokens,
|
|
inputUsd,
|
|
outputUsd,
|
|
totalUsd,
|
|
};
|
|
}
|