1234567891011121314151617181920212223242526272829303132333435363738394041 |
- import decimal
- from typing import Optional
- import tiktoken
- from core.constant import llm_constant
- class TokenCalculator:
- @classmethod
- def get_num_tokens(cls, model_name: str, text: str):
- if len(text) == 0:
- return 0
- enc = tiktoken.encoding_for_model(model_name)
- tokenized_text = enc.encode(text)
- # calculate the number of tokens in the encoded text
- return len(tokenized_text)
- @classmethod
- def get_token_price(cls, model_name: str, tokens: int, text_type: Optional[str] = None) -> decimal.Decimal:
- if model_name in llm_constant.models_by_mode['embedding']:
- unit_price = llm_constant.model_prices[model_name]['usage']
- elif text_type == 'prompt':
- unit_price = llm_constant.model_prices[model_name]['prompt']
- elif text_type == 'completion':
- unit_price = llm_constant.model_prices[model_name]['completion']
- else:
- raise Exception('Invalid text type')
- tokens_per_1k = (decimal.Decimal(tokens) / 1000).quantize(decimal.Decimal('0.001'),
- rounding=decimal.ROUND_HALF_UP)
- total_price = tokens_per_1k * unit_price
- return total_price.quantize(decimal.Decimal('0.0000001'), rounding=decimal.ROUND_HALF_UP)
- @classmethod
- def get_currency(cls, model_name: str):
- return llm_constant.model_currency
|