code: def _num_token_from_messages(
      messages: Union[List, Dict], model="gpt-3.5-turbo-0613"
  ):
      """Return the number of tokens used by a list of messages.
  
      retrieved from https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb/
      """
      if isinstance(messages, dict):
          messages = [messages]
  
      try:
          encoding = tiktoken.encoding_for_model(model)
      except KeyError:
          print("Warning: model not found. Using cl100k_base encoding.")
          encoding = tiktoken.get_encoding("cl100k_base")
      if model in {
          "gpt-3.5-turbo-0613",
          "gpt-3.5-turbo-16k-0613",
          "gpt-4-0314",
          "gpt-4-32k-0314",
          "gpt-4-0613",
          "gpt-4-32k-0613",
      }:
          tokens_per_message = 3
          tokens_per_name = 1
      elif model == "gpt-3.5-turbo-0301":
          tokens_per_message = 4  # every message follows <|start|>{role/name}\n{content}<|end|>\n
          tokens_per_name = -1  # if there's a name, the role is omitted
      elif "gpt-3.5-turbo" in model:
          logger.info(
              "gpt-3.5-turbo may update over time. Returning num tokens assuming gpt-3.5-turbo-0613."
          )
          return _num_token_from_messages(
              messages, model="gpt-3.5-turbo-0613"
          )
      elif "gpt-4" in model:
          logger.info(
              "gpt-4 may update over time. Returning num tokens assuming gpt-4-0613."
          )
          return _num_token_from_messages(messages, model="gpt-4-0613")
      else:
          raise NotImplementedError(
              f"""_num_token_from_messages() is not implemented for model {model}. See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens."""
          )
      num_tokens = 0
      for message in messages:
          num_tokens += tokens_per_message
          for key, value in message.items():
              if value is None:
                  continue
  
              # function calls
              if not isinstance(value, str):
                  try:
                      value = json.dumps(value)
                  except TypeError:
                      logger.warning(
                          f"Value {value} is not a string and cannot be converted to json. It is a type: {type(value)} Skipping."
                      )
                      continue
  
              num_tokens += len(encoding.encode(value))
              if key == "name":
                  num_tokens += tokens_per_name
      num_tokens += (
          3  # every reply is primed with <|start|>assistant<|message|>
      )
      return num_tokens
  
file_path: autogen/autogen/token_count_utils.py
imports: from typing import List, Union, Dict
  import logging
  import json
  import tiktoken
  import re
label_desc: Use image node_id 6 for calling a global function with example usage: _num_token_from_messages(messages, model) and returns: num_tokens, _num_token_from_messages, _num_token_from_messages