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")