33 lines
787 B
TypeScript
33 lines
787 B
TypeScript
export type Usage = {
|
|
inputTokens: number;
|
|
outputTokens: number;
|
|
totalTokens: number;
|
|
estimated: boolean;
|
|
};
|
|
|
|
export const estimateTokens = (text: string) => {
|
|
if (!text.trim()) {
|
|
return 0;
|
|
}
|
|
|
|
const ascii = text.match(/[\x00-\x7F]/g)?.length ?? 0;
|
|
const nonAscii = text.length - ascii;
|
|
return Math.max(1, Math.ceil(ascii / 4 + nonAscii / 1.7));
|
|
};
|
|
|
|
export const normalizeUsage = (
|
|
prompt: string,
|
|
output: string,
|
|
usage?: Partial<Usage> | null
|
|
): Usage => {
|
|
const inputTokens = usage?.inputTokens ?? estimateTokens(prompt);
|
|
const outputTokens = usage?.outputTokens ?? estimateTokens(output);
|
|
|
|
return {
|
|
inputTokens,
|
|
outputTokens,
|
|
totalTokens: usage?.totalTokens ?? inputTokens + outputTokens,
|
|
estimated: usage?.estimated ?? !usage
|
|
};
|
|
};
|