Spaces:
Sleeping
Sleeping
import gradio as gr | |
import tiktoken | |
from decimal import getcontext | |
getcontext().prec = 2 | |
def num_tokens_from_messages(messages, model): | |
"""Return the number of tokens used by a list of messages.""" | |
encoding = tiktoken.encoding_for_model(model) | |
if model in { | |
"gpt-3.5-turbo-1106", | |
"gpt-4-1106-preview", | |
"gpt-4", | |
}: | |
tokens_per_message = 3 | |
tokens_per_name = 1 | |
else: | |
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.""" | |
) | |
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|> | |
return num_tokens | |
# https://openai.com/pricing | |
def calc_input_cost(tokens, model): | |
"""Return the input cost of tokens""" | |
cost = 0 | |
if model == "gpt-3.5-turbo-1106": | |
# input $0.001 / 1K tokens, output $0.002 / 1K tokens | |
cost = 0.001 * tokens / 1000 | |
elif model == "gpt-4-1106-preview": | |
# input $0.01 / 1K tokens, output $0.03 / 1K tokens | |
cost = 0.01 * tokens / 1000 | |
elif model == "gpt-4": | |
# input $0.03 / 1K tokens, output $0.06 / 1K tokens | |
cost = 0.03 * tokens / 1000 | |
else: | |
raise NotImplementedError( | |
f"""calc_input_cost() is not implemented for model {model}.""" | |
) | |
return float(cost) | |
# https://openai.com/pricing | |
def calc_output_cost(tokens, model="gpt-3.5-turbo-1106"): | |
"""Return the output cost of tokens""" | |
cost = 0 | |
if model == "gpt-3.5-turbo-1106": | |
# input $0.001 / 1K tokens, output $0.002 / 1K tokens | |
cost = 0.002 * tokens / 1000 | |
elif model == "gpt-4-1106-preview": | |
# input $0.03 / 1K tokens, output $0.03 / 1K tokens | |
cost = 0.03 * tokens / 1000 | |
elif model == "gpt-4": | |
# input $0.03 / 1K tokens, output $0.06 / 1K tokens | |
cost = 0.06 * tokens / 1000 | |
else: | |
raise NotImplementedError( | |
f"""calc_input_cost() is not implemented for model {model}.""" | |
) | |
return float(cost) | |
def make_input_messages(system, user): | |
return [ | |
{ | |
"role": "system", | |
"content": system, | |
}, | |
{ | |
"role": "user", | |
"content": user, | |
} | |
] | |
def make_output_messages(output): | |
return [ | |
{ | |
"role": "assistant", | |
"content": output, | |
} | |
] | |
def calc(request_count, system_prompt, user_prompt, output): | |
result = "" | |
input_messages = make_input_messages(system_prompt, user_prompt) | |
output_messages = make_output_messages(output) | |
for model in [ | |
"gpt-3.5-turbo-1106", | |
"gpt-4-1106-preview", | |
"gpt-4" | |
]: | |
# example token count from the function defined above | |
input_token = num_tokens_from_messages(input_messages, model) | |
input_cost = calc_input_cost(input_token, model) | |
output_token = num_tokens_from_messages(output_messages, model) | |
output_cost = calc_output_cost(output_token, model) | |
total_cost = input_cost + output_cost | |
result += f"""{model} | |
input token:{input_token}, output token: {output_token} tokens counted by tiktoken. | |
input cost: ${format(input_cost, 'f')}, output cost: ${format(output_cost, 'f')}, total cost: ${format(total_cost, 'f')} per 1 request | |
{int(request_count)} request cost is ${format(total_cost * request_count, 'f')}\n""" | |
return result | |
iface = gr.Interface( | |
fn=calc, | |
inputs=[ | |
gr.Number(label="Request Count", value=500), | |
gr.Textbox(label="System Prompt", value="System Prompt"), | |
gr.Textbox(label="User Prompt", value="User Prompt"), | |
gr.Textbox(label="Output", value="Output Text"), | |
], | |
outputs=[ | |
gr.Textbox(label="Result") | |
], | |
title="ChatGPT Token and Cost Calculator", | |
description=f"Enter each form value, then click the button to see the results.\nThe results of this calculation should be considered for reference only." | |
) | |
iface.launch() | |