27 lines
1.1 KiB
TypeScript
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};
|
|
}
|