FetchModel / app.py
spoon-1's picture
Update app.py
6168b31 verified
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()