agent-ecosystem/src/shared/utils/tokenFormatting.ts

91 lines
2.3 KiB
TypeScript

/**
* Shared token formatting utilities.
*
* This module consolidates all token-related formatting functions across the codebase.
* Use these functions instead of implementing token formatting inline.
*/
/**
* Formats token count for compact display.
* Shows full number under 1k, uses 'k' suffix for thousands, 'M' suffix for millions.
*
* Examples:
* - 500 -> "500"
* - 1500 -> "1.5k"
* - 50000 -> "50.0k"
* - 1500000 -> "1.5M"
*/
export function formatTokensCompact(tokens: number): string {
if (tokens >= 1000000) {
return `${(tokens / 1000000).toFixed(1)}M`;
}
if (tokens >= 1000) {
return `${(tokens / 1000).toFixed(1)}k`;
}
return tokens.toString();
}
/**
* Formats token count with smart precision.
* Uses one decimal for 1k-10k range, whole numbers above 10k.
*
* Examples:
* - 500 -> "500"
* - 1500 -> "1.5k"
* - 15000 -> "15k"
*/
export function formatTokens(tokens: number): string {
if (tokens < 1000) {
return `${tokens}`;
}
if (tokens < 10000) {
return `${(tokens / 1000).toFixed(1)}k`;
}
return `${Math.round(tokens / 1000)}k`;
}
/**
* Formats token count with locale-aware separators.
* Used for detailed views where exact numbers matter.
*
* Examples:
* - 1500 -> "1,500" (in en-US locale)
* - 1000000 -> "1,000,000"
*/
export function formatTokensDetailed(tokens: number): string {
return tokens.toLocaleString();
}
/**
* Estimates token count from text content.
* Uses the rough heuristic of ~4 characters per token, which is a
* reasonable average for English text and code.
*
* This is faster than using a real tokenizer and accurate enough
* for display purposes.
*/
export function estimateTokens(text: string | undefined | null): number {
if (!text || text.length === 0) {
return 0;
}
return Math.ceil(text.length / 4);
}
/**
* Estimates tokens for content that may be a string, array, or object.
* Arrays and objects are stringified before counting.
*/
export function estimateContentTokens(
content: string | unknown[] | Record<string, unknown> | undefined | null
): number {
if (!content) {
return 0;
}
if (typeof content === 'string') {
return estimateTokens(content);
}
// For array/object content, stringify and count
return estimateTokens(JSON.stringify(content));
}