import requests import os from datetime import datetime from dateutil.relativedelta import relativedelta import openai queryUrl = 'https://api.openai.com/v1/chat/completions' GPT_TYPES = ["gpt-3.5-turbo", "gpt-4", "gpt-4-32k"] rate_limit_per_model = { "gpt-3.5-turbo-trial": 2000, "gpt-3.5-turbo-pay": 3500, "gpt-4": 200, "gpt-4-32k": 1000 # No actual clue, rare enough } body_gpt = { "gpt-3.5-turbo": {"model": "gpt-3.5-turbo", "max_tokens": 1, "messages": [{'role':'user', 'content': ''}]}, "gpt-4": {"model": "gpt-4", "max_tokens": 1, "messages": [{'role':'user', 'content': ''}]}, "gpt-4-32k": {"model": "gpt-4", "max_tokens": 1, "messages": [{'role':'user', 'content': ''}]} } def get_headers(key): headers = {'Authorization': f'Bearer {key}'} return headers def get_subscription(key): headers = get_headers(key) #results = r.json() key_highest_model = "" if check_gpt4_32k_availability(): key_highest_model = GPT_TYPES[2] elif check_gpt4_availability(): key_highest_model = GPT_TYPES[1] else: key_highest_model = GPT_TYPES[0] if check_key_availability(): rpm = "" org = "" quota = "" r = requests.post(queryUrl, headers=headers, json=body_gpt[key_highest_model]) result = r.json() if "id" in result: rpm = r.headers['x-ratelimit-limit-requests'] org = r.headers['openai-organization'] quota = check_key_type(key_highest_model, int(rpm)) else: e = result["error"]["code"] quota = f"Error: {e}" return {"organization": org, "rpm": rpm, "quota": quota} else: return {"organization": "", "rpm": "", "quota": ""} #"has_payment_method": False, #"hard_limit_usd": "", #"plan": ""} #def get_usage(key): # if check_key_availability(): # start_date = datetime.now().strftime('%Y-%m-01') # end_date = (datetime.now() + relativedelta(months=1)).strftime('%Y-%m-01') # queryUrl = f'https://api.openai.com/dashboard/billing/usage?start_date={start_date}&end_date={end_date}' # headers = get_headers(key) # r = requests.get(queryUrl, headers=headers) # return r.json() # else: # return "" def check_key_type(model, rpm): if model == GPT_TYPES[0]: if rpm > rate_limit_per_model['gpt-3.5-turbo-pay']: return "yes | pay, possibly big key" elif rpm > rate_limit_per_model['gpt-3.5-turbo-trial'] and rpm <= rate_limit_per_model['gpt-3.5-turbo-pay']: return "yes | pay" else: return "yes | trial" else: if rpm < rate_limit_per_model[model]: return "yes | trial" elif rpm == rate_limit_per_model[model]: return "yes | pay" else: return "yes | pay, possibly big key" def check_gpt4_availability(): if check_key_availability(): available_models = [model["root"] for model in openai.Model.list()["data"]] if 'gpt-4' in available_models: return True else: return False else: return False def check_gpt4_32k_availability(): if check_key_availability(): available_models = [model["root"] for model in openai.Model.list()["data"]] if 'gpt-4-32k' in available_models: return True else: return False else: return False def check_key_availability(): try: openai.Model.list() return True except: return False if __name__ == "__main__": key = os.getenv("OPENAI_API_KEY") # results = get_usage(key) # print(results) results = get_subscription(key) for k, v in results.items(): print(f"{k}: {v}")