【福利上架】新增分组【Codex】0.1 倍率, SVIP 低至 0.08,GPT Plus 日抛号池查看通知

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-previewgemini-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-image1K便宜、速度快,适合草图和轻量生成
gemini-3.1-flash-image-preview1K / 2K / 4KFlash 生图模型,适合日常生图、风格一致性和商品图
gemini-3-pro-image-preview1K / 2K / 4KPro 生图模型,适合高质量广告图、复杂构图和 4K 输出

1K / 2K / 4K 是图片边长档位。使用 1:1 比例时,常见输出尺寸分别为 1024x10242048x20484096x4096

计费方式

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"
        }
      }
    }
  }'

参数说明

参数必填说明
modelGemini 生图模型名,例如 gemini-3.1-flash-image-preview
messagesOpenAI Chat Completions 消息数组,prompt 放在 user 消息里
stream建议先用 false,方便直接解析完整响应
max_tokens建议设置足够大,例如 8192,避免图片或说明内容被截断
extra_body.google.image_config.aspect_ratio图片比例,例如 1:116:99:16
extra_body.google.image_config.image_size图片分辨率档位:1K2K4K

image_config 必须写在 extra_body.google 下面,并使用 snake_case:

{
  "extra_body": {
    "google": {
      "image_config": {
        "aspect_ratio": "1:1",
        "image_size": "2K"
      }
    }
  }
}

不要写成 imageConfigaspectRatioimageSize,这些 camelCase 字段在 OpenAI 兼容入口会被拒绝。

支持的比例

常用比例:

比例场景
1:1商品图、头像、封面缩略图
16:9横版封面、视频封面、演示文稿配图
9:16手机海报、短视频封面
3:2 / 2:3摄影感构图、竖版海报
4:3 / 3:4通用横竖图

Gemini 3.1 Flash 还支持更长的比例,例如 1:44:11:88:1。不同模型和上游服务商可能会对比例做额外限制;如果返回参数错误,先改成 1:1 验证。

响应格式

Token 计费版走 Chat Completions,响应中的图片通常在 choices[0].message.content 里,以 Markdown data URI 形式返回:

{
  "choices": [
    {
      "message": {
        "role": "assistant",
        "content": "![image](data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ...)"
      }
    }
  ],
  "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 设为 falsemax_tokens 设为 8192,并检查完整 JSON 响应。

请求超时

4K 生图可能需要更久。建议完整请求超时设置为 900 秒,包括客户端、工作流平台、Serverless 网关、反向代理和本地代理的 read/idle timeout。

如果本地设置了代理,且经常在 60 秒左右断开,可以先用 curl --noproxy '*' --max-time 900 排查是不是本地代理超时。