GEMINI IMAGE
Gemini Token 计费生图
使用 Chat Completions 调用 Gemini Token 计费生图,控制 1K/2K/4K 输出并解析 base64 图片响应。
Gemini Token 计费生图
RootFlow AI 同时提供两种 Gemini 生图接入方式:
- 计次版:走
/v1/images/generations,使用*-count模型名,价格固定,适合希望成本可预测的场景 - Token 计费版:走
/v1/chat/completions,使用 Gemini 原始生图模型名,按实际 token 用量和分组倍率计费
如果你想像调用聊天模型一样调用 Gemini 生图,并通过 extra_body.google.image_config 精细控制 1K / 2K / 4K 输出,请使用本页的 Token 计费方式。
适用场景
- 想用
gemini-3.1-flash-image-preview、gemini-3-pro-image-preview等 Gemini 原始模型名 - 希望通过计量账单观察不同服务商、不同分辨率的实际成本
- 需要在同一套 Chat Completions 工作流里同时处理文字和图片
- 希望直接拿到 Gemini 返回的 inline image(base64 data URI),由客户端自行保存
Gemini Token 计费生图不要调用 /v1/images/generations。该路径用于 OpenAI Images 兼容的计次模型,例如 gemini-3.1-flash-image-count。
Token 计费版请调用 /v1/chat/completions,并使用不带 -count 的模型名。
可用模型
| 模型名 | 支持分辨率 | 说明 |
|---|---|---|
gemini-2.5-flash-image | 1K | 便宜、速度快,适合草图和轻量生成 |
gemini-3.1-flash-image-preview | 1K / 2K / 4K | Flash 生图模型,适合日常生图、风格一致性和商品图 |
gemini-3-pro-image-preview | 1K / 2K / 4K | Pro 生图模型,适合高质量广告图、复杂构图和 4K 输出 |
1K / 2K / 4K 是图片边长档位。使用 1:1 比例时,常见输出尺寸分别为 1024x1024、2048x2048、4096x4096。
计费方式
Token 计费生图按模型的实际 token 用量计费,再叠加你的用户分组倍率。最终价格会受到这些因素影响:
- 模型:Flash 和 Pro 的输入、输出 token 单价不同
- 分辨率:2K / 4K 通常会产生更多输出 token
- prompt 长度:提示词越长,输入 token 越多
- 分组倍率:不同用户等级或分组会有不同倍率
- 服务商通道:不同上游返回的 usage 可能略有差异
账单里常见字段含义:
| 字段 | 含义 |
|---|---|
| 输入 token | 本次 prompt、消息和图片配置等输入内容折算后的 token |
| 输入价格 | 当前模型的输入 token 单价,例如 $0.5 / 1M tokens |
| 分组倍率 | 用户所在分组的计费倍率 |
| 扣费金额 | 平台按模型价格、usage 和分组倍率计算后的最终费用 |
如果你希望每张图固定价格、方便给业务侧做成本预算,优先使用 图像生成 中的 *-count 模型。
快速开始
1K 生图
curl https://api.rootflowai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-xxxxxxxxxxxxxxxx" \
-d '{
"model": "gemini-3.1-flash-image-preview",
"messages": [
{
"role": "user",
"content": "一张黑色陶瓷咖啡杯的商品主图,白色背景,干净高级,不要文字"
}
],
"stream": false,
"max_tokens": 8192,
"extra_body": {
"google": {
"image_config": {
"aspect_ratio": "1:1",
"image_size": "1K"
}
}
}
}'2K 生图
把 image_size 改成 2K:
curl https://api.rootflowai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-xxxxxxxxxxxxxxxx" \
-d '{
"model": "gemini-3.1-flash-image-preview",
"messages": [
{
"role": "user",
"content": "未来感智能手表广告海报,棚拍灯光,金属质感,干净背景,不要文字"
}
],
"stream": false,
"max_tokens": 8192,
"extra_body": {
"google": {
"image_config": {
"aspect_ratio": "1:1",
"image_size": "2K"
}
}
}
}'4K 生图
curl https://api.rootflowai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-xxxxxxxxxxxxxxxx" \
-d '{
"model": "gemini-3-pro-image-preview",
"messages": [
{
"role": "user",
"content": "高端腕表广告海报,棚拍灯光,细节清晰,金属质感,高级黑金配色,不要文字"
}
],
"stream": false,
"max_tokens": 8192,
"extra_body": {
"google": {
"image_config": {
"aspect_ratio": "1:1",
"image_size": "4K"
}
}
}
}'参数说明
| 参数 | 必填 | 说明 |
|---|---|---|
model | 是 | Gemini 生图模型名,例如 gemini-3.1-flash-image-preview |
messages | 是 | OpenAI Chat Completions 消息数组,prompt 放在 user 消息里 |
stream | 否 | 建议先用 false,方便直接解析完整响应 |
max_tokens | 否 | 建议设置足够大,例如 8192,避免图片或说明内容被截断 |
extra_body.google.image_config.aspect_ratio | 否 | 图片比例,例如 1:1、16:9、9:16 |
extra_body.google.image_config.image_size | 是 | 图片分辨率档位:1K、2K、4K |
image_config 必须写在 extra_body.google 下面,并使用 snake_case:
{
"extra_body": {
"google": {
"image_config": {
"aspect_ratio": "1:1",
"image_size": "2K"
}
}
}
}不要写成 imageConfig、aspectRatio 或 imageSize,这些 camelCase 字段在 OpenAI 兼容入口会被拒绝。
支持的比例
常用比例:
| 比例 | 场景 |
|---|---|
1:1 | 商品图、头像、封面缩略图 |
16:9 | 横版封面、视频封面、演示文稿配图 |
9:16 | 手机海报、短视频封面 |
3:2 / 2:3 | 摄影感构图、竖版海报 |
4:3 / 3:4 | 通用横竖图 |
Gemini 3.1 Flash 还支持更长的比例,例如 1:4、4:1、1:8、8:1。不同模型和上游服务商可能会对比例做额外限制;如果返回参数错误,先改成 1:1 验证。
响应格式
Token 计费版走 Chat Completions,响应中的图片通常在 choices[0].message.content 里,以 Markdown data URI 形式返回:
{
"choices": [
{
"message": {
"role": "assistant",
"content": ""
}
}
],
"usage": {
"prompt_tokens": 1484,
"completion_tokens": 0,
"total_tokens": 1484
}
}你可以从 content 中提取 data:image/...;base64,...,解码后保存成图片文件。注意实际图片格式由 data URI 的 MIME 类型决定,可能是 image/jpeg,也可能是 image/png。
Python 示例:保存返回图片
import base64
import re
from openai import OpenAI
client = OpenAI(
api_key="sk-xxxxxxxxxxxxxxxx",
base_url="https://api.rootflowai.com/v1",
)
response = client.chat.completions.create(
model="gemini-3.1-flash-image-preview",
messages=[
{
"role": "user",
"content": "一张玻璃棱镜放在干净桌面上的技术测试图,不要文字",
}
],
stream=False,
max_tokens=8192,
extra_body={
"google": {
"image_config": {
"aspect_ratio": "1:1",
"image_size": "2K",
}
}
},
)
content = response.choices[0].message.content or ""
match = re.search(r"data:image/([^;]+);base64,([A-Za-z0-9+/=\\s]+)", content)
if not match:
raise RuntimeError("响应里没有找到图片 data URI")
ext = "jpg" if match.group(1) in ("jpeg", "jpg") else match.group(1)
image_bytes = base64.b64decode(re.sub(r"\\s+", "", match.group(2)))
with open(f"gemini-image.{ext}", "wb") as f:
f.write(image_bytes)
print(response.usage)Node.js 示例:保存返回图片
import fs from "node:fs";
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "sk-xxxxxxxxxxxxxxxx",
baseURL: "https://api.rootflowai.com/v1",
});
const response = await client.chat.completions.create({
model: "gemini-3-pro-image-preview",
messages: [
{
role: "user",
content: "高端腕表广告海报,棚拍灯光,细节清晰,不要文字",
},
],
stream: false,
max_tokens: 8192,
extra_body: {
google: {
image_config: {
aspect_ratio: "1:1",
image_size: "4K",
},
},
},
});
const content = response.choices[0]?.message?.content ?? "";
const match = content.match(/data:image\/([^;]+);base64,([A-Za-z0-9+/=\\s]+)/);
if (!match) {
throw new Error("响应里没有找到图片 data URI");
}
const ext = ["jpeg", "jpg"].includes(match[1]) ? "jpg" : match[1];
const image = Buffer.from(match[2].replace(/\\s+/g, ""), "base64");
fs.writeFileSync(`gemini-image.${ext}`, image);
console.log(response.usage);计费对比建议
同一条 prompt、同一模型、同一分辨率下,可以分别测试 Token 计费版和计次版:
- Token 计费版:看消费日志里的实际扣费
- 计次版:对照 图像生成 里的固定单价
如果你的 prompt 很短、输出 usage 较低,Token 计费可能更便宜;如果你希望稳定预算,计次版更直观。建议先用少量样例测算,再决定生产环境使用哪一种。
常见错误
调用 /v1/images/generations 返回“不支持模型”
Token 计费 Gemini 生图应使用 /v1/chat/completions。如果你把 gemini-3.1-flash-image-preview 发送到 /v1/images/generations,可能会收到类似错误:
{
"error": {
"message": "not supported model for image generation, only imagen models are supported",
"code": "convert_request_failed"
}
}解决方法:改用 /v1/chat/completions,或者使用计次模型名 gemini-3.1-flash-image-count。
传了 2K / 4K 但没有生效
请确认参数位置和字段名:
- 正确:
extra_body.google.image_config.image_size - 错误:
image_size放在顶层 - 错误:
extra_body.google.imageConfig.imageSize
响应里没有图片
可能原因:
- prompt 被安全策略拒绝
max_tokens太小,响应被截断- 模型或上游临时返回纯文本说明
- 请求没有正确触发生图能力
建议把 stream 设为 false,max_tokens 设为 8192,并检查完整 JSON 响应。
请求超时
4K 生图可能需要更久。建议完整请求超时设置为 900 秒,包括客户端、工作流平台、Serverless 网关、反向代理和本地代理的 read/idle timeout。
如果本地设置了代理,且经常在 60 秒左右断开,可以先用 curl --noproxy '*' --max-time 900 排查是不是本地代理超时。