@juspay/neurolink
Version:
Universal AI Development Platform with working MCP integration, multi-provider support, voice (TTS/STT/realtime), and professional CLI. 58+ external MCP servers discoverable, multimodal file processing, RAG pipelines. Build, test, and deploy AI applicatio
110 lines (109 loc) • 3.49 kB
JavaScript
/**
* Analytics utility functions for TokenUsage and AnalyticsData
* Provides helper functions to avoid manual field access patterns
*/
/**
* Format token usage as a human-readable string
*/
export function formatTokenUsage(usage) {
let result = `${usage.input} input / ${usage.output} output`;
if (usage.cacheCreationTokens) {
result += ` / ${usage.cacheCreationTokens} cache-create`;
}
if (usage.cacheReadTokens) {
result += ` / ${usage.cacheReadTokens} cache-read`;
}
if (usage.reasoning) {
result += ` / ${usage.reasoning} reasoning`;
}
return result;
}
/**
* Calculate cost based on token usage and cost per token
*/
export function calculateTokenCost(usage, costPerToken) {
return usage.total * costPerToken;
}
/**
* Combine multiple token usage objects into a single total
*/
export function combineTokenUsage(usages) {
return usages.reduce((total, current) => ({
input: total.input + current.input,
output: total.output + current.output,
total: total.total + current.total,
cacheCreationTokens: (total.cacheCreationTokens || 0) + (current.cacheCreationTokens || 0),
cacheReadTokens: (total.cacheReadTokens || 0) + (current.cacheReadTokens || 0),
reasoning: (total.reasoning || 0) + (current.reasoning || 0),
}), {
input: 0,
output: 0,
total: 0,
cacheCreationTokens: 0,
cacheReadTokens: 0,
reasoning: 0,
});
}
/**
* Format analytics data for display
*/
export function formatAnalyticsForDisplay(analytics) {
const parts = [];
// Provider and model
parts.push(`Provider: ${analytics.provider}`);
if (analytics.model) {
parts.push(`Model: ${analytics.model}`);
}
// Token usage
parts.push(`Tokens: ${formatTokenUsage(analytics.tokenUsage)}`);
// Cost
if (analytics.cost !== undefined) {
parts.push(`Cost: $${analytics.cost.toFixed(5)}`);
}
// Duration
const timeInSeconds = (analytics.requestDuration / 1000).toFixed(1);
parts.push(`Time: ${timeInSeconds}s`);
return parts.join(" | ");
}
/**
* Check if analytics data contains valid token usage
*/
export function hasValidTokenUsage(analytics) {
return !!(analytics.tokenUsage &&
typeof analytics.tokenUsage.input === "number" &&
typeof analytics.tokenUsage.output === "number" &&
typeof analytics.tokenUsage.total === "number");
}
/**
* Extract summary metrics from analytics data
*/
export function getAnalyticsSummary(analytics) {
const totalTokens = analytics.tokenUsage.total;
let costPerToken = null;
if (analytics.cost !== null &&
analytics.cost !== undefined &&
Number.isFinite(analytics.cost) &&
totalTokens > 0) {
const computed = analytics.cost / (totalTokens / 1000);
costPerToken = Number.isFinite(computed) ? computed : null;
}
const requestsPerSecond = analytics.requestDuration > 0 ? 1000 / analytics.requestDuration : 0;
return {
totalTokens,
costPerToken,
requestsPerSecond,
};
}
/**
* Type guard for token usage
*/
export function isTokenUsage(value) {
return (typeof value === "object" &&
value !== null &&
"input" in value &&
"output" in value &&
"total" in value &&
typeof value.input === "number" &&
typeof value.output === "number" &&
typeof value.total === "number");
}