File size: 3,947 Bytes
e125734
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import pkg_resources
import gradio as gr

# ============ 工具函式 ============
def detect_sdk():
    """偵測目前環境中與 Google 相關套件的版本與 SDK 狀態"""
    pkgs = []
    has_new = has_old = False
    for dist in pkg_resources.working_set:
        name = dist.project_name
        lower = name.lower()
        if "google" in lower:
            pkgs.append(f"{name} {dist.version}")
        if lower == "google-genai":
            has_new = True
        if lower == "google-generativeai":
            has_old = True

    if has_new and not has_old:
        sdk = "google-genai(新 SDK, v1)"
        sdk_tag = "new"
    elif has_old and not has_new:
        sdk = "google-generativeai(舊 SDK, v1beta)"
        sdk_tag = "old"
    elif has_new and has_old:
        sdk = "同時裝了新舊 SDK(建議只留一個以免衝突)"
        sdk_tag = "both"
    else:
        sdk = "無法判定(可能沒安裝任何 Google GenAI SDK)"
        sdk_tag = "none"

    return sdk, sdk_tag, "\n".join(sorted(pkgs))

def list_models_if_possible():
    """若有新 SDK + API Key,嘗試列出可用模型;否則回傳提示訊息"""
    api_key = os.getenv("GEMINI_API_KEY")
    if not api_key:
        return "⚠️ 未設定 GEMINI_API_KEY(無法列出模型)。"

    # 盡量用新 SDK;若不存在就回訊息
    try:
        from google import genai
    except Exception as e:
        return f"⚠️ 未安裝新 SDK(google-genai)。無法 list models。\n{e}"

    try:
        client = genai.Client(api_key=api_key)
        names = [m.name for m in client.models.list()]
        if not names:
            return "(沒有列到任何模型)"
        return "可用模型:\n" + "\n".join(names)
    except Exception as e:
        return f"⚠️ 列模型失敗:{e}"

def quick_health_check():
    """快速健康檢查:API Key 是否存在、推薦模型名是否設定"""
    api_key_ok = bool(os.getenv("GEMINI_API_KEY"))
    model = os.getenv("GEMINI_MODEL", "(未設定,預設建議 gemini-2.5-flash)")
    lines = []
    lines.append(f"API Key 設定:{'✅ 已設定' if api_key_ok else '❌ 未設定'}(環境變數 GEMINI_API_KEY)")
    lines.append(f"模型名稱:{model}")
    lines.append("建議:gemini-2.5-flash 或 gemini-2.5-pro")
    return "\n".join(lines)

# ============ Gradio 介面邏輯 ============
def refresh_status():
    sdk, tag, pkgs = detect_sdk()
    health = quick_health_check()
    return sdk, pkgs, health

def do_list_models():
    return list_models_if_possible()

with gr.Blocks(title="Gemini SDK 偵測面板 (HF Space)") as demo:
    gr.Markdown("## 🔎 Gemini SDK 偵測面板(Hugging Face Space)\n"
                "啟動後自動檢查你目前是跑 **新 SDK** 還是 **舊 SDK**,以及常見設定。")

    with gr.Row():
        with gr.Column():
            sdk_label = gr.Textbox(label="目前偵測到的 SDK", interactive=False)
            pkgs_box = gr.Textbox(label="與 Google 相關的已安裝套件(含版本)", lines=10, interactive=False)
            health_box = gr.Textbox(label="快速健康檢查", lines=4, interactive=False)

            btn_refresh = gr.Button("🔄 重新偵測")
            btn_refresh.click(fn=refresh_status, outputs=[sdk_label, pkgs_box, health_box])

        with gr.Column():
            gr.Markdown("### 📜 列出可用模型(需要新 SDK + API Key)")
            models_box = gr.Textbox(label="可用模型清單", lines=12, interactive=False)
            btn_models = gr.Button("📋 List Models")
            btn_models.click(fn=do_list_models, outputs=models_box)

    # 啟動時自動偵測一次
    demo.load(fn=refresh_status, outputs=[sdk_label, pkgs_box, health_box])

if __name__ == "__main__":
    demo.launch(server_name="0.0.0.0")