| |
| |
| |
| import { aggregateUsageFromSegments } from '../../features/chat/chatCompletionUsage'; |
| import type { ChatDisplaySegment } from '../../features/chat/chatSegments'; |
| import type { OpenAICompletionsResponse } from '../../shared/api/completionsClient'; |
|
|
| let passed = 0; |
| let failed = 0; |
|
|
| function assert(desc: string, cond: boolean) { |
| if (cond) { |
| console.log(` ✓ ${desc}`); |
| passed++; |
| } else { |
| console.error(` ✗ ${desc}`); |
| failed++; |
| } |
| } |
|
|
| function out(usage: OpenAICompletionsResponse['usage']): ChatDisplaySegment { |
| return { |
| kind: 'output', |
| text: 'x', |
| promptUsed: 'p', |
| modelName: 'm', |
| response: { choices: [{ text: 'x', index: 0 }], usage } as OpenAICompletionsResponse, |
| }; |
| } |
|
|
| const ok = { prompt_tokens: 10, completion_tokens: 5, total_tokens: 15 }; |
|
|
| assert('无 output → null', aggregateUsageFromSegments([]) === null); |
| assert('完整 → 累计', aggregateUsageFromSegments([out(ok)])?.total_tokens === 15); |
| assert( |
| '多轮完整', |
| aggregateUsageFromSegments([ |
| out({ prompt_tokens: 100, completion_tokens: 20, total_tokens: 120 }), |
| out({ prompt_tokens: 200, completion_tokens: 30, total_tokens: 230 }), |
| ])?.total_tokens === 350 |
| ); |
| assert( |
| '缺字段 → {}', |
| Object.keys(aggregateUsageFromSegments([out(ok), out({ prompt_tokens: 1 })]) ?? { x: 1 }).length === |
| 0 |
| ); |
|
|
| console.log(`\n${passed} passed, ${failed} failed`); |
| process.exit(failed > 0 ? 1 : 0); |
|
|