File size: 1,148 Bytes
654165a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import type { OpenAICompletionsResponse } from '../../shared/api/completionsClient';
import type { ChatDisplaySegment } from './chatSegments';

type ApiTokenUsage = NonNullable<OpenAICompletionsResponse['usage']>;

/**
 * 累计各 output 段的 API usage。
 * - 无 output:null(不刷新指标)
 * - 任一段缺 usage 三字段:{}(展示层全 `-`)
 */
export function aggregateUsageFromSegments(
    segments: ChatDisplaySegment[]
): ApiTokenUsage | null {
    let prompt_tokens = 0;
    let completion_tokens = 0;
    let total_tokens = 0;
    let count = 0;

    for (const seg of segments) {
        if (seg.kind !== 'output') continue;
        const u = seg.response.usage;
        if (
            typeof u?.prompt_tokens !== 'number' ||
            typeof u?.completion_tokens !== 'number' ||
            typeof u?.total_tokens !== 'number'
        ) {
            return {};
        }
        prompt_tokens += u.prompt_tokens;
        completion_tokens += u.completion_tokens;
        total_tokens += u.total_tokens;
        count++;
    }

    return count > 0 ? { prompt_tokens, completion_tokens, total_tokens } : null;
}