agent-Specialization/easyagent/src/utils/token_usage.js

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 };