genmux API 现已全面开放。 查看文档 →
genmux API

博客

用 Python 调用 Nano Banana API 生成图片

1 分钟阅读作者 genmux API Team


这是一份完整的 Python 集成:提交 → 轮询 → 下载,带上可以直接上线的幂等和错误处理。唯一的依赖是 requests。

准备

在控制台创建一把 API 密钥并导出:

bash
export IMAGE_API_KEY=nb_live_...
export IMAGE_API_BASE=https://api.example.com   # your base URL from the docs

提交任务

生成是异步的:POST /v1/generations 在毫秒级返回一个任务 id,图片几秒后就绪。请务必带上 Idempotency-Key——如果你的进程崩溃后重试,拿回来的会是同一个任务,而不是付两次钱。

python
import os, time, uuid, requests

BASE = os.environ["IMAGE_API_BASE"]
HEADERS = {"Authorization": f"Bearer {os.environ['IMAGE_API_KEY']}"}

def submit(prompt: str, resolution: str = "1K", ratio: str = "1:1", model: str = "nanobanana") -> dict:
    r = requests.post(
        f"{BASE}/v1/generations",
        headers={**HEADERS, "Idempotency-Key": str(uuid.uuid4())},
        json={"model": model, "prompt": prompt, "n": 1, "resolution": resolution, "ratio": ratio},
        timeout=10,
    )
    r.raise_for_status()   # 202 Accepted
    return r.json()        # {"id": "...", "status": "queued", "cost": 2, ...}

正确地轮询

用退避方式轮询,不要写死循环——任务通常在 1–20 秒内完成:

python
def wait(job_id: str, timeout_s: int = 120) -> dict:
    deadline, delay = time.monotonic() + timeout_s, 0.5
    while time.monotonic() < deadline:
        job = requests.get(f"{BASE}/v1/generations/{job_id}", headers=HEADERS, timeout=10).json()
        if job["status"] in ("succeeded", "failed", "cancelled"):
            return job
        time.sleep(delay)
        delay = min(delay * 1.6, 5.0)
    raise TimeoutError(job_id)

下载结果

图片 URL 是预签名的,15 分钟后过期。如果你之后还要用这个文件,现在就下载;如果 URL 已经过期,再 GET 一次任务就能拿到新的。

python
def download(job: dict, path: str) -> None:
    if job["status"] != "succeeded":
        raise RuntimeError(f"{job['status']}: {job.get('error')}")
    img = job["images"][0]
    data = requests.get(img["url"], timeout=30).content
    with open(path, "wb") as f:
        f.write(data)

job = submit("a red fox in snow, studio lighting")
job = wait(job["id"])
download(job, "fox.png")

像生产服务那样处理错误

错误采用 application/problem+json;按 code 分支处理:

code该怎么做
insufficient_credits(402)停止提交;通知负责余额的人。
rate_limited / too_many_inflight(429)按 Retry-After 的秒数等待,然后重试同一个请求。
model_unavailable(503)没有扣费。稍后重试,或改用另一个模型 id。
internal_error(500)用同一个 Idempotency-Key 重试——不会重复扣费。
任务状态为 failed积分已自动退回;查看 error.code。

最后那一行才是值得围绕着设计的特性:失败的任务不花钱,所以你的重试逻辑永远不需要去对账——重新提交就行。

下一步:把 model 换成 nanobanana-pro 以获得更高保真度(对比),或者用 webhook 取代轮询。

关于作者

作者 genmux API Team — genmux API.

了解我们