40 lines
1.5 KiB
JavaScript
40 lines
1.5 KiB
JavaScript
'use strict';
|
|
|
|
function normalizeTokenUsage(value) {
|
|
if (value && typeof value === 'object') {
|
|
return {
|
|
prompt: Number(value.prompt) || 0,
|
|
completion: Number(value.completion) || 0,
|
|
total: Number(value.total) || 0,
|
|
};
|
|
}
|
|
const num = Number(value);
|
|
return {
|
|
prompt: 0,
|
|
completion: 0,
|
|
total: Number.isFinite(num) ? num : 0,
|
|
};
|
|
}
|
|
|
|
function applyUsage(base, usage) {
|
|
const normalized = normalizeTokenUsage(base);
|
|
if (!usage) return normalized;
|
|
if (Number.isFinite(usage.prompt_tokens)) normalized.prompt += usage.prompt_tokens;
|
|
if (Number.isFinite(usage.completion_tokens)) normalized.completion += usage.completion_tokens;
|
|
if (Number.isFinite(usage.total_tokens)) normalized.total = usage.total_tokens;
|
|
return normalized;
|
|
}
|
|
|
|
function normalizeUsagePayload(usage) {
|
|
if (!usage || typeof usage !== 'object') return null;
|
|
const toNum = (value) => (Number.isFinite(Number(value)) ? Number(value) : 0);
|
|
const prompt = toNum(usage.prompt_tokens ?? usage.input_tokens ?? usage.prompt ?? usage.input);
|
|
const completion = toNum(usage.completion_tokens ?? usage.output_tokens ?? usage.completion ?? usage.output);
|
|
let total = toNum(usage.total_tokens ?? usage.total);
|
|
if (!total && (prompt || completion)) total = prompt + completion;
|
|
if (!prompt && !completion && !total) return null;
|
|
return { prompt_tokens: prompt, completion_tokens: completion, total_tokens: total };
|
|
}
|
|
|
|
module.exports = { normalizeTokenUsage, applyUsage, normalizeUsagePayload };
|