2023-07-18 17:51:13 +02:00
"""
2023-07-15 12:20:38 +02:00
This file ' s purpose is to count the number of tokens used by a list of messages.
It is used to check if the token limit of the model is reached .
Reference : https : / / github . com / openai / openai - cookbook / blob / main / examples / How_to_format_inputs_to_ChatGPT_models . ipynb
2023-07-18 17:51:13 +02:00
"""
2023-07-15 12:20:38 +02:00
import tiktoken
2023-07-18 17:51:13 +02:00
2023-07-15 12:20:38 +02:00
async def num_tokens_from_messages ( messages , model = " gpt-3.5-turbo " ) :
""" Returns the number of tokens used by a list of 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 . startswith ( " gpt-3.5-turbo " ) :
2023-07-18 17:51:13 +02:00
tokens_per_message = (
4 # every message follows <|start|>{role/name}\n{content}<|end|>\n
)
2023-07-15 12:20:38 +02:00
tokens_per_name = - 1 # if there's a name, the role is omitted
elif model . startswith ( " gpt-4 " ) :
tokens_per_message = 3
tokens_per_name = 1
else :
2023-07-18 17:51:13 +02:00
raise NotImplementedError (
f """ num_tokens_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. """
)
2023-07-15 12:20:38 +02:00
num_tokens = 0
for message in messages :
num_tokens + = tokens_per_message
for key , value in message . items ( ) :
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|>
2023-07-18 17:51:13 +02:00
return num_tokens