File size: 4,086 Bytes
d2ec9da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import requests
import gradio as gr
import os

# ----------- Helper Functions -----------
def test_openai_key(key: str):
    try:
        headers = {"Authorization": f"Bearer {key}"}
        resp = requests.get("https://api.openai.com/v1/models", headers=headers)
        if resp.status_code == 200:
            return True, [m.get("id") for m in resp.json().get("data", [])]
        return False, resp.text
    except Exception as e:
        return False, str(e)

def test_gemini_key(key: str):
    try:
        url = f"https://generativelanguage.googleapis.com/v1beta/models?key={key}"
        resp = requests.get(url)
        if resp.status_code == 200:
            models = [m.get("name") for m in resp.json().get("models", [])]
            return True, models
        return False, resp.text
    except Exception as e:
        return False, str(e)

# ----------- Gradio Interface -----------
def validate_keys(openai_key: str, gemini_key: str):
    parts = ["## Results"]
    openai_models = None
    gemini_models = None

    if openai_key:
        valid, data = test_openai_key(openai_key)
        if valid:
            parts.append("### OpenAI Key: βœ… Valid")
            openai_models = data
        else:
            parts.append("### OpenAI Key: ❌ Invalid")
            parts.append(f"```\n{str(data)}\n```")

    if gemini_key:
        valid, data = test_gemini_key(gemini_key)
        if valid:
            parts.append("### Gemini Key: βœ… Valid")
            gemini_models = data
        else:
            parts.append("### Gemini Key: ❌ Invalid")
            parts.append(f"```\n{str(data)}\n```")

    if not openai_key and not gemini_key:
        parts.append("Enter at least one key to test.")

    summary_md = "\n\n".join(parts)
    return summary_md, (openai_models or []), (gemini_models or [])

custom_css = """
:root { --brand1: #2b6cb0; --brand2: #38b2ac; }
.header {text-align:center; padding: 1rem 0;}
.subtitle {text-align:center; color: #555; margin-bottom: 1rem;}
.card {border: 1px solid #e6e6e6; border-radius: 12px; padding: 16px; background: #fafafa;}
.btn-primary {background: var(--brand1) !important; color: white !important}
.models {min-height: 280px}
"""

with gr.Blocks(title="API Key Validator for OpenAI & Gemini", css=custom_css, theme=gr.themes.Soft(primary_hue=gr.themes.colors.blue, secondary_hue=gr.themes.colors.teal)) as demo:
    gr.Markdown("""
    <div class="header">
      <h1>πŸ”‘ API Key Validator</h1>
    </div>
    <div class="subtitle">Validate keys and view available models for OpenAI & Gemini</div>
    """)

    with gr.Row():
        with gr.Column(scale=1):
            gr.Markdown("### πŸ” Enter API Keys")
            with gr.Group():
                openai_key_box = gr.Textbox(label="OpenAI API Key", type="password", placeholder="sk-...", show_label=True)
                gemini_key_box = gr.Textbox(label="Gemini API Key", type="password", placeholder="AI Studio key...", show_label=True)
            test_btn = gr.Button("Test Keys", elem_classes=["btn-primary"])

        with gr.Column(scale=1):
            gr.Markdown("### ℹ️ Tips")
            gr.Markdown("- Keys are not stored.\n- Invalid keys show provider error JSON.\n- Enter either or both keys.")

    with gr.Row():
        with gr.Column():
            gr.Markdown("### βœ… Results")
            summary = gr.Markdown(elem_classes=["card"])

    with gr.Row():
        with gr.Column():
            gr.Markdown("### OpenAI Models")
            openai_models_json = gr.JSON(elem_classes=["card","models"])
        with gr.Column():
            gr.Markdown("### Gemini Models")
            gemini_models_json = gr.JSON(elem_classes=["card","models"])

    test_btn.click(
        fn=validate_keys,
        inputs=[openai_key_box, gemini_key_box],
        outputs=[summary, openai_models_json, gemini_models_json],
    )

if __name__ == "__main__":
    share = os.getenv("GRADIO_SHARE", "false").lower() in {"1", "true", "yes"}
    port = int(os.getenv("PORT", "7860"))
    demo.launch(server_name="0.0.0.0", server_port=port, share=share)