| | 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: |
| | |
| | url_getListModel = f"https://generativelanguage.googleapis.com/v1beta/models?key={key}" |
| | rq = requests.get(url_getListModel) |
| | rq.raise_for_status() |
| | result = rq.json() |
| | if 'models' not in result: |
| | return False, f"Invalid key: 'models' field not found in response from list models endpoint." |
| |
|
| | |
| | ai_model_ = ai_model.strip() or "gemini-1.5-flash" |
| | models = [ x["name"].split('/',1)[1] for x in result['models'] ] |
| | if ai_model_ not in models: |
| | return False, f"Specified model {ai_model_} is not in available 'models'." |
| | url_generateContent = f"https://generativelanguage.googleapis.com/v1beta/models/{ai_model_}:generateContent?key={key}" |
| | |
| | data = {"contents": [{"parts": [{"text": "Say \"this is a test\""}]}]} |
| | rq = requests.post(url_generateContent, json=data) |
| |
|
| | if 400 <= rq.status_code < 500: |
| | return False, f"{rq.status_code}" |
| | else: |
| | |
| | print(key) |
| | 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, ai_model): |
| | """ |
| | 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)) |
| |
|
| | valid_keys = [] |
| | invalid_keys = [] |
| |
|
| | for key in key_list: |
| | is_valid, error_msg = check_key_gemini_availability(key, ai_model) |
| | 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() |