File size: 3,493 Bytes
ee416f4
 
 
2885319
ee416f4
 
 
 
 
 
 
 
fce4a54
ee416f4
 
 
 
fce4a54
 
 
 
2885319
 
 
 
fce4a54
 
1c6e5a1
fce4a54
 
07dca08
fce4a54
 
ee416f4
fce4a54
 
 
ee416f4
07dca08
ee416f4
07dca08
ee416f4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c889167
ee416f4
 
 
 
 
 
 
 
2885319
ee416f4
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import gradio as gr
import requests

def check_key_gemini_availability(key, ai_model):
    """
    Checks the availability of a Gemini API key.
    Args:
        key: The API key to check.
    Returns:
        A tuple containing a boolean indicating whether the key is valid and an error message (or None if the key is valid).
    """
    try:
        # First, check if the key allows access to the list of models
        url_getListModel = f"https://generativelanguage.googleapis.com/v1beta/models?key={key}"
        rq = requests.get(url_getListModel)
        rq.raise_for_status()  # Raise HTTPError for bad responses (4xx or 5xx)
        result = rq.json()
        if 'models' not in result:
            return False, f"Invalid key: 'models' field not found in response from list models endpoint."

        # Second, attempt to generate content to further validate the key
        ai_model_ = ai_model.strip() or "gemini-1.5-flash"
        if ai_model_ not in result['models']:
            return False, f"Specified model is not in available 'models'."
        url_generateContent = f"https://generativelanguage.googleapis.com/v1beta/models/{ai_model_}:generateContent?key={key}"
        # headers = {'Content-Type': 'application/json'}
        data = {"contents": [{"parts": [{"text": "Say \"this is a test\""}]}]}
        rq = requests.post(url_generateContent, json=data) #headers=headers, data=json.dumps(data)

        if 400 <= rq.status_code < 500:
            return False, f"{rq.status_code}"
        elif 500 <= rq.status_code < 600:
             return True, None # consider 5xx as valid, could be temporary issue.
        else:
            rq.raise_for_status() # Raise other errors for other status codes
            return True, None

    except requests.exceptions.HTTPError as e:
        return False, f"Invalid: HTTP {e.response.status_code} - {e}"
    except Exception as e:
        return False, f"Error: {e}"

def check_keys(keys_text):
    """
    Checks a list of Gemini API keys and categorizes them into valid and invalid.

    Args:
        keys_text: A string containing API keys separated by lines.

    Returns:
        A tuple containing two strings: a list of valid keys and a list of invalid keys with error messages.
    """
    key_list = keys_text.strip().splitlines()
    key_list = list(set(key_list))  # Remove duplicates

    valid_keys = []
    invalid_keys = []

    for key in key_list:
        is_valid, error_msg = check_key_gemini_availability(key)
        if is_valid:
            valid_keys.append(key)
        else:
            invalid_keys.append(f"{key} - {error_msg}")

    return "\n".join(valid_keys), "\n".join(invalid_keys)

def clear_inputs():
    """Clears the input text area."""
    return ""

with gr.Blocks() as demo:
    gr.Markdown('''
    # Gemini API Key Status Checker - batch mode
    ''')

    with gr.Row():
        with gr.Column():
            keys = gr.TextArea(label="API Keys (by lines)")
            ai_model = gr.Textbox(label="gemini model")
            with gr.Row():
                clear_button = gr.Button("Clear")
                submit_button = gr.Button("Submit", variant="primary")
        with gr.Column():
            infos = gr.TextArea(label="Alive Keys")
            errs = gr.TextArea(label="Invalid Keys-status code")

    clear_button.click(fn=clear_inputs, outputs=[keys])
    submit_button.click(fn=check_keys, inputs=[keys,ai_model], outputs=[infos, errs], api_name="check_keys")

demo.launch()