mirror of
https://github.com/fawney19/Aether.git
synced 2026-10-07 01:47:47 +08:00
86 lines
3.2 KiB
TypeScript
86 lines
3.2 KiB
TypeScript
export interface UsagePerformanceTiming {
|
|||
|
|
output_tokens?: number | null
|
||
|
|
response_time_ms?: number | null
|
||
|
|
first_byte_time_ms?: number | null
|
||
|
|
is_stream?: boolean | null
|
||
|
|
upstream_is_stream?: boolean | null
|
||
|
|
}
|
||
|
|
|
||
|
|
export function getGenerationTimeMs(timing: UsagePerformanceTiming): number | null {
|
||
|
|
const responseTimeMs = timing.response_time_ms
|
||
|
|
const firstByteTimeMs = timing.first_byte_time_ms
|
||
|
|
|
||
|
|
if (responseTimeMs == null || firstByteTimeMs == null) return null
|
||
|
|
if (!Number.isFinite(responseTimeMs) || !Number.isFinite(firstByteTimeMs)) return null
|
||
|
|
if (responseTimeMs <= 0 || firstByteTimeMs < 0 || firstByteTimeMs >= responseTimeMs) return null
|
||
|
|
|
||
|
|
return responseTimeMs - firstByteTimeMs
|
||
|
|
}
|
||
|
|
|
||
|
|
export function isOutputRateUsingGenerationTime(timing: UsagePerformanceTiming): boolean {
|
||
|
|
return timing.upstream_is_stream ?? timing.is_stream ?? false
|
||
|
|
}
|
||
|
|
|
||
|
|
export function getOutputRateDurationMs(timing: UsagePerformanceTiming): number | null {
|
||
|
|
if (isOutputRateUsingGenerationTime(timing)) {
|
||
|
|
return getGenerationTimeMs(timing)
|
||
|
|
}
|
||
|
|
|
||
|
|
const responseTimeMs = timing.response_time_ms
|
||
|
|
if (responseTimeMs == null || !Number.isFinite(responseTimeMs) || responseTimeMs <= 0) return null
|
||
|
|
return responseTimeMs
|
||
|
|
}
|
||
|
|
|
||
|
|
export function calculateOutputRate(timing: UsagePerformanceTiming): number | null {
|
||
|
|
const outputTokens = timing.output_tokens ?? 0
|
||
|
|
const outputRateDurationMs = getOutputRateDurationMs(timing)
|
||
|
|
|
||
|
|
if (!Number.isFinite(outputTokens) || outputTokens <= 0 || outputRateDurationMs == null) return null
|
||
|
|
|
||
|
|
const outputRateSeconds = outputRateDurationMs / 1000
|
||
|
|
if (outputRateSeconds <= 0) return null
|
||
|
|
|
||
|
|
return outputTokens / outputRateSeconds
|
||
|
|
}
|
||
|
|
|
||
|
|
export function shouldHideOutputRate(
|
||
|
|
outputRate: number | null,
|
||
|
|
timing: UsagePerformanceTiming,
|
||
|
|
): boolean {
|
||
|
|
if (!isOutputRateUsingGenerationTime(timing)) return false
|
||
|
|
|
||
|
|
const responseTimeMs = timing.response_time_ms
|
||
|
|
const generationTimeMs = getGenerationTimeMs(timing)
|
||
|
|
|
||
|
|
if (outputRate == null || responseTimeMs == null || generationTimeMs == null) return false
|
||
|
|
if (!Number.isFinite(outputRate) || !Number.isFinite(responseTimeMs) || responseTimeMs <= 0) return true
|
||
|
|
|
||
|
|
return generationTimeMs / responseTimeMs < 0.1 && outputRate > 5000
|
||
|
|
}
|
||
|
|
|
||
|
|
export function getDisplayOutputRate(timing: UsagePerformanceTiming): number | null {
|
||
|
|
const outputRate = calculateOutputRate(timing)
|
||
|
|
if (shouldHideOutputRate(outputRate, timing)) return null
|
||
|
|
return outputRate
|
||
|
|
}
|
||
|
|
|
||
|
|
export function formatDurationMs(ms: number | null | undefined, fractionDigits = 2): string {
|
||
|
|
if (ms == null || !Number.isFinite(ms)) return '-'
|
||
|
|
if (ms >= 1000) return `${(ms / 1000).toFixed(fractionDigits)}s`
|
||
|
|
return `${Math.round(ms)}ms`
|
||
|
|
}
|
||
|
|
|
||
|
|
export function formatOutputRateValue(outputRate: number | null | undefined): string {
|
||
|
|
if (outputRate == null || !Number.isFinite(outputRate)) return '-'
|
||
|
|
if (outputRate >= 1000) return Math.round(outputRate).toLocaleString()
|
||
|
|
if (outputRate >= 100) return `${Math.round(outputRate)}`
|
||
|
|
if (outputRate >= 10) return outputRate.toFixed(1)
|
||
|
|
return outputRate.toFixed(2)
|
||
|
|
}
|
||
|
|
|
||
|
|
export function formatOutputRate(outputRate: number | null | undefined): string {
|
||
|
|
const value = formatOutputRateValue(outputRate)
|
||
|
|
if (value === '-') return value
|
||
|
|
return `${value} tps`
|
||
|
|
}
|