ForgetMe/openai_api_key_status
0
1import gradio as gr2import requests, re3from api_usage import get_subscription, check_key_availability, check_key_ant_availability, check_ant_rate_limit, check_key_gemini_availability, check_key_azure_availability, get_azure_status, get_azure_deploy, check_key_mistral_availability, check_mistral_quota, check_key_replicate_availability, check_key_aws_availability, check_key_or_availability, check_key_or_limits, check_gcp_anthropic, check_groq_status, check_nai_status, check_elevenlabs_status4 5async def sort_key(key, rate_limit, claude_model):6 _key = key.strip()7 8 if _key.startswith("sk-or-v1-") and re.match(re.compile("sk-or-v1-[a-z0-9]{64}"), _key): 9 return get_key_openrouter_info(_key)10 11 if _key.startswith("sk-ant-") and re.match(re.compile("sk-ant-api03-[a-zA-Z0-9\-_]{93}AA"), _key):12 return await get_key_ant_info(_key, rate_limit, claude_model)13 14 if _key.startswith("sk-"): 15 return get_key_oai_info(_key)16 17 if _key.startswith("AIzaSy"):18 return get_key_gemini_info(_key)19 20 if _key.startswith("pst-"):21 return get_key_nai_info(_key)22 23 if (_key.startswith("r8_") and len(_key) == 40) or (_key.islower() and len(_key) == 40):24 return get_key_replicate_info(_key)25 26 if len(_key.split(':')) == 2 and _key.split(':')[1].islower() and len(_key.split(':')[1]) == 32 and "openai.azure.com" not in _key.split(':')[1]:27 endpoint = f"{_key.split(':')[0]}.openai.azure.com"28 api_key = _key.split(':')[1]29 return get_key_azure_info(endpoint, api_key)30 31 if "openai.azure.com" in _key.split(';')[0]:32 endpoint = _key.split(';')[0]33 api_key = _key.split(';')[1]34 return get_key_azure_info(endpoint, api_key)35 36 if _key.startswith("AKIA") and len(_key.split(':')[0]) == 20 and _key.split(':')[0].isupper():37 return await get_key_aws_info(_key)38 39 if re.match(re.compile(r"[a-f0-9]{32}"), _key) or re.match(re.compile(r"sk_[a-f0-9]{48}"), _key):40 return get_key_elevenlabs_info(_key)41 42 if re.match(re.compile(r"[a-zA-Z0-9]{32}"), _key):43 return get_key_mistral_info(_key)44 45 if re.match(re.compile(r"gsk_[a-zA-Z0-9]{20}WGdyb3FY[a-zA-Z0-9]{24}"), _key):46 return get_key_groq_info(_key)47 48 if re.match(re.compile(r"[\w\-]+:[\w\-@\.]+:[\w-]+:.+"), _key): # 0: refresh token49 return await get_key_gcp_info(_key, 0)50 51 if re.match(re.compile(r"[\w\-]+:[\w\-@\.]+:.+\\n"), _key): # 1: service account52 return await get_key_gcp_info(_key, 1)53 54 return not_supported(_key)55 56def get_key_oai_info(key):57 # Return a dictionary containing key information58 session = requests.Session()59 key_avai = check_key_availability(session, key)60 info_dict = {#"account_name": "",61 "key_type": "OpenAI",62 "key_availability": True if key_avai[0] else False,63 "gpt4_availability": "",64 "gpt4_32k_availability": "",65 "default_org": "", 66 "org_description": "",67 "organization": "",68 "models": "",69 "requests_per_minute": "",70 "tokens_per_minute": "",71 #"tokens_per_minute_left": "",72 "quota": ""}73 if key_avai[0]:74 if key_avai[0] == 200: 75 info = get_subscription(key, session, key_avai[1])76 info_dict["default_org"] = info["default_org"] 77 info_dict["org_description"] = info["org_description"]78 info_dict["organization"] = info["organization"] 79 else:80 empty_org = { 'id': '' }81 info = get_subscription(key, session, [empty_org])82 info_dict["organization"] = key_avai[1]83 info_dict["gpt4_availability"] = info["has_gpt4"]84 info_dict["gpt4_32k_availability"] = info["has_gpt4_32k"]85 info_dict["models"] = info["models"]86 info_dict["requests_per_minute"] = info["rpm"]87 info_dict["tokens_per_minute"] = info["tpm"]88 info_dict["quota"] = info["quota"]89 return info_dict90 91async def get_key_ant_info(key, rate_limit, claude_model):92 # Return a dictionary containing key information93 key_avai = await check_key_ant_availability(key, claude_model)94 info_dict = {#"account_name": "",95 "key_type": "Anthropic Claude",96 "key_availability": key_avai[0],97 "status": "",98 "filter_response": "",99 "requests_per_minute": "",100 "tokens_per_minute": "",101 "tier": "",102 "concurrent_rate_limit": ""}103 104 info_dict["status"] = key_avai[1]105 info_dict["filter_response"] = key_avai[2]106 info_dict["requests_per_minute"] = key_avai[3] + ("" if key_avai[3] == "" else f" ({key_avai[4]} left)")107 info_dict["tokens_per_minute"] = key_avai[5] + ("" if key_avai[5] == "" else f" ({key_avai[6]} left)")108 info_dict["tier"] = key_avai[7]109 110 if rate_limit:111 rate = await check_ant_rate_limit(key, claude_model)112 info_dict["concurrent_rate_limit"] = rate113 114 return info_dict115 116def get_key_gemini_info(key):117 key_avai = check_key_gemini_availability(key)118 info_dict = {#"account_name": "",119 "key_type": "Google Gemini",120 "key_availability": key_avai[0],121 "status": key_avai[1],122 "models": key_avai[2]}123 return info_dict124 125def get_key_azure_info(endpoint, api_key):126 key_avai = check_key_azure_availability(endpoint, api_key)127 info_dict = {#"account_name": "",128 "key_type": "Microsoft Azure OpenAI",129 "key_availability": key_avai[0],130 "gpt35_availability": "",131 "gpt4_availability": "",132 "gpt4_32k_availability": "", 133 "dall_e_3_availability": "", 134 "moderation_status": "",135 "models": "",136 "deployments": ""}137 if key_avai[0]: 138 azure_deploy = get_azure_deploy(endpoint, api_key)139 status = get_azure_status(endpoint, api_key, azure_deploy)140 info_dict["gpt35_availability"] = status[1]141 info_dict["gpt4_availability"] = status[2]142 info_dict["gpt4_32k_availability"] = status[3]143 info_dict["dall_e_3_availability"] = status[4]144 info_dict["moderation_status"] = status[0]145 info_dict["models"] = key_avai[1]146 info_dict["deployments"] = azure_deploy147 return info_dict148 149def get_key_mistral_info(key):150 key_avai = check_key_mistral_availability(key)151 info_dict = {#"account_name": "",152 "key_type": "Mistral AI",153 "key_availability": True if key_avai else False,154 "has_quota": "",155 "limits": "",156 "models": ""}157 if key_avai:158 quota_info = check_mistral_quota(key)159 info_dict['has_quota'] = quota_info[0]160 if quota_info[1]:161 info_dict['limits'] = quota_info[1]162 info_dict['models'] = key_avai163 return info_dict164 165def get_key_replicate_info(key):166 key_avai = check_key_replicate_availability(key)167 info_dict = {#"account_name": "",168 "key_type": "Replicate",169 "key_availability": key_avai[0],170 "account_name": "",171 "type": "",172 "has_quota": "",173 "hardware_available": ""}174 if key_avai[0]:175 info_dict['account_name'] = key_avai[1]['username']176 info_dict['type'] = key_avai[1]['type']177 info_dict['has_quota'] = key_avai[2]178 info_dict['hardware_available'] = key_avai[3]179 return info_dict180 181async def get_key_aws_info(key):182 key_avai = await check_key_aws_availability(key)183 info_dict = {#"account_name": "",184 "key_type": "Amazon AWS Claude",185 "key_availability": key_avai[0],186 "username": "",187 "root": "",188 "admin": "",189 "quarantine": "",190 "iam_full_access": "", 191 "iam_user_change_password": "", 192 "aws_bedrock_full_access": "", 193 "enabled_region": "",194 "models_usage": "", 195 "cost_and_usage": key_avai[1]}196 if key_avai[0]:197 info_dict['username'] = key_avai[1]198 info_dict['root'] = key_avai[2]199 info_dict['admin'] = key_avai[3]200 info_dict['quarantine'] = key_avai[4] 201 info_dict['iam_full_access'] = key_avai[5]202 info_dict['iam_user_change_password'] = key_avai[6]203 info_dict['aws_bedrock_full_access'] = key_avai[7]204 info_dict['enabled_region'] = key_avai[8]205 info_dict['models_usage'] = key_avai[9]206 info_dict['cost_and_usage'] = key_avai[10]207 return info_dict208 209def get_key_openrouter_info(key): 210 key_avai = check_key_or_availability(key)211 info_dict = {#"account_name": "",212 "key_type": "OpenRouter",213 "key_availability": key_avai[0],214 "is_free_tier": "",215 "usage": "",216 "balance": "",217 "limit": "",218 "limit_remaining": "",219 "rate_limit_per_minite": "",220 "4_turbo_per_request_tokens_limit": "",221 "sonnet_per_request_tokens_limit": "",222 "opus_per_request_tokens_limit": ""}223 if key_avai[0]:224 models_info = check_key_or_limits(key)225 info_dict['is_free_tier'] = key_avai[1]['is_free_tier']226 info_dict['limit'] = key_avai[1]['limit']227 info_dict['limit_remaining'] = key_avai[1]['limit_remaining']228 info_dict['usage'] = f"${format(key_avai[1]['usage'], '.4f')}"229 info_dict['balance'] = f"${format(models_info[0], '.4f')}"230 info_dict['rate_limit_per_minite'] = key_avai[2]231 info_dict['4_turbo_per_request_tokens_limit'] = models_info[1]['openai/gpt-4-turbo-preview']232 info_dict['sonnet_per_request_tokens_limit'] = models_info[1]['anthropic/claude-3-sonnet:beta']233 info_dict['opus_per_request_tokens_limit'] = models_info[1]['anthropic/claude-3-opus:beta']234 else:235 info_dict['usage'] = key_avai[1]236 return info_dict237 238async def get_key_gcp_info(key, type): 239 key_avai = await check_gcp_anthropic(key, type)240 info_dict = {#"account_name": "",241 "key_type": "Vertex AI (GCP)",242 "key_availability": key_avai[0],243 "status": "",244 "enabled_region": ""}245 if key_avai[0]:246 info_dict['enabled_region'] = key_avai[2]247 else:248 info_dict['status'] = key_avai[1]249 return info_dict250 251def get_key_groq_info(key):252 key_avai = check_groq_status(key)253 info_dict = {#"account_name": "",254 "key_type": "Groq",255 "key_availability": True if key_avai else False,256 "models": key_avai if key_avai else ""}257 return info_dict258 259def get_key_nai_info(key):260 key_avai = check_nai_status(key)261 info_dict = {#"account_name": "",262 "key_type": "NovelAI",263 "key_availability": True if key_avai[0] else False,264 "user_info": key_avai[1] if key_avai[0] else ""}265 return info_dict266 267def get_key_elevenlabs_info(key):268 key_avai = check_elevenlabs_status(key)269 info_dict = {#"account_name": "",270 "key_type": "ElevenLabs",271 "key_availability": key_avai[0],272 "user_info": key_avai[1],273 "voices_info": key_avai[2]}274 return info_dict275 276def not_supported(key):277 info_dict = {#"account_name": "",278 "key_type": "Not supported",279 "status": ""}280 return info_dict281 282def clear_inputs(text):283 return ""284 285with gr.Blocks() as demo:286 gr.Markdown('''287 # OpenAI/Anthropic/Gemini/Azure/Mistral/Replicate/AWS Claude/OpenRouter/Vertex AI(GCP Anthropic)/Groq/NovelAI/ElevenLabs API Key Status Checker288 289 *(Based on shaocongma, CncAnon1, su, Drago, kingbased key checkers)*290 291 AWS credential's format: AWS_ACCESS_KEY_ID:AWS_SECRET_ACCESS_KEY (root might not be accurate)292 293 Azure endpoint's format: YOUR_RESOURCE_NAME:YOUR_API_KEY or (https://)YOUR_RESOURCE_NAME.openai.azure.com;YOUR_API_KEY294 295 GCP format: PROJECT_ID:CLIENT_EMAIL:PRIVATE_KEY (including \\n)296 | or refresh token: PROJECT_ID:CLIENT_ID:CLIENT_SECRET:REFRESH_TOKEN297 ''')298 claude_options = [299 'claude-3-haiku-20240307',300 'claude-3-sonnet-20240229',301 'claude-3-opus-20240229',302 'claude-3-5-sonnet-20240620',303 ]304 with gr.Row():305 with gr.Column():306 key = gr.Textbox(lines=1, max_lines=5, label="API Key")307 claude_model = gr.Dropdown(claude_options, value="claude-3-haiku-20240307", label="Claude API model", info="model for filter_response and concurrent check")308 rate_limit = gr.Checkbox(label="Check concurrent rate limit (API Claude, experimental)")309 with gr.Row():310 clear_button = gr.Button("Clear")311 submit_button = gr.Button("Submit", variant="primary")312 with gr.Column():313 info = gr.JSON(label="API Key Information")314 315 clear_button.click(fn=clear_inputs, inputs=[key], outputs=[key])316 submit_button.click(fn=sort_key, inputs=[key, rate_limit, claude_model], outputs=[info], api_name="sort_key")317demo.launch()318 