UNPKG

@lobehub/chat

Version:

Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.

100 lines (84 loc) 2.46 kB
import Anthropic from '@anthropic-ai/sdk'; import { describe, expect, it } from 'vitest'; import { convertAnthropicUsage } from './anthropic'; describe('convertAnthropicUsage', () => { it('should convert message_start usage with cache information', () => { const event = { type: 'message_start', message: { id: 'msg_1', usage: { cache_creation_input_tokens: 20, cache_read_input_tokens: 10, input_tokens: 100, output_tokens: 5, }, }, } as unknown as Anthropic.MessageStreamEvent; const usage = convertAnthropicUsage(event); expect(usage).toEqual({ inputCacheMissTokens: 100, inputCachedTokens: 10, inputWriteCacheTokens: 20, totalInputTokens: 130, totalOutputTokens: 5, }); }); it('should accumulate output tokens on message_delta', () => { const previousUsage = { inputCacheMissTokens: 100, inputCachedTokens: 10, inputWriteCacheTokens: 20, totalInputTokens: 130, totalOutputTokens: 5, }; const deltaEvent = { type: 'message_delta', delta: { stop_reason: 'end_turn', }, usage: { output_tokens: 8, }, } as unknown as Anthropic.MessageStreamEvent; const usage = convertAnthropicUsage(deltaEvent, previousUsage); expect(usage).toEqual({ inputCacheMissTokens: 100, inputCachedTokens: 10, inputWriteCacheTokens: 20, totalInputTokens: 130, totalOutputTokens: 13, totalTokens: 143, }); }); it('should keep previous usage when delta has no tokens', () => { const previousUsage = { totalInputTokens: 50, totalOutputTokens: 2, }; const deltaEvent = { type: 'message_delta', delta: { stop_reason: 'end_turn', }, usage: null, } as unknown as Anthropic.MessageStreamEvent; const usage = convertAnthropicUsage(deltaEvent, previousUsage); expect(usage).toEqual({ totalInputTokens: 50, totalOutputTokens: 2, totalTokens: 52, }); }); it('should return undefined when delta has no usage and no context', () => { const deltaEvent = { type: 'message_delta', delta: { stop_reason: 'end_turn', }, usage: null, } as unknown as Anthropic.MessageStreamEvent; const usage = convertAnthropicUsage(deltaEvent); expect(usage).toBeUndefined(); }); });