03快速上手
Python 和 Node.js 客户端库新
现成的客户端会替你处理幂等键、等待结果和 Webhook 签名验证。同样是这五个 API 端点,代码更少。
这个模型并不支持所有分辨率和宽高比:示例中使用的是它支持的那些。
安装
# Python 3.11 及更高版本
$ pip install rendergrid# Node.js 22 及更高版本
$ npm install @rendergrid/sdk客户端库从环境变量 RENDERGRID_API_KEY 中读取密钥。也可以显式传入其他来源:Rendergrid(api_key=…)。
第一张图片
from rendergrid import Rendergrid client = Rendergrid() # 密钥取自 RENDERGRID_API_KEY creation = client.images.generate( model="nano-banana-pro", prompt="大理石上的陶瓷杯,柔和的窗光", resolution="1K", aspect_ratio="4:5", ) print(creation.id, creation.status, creation.cost) result = creation.wait(timeout=180) # 轮询频率不高于每 5 秒一次 print(result.result_urls)
import { Rendergrid } from "@rendergrid/sdk"; // 密钥取自 RENDERGRID_API_KEY const client = new Rendergrid(); const creation = await client.images.generate({ model: "nano-banana-pro", prompt: "大理石上的陶瓷杯,柔和的窗光", resolution: "1K", aspect_ratio: "4:5", }); console.log(creation.id, creation.status, creation.cost); // 轮询频率不高于每 5 秒一次 const result = await creation.wait({ timeoutMs: 180_000 }); console.log(result.result_urls);
generate 发送请求,并返回已被接收的任务。wait 会轮询该任务,直到它变为 completed 或 failed。如果在规定时间内没有结果,你会收到一个带有任务 id 的错误——之后可以继续。
客户端库替你做什么
| 事项 | 客户端库做什么 | 详见 |
|---|---|---|
| 幂等键 | 自动创建 X-Idempotency-Key,并在重试时保持不变 | 重试不重复扣费 |
| 重试 | 遇到连接中断、429 和 5xx 时,最多重试三次,并至少等待 Retry-After。如果响应本身表明无需重试,则不会重试。上传参考图(uploads.create)仅在请求确定没有到达 API 时才重试:即遇到 429、503 或连接被拒绝之后 | 限额 |
| 等待 | 轮询任务的频率不高于每 5 秒一次,并遵守 min_interval_seconds | 任务与状态 |
| 错误 | 把响应转换为带有 status、code、retryable 和 details 字段的异常 | 错误码 |
| Webhook | 验证签名和时间戳的时效,返回解析后的事件 | Webhook |
| 金额 | 在 Python 中以 Decimal、在 Node.js 中以字符串返回金额,而不是浮点数 | 余额 |
错误
import time import rendergrid try: creation = client.images.generate( model="nano-banana-pro", prompt="大理石上的陶瓷杯", ) except rendergrid.InsufficientBalance as e: need, have = e.details["required"], e.details["available"] print("需要:", need, "可用:", have) except rendergrid.RateLimited as e: time.sleep(e.retry_after) except rendergrid.APIError as e: print(e.status, e.code, e.retryable)
import { RendergridError } from "@rendergrid/sdk"; try { const creation = await client.images.generate({ model: "nano-banana-pro", prompt: "大理石上的陶瓷杯", }); } catch (error) { if (!(error instanceof RendergridError)) throw error; if (error.code === "ERR_INSUFFICIENT_BALANCE") { const { required, available } = error.details; console.log("需要:", required, "可用:", available); } else { console.log(error.status, error.code, error.retryable); } }
错误类的名称与 API 的错误码对应:ERR_INSUFFICIENT_BALANCE 对应 InsufficientBalance,ERR_RATE_LIMIT 对应 RateLimited。其余的都是通用的 APIError。
Webhook
import os from flask import Flask, request from rendergrid.webhooks import verify app = Flask(__name__) @app.post("/webhooks/rendergrid") def hook(): event = verify( secret=os.environ["RENDERGRID_WEBHOOK_SECRET"], headers=request.headers, body=request.get_data(), # 原始字节,而不是 request.json ) if not event.get("test"): save_result( event["id"], event["status"], event.get("result_urls") ) return "", 204
import express from "express"; import { verifyWebhook } from "@rendergrid/sdk/webhooks"; const app = express(); const raw = express.raw({ type: "application/json" }); app.post("/webhooks/rendergrid", raw, (req, res) => { const event = verifyWebhook({ secret: process.env.RENDERGRID_WEBHOOK_SECRET, headers: req.headers, body: req.body, // Buffer:请求体的原始字节 }); if (!event.test) { saveResult(event.id, event.status, event.result_urls); } res.sendStatus(204); });
签名是按请求体的原始字节计算的。如果框架已经解析了 JSON 并重新序列化,签名就会对不上。
版本与其他语言
- Python
- 3.11 及更高版本。PyPI 上的
rendergrid包。 - Node.js
- 22 及更高版本。npm 上的
@rendergrid/sdk包,也可用于 TypeScript。 - API 版本
- 客户端库适用于 API v1。响应中新增的字段不会让旧版本的客户端库出错。