generate-image
使用 Gemini Nano Banana 2 產生圖片。當用戶說「產圖」「生成圖片」「generate image」「畫一張圖」時使用。
Gemini Nano Banana 2 圖片生成
目標
透過 Google Gemini 最新圖像模型(Nano Banana 2)生成圖片,儲存到本機。
流程
Step 0: 檢查 Gemini API Key
在做任何事之前,先確認用戶有 API Key。依序檢查:
python3 -c "
import os
key = os.environ.get('GEMINI_API_KEY') or os.environ.get('GOOGLE_API_KEY') or ''
if key:
print('KEY_FOUND')
else:
print('KEY_NOT_FOUND')
"
- 找到 → 繼續 Step 1
- 沒找到 → 告訴用戶:
找不到 Gemini API Key。請提供你的 API Key:
1. 到 https://aistudio.google.com/apikey 申請(免費)
2. 然後用以下任一方式提供:
a) 直接貼給我(本次 session 有效)
b) 加到 shell 環境:export GEMINI_API_KEY="your-key-here"
c) 加到 .env 檔案:echo 'GEMINI_API_KEY=your-key-here' >> ~/.env
等用戶提供 key 後,用他給的值繼續。不要在沒有 key 的情況下嘗試呼叫 API。
Step 1: 確認圖片需求
根據 $ARGUMENTS 判斷:
- 有 prompt → 直接使用
- 空 → 詢問用戶想要什麼圖片,引導他描述:
- 主題 / 場景
- 風格(寫實、插畫、極簡、水彩...)
- 色調偏好
- 用途(blog feature image、social media、簡報...)
Step 2: 優化 Prompt
將用戶描述優化為英文 prompt(Gemini 對英文 prompt 效果最好)。遵循原則:
- 具體描述構圖、光線、色調
- 指定風格關鍵字(e.g., minimalist, watercolor, isometric, flat design)
- 指定比例(16:9 for blog, 1:1 for social, 4:3 for presentation)
- 避免過於抽象的描述
Prompt 範例:
Clean modern tech blog illustration, 16:9 aspect ratio, minimalist style.
Visual metaphor for AI-powered knowledge management.
Cool blue and grey tones with warm orange accent colors.
Abstract geometric shapes representing data flow, no text, no human faces.
向用戶展示優化後的 prompt,確認後繼續。
Step 3: 呼叫 Gemini API 生成圖片
python3 << 'PYEOF'
import json, os, sys, base64, urllib.request, urllib.error
# --- API Key ---
API_KEY = os.environ.get("GEMINI_API_KEY") or os.environ.get("GOOGLE_API_KEY") or "USER_PROVIDED_KEY_HERE"
# --- 設定 ---
PROMPT = """USER_PROMPT_HERE"""
OUTPUT_PATH = "/tmp/generated-image.png"
MODEL = "gemini-3.1-flash-image-preview" # Gemini 圖像生成(穩定版)
# --- 呼叫 Gemini API ---
url = f"https://generativelanguage.googleapis.com/v1beta/models/{MODEL}:generateContent?key={API_KEY}"
payload = {
"contents": [{
"parts": [{"text": PROMPT}]
}],
"generationConfig": {
"responseModalities": ["TEXT", "IMAGE"]
}
}
req = urllib.request.Request(
url,
data=json.dumps(payload).encode("utf-8"),
headers={"Content-Type": "application/json"},
method="POST",
)
try:
with urllib.request.urlopen(req, timeout=120) as resp:
result = json.loads(resp.read().decode())
except urllib.error.HTTPError as e:
body = e.read().decode()
print(f"API Error {e.code}: {body}", file=sys.stderr)
sys.exit(1)
# --- 從回應中提取圖片 ---
saved = False
for candidate in result.get("candidates", []):
for part in candidate.get("content", {}).get("parts", []):
if "inlineData" in part:
img_data = base64.b64decode(part["inlineData"]["data"])
mime = part["inlineData"].get("mimeType", "image/png")
ext = {"image/png": ".png", "image/jpeg": ".jpg", "image/webp": ".webp"}.get(mime, ".png")
out = OUTPUT_PATH.rsplit(".", 1)[0] + ext
with open(out, "wb") as f:
f.write(img_data)
print(f"IMAGE_SAVED:{out} ({len(img_data)} bytes)")
saved = True
break
if saved:
break
if not saved:
# 印出回應以便 debug
print("No image in response. Full response:")
print(json.dumps(result, ensure_ascii=False, indent=2)[:2000])
sys.exit(1)
PYEOF
重要替換:
USER_PROVIDED_KEY_HERE→ 用戶提供的 API Key(如果環境變數沒有的話)USER_PROMPT_HERE→ Step 2 優化後的 promptOUTPUT_PATH→ 依用途調整檔名
Step 4: 展示結果
圖片生成後:
- 用 Read tool 讀取圖片檔案,展示給用戶看
- 告知檔案位置和大小
- 詢問是否滿意:
- 滿意 → 詢問是否要搬到特定目錄
- 不滿意 → 調整 prompt 重新生成(最多重試 2 次)
圖片已生成!
檔案:/tmp/generated-image.png
大小:{size}
Prompt:{prompt}
滿意嗎?如果要調整,告訴我哪裡需要修改。
Step 5: 儲存到目標位置(可選)
如果用戶指定了儲存位置:
cp /tmp/generated-image.png "{TARGET_PATH}"
可用模型
| 模型 ID | 特性 |
|---|---|
gemini-3.1-flash-image-preview(預設) | 最新圖像生成,品質好 |
gemini-2.0-flash-preview-image-generation | 備用(舊版) |
模型 ID 可能隨 Google 更新而變動。如果遇到 404 錯誤,請查閱 https://ai.google.dev/gemini-api/docs/image-generation 確認最新模型 ID。
常見問題
API 回應沒有圖片
- Gemini 有時會因為 safety filter 拒絕生成
- 調整 prompt 避免敏感內容,重新嘗試
403 / 401 錯誤
- API Key 無效或過期
- 確認 Key 有啟用 Generative Language API
429 Too Many Requests
- 免費額度用完,等一分鐘後重試
- 或升級為付費方案
注意事項
- Gemini 免費方案有每分鐘請求限制(通常 15 RPM)
- 生成的圖片版權歸用戶所有(依 Google ToS)
- 不要用來生成真人照片、有害內容、或侵權素材
- API Key 不會被記錄或儲存到任何檔案中