fix(usage): streaming 状态在首字节到达前显示为 pending

新增 resolveDisplayRequestStatus 函数,当记录状态为 streaming 但
first_byte_time_ms 为空时回退显示为 pending,避免误导用户。
This commit is contained in:
fawney19
2026-04-15 17:50:45 +08:00
parent 77d413d777
commit c569081340
3 changed files with 38 additions and 11 deletions
@@ -5,6 +5,7 @@ import {
isUsageRecordSuccessful,
mapRequestStatusToTimelineStatus,
normalizeRequestStatus,
resolveDisplayRequestStatus,
resolveTimelineFinalStatus,
} from '../status'
import type { UsageRecord } from '../../types'
@@ -64,6 +65,18 @@ describe('usage status helpers', () => {
expect(mapRequestStatusToTimelineStatus('failed')).toBe('failed')
})
it('shows streaming as pending until first byte is recorded', () => {
expect(resolveDisplayRequestStatus(buildUsageRecord({
status: 'streaming',
first_byte_time_ms: undefined,
}))).toBe('pending')
expect(resolveDisplayRequestStatus(buildUsageRecord({
status: 'streaming',
first_byte_time_ms: 320,
}))).toBe('streaming')
})
it('treats explicit success status code as authoritative for the timeline', () => {
expect(resolveTimelineFinalStatus({
traceFinalStatus: 'success',
@@ -76,6 +76,16 @@ export function normalizeRequestStatus(status: RequestStatusLike): RequestStatus
}
}
export function resolveDisplayRequestStatus(
record: Pick<UsageRecord, 'status' | 'first_byte_time_ms'>
): RequestStatus | undefined {
const status = normalizeRequestStatus(record.status)
if (status === 'streaming' && record.first_byte_time_ms == null) {
return 'pending'
}
return status
}
export function mapRequestStatusToTimelineStatus(
status: RequestStatusLike
): TimelineFinalStatus | undefined {