CoolFace
Apppublic

ForgetMe/openai_api_key_status

sourceHugging Facemitupdated 2y agoView on Hugging Face
0likes
app.py318 linesDownload Raw Back to root
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