import gradio as gr from google import genai import pandas as pd def fetch_gemini_models(api_key): """ Fetches available Gemini models and returns them as a pandas DataFrame. """ if not api_key: return None, "エラー: GEMINI_API_KEY が必要です。" try: client = genai.Client(api_key=api_key) models = list(client.models.list()) models.sort(key=lambda x: x.name) # Mapping for Japanese translation method_translation = { "generateContent": "コンテンツ生成", "countTokens": "トークン計算", "createCachedContent": "キャッシュ作成", "embedText": "テキスト埋め込み", "batchGenerate": "バッチ生成", "embedContent": "コンテンツ埋め込み" } data = [] for m in models: if hasattr(m, "supported_actions") and m.supported_actions and "generateContent" in m.supported_actions: translated_methods = [method_translation.get(method, method) for method in m.supported_actions] methods = ", ".join(translated_methods) # Checkbox column first data.append({ "選択": False, "モデル名": m.name, "表示名": m.display_name, "対応メソッド": methods }) if not data: return None, "'generateContent' をサポートするモデルが見つかりませんでした。" df = pd.DataFrame(data) return df, "成功: モデルの取得に成功しました。" except Exception as e: return None, f"エラーが発生しました: {str(e)}" def parse_error_message(error_str): """ Parses complex error messages and returns a concise Japanese explanation. """ if "429" in error_str or "RESOURCE_EXHAUSTED" in error_str: return "リソース制限を超過しました (429 Resource Exhausted) - 無料枠の上限に達した可能性があります。" elif "403" in error_str or "PERMISSION_DENIED" in error_str: return "アクセス権限がありません (403 Permission Denied) - APIキーの設定やモデルの利用権限を確認してください。" elif "404" in error_str or "NOT_FOUND" in error_str: return "モデルが見つかりません (404 Not Found) - 指定されたモデルが存在しないか、利用できません。" elif "400" in error_str or "INVALID_ARGUMENT" in error_str: return "無効なリクエストです (400 Invalid Argument) - パラメータ設定を確認してください。" else: # Return a shortened version of the original error if it's too long return f"エラー: {error_str[:100]}..." if len(error_str) > 100 else f"エラー: {error_str}" def check_selected_models(api_key, df): """ Checks access for all selected models in the dataframe. """ if not api_key: return "エラー: GEMINI_API_KEY が必要です。" if df is None or df.empty: return "エラー: モデル一覧が空です。" # Filter selected rows # Gradio dataframe usually sends back a pandas dataframe or list of lists if isinstance(df, dict): # Handle some Gradio versions wrapping it df = pd.DataFrame(df['data'], columns=df['headers']) # Check if "選択" column exists if "選択" not in df.columns: return "エラー: モデル一覧の形式が不正です。" selected_rows = df[df["選択"] == True] if selected_rows.empty: return "警告: チェックするモデルが選択されていません。" results = [] client = genai.Client(api_key=api_key) for index, row in selected_rows.iterrows(): model_name = row["モデル名"] try: # Try a minimal generation request response = client.models.generate_content( model=model_name, contents="test", ) results.append(f"✅ {model_name}: アクセス確認成功") except Exception as e: error_msg = parse_error_message(str(e)) results.append(f"❌ {model_name}: 失敗 - {error_msg}") return "\n".join(results) # Define Gradio Theme (Rich Aesthetics) theme = gr.themes.Soft( primary_hue="indigo", secondary_hue="blue", neutral_hue="slate", ).set( button_primary_background_fill='*primary_600', button_primary_background_fill_hover='*primary_700', ) with gr.Blocks(theme=theme, title="Gemini モデルチェッカー") as demo: gr.Markdown( """ # 💎 Gemini モデルチェッカー Hugging Face Spaces上のGradioで、利用可能なGeminiモデルを簡単に確認できます。 """ ) with gr.Row(): api_key_input = gr.Textbox( label="Gemini APIキー", placeholder="AIzaSy...", type="password", interactive=True, scale=4 ) fetch_btn = gr.Button("モデル一覧取得", variant="primary", scale=1) output_status = gr.Textbox(label="ステータス", interactive=False) # Make dataframe interactive to allow checkbox editing output_table = gr.DataFrame( label="利用可能なモデル (左端のチェックボックスで選択)", interactive=True, type="pandas", col_count=(4, "fixed"), # 選択, モデル名, 表示名, 対応メソッド headers=["選択", "モデル名", "表示名", "対応メソッド"], datatype=["bool", "str", "str", "str"] ) fetch_btn.click( fn=fetch_gemini_models, inputs=api_key_input, outputs=[output_table, output_status] ) gr.Markdown("## モデルアクセス確認") gr.Markdown("上の表でチェックを入れたモデルに対して、一括でアクセス確認を行います。") check_btn = gr.Button("選択したモデルのアクセス確認", variant="secondary") access_status = gr.Textbox(label="アクセス確認結果", interactive=False, lines=10) check_btn.click( fn=check_selected_models, inputs=[api_key_input, output_table], outputs=access_status ) gr.Markdown( """ --- ### 使い方 1. Google AI Studioから取得した **APIキー** を入力します。 2. **モデル一覧取得** ボタンをクリックします。利用可能なモデルの一覧が表示されます。 3. 特定のモデルへのアクセスを確認するには、**モデルアクセス確認** セクションで **モデル名** を選択(または入力)し、**アクセス確認** ボタンをクリックします。 """ ) if __name__ == "__main__": demo.launch()