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.

119 lines (100 loc) 4.06 kB
import { ChatModelPricing, LobeDefaultAiModelListItem } from '@/types/aiModel'; import { ModelTokensUsage } from '@/types/message'; import { getPrice } from './pricing'; const calcCredit = (token: number, pricing?: number) => { if (!pricing) return '-'; return parseInt((token * pricing).toFixed(0)); }; export const getDetailsToken = ( usage: ModelTokensUsage, modelCard?: LobeDefaultAiModelListItem, ) => { const inputTextTokens = usage.inputTextTokens || (usage as any).inputTokens || 0; const totalInputTokens = usage.totalInputTokens || (usage as any).inputTokens || 0; const totalOutputTokens = usage.totalOutputTokens || (usage as any).outputTokens || 0; const outputReasoningTokens = usage.outputReasoningTokens || (usage as any).reasoningTokens || 0; const outputTextTokens = usage.outputTextTokens ? usage.outputTextTokens : totalOutputTokens - outputReasoningTokens - (usage.outputAudioTokens || 0); const inputWriteCacheTokens = usage.inputWriteCacheTokens || 0; const inputCacheTokens = usage.inputCachedTokens || (usage as any).cachedTokens || 0; const inputCacheMissTokens = usage?.inputCacheMissTokens ? usage?.inputCacheMissTokens : totalInputTokens - (inputCacheTokens || 0); // Pricing const formatPrice = getPrice(modelCard?.pricing as ChatModelPricing); const inputCacheMissCredit = ( !!inputCacheMissTokens ? calcCredit(inputCacheMissTokens, formatPrice.input) : 0 ) as number; const inputCachedCredit = ( !!inputCacheTokens ? calcCredit(inputCacheTokens, formatPrice.cachedInput) : 0 ) as number; const inputWriteCachedCredit = !!inputWriteCacheTokens ? (calcCredit(inputWriteCacheTokens, formatPrice.writeCacheInput) as number) : 0; const totalOutputCredit = ( !!totalOutputTokens ? calcCredit(totalOutputTokens, formatPrice.output) : 0 ) as number; const totalInputCredit = ( !!totalInputTokens ? calcCredit(totalInputTokens, formatPrice.output) : 0 ) as number; const totalCredit = inputCacheMissCredit + inputCachedCredit + inputWriteCachedCredit + totalOutputCredit; return { inputAudio: !!usage.inputAudioTokens ? { credit: calcCredit(usage.inputAudioTokens, modelCard?.pricing?.audioInput), token: usage.inputAudioTokens, } : undefined, inputCacheMiss: !!inputCacheMissTokens ? { credit: inputCacheMissCredit, token: inputCacheMissTokens } : undefined, inputCached: !!inputCacheTokens ? { credit: inputCachedCredit, token: inputCacheTokens } : undefined, inputCachedWrite: !!inputWriteCacheTokens ? { credit: inputWriteCachedCredit, token: inputWriteCacheTokens } : undefined, inputCitation: !!usage.inputCitationTokens ? { credit: calcCredit(usage.inputCitationTokens, formatPrice.input), token: usage.inputCitationTokens, } : undefined, inputText: !!inputTextTokens ? { credit: calcCredit(inputTextTokens, formatPrice.input), token: inputTextTokens, } : undefined, outputAudio: !!usage.outputAudioTokens ? { credit: calcCredit(usage.outputAudioTokens, modelCard?.pricing?.audioOutput), id: 'outputAudio', token: usage.outputAudioTokens, } : undefined, outputReasoning: !!outputReasoningTokens ? { credit: calcCredit(outputReasoningTokens, formatPrice.output), token: outputReasoningTokens, } : undefined, outputText: !!outputTextTokens ? { credit: calcCredit(outputTextTokens, formatPrice.output), token: outputTextTokens, } : undefined, totalInput: !!totalInputTokens ? { credit: totalInputCredit, token: totalInputTokens } : undefined, totalOutput: !!totalOutputTokens ? { credit: totalOutputCredit, token: totalOutputTokens } : undefined, totalTokens: !!usage.totalTokens ? { credit: totalCredit, token: usage.totalTokens } : undefined, }; };