calc_token_mixin.py 1.1 KB

1234567891011121314151617181920212223242526272829303132
  1. from typing import List
  2. from langchain.schema import BaseMessage
  3. from core.model_providers.models.entity.message import to_prompt_messages
  4. from core.model_providers.models.llm.base import BaseLLM
  5. class CalcTokenMixin:
  6. def get_num_tokens_from_messages(self, model_instance: BaseLLM, messages: List[BaseMessage], **kwargs) -> int:
  7. return model_instance.get_num_tokens(to_prompt_messages(messages))
  8. def get_message_rest_tokens(self, model_instance: BaseLLM, messages: List[BaseMessage], **kwargs) -> int:
  9. """
  10. Got the rest tokens available for the model after excluding messages tokens and completion max tokens
  11. :param llm:
  12. :param messages:
  13. :return:
  14. """
  15. llm_max_tokens = model_instance.model_rules.max_tokens.max
  16. completion_max_tokens = model_instance.model_kwargs.max_tokens
  17. used_tokens = self.get_num_tokens_from_messages(model_instance, messages, **kwargs)
  18. rest_tokens = llm_max_tokens - completion_max_tokens - used_tokens
  19. return rest_tokens
  20. class ExceededLLMTokensLimitError(Exception):
  21. pass