| const { logger } = require('@librechat/data-schemas'); |
| const { createTransaction, createStructuredTransaction } = require('./Transaction'); |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const spendTokens = async (txData, tokenUsage) => { |
| const { promptTokens, completionTokens } = tokenUsage; |
| logger.debug( |
| `[spendTokens] conversationId: ${txData.conversationId}${ |
| txData?.context ? ` | Context: ${txData?.context}` : '' |
| } | Token usage: `, |
| { |
| promptTokens, |
| completionTokens, |
| }, |
| ); |
| let prompt, completion; |
| try { |
| if (promptTokens !== undefined) { |
| prompt = await createTransaction({ |
| ...txData, |
| tokenType: 'prompt', |
| rawAmount: promptTokens === 0 ? 0 : -Math.max(promptTokens, 0), |
| }); |
| } |
|
|
| if (completionTokens !== undefined) { |
| completion = await createTransaction({ |
| ...txData, |
| tokenType: 'completion', |
| rawAmount: completionTokens === 0 ? 0 : -Math.max(completionTokens, 0), |
| }); |
| } |
|
|
| if (prompt || completion) { |
| logger.debug('[spendTokens] Transaction data record against balance:', { |
| user: txData.user, |
| prompt: prompt?.prompt, |
| promptRate: prompt?.rate, |
| completion: completion?.completion, |
| completionRate: completion?.rate, |
| balance: completion?.balance ?? prompt?.balance, |
| }); |
| } else { |
| logger.debug('[spendTokens] No transactions incurred against balance'); |
| } |
| } catch (err) { |
| logger.error('[spendTokens]', err); |
| } |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const spendStructuredTokens = async (txData, tokenUsage) => { |
| const { promptTokens, completionTokens } = tokenUsage; |
| logger.debug( |
| `[spendStructuredTokens] conversationId: ${txData.conversationId}${ |
| txData?.context ? ` | Context: ${txData?.context}` : '' |
| } | Token usage: `, |
| { |
| promptTokens, |
| completionTokens, |
| }, |
| ); |
| let prompt, completion; |
| try { |
| if (promptTokens) { |
| const { input = 0, write = 0, read = 0 } = promptTokens; |
| prompt = await createStructuredTransaction({ |
| ...txData, |
| tokenType: 'prompt', |
| inputTokens: -input, |
| writeTokens: -write, |
| readTokens: -read, |
| }); |
| } |
|
|
| if (completionTokens) { |
| completion = await createTransaction({ |
| ...txData, |
| tokenType: 'completion', |
| rawAmount: -completionTokens, |
| }); |
| } |
|
|
| if (prompt || completion) { |
| logger.debug('[spendStructuredTokens] Transaction data record against balance:', { |
| user: txData.user, |
| prompt: prompt?.prompt, |
| promptRate: prompt?.rate, |
| completion: completion?.completion, |
| completionRate: completion?.rate, |
| balance: completion?.balance ?? prompt?.balance, |
| }); |
| } else { |
| logger.debug('[spendStructuredTokens] No transactions incurred against balance'); |
| } |
| } catch (err) { |
| logger.error('[spendStructuredTokens]', err); |
| } |
|
|
| return { prompt, completion }; |
| }; |
|
|
| module.exports = { spendTokens, spendStructuredTokens }; |
|
|