Files
homelab/chat/lib/response-metadata.ts
T

27 lines
1.1 KiB
TypeScript

import type {ResponseMetadata} from "./conversation-types";
function normalizeTokenCount(value: unknown): number | null {
if (typeof value === "number" && Number.isFinite(value) && value >= 0) return Math.round(value);
if (typeof value === "bigint" && value >= 0n) return Number(value);
if (typeof value === "string") {
const parsed = Number(value);
if (Number.isFinite(parsed) && parsed >= 0) return Math.round(parsed);
}
return null;
}
export function responseMetadata(
providerId: string,
model: string,
startedAt: number,
outputTokens: number | undefined | null,
fallbackOutputTokens?: number | undefined | null
): ResponseMetadata {
const durationMs = Math.max(1, Math.round(performance.now() - startedAt));
const normalizedTokens = normalizeTokenCount(outputTokens) ?? normalizeTokenCount(fallbackOutputTokens);
const tokensPerSecond = normalizedTokens === null
? null
: Math.round((normalizedTokens / (durationMs / 1000)) * 10) / 10;
return {providerId, model, durationMs, outputTokens: normalizedTokens, tokensPerSecond};
}