Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

49 lines
1.8KB

  1. from bot.session_manager import Session
  2. from common.log import logger
  3. class ChatGLMSession(Session):
  4. def __init__(self, session_id, system_prompt=None, model="glm-4"):
  5. super().__init__(session_id, system_prompt)
  6. self.model = model
  7. self.reset()
  8. def discard_exceeding(self, max_tokens, cur_tokens=None):
  9. precise = True
  10. try:
  11. cur_tokens = self.calc_tokens()
  12. except Exception as e:
  13. precise = False
  14. if cur_tokens is None:
  15. raise e
  16. logger.debug("Exception when counting tokens precisely for query: {}".format(e))
  17. while cur_tokens > max_tokens:
  18. if len(self.messages) > 2:
  19. self.messages.pop(1)
  20. elif len(self.messages) == 2 and self.messages[1]["role"] == "assistant":
  21. self.messages.pop(1)
  22. if precise:
  23. cur_tokens = self.calc_tokens()
  24. else:
  25. cur_tokens = cur_tokens - max_tokens
  26. break
  27. elif len(self.messages) == 2 and self.messages[1]["role"] == "user":
  28. logger.warn("user message exceed max_tokens. total_tokens={}".format(cur_tokens))
  29. break
  30. else:
  31. logger.debug("max_tokens={}, total_tokens={}, len(messages)={}".format(max_tokens, cur_tokens, len(self.messages)))
  32. break
  33. if precise:
  34. cur_tokens = self.calc_tokens()
  35. else:
  36. cur_tokens = cur_tokens - max_tokens
  37. return cur_tokens
  38. def calc_tokens(self):
  39. return num_tokens_from_messages(self.messages, self.model)
  40. def num_tokens_from_messages(messages, model):
  41. tokens = 0
  42. for msg in messages:
  43. tokens += len(msg["content"])
  44. return tokens