|

Nano Banana Pro API 同步與異步調用的 4 個核心差異

調用 Nano Banana Pro API 生成圖像時,同步調用和異步調用有什麼區別?目前 APIYI 和 Gemini 官方都僅支持同步調用模式,但 APIYI 通過提供 OSS URL 圖片輸出顯著改善了用戶體驗。本文將系統解析同步與異步調用的核心差異,以及 APIYI 平臺在圖片輸出格式上的優化方案。

核心價值: 讀完本文,你將理解同步調用與異步調用在 API 設計中的本質差異、APIYI 平臺 OSS URL 輸出相比 base64 編碼的優勢,以及如何根據業務場景選擇最優的圖片獲取方案。

nano-banana-pro-sync-async-api-comparison-zh-hant 图示

Nano Banana Pro API 調用模式核心對比

特性 同步調用 (Synchronous) 異步調用 (Asynchronous) APIYI 當前支持
連接模式 保持 HTTP 連接,等待完成 立即返回任務 ID,關閉連接 ✅ 同步調用
等待方式 阻塞等待 (30-170 秒) 非阻塞,輪詢或 Webhook ✅ 同步 (阻塞等待)
超時風險 高 (需配置 300-600 秒超時) 低 (僅提交任務需要短超時) ⚠️ 需合理配置超時
實現複雜度 低 (單次請求完成) 中等 (需輪詢或 Webhook 監聽) ✅ 簡單易用
適用場景 實時生成,立即展示 批量處理,後臺任務 ✅ 實時生成
成本優化 標準價格 Google Batch API 可節省 50%

同步調用的工作原理

同步調用 (Synchronous Call) 採用 請求-等待-響應 模式:

  1. 客戶端發起請求: 發送圖像生成請求到服務器
  2. 保持 HTTP 連接: 客戶端保持 TCP 連接打開,等待服務器完成推理
  3. 阻塞等待: 在 30-170 秒的推理時間內,客戶端無法處理其他操作
  4. 接收完整響應: 服務器返回生成的圖像數據 (base64 或 URL)
  5. 關閉連接: 完成後關閉 HTTP 連接

關鍵特徵: 同步調用是阻塞式 (Blocking) 的,客戶端必須等待服務器響應後才能繼續執行後續操作。這要求設置足夠長的超時時間 (1K/2K 推薦 300 秒,4K 推薦 600 秒),以避免在推理完成前連接被中斷。

異步調用的工作原理

異步調用 (Asynchronous Call) 採用 請求-接受-通知 模式:

  1. 客戶端提交任務: 發送圖像生成請求到服務器
  2. 立即返回任務 ID: 服務器接受請求,返回任務 ID (如 task_abc123),立即關閉連接
  3. 後臺推理: 服務器在後臺進行圖像生成,客戶端可以處理其他操作
  4. 獲取結果: 客戶端通過以下兩種方式之一獲取結果:
    • 輪詢 (Polling): 定期請求 /tasks/task_abc123/status 查詢任務狀態
    • Webhook 回調: 任務完成後,服務器主動調用客戶端提供的回調 URL
  5. 下載圖像: 任務完成後,通過返回的 URL 下載生成的圖像

關鍵特徵: 異步調用是非阻塞式 (Non-blocking) 的,客戶端在提交任務後可以立即處理其他請求,無需長時間保持連接。適合批量處理、後臺任務和對實時性要求不高的場景。

💡 技術建議: APIYI 平臺目前僅支持同步調用模式,但通過優化超時配置和提供 OSS URL 輸出,顯著提升了用戶體驗。對於需要批量生成圖像的場景,建議通過 API易 apiyi.com 平臺調用,該平臺提供穩定的 HTTP 端口接口,默認配置了合理的超時時間,支持高併發同步調用。

nano-banana-pro-sync-async-api-comparison-zh-hant 图示

核心差異 1: 連接保持時間與超時配置

同步調用的連接保持要求

同步調用要求客戶端在整個圖像生成過程中保持 HTTP 連接打開,這導致以下技術挑戰:

挑戰 影響 解決方案
長時間空閒連接 中間網絡設備 (NAT、防火牆) 可能關閉連接 設置 TCP Keep-Alive
超時配置複雜 需要根據分辨率精確配置超時時間 1K/2K: 300 秒,4K: 600 秒
網絡波動敏感 弱網環境容易斷開連接 實現重試機制
併發連接限制 瀏覽器默認最多 6 個併發連接 使用服務端調用或增加連接池

Python 同步調用示例:

import requests
import time

def generate_image_sync(prompt: str, size: str = "4096x4096") -> dict:
    """
    同步調用 Nano Banana Pro API 生成圖像

    Args:
        prompt: 圖像提示詞
        size: 圖像尺寸

    Returns:
        API 響應結果
    """
    start_time = time.time()

    # 同步調用:保持連接直到生成完成
    response = requests.post(
        "http://api.apiyi.com:16888/v1/images/generations",
        json={
            "prompt": prompt,
            "size": size,
            "model": "nano-banana-pro",
            "n": 1,
            "response_format": "url"  # APIYI 支持 URL 輸出
        },
        headers={"Authorization": "Bearer YOUR_API_KEY"},
        timeout=(10, 600)  # 連接超時 10 秒,讀取超時 600 秒
    )

    elapsed = time.time() - start_time
    print(f"⏱️ 同步調用耗時: {elapsed:.2f} 秒")
    print(f"🔗 連接狀態: 保持打開 {elapsed:.2f} 秒")

    return response.json()


# 使用示例
result = generate_image_sync(
    prompt="A futuristic cityscape at sunset",
    size="4096x4096"
)

print(f"✅ 圖像 URL: {result['data'][0]['url']}")

關鍵觀察:

  • 客戶端在 100-170 秒的推理時間內完全阻塞
  • HTTP 連接持續打開,消耗系統資源
  • 如果超時設置不當 (如 60 秒),會在推理完成前斷開

異步調用的短連接優勢

異步調用僅在提交任務和查詢狀態時建立短連接,大幅降低連接保持時間:

階段 連接時間 超時配置
提交任務 1-3 秒 30 秒足夠
輪詢狀態 每次 1-2 秒 10 秒足夠
下載圖像 5-10 秒 60 秒足夠
總計 10-20 秒 (分散) 遠低於同步調用

Python 異步調用示例 (模擬未來 APIYI 支持):

import requests
import time

def generate_image_async(prompt: str, size: str = "4096x4096") -> str:
    """
    異步調用 Nano Banana Pro API 生成圖像 (未來功能)

    Args:
        prompt: 圖像提示詞
        size: 圖像尺寸

    Returns:
        任務 ID
    """
    # 步驟 1: 提交任務 (短連接)
    response = requests.post(
        "http://api.apiyi.com:16888/v1/images/generations/async",  # 未來接口
        json={
            "prompt": prompt,
            "size": size,
            "model": "nano-banana-pro",
            "n": 1,
            "response_format": "url"
        },
        headers={"Authorization": "Bearer YOUR_API_KEY"},
        timeout=(10, 30)  # 提交任務僅需 30 秒超時
    )

    task_data = response.json()
    task_id = task_data["task_id"]
    print(f"✅ 任務已提交: {task_id}")
    print(f"🔓 連接已關閉,可以處理其他任務")

    return task_id


def poll_task_status(task_id: str, max_wait: int = 300) -> dict:
    """
    輪詢任務狀態直到完成

    Args:
        task_id: 任務 ID
        max_wait: 最大等待時間 (秒)

    Returns:
        生成結果
    """
    start_time = time.time()
    poll_interval = 5  # 每 5 秒輪詢一次

    while time.time() - start_time < max_wait:
        # 查詢任務狀態 (短連接)
        response = requests.get(
            f"http://api.apiyi.com:16888/v1/tasks/{task_id}",  # 未來接口
            headers={"Authorization": "Bearer YOUR_API_KEY"},
            timeout=(10, 10)  # 查詢狀態僅需 10 秒超時
        )

        status_data = response.json()
        status = status_data["status"]

        if status == "completed":
            elapsed = time.time() - start_time
            print(f"✅ 任務完成! 總耗時: {elapsed:.2f} 秒")
            return status_data["result"]

        elif status == "failed":
            raise Exception(f"任務失敗: {status_data.get('error')}")

        else:
            print(f"⏳ 任務狀態: {status}, 等待 {poll_interval} 秒後重試...")
            time.sleep(poll_interval)

    raise TimeoutError(f"任務超時: {task_id}")


# 使用示例
task_id = generate_image_async(
    prompt="A serene mountain landscape",
    size="4096x4096"
)

# 在輪詢期間,可以處理其他任務
print("🚀 可以併發處理其他請求...")

# 輪詢任務狀態
result = poll_task_status(task_id, max_wait=600)
print(f"✅ 圖像 URL: {result['data'][0]['url']}")
查看 Webhook 回調模式示例 (未來功能)
from flask import Flask, request, jsonify
import requests

app = Flask(__name__)

# 全局字典存儲任務結果
task_results = {}


@app.route('/webhook/image_completed', methods=['POST'])
def handle_webhook():
    """接收 APIYI 異步任務完成的 Webhook 回調"""
    data = request.json

    task_id = data['task_id']
    status = data['status']
    result = data.get('result')

    if status == 'completed':
        task_results[task_id] = result
        print(f"✅ 任務 {task_id} 完成: {result['data'][0]['url']}")
    else:
        print(f"❌ 任務 {task_id} 失敗: {data.get('error')}")

    return jsonify({"received": True}), 200


def generate_image_with_webhook(prompt: str, size: str = "4096x4096") -> str:
    """
    使用 Webhook 模式異步生成圖像

    Args:
        prompt: 圖像提示詞
        size: 圖像尺寸

    Returns:
        任務 ID
    """
    response = requests.post(
        "http://api.apiyi.com:16888/v1/images/generations/async",
        json={
            "prompt": prompt,
            "size": size,
            "model": "nano-banana-pro",
            "n": 1,
            "response_format": "url",
            "webhook_url": "https://your-domain.com/webhook/image_completed"  # 回調 URL
        },
        headers={"Authorization": "Bearer YOUR_API_KEY"},
        timeout=(10, 30)
    )

    task_id = response.json()["task_id"]
    print(f"✅ 任務已提交: {task_id}")
    print(f"📞 Webhook 將回調: https://your-domain.com/webhook/image_completed")

    return task_id


# 啓動 Flask 服務器監聽 Webhook
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

🎯 當前限制: APIYI 和 Gemini 官方目前均僅支持同步調用模式,異步調用功能計劃在未來版本推出。對於需要高併發圖像生成的場景,建議通過 API易 apiyi.com 平臺使用多線程或多進程併發調用同步接口,並配置合理的超時時間。

核心差異 2: 併發處理能力與資源佔用

同步調用的併發限制

同步調用在高併發場景下面臨顯著的資源佔用問題:

單線程阻塞問題:

import time

# ❌ 錯誤: 單線程順序調用,總耗時 = 單次耗時 × 任務數
def generate_multiple_images_sequential(prompts: list) -> list:
    results = []
    start_time = time.time()

    for prompt in prompts:
        result = generate_image_sync(prompt, size="4096x4096")
        results.append(result)

    elapsed = time.time() - start_time
    print(f"❌ 順序調用 {len(prompts)} 張圖像耗時: {elapsed:.2f} 秒")
    # 假設每張圖 120 秒,10 張圖 = 1200 秒 (20 分鐘!)

    return results

多線程併發優化:

from concurrent.futures import ThreadPoolExecutor, as_completed
import time

# ✅ 正確: 多線程併發調用,充分利用 I/O 等待時間
def generate_multiple_images_concurrent(prompts: list, max_workers: int = 5) -> list:
    """
    多線程併發生成多張圖像

    Args:
        prompts: 提示詞列表
        max_workers: 最大併發線程數

    Returns:
        生成結果列表
    """
    results = []
    start_time = time.time()

    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        # 提交所有任務
        future_to_prompt = {
            executor.submit(generate_image_sync, prompt, "4096x4096"): prompt
            for prompt in prompts
        }

        # 等待所有任務完成
        for future in as_completed(future_to_prompt):
            prompt = future_to_prompt[future]
            try:
                result = future.result()
                results.append(result)
                print(f"✅ 完成: {prompt[:30]}...")
            except Exception as e:
                print(f"❌ 失敗: {prompt[:30]}... - {e}")

    elapsed = time.time() - start_time
    print(f"✅ 併發調用 {len(prompts)} 張圖像耗時: {elapsed:.2f} 秒")
    # 假設每張圖 120 秒,10 張圖 ≈ 120-150 秒 (2-2.5 分鐘)

    return results


# 使用示例
prompts = [
    "A cyberpunk city at night",
    "A serene forest landscape",
    "An abstract geometric pattern",
    "A futuristic space station",
    "A vintage car in the desert",
    # ...更多提示詞
]

results = generate_multiple_images_concurrent(prompts, max_workers=5)
print(f"🎉 生成了 {len(results)} 張圖像")
併發方式 10 張 4K 圖像耗時 資源佔用 適用場景
順序調用 1200 秒 (20 分鐘) 低 (單連接) 單張圖像,實時生成
多線程併發 (5 線程) 250 秒 (4 分鐘) 中等 (5 個連接) 中小批量 (10-50 張)
多進程併發 (10 進程) 150 秒 (2.5 分鐘) 高 (10 個連接) 大批量 (50+ 張)
異步調用 (未來) 120 秒 + 輪詢開銷 低 (輪詢連接短) 超大批量 (100+ 張)

異步調用的併發優勢

異步調用在批量處理場景下具有顯著優勢:

批量提交 + 批量輪詢:

def generate_batch_async(prompts: list) -> list:
    """
    批量異步生成圖像 (未來功能)

    Args:
        prompts: 提示詞列表

    Returns:
        任務 ID 列表
    """
    task_ids = []

    # 步驟 1: 快速批量提交所有任務 (每個 1-3 秒)
    for prompt in prompts:
        task_id = generate_image_async(prompt, size="4096x4096")
        task_ids.append(task_id)

    print(f"✅ 批量提交 {len(task_ids)} 個任務,耗時約 {len(prompts) * 2} 秒")

    # 步驟 2: 批量輪詢任務狀態
    results = []
    for task_id in task_ids:
        result = poll_task_status(task_id, max_wait=600)
        results.append(result)

    return results
指標 同步調用 (多線程) 異步調用 (未來) 差異
提交階段耗時 1200 秒 (阻塞等待) 20 秒 (快速提交) 異步快 60 倍
總耗時 250 秒 (5 線程) 120 秒 + 輪詢開銷 異步快 2 倍
連接數峯值 5 個長連接 1 個短連接 (提交時) 異步節省 80% 連接
可處理其他任務 ❌ 線程阻塞 ✅ 完全非阻塞 異步更靈活

nano-banana-pro-sync-async-api-comparison-zh-hant 图示

💰 成本優化: Google Gemini API 提供 Batch API 模式,支持異步處理並提供 50% 的價格折扣 (標準價格 $0.133-$0.24/張,Batch API $0.067-$0.12/張),但需容忍最長 24 小時的交付時間。對於不需要實時生成的場景,可考慮使用 Batch API 降低成本。

核心差異 3: APIYI 平臺的 OSS URL 輸出優勢

base64 編碼 vs URL 輸出對比

Nano Banana Pro API 支持兩種圖片輸出格式:

特性 base64 編碼 OSS URL 輸出 (APIYI 獨有) 推薦
響應體大小 6-8 MB (4K 圖像) 200 字節 (僅 URL) URL ✅
傳輸時間 5-10 秒 (弱網更慢) < 1 秒 URL ✅
瀏覽器緩存 ❌ 無法緩存 ✅ 標準 HTTP 緩存 URL ✅
CDN 加速 ❌ 無法使用 ✅ 全球 CDN 加速 URL ✅
圖片優化 ❌ 不支持 WebP 等 ✅ 支持格式轉換 URL ✅
漸進式加載 ❌ 必須完整下載 ✅ 支持漸進式加載 URL ✅
移動端性能 ❌ 內存佔用高 ✅ 優化的下載流 URL ✅

base64 編碼的性能問題:

  1. 響應體膨脹 33%: base64 編碼會增加約 33% 的數據量

    • 原始 4K 圖像: 約 6 MB
    • base64 編碼後: 約 8 MB
  2. 無法利用 CDN: base64 字符串嵌入在 JSON 響應中,無法通過 CDN 緩存

  3. 移動端內存壓力: 解碼 base64 字符串需要額外的內存和 CPU 資源

APIYI OSS URL 輸出的優勢:

import requests

# ✅ 推薦: 使用 APIYI OSS URL 輸出
response = requests.post(
    "http://api.apiyi.com:16888/v1/images/generations",
    json={
        "prompt": "A beautiful sunset over mountains",
        "size": "4096x4096",
        "model": "nano-banana-pro",
        "n": 1,
        "response_format": "url"  # 指定 URL 輸出
    },
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    timeout=(10, 600)
)

result = response.json()

# 響應體僅包含 URL,大小約 200 字節
print(f"響應體大小: {len(response.content)} 字節")
# 輸出: 響應體大小: 234 字節

# OSS URL 示例
image_url = result['data'][0]['url']
print(f"圖像 URL: {image_url}")
# 輸出: https://apiyi-oss.oss-cn-beijing.aliyuncs.com/nano-banana/abc123.png

# 後續通過標準 HTTP 下載圖像,享受 CDN 加速
image_response = requests.get(image_url)
with open("output.png", "wb") as f:
    f.write(image_response.content)

對比: base64 輸出的性能問題:

# ❌ 不推薦: base64 編碼輸出
response = requests.post(
    "https://api.example.com/v1/images/generations",
    json={
        "prompt": "A beautiful sunset over mountains",
        "size": "4096x4096",
        "model": "nano-banana-pro",
        "n": 1,
        "response_format": "b64_json"  # base64 編碼
    },
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    timeout=(10, 600)
)

result = response.json()

# 響應體包含完整 base64 字符串,大小約 8 MB
print(f"響應體大小: {len(response.content)} 字節")
# 輸出: 響應體大小: 8388608 字節 (8 MB!)

# 需要解碼 base64 字符串
import base64
image_b64 = result['data'][0]['b64_json']
image_bytes = base64.b64decode(image_b64)

with open("output.png", "wb") as f:
    f.write(image_bytes)
對比指標 base64 編碼 APIYI OSS URL 性能提升
API 響應大小 8 MB 200 字節 減少 99.998%
API 響應時間 125 秒 + 5-10 秒傳輸 125 秒 + < 1 秒 節省 5-10 秒
圖像下載方式 嵌入 JSON 獨立 HTTP 請求 可併發下載
瀏覽器緩存 不可緩存 標準 HTTP 緩存 重複訪問秒開
CDN 加速 不支持 全球 CDN 節點 跨國訪問加速

🚀 推薦配置: 在調用 APIYI 平臺的 Nano Banana Pro API 時,始終使用 response_format: "url" 獲取 OSS URL 輸出,而非 base64 編碼。這不僅顯著減少 API 響應大小和傳輸時間,還能充分利用 CDN 加速和瀏覽器緩存,提升用戶體驗。

核心差異 4: 適用場景與未來規劃

同步調用的最佳適用場景

推薦場景:

  1. 實時圖像生成: 用戶提交提示詞後立即展示生成的圖像
  2. 小批量處理: 生成 1-10 張圖像,併發調用即可滿足性能要求
  3. 簡單集成: 無需實現輪詢或 Webhook,降低開發複雜度
  4. 交互式應用: AI 繪畫工具、圖像編輯器等需要即時反饋的場景

典型代碼模式:

from flask import Flask, request, jsonify
import requests

app = Flask(__name__)

@app.route('/generate', methods=['POST'])
def generate_image():
    """實時圖像生成接口"""
    data = request.json
    prompt = data['prompt']
    size = data.get('size', '1024x1024')

    # 同步調用,用戶等待生成完成
    response = requests.post(
        "http://api.apiyi.com:16888/v1/images/generations",
        json={
            "prompt": prompt,
            "size": size,
            "model": "nano-banana-pro",
            "n": 1,
            "response_format": "url"
        },
        headers={"Authorization": "Bearer YOUR_API_KEY"},
        timeout=(10, 300 if size != '4096x4096' else 600)
    )

    result = response.json()
    return jsonify({
        "success": True,
        "image_url": result['data'][0]['url']
    })

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)

異步調用的未來應用場景

適用場景 (未來支持):

  1. 批量圖像生成: 生成 100+ 張圖像,如電商批量商品圖、設計素材庫
  2. 後臺定時任務: 每日自動生成特定類型的圖像,無需實時響應
  3. 低成本處理: 使用 Google Batch API 獲取 50% 價格折扣,容忍 24 小時交付時間
  4. 高併發場景: 數百個用戶同時提交生成請求,避免連接池耗盡

典型代碼模式 (未來):

from flask import Flask, request, jsonify
from celery import Celery
import requests

app = Flask(__name__)
celery = Celery('tasks', broker='redis://localhost:6379/0')

@celery.task
def generate_image_task(prompt: str, size: str, user_id: str):
    """Celery 異步任務:生成圖像"""
    # 提交異步任務到 APIYI
    response = requests.post(
        "http://api.apiyi.com:16888/v1/images/generations/async",  # 未來接口
        json={
            "prompt": prompt,
            "size": size,
            "model": "nano-banana-pro",
            "n": 1,
            "response_format": "url",
            "webhook_url": f"https://your-domain.com/webhook/{user_id}"
        },
        headers={"Authorization": "Bearer YOUR_API_KEY"},
        timeout=(10, 30)
    )

    task_id = response.json()["task_id"]
    return task_id


@app.route('/generate_async', methods=['POST'])
def generate_image_async():
    """異步圖像生成接口"""
    data = request.json
    prompt = data['prompt']
    size = data.get('size', '1024x1024')
    user_id = data['user_id']

    # 提交 Celery 任務,立即返回
    task = generate_image_task.delay(prompt, size, user_id)

    return jsonify({
        "success": True,
        "message": "任務已提交,完成後將通過 Webhook 通知",
        "task_id": task.id
    })


@app.route('/webhook/<user_id>', methods=['POST'])
def handle_webhook(user_id: str):
    """接收 APIYI 異步任務完成的 Webhook 回調"""
    data = request.json
    task_id = data['task_id']
    result = data['result']

    # 通知用戶圖像生成完成 (如發送郵件、推送通知等)
    notify_user(user_id, result['data'][0]['url'])

    return jsonify({"received": True}), 200

APIYI 平臺的未來規劃

功能 當前狀態 未來規劃 預期時間
同步調用 ✅ 已支持 持續優化超時配置
OSS URL 輸出 ✅ 已支持 增加更多 CDN 節點 2026 Q2
異步調用 (輪詢) ❌ 未支持 支持任務提交 + 狀態查詢 2026 Q2
異步調用 (Webhook) ❌ 未支持 支持任務完成回調通知 2026 Q2
Batch API 集成 ❌ 未支持 集成 Google Batch API 2026 Q4

💡 開發建議: APIYI 計劃在 2026 年第三季度推出異步調用功能,支持任務提交、狀態查詢和 Webhook 回調。對於當前有批量處理需求的開發者,建議使用多線程併發調用同步接口,並通過 API易 apiyi.com 平臺獲取穩定的 HTTP 端口接口和優化的超時配置。

常見問題

Q1: 爲什麼 APIYI 和 Gemini 官方都不支持異步調用?

技術原因:

  1. Google 基礎設施限制: Google Gemini API 的底層基礎設施目前僅支持同步推理模式,異步調用需要額外的任務隊列和狀態管理系統

  2. 開發複雜度: 異步調用需要實現:

    • 任務隊列管理
    • 任務狀態持久化
    • Webhook 回調機制
    • 失敗重試和補償邏輯
  3. 用戶需求優先級: 大多數用戶需要實時生成圖像,同步調用已能滿足 80% 以上的場景

解決方案:

  • 當前: 使用多線程/多進程併發調用同步接口
  • 未來: APIYI 計劃在 2026 Q2 推出異步調用功能
Q2: APIYI 的 OSS URL 圖片會永久保存嗎?

存儲策略:

存儲時長 說明 適用場景
7 天 默認保存 7 天,之後自動刪除 臨時預覽、測試生成
30 天 付費用戶可延長至 30 天 短期項目、活動素材
永久 用戶自行下載到自己的 OSS 長期使用、商業項目

推薦做法:

import requests

# 生成圖像並獲取 URL
result = generate_image_sync(prompt="A beautiful landscape", size="4096x4096")
temp_url = result['data'][0]['url']
print(f"臨時 URL: {temp_url}")

# 下載圖像到本地或自己的 OSS
image_response = requests.get(temp_url)
with open("permanent_image.png", "wb") as f:
    f.write(image_response.content)

# 或上傳到自己的 OSS (以阿里雲 OSS 爲例)
import oss2
auth = oss2.Auth('YOUR_ACCESS_KEY', 'YOUR_SECRET_KEY')
bucket = oss2.Bucket(auth, 'oss-cn-beijing.aliyuncs.com', 'your-bucket')
bucket.put_object('images/permanent_image.png', image_response.content)

注意: APIYI 提供的 OSS URL 是臨時存儲,適合快速預覽和測試。對於需要長期使用的圖像,請及時下載到本地或自己的雲存儲。

Q2: 同步調用時如何避免超時?

避免超時的 3 個關鍵配置:

  1. 正確設置超時時間:

    # ✅ 正確: 分別設置連接和讀取超時
    timeout=(10, 600)  # (連接超時 10 秒, 讀取超時 600 秒)
    
    # ❌ 錯誤: 僅設置單個超時值
    timeout=600  # 可能僅作用於連接超時
    
  2. 使用 HTTP 端口接口:

    # ✅ 推薦: 使用 APIYI HTTP 端口,避免 HTTPS 握手開銷
    url = "http://api.apiyi.com:16888/v1/images/generations"
    
    # ⚠️ 可選: HTTPS 接口,增加 TLS 握手時間
    url = "https://api.apiyi.com/v1/images/generations"
    
  3. 實現重試機制:

    from requests.adapters import HTTPAdapter
    from requests.packages.urllib3.util.retry import Retry
    
    # 配置重試策略
    retry_strategy = Retry(
        total=3,  # 最多重試 3 次
        status_forcelist=[429, 500, 502, 503, 504],  # 僅對這些狀態碼重試
        backoff_factor=2  # 指數退避: 2s, 4s, 8s
    )
    
    adapter = HTTPAdapter(max_retries=retry_strategy)
    session = requests.Session()
    session.mount("http://", adapter)
    
    # 使用 session 發起請求
    response = session.post(
        "http://api.apiyi.com:16888/v1/images/generations",
        json={...},
        timeout=(10, 600)
    )
    
Q4: 如何在前端直接調用 Nano Banana Pro API?

不推薦在前端直接調用的原因:

  1. API Key 泄露風險: 前端代碼會暴露 API Key 給所有用戶
  2. 瀏覽器併發限制: 瀏覽器對同一域名默認最多 6 個併發連接
  3. 超時限制: 瀏覽器 fetch API 默認超時較短,可能不足以完成生成

推薦架構: 後端代理模式:

// 前端代碼 (React 示例)
async function generateImage(prompt, size) {
  // 調用自己的後端接口
  const response = await fetch('https://your-backend.com/api/generate', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer YOUR_USER_TOKEN'  // 用戶認證 token
    },
    body: JSON.stringify({ prompt, size })
  });

  const result = await response.json();
  return result.image_url;  // 返回 APIYI OSS URL
}

// 使用
const imageUrl = await generateImage("A futuristic city", "4096x4096");
document.getElementById('result-image').src = imageUrl;
# 後端代碼 (Flask 示例)
from flask import Flask, request, jsonify
import requests

app = Flask(__name__)

@app.route('/api/generate', methods=['POST'])
def generate():
    # 驗證用戶 token
    user_token = request.headers.get('Authorization')
    if not verify_user_token(user_token):
        return jsonify({"error": "Unauthorized"}), 401

    data = request.json

    # 後端調用 APIYI API (API Key 不會暴露給前端)
    response = requests.post(
        "http://api.apiyi.com:16888/v1/images/generations",
        json={
            "prompt": data['prompt'],
            "size": data['size'],
            "model": "nano-banana-pro",
            "n": 1,
            "response_format": "url"
        },
        headers={"Authorization": "Bearer YOUR_APIYI_API_KEY"},  # 安全存儲在後端
        timeout=(10, 600)
    )

    result = response.json()
    return jsonify({"image_url": result['data'][0]['url']})

總結

Nano Banana Pro API 同步與異步調用的核心要點:

  1. 同步調用特徵: 保持 HTTP 連接直到生成完成,阻塞等待 30-170 秒,需配置長超時 (300-600 秒)
  2. 異步調用優勢: 立即返回任務 ID,非阻塞,適合批量處理和後臺任務,但目前 APIYI 和 Gemini 官方均未支持
  3. APIYI OSS URL 輸出: 相比 base64 編碼,響應體減少 99.998%,支持 CDN 加速和瀏覽器緩存,顯著提升性能
  4. 當前最佳實踐: 使用同步調用 + 多線程併發 + OSS URL 輸出,通過 APIYI HTTP 端口接口獲取優化的超時配置
  5. 未來規劃: APIYI 計劃在 2026 Q2 推出異步調用功能,支持任務提交、狀態查詢和 Webhook 回調

推薦通過 API易 apiyi.com 快速集成 Nano Banana Pro API。該平臺提供優化的 HTTP 端口接口 (http://api.apiyi.com:16888/v1)、獨家的 OSS URL 圖片輸出,以及合理的超時配置,適合實時圖像生成和批量處理場景。


作者: APIYI 技術團隊 | 如有技術問題,歡迎訪問 API易 apiyi.com 獲取更多 AI 模型接入方案。

Similar Posts