要点
每月的图片预算,就是成功生成的张数乘以单张价格,单张价格由模型和分辨率决定。失败的请求不用付费,请求被接收时扣的金额会立即退回余额,预算里只数成功出图的请求。
本文以每个月生成 10,000 张为例。这是假设的数量,不是 Rendergrid 或任何账号的实际用量;文中不写合计金额,文末附一份用你的账号自己的价格计算的模板。
每月预算怎么算?
公式只有一行:总额 = 张数 × 单张价格。张数是你一个月要生成的、成功出图的图片数。单张价格取决于模型和分辨率,所有模型的当前价格见价格页。
请求里要写明 resolution。不写时,图片按模型的默认分辨率生成并计费:Nano Banana Pro、Nano Banana 2 和 Nano Banana 2.1 是 2K,Nano Banana Flash 是 1K。想按 1K 做预算,就把 resolution 设为 1K。
哪些请求计入账单?
扣费发生在请求被接收时,在开始处理之前。如果最后没有生成出图片,这笔金额会自动、立即退回余额。无论失败的类型是 declined(原因在请求本身)还是 error(原因在服务一侧),都是如此,所以预算里只数成功出图的请求。详见错误码和失败请求如何退款。
在请求被接收之前就返回的 400 或 422,同样不会扣费。任务变成 failed 之后再发的请求,是新的请求:要用新的幂等键,有自己的扣费,失败的那一次已经退回。
10,000 张图片按不同 模型和分辨率怎么算?
示例都假设每个月生成 10,000 张,只写张数和单张价格,不写合计,请用价格页上的当前价格自己相乘。
- Nano Banana Flash,1K:10,000 张,每张 $0.015,预算 = 10,000 × $0.015。
- Nano Banana 2.1,2K:10,000 张,每张 $0.03。2K 是这款模型的默认分辨率,价格详见 Nano Banana 2.1 的价格文章。
- Nano Banana Pro,4K:10,000 张,每张 $0.07。4K 要在请求里写明,价格详见 Nano Banana Pro 的价格文章。
- 三者混合:6,000 张 Nano Banana Flash 的 1K、3,000 张 Nano Banana 2.1 的 2K 和 1,000 张 Nano Banana Pro 的 4K,合起来也是 10,000 张,预算 = 6,000 × $0.015 + 3,000 × $0.03 + 1,000 × $0.07。
三张示例图片 能看到什么?
三张图片对应上面前三个示例,提示词、模型和分辨率各不相同:封面是 Nano Banana Flash 的 1K,第二张是 Nano Banana 2.1 的 2K,第三张是 Nano Banana Pro 的 4K。它们只是配图,不是质量对比。三张都是一次尝试,共同点是奶油色的香皂和浅蓝色的底面,画面里都没有文字;每张的说明写出了它与提示词不同的地方。
这张图片的提示词
浅蓝纸台上放一块奶油色长方香皂,边角圆润,三分之四视角。左侧柔光形成短影。构图简洁,香皂完整居中,平滑背景四周留白。不出现文字、标志、人物或水印。
Nano Banana Flash
nano-banana-flash · 1K · 1:1 · $0.015
Nano Banana Flash,1K,1:1,一次尝试。奶油色的长方形香皂放在一张边缘毛糙、带纸纤维的浅蓝色纸上,纸的四周是奶白色的台面。香皂完整,位于画面中央,边角圆润;光线来自左侧,在香皂右侧投下一小块边缘柔和的影子,与提示词的“左侧柔光”和“短影”一致。与提示词不同的有两处:一是视角,提示词要的是三分之四视角,画面却是从较高的角度拍摄,香皂只略微转向镜头,右端的侧面只露出窄窄的一条;二是画面左上角有一小块深色,提示词没有要求。画面中没有文字、标志、人物或水印。
这张图片的提示词
奶油色长方香皂旁放一条叠好的白毛巾,台面浅蓝。三分之四视角,左侧柔光照出香皂圆滑边缘和毛巾线圈。两件物品完整,构图安静宽松。不出现文字、标志、人物或水印。
Nano Banana 2.1
nano-banana-2.1 · 2K · 1:1 · $0.03
Nano Banana 2.1,2K,1:1,一次尝试。奶油色的长方形香皂在画面左侧,右边是一条叠好的白色毛巾,台面是浅蓝色,毛巾的线圈看得很清楚。能同时看到香皂的顶面和相邻的两个侧面,边角略圆;光线大致来自左侧,香皂右侧和毛巾下方的影子边缘柔和,与提示词的“左侧柔光”一致。与提示词不同的有两处:提示词要求两件物品完整,毛巾的右端却被画面右边缘截断,香皂是完整的;背景里有一片虚化的白色窗框或墙板,提示词没有要求。画面中没有文字、标志、人物或水印。
这张图片的提示词
奶油色长方香皂放在透明玻璃皂碟上,旁边白毛巾自然起褶,底面浅蓝。三分之四角度,光从左来,呈现薄玻璃边、反射和毛巾线圈。整组完整居中,外围留宽余白。不出现文字、标志、人物或水印。
Nano Banana Pro
nano-banana-pro · 4K · 1:1 · $0.07
Nano Banana Pro,4K,1:1,一次尝试。透明的玻璃皂碟里放着一块奶油色的长方形香皂,碟面上有几处小水珠;碟子右边是一条起褶的白色毛巾,毛巾的线圈、碟子的玻璃边和反光都看得出来。光线大致来自左侧,碟子下方偏右的台面上有折射的光斑,底面是浅蓝色,内容区域的左、右、下三边是奶白色的宽边,与提示词的“外围留宽余白”相合。与提示词不同的有几处:一是蓝色背景的上沿是一条笔直的横线,横线以上发白,里面有一个很淡的、形状像玻璃碟的轮廓,像重影,提示词没有要求;二是毛巾的右侧和下端被内容区域的边缘截断,整组并不完整;三是视角比提示词的三分之四角度更高,香皂的顶面占了大部分,侧面只露出窄窄的一条;四是碟面上的小水珠,提示词没有提到。画面中没有文字、标志、人物或水印。
怎样给每月的消费 设限额?
月度限额是可选的,默认没有,分两种,可以同时生效:
- 账号限额:对账号的所有密钥合计,在控制台的“余额与充值”页面设置。
- 密钥限额:只管一个密钥,在“API 密钥”页面设置。
两种限额都按 UTC 日历月计算,失败图片的退款会释放相应的金额。任何一个限额用尽后,下一个生成请求会得到 402 ERR_INSUFFICIENT_BALANCE,其中 details.reason 为 monthly_budget_exceeded,并带有 details.cap;这样的请求不会扣费。这是硬性限制:到下个月或你调高限额之前,新的生成请求都不会被接收。详见限额。
可以把限额设成你算出的预算,花到这个数后,新的生成请求就不再被接收。
余额不足时,同样返回 402 ERR_INSUFFICIENT_BALANCE,见余额。充值:用 USDT 在控制台的“余额与充值”页面中充值,或通过经理充值,详见 USDT 充值。
这个算法 不适合哪些情况?
- 10,000 张是假设。它不是 Rendergrid 或任何账号的用量,文中也没有失败比例或成功率。
- 只数成功出图的请求。为了得到满意的图片而再发的请求,每一个都有自己的扣费。
- 价格会变,也因账号而异。价格不含税,涨价会提前 7 天通知;你的账号可能有专属价格,以
GET /models的返回为准。
怎样用账号的价格 算出预算?
模板读取你的账号自己的价格,再乘以你填的张数。它请求 GET /models:不扣费,不占用生成名额,但计入账号的请求速率限制。每个分辨率的价格取自 variants[].price,用 variant_key(1k、2k、4k)对应;不要用根层级的 price,它只是该模型最便宜分辨率的价格。curl 查看原始响应,Python 和 Node.js 负责计算。价格是字符串,Python 用 Decimal,Node.js 换成以万分之一美元为单位的整数,都不用浮点数。
curl --fail-with-body --max-time 20 \ "https://api.rendergrid.io/ api/ public/ v1/ models?category=image" \ -H "Authorization: Bearer $RENDERGRID_API_KEY"
import os from decimal import Decimal import requests API = "https://api.rendergrid.io/ api/ public/ v1" KEY = os.environ["RENDERGRID_API_KEY"] # 假设的每月计划:(模型,resolution,张数)。按你的情况修改 PLAN = [ ("nano-banana-flash", "1K", 6000), ("nano-banana-2.1", "2K", 3000), ("nano-banana-pro", "4K", 1000), ] response = requests.get( f"{API}/models", params={"category": "image"}, headers={"Authorization": f"Bearer {KEY}"}, timeout=(5, 20), ) response.raise_for_status() # 价格取自 variants,而不是根层级的 price prices = { (model["id"], variant["variant_key"]): Decimal(variant["price"]) for model in response.json()["models"] for variant in model.get("variants", []) } total = Decimal("0") missing = [] for model_id, resolution, images in PLAN: price = prices.get((model_id, resolution.lower())) if price is None: missing.append((model_id, resolution)) continue line = price * images total += line print(model_id, resolution, images, "×", price, "=", line) if missing: print("账号的价格列表里没有:", missing, "。不给合计") else: print("合计:", total)
// Node.js 22+,文件扩展名为 .mjs const API = "https://api.rendergrid.io/ api/ public/ v1"; const key = process.env.RENDERGRID_API_KEY; // 假设的每月计划:[模型, resolution, 张数]。按你的情况修改 const plan = [ ["nano-banana-flash", "1K", 6000n], ["nano-banana-2.1", "2K", 3000n], ["nano-banana-pro", "4K", 1000n], ]; // 价格是字符串:换成以万分之一美元为单位的整数,避免浮点误差 function toUnits(price) { const [whole, fraction = ""] = price.split("."); if (fraction.length > 4) throw new Error(`price has more than 4 decimals: ${price}`); return BigInt(whole + fraction.padEnd(4, "0")); } function toDollars(units) { return `${units / 10000n}.${String(units % 10000n).padStart(4, "0")}`; } const response = await fetch(`${API}/models?category=image`, { headers: { Authorization: `Bearer ${key}` }, signal: AbortSignal.timeout(20_000), }); if (!response.ok) { throw new Error(`HTTP ${response.status}: ${await response.text()}`); } // 价格取自 variants,而不是根层级的 price const prices = new Map(); for (const model of (await response.json()).models) { for (const variant of model.variants ?? []) { prices.set(`${model.id}:${variant.variant_key}`, toUnits(variant.price)); } } let total = 0n; const missing = []; for (const [modelId, resolution, images] of plan) { const price = prices.get(`${modelId}:${resolution.toLowerCase()}`); if (price === undefined) { missing.push(`${modelId} ${resolution}`); continue; } total += price * images; console.log(modelId, resolution, images, "×", toDollars(price), "=", toDollars(price * images)); } if (missing.length) { console.log("账号的价格列表里没有:", missing.join(", "), "。不给合计"); } else { console.log("合计:", toDollars(total)); }
模板只读取价格,不发送生成请求。真正生成时,请求里同样要写 resolution。
常见问题解答
每月生成 10,000 张图片,预算是多少?
失败的请求要付费吗?
declined 和 error 两种类型的失败都是如此。失败之后重新发送,会再扣一次费吗?
请求里不写 resolution 会怎样?
resolution。来源
- Rendergrid 价格每款模型、每个分辨率的单张价格。
- Rendergrid 文档:模型与参数默认分辨率,以及
price和variants字段。 - Rendergrid 文档:余额什么时候扣费,以及余额不足的
402。 - Rendergrid 文档:限额账号和密钥的月度限额。
- Rendergrid 文档:USDT 充值充值方式。
- 本文的三张图片三条提示词,各请求一次。





