Files
cc-switch/tests/components/usageFormat.test.ts
T
Juexe dc0febe503 feat(usage): display output tokens per second in request log table and detail panel (#3369)
Show tokens/s next to the output token count in the request log table and the request detail panel.

The generation window prefers an explicit duration when present, otherwise latency minus first-token time for streaming requests, and falls back to full latency for non-streaming requests. Rows without a positive token count or window show nothing.

Closes #5936
2026-09-13 18:05:36 +08:00

81 lines
2.0 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
formatOutputTokensPerSecond,
formatTokensShort,
getOutputTokensPerSecond,
getLocaleFromLanguage,
} from "@/components/usage/format";
describe("usage format helpers", () => {
it("formats Traditional Chinese token units with Traditional characters", () => {
expect(formatTokensShort(12_345, "zh-TW")).toBe("1.2 萬");
expect(formatTokensShort(123_456_789, "zh-Hant", 2)).toBe("1.23 億");
});
it("resolves Traditional Chinese locale aliases", () => {
expect(getLocaleFromLanguage("zh_TW")).toBe("zh-TW");
expect(getLocaleFromLanguage("zh-HK")).toBe("zh-TW");
});
it("calculates streaming TPS from generation duration after first token", () => {
expect(
getOutputTokensPerSecond({
outputTokens: 120,
latencyMs: 10_000,
firstTokenMs: 4_000,
}),
).toBe(20);
});
it("prefers explicit durationMs for output TPS", () => {
expect(
getOutputTokensPerSecond({
outputTokens: 120,
latencyMs: 10_000,
firstTokenMs: 4_000,
durationMs: 3_000,
}),
).toBe(40);
});
it("falls back to full latency when first token timing is missing", () => {
expect(
getOutputTokensPerSecond({
outputTokens: 120,
latencyMs: 10_000,
}),
).toBe(12);
});
it("does not show TPS without positive tokens or duration", () => {
expect(
formatOutputTokensPerSecond({
outputTokens: 0,
latencyMs: 10_000,
}),
).toBeNull();
expect(
formatOutputTokensPerSecond({
outputTokens: 120,
latencyMs: 4_000,
firstTokenMs: 4_000,
}),
).toBeNull();
});
it("formats TPS with integer or single-decimal precision", () => {
expect(
formatOutputTokensPerSecond({
outputTokens: 121,
latencyMs: 10_000,
}),
).toBe("12");
expect(
formatOutputTokensPerSecond({
outputTokens: 1,
latencyMs: 4_000,
}),
).toBe("0.3");
});
});