Gemini 图像生成 API
curl --request POST \
--url https://www.geeknow.top/v1beta/models/{model}:generateContent \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"contents": [
{}
],
"contents[].role": "<string>",
"contents[].parts": [
{}
],
"contents[].parts[].text": "<string>",
"contents[].parts[].inlineData": {},
"contents[].parts[].inlineData.mimeType": "<string>",
"contents[].parts[].inlineData.data": "<string>",
"generationConfig": {},
"generationConfig.responseModalities": [
"<string>"
],
"generationConfig.imageConfig": {},
"generationConfig.imageConfig.aspectRatio": "<string>",
"generationConfig.imageConfig.imageSize": "<string>",
"safetySettings": [
{}
]
}
'import requests
url = "https://www.geeknow.top/v1beta/models/{model}:generateContent"
payload = {
"contents": [{}],
"contents[].role": "<string>",
"contents[].parts": [{}],
"contents[].parts[].text": "<string>",
"contents[].parts[].inlineData": {},
"contents[].parts[].inlineData.mimeType": "<string>",
"contents[].parts[].inlineData.data": "<string>",
"generationConfig": {},
"generationConfig.responseModalities": ["<string>"],
"generationConfig.imageConfig": {},
"generationConfig.imageConfig.aspectRatio": "<string>",
"generationConfig.imageConfig.imageSize": "<string>",
"safetySettings": [{}]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
contents: [{}],
'contents[].role': '<string>',
'contents[].parts': [{}],
'contents[].parts[].text': '<string>',
'contents[].parts[].inlineData': {},
'contents[].parts[].inlineData.mimeType': '<string>',
'contents[].parts[].inlineData.data': '<string>',
generationConfig: {},
'generationConfig.responseModalities': ['<string>'],
'generationConfig.imageConfig': {},
'generationConfig.imageConfig.aspectRatio': '<string>',
'generationConfig.imageConfig.imageSize': '<string>',
safetySettings: [{}]
})
};
fetch('https://www.geeknow.top/v1beta/models/{model}:generateContent', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://www.geeknow.top/v1beta/models/{model}:generateContent",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'contents' => [
[
]
],
'contents[].role' => '<string>',
'contents[].parts' => [
[
]
],
'contents[].parts[].text' => '<string>',
'contents[].parts[].inlineData' => [
],
'contents[].parts[].inlineData.mimeType' => '<string>',
'contents[].parts[].inlineData.data' => '<string>',
'generationConfig' => [
],
'generationConfig.responseModalities' => [
'<string>'
],
'generationConfig.imageConfig' => [
],
'generationConfig.imageConfig.aspectRatio' => '<string>',
'generationConfig.imageConfig.imageSize' => '<string>',
'safetySettings' => [
[
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://www.geeknow.top/v1beta/models/{model}:generateContent"
payload := strings.NewReader("{\n \"contents\": [\n {}\n ],\n \"contents[].role\": \"<string>\",\n \"contents[].parts\": [\n {}\n ],\n \"contents[].parts[].text\": \"<string>\",\n \"contents[].parts[].inlineData\": {},\n \"contents[].parts[].inlineData.mimeType\": \"<string>\",\n \"contents[].parts[].inlineData.data\": \"<string>\",\n \"generationConfig\": {},\n \"generationConfig.responseModalities\": [\n \"<string>\"\n ],\n \"generationConfig.imageConfig\": {},\n \"generationConfig.imageConfig.aspectRatio\": \"<string>\",\n \"generationConfig.imageConfig.imageSize\": \"<string>\",\n \"safetySettings\": [\n {}\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://www.geeknow.top/v1beta/models/{model}:generateContent")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"contents\": [\n {}\n ],\n \"contents[].role\": \"<string>\",\n \"contents[].parts\": [\n {}\n ],\n \"contents[].parts[].text\": \"<string>\",\n \"contents[].parts[].inlineData\": {},\n \"contents[].parts[].inlineData.mimeType\": \"<string>\",\n \"contents[].parts[].inlineData.data\": \"<string>\",\n \"generationConfig\": {},\n \"generationConfig.responseModalities\": [\n \"<string>\"\n ],\n \"generationConfig.imageConfig\": {},\n \"generationConfig.imageConfig.aspectRatio\": \"<string>\",\n \"generationConfig.imageConfig.imageSize\": \"<string>\",\n \"safetySettings\": [\n {}\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.geeknow.top/v1beta/models/{model}:generateContent")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"contents\": [\n {}\n ],\n \"contents[].role\": \"<string>\",\n \"contents[].parts\": [\n {}\n ],\n \"contents[].parts[].text\": \"<string>\",\n \"contents[].parts[].inlineData\": {},\n \"contents[].parts[].inlineData.mimeType\": \"<string>\",\n \"contents[].parts[].inlineData.data\": \"<string>\",\n \"generationConfig\": {},\n \"generationConfig.responseModalities\": [\n \"<string>\"\n ],\n \"generationConfig.imageConfig\": {},\n \"generationConfig.imageConfig.aspectRatio\": \"<string>\",\n \"generationConfig.imageConfig.imageSize\": \"<string>\",\n \"safetySettings\": [\n {}\n ]\n}"
response = http.request(request)
puts response.read_body{
"candidates": [
{
"content": {
"role": "model",
"parts": [
{
"inlineData": {
"mimeType": "image/png",
"data": "BASE64_OR_URL"
}
}
]
},
"finishReason": "STOP"
}
],
"usageMetadata": {
"promptTokenCount": 123,
"candidatesTokenCount": 456,
"totalTokenCount": 579,
"trafficType": "ON_DEMAND"
},
"modelVersion": "gemini-3-pro-image-preview",
"createTime": "2026-05-21T00:00:00Z"
}
Gemini 图像生成
Gemini 图像生成 API
使用 POST /v1beta/models/{model}:generateContent 调用 Gemini 图像生成接口,统一覆盖 gemini-3-pro-image-preview、gemini-2.5-flash-image-preview、gemini-3.1-flash-image-preview 和 gemini-3.1-flash-lite-image。
POST
https://www.geeknow.top
/
v1beta
/
models
/
{model}
:generateContent
Gemini 图像生成 API
curl --request POST \
--url https://www.geeknow.top/v1beta/models/{model}:generateContent \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"contents": [
{}
],
"contents[].role": "<string>",
"contents[].parts": [
{}
],
"contents[].parts[].text": "<string>",
"contents[].parts[].inlineData": {},
"contents[].parts[].inlineData.mimeType": "<string>",
"contents[].parts[].inlineData.data": "<string>",
"generationConfig": {},
"generationConfig.responseModalities": [
"<string>"
],
"generationConfig.imageConfig": {},
"generationConfig.imageConfig.aspectRatio": "<string>",
"generationConfig.imageConfig.imageSize": "<string>",
"safetySettings": [
{}
]
}
'import requests
url = "https://www.geeknow.top/v1beta/models/{model}:generateContent"
payload = {
"contents": [{}],
"contents[].role": "<string>",
"contents[].parts": [{}],
"contents[].parts[].text": "<string>",
"contents[].parts[].inlineData": {},
"contents[].parts[].inlineData.mimeType": "<string>",
"contents[].parts[].inlineData.data": "<string>",
"generationConfig": {},
"generationConfig.responseModalities": ["<string>"],
"generationConfig.imageConfig": {},
"generationConfig.imageConfig.aspectRatio": "<string>",
"generationConfig.imageConfig.imageSize": "<string>",
"safetySettings": [{}]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
contents: [{}],
'contents[].role': '<string>',
'contents[].parts': [{}],
'contents[].parts[].text': '<string>',
'contents[].parts[].inlineData': {},
'contents[].parts[].inlineData.mimeType': '<string>',
'contents[].parts[].inlineData.data': '<string>',
generationConfig: {},
'generationConfig.responseModalities': ['<string>'],
'generationConfig.imageConfig': {},
'generationConfig.imageConfig.aspectRatio': '<string>',
'generationConfig.imageConfig.imageSize': '<string>',
safetySettings: [{}]
})
};
fetch('https://www.geeknow.top/v1beta/models/{model}:generateContent', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://www.geeknow.top/v1beta/models/{model}:generateContent",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'contents' => [
[
]
],
'contents[].role' => '<string>',
'contents[].parts' => [
[
]
],
'contents[].parts[].text' => '<string>',
'contents[].parts[].inlineData' => [
],
'contents[].parts[].inlineData.mimeType' => '<string>',
'contents[].parts[].inlineData.data' => '<string>',
'generationConfig' => [
],
'generationConfig.responseModalities' => [
'<string>'
],
'generationConfig.imageConfig' => [
],
'generationConfig.imageConfig.aspectRatio' => '<string>',
'generationConfig.imageConfig.imageSize' => '<string>',
'safetySettings' => [
[
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://www.geeknow.top/v1beta/models/{model}:generateContent"
payload := strings.NewReader("{\n \"contents\": [\n {}\n ],\n \"contents[].role\": \"<string>\",\n \"contents[].parts\": [\n {}\n ],\n \"contents[].parts[].text\": \"<string>\",\n \"contents[].parts[].inlineData\": {},\n \"contents[].parts[].inlineData.mimeType\": \"<string>\",\n \"contents[].parts[].inlineData.data\": \"<string>\",\n \"generationConfig\": {},\n \"generationConfig.responseModalities\": [\n \"<string>\"\n ],\n \"generationConfig.imageConfig\": {},\n \"generationConfig.imageConfig.aspectRatio\": \"<string>\",\n \"generationConfig.imageConfig.imageSize\": \"<string>\",\n \"safetySettings\": [\n {}\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://www.geeknow.top/v1beta/models/{model}:generateContent")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"contents\": [\n {}\n ],\n \"contents[].role\": \"<string>\",\n \"contents[].parts\": [\n {}\n ],\n \"contents[].parts[].text\": \"<string>\",\n \"contents[].parts[].inlineData\": {},\n \"contents[].parts[].inlineData.mimeType\": \"<string>\",\n \"contents[].parts[].inlineData.data\": \"<string>\",\n \"generationConfig\": {},\n \"generationConfig.responseModalities\": [\n \"<string>\"\n ],\n \"generationConfig.imageConfig\": {},\n \"generationConfig.imageConfig.aspectRatio\": \"<string>\",\n \"generationConfig.imageConfig.imageSize\": \"<string>\",\n \"safetySettings\": [\n {}\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.geeknow.top/v1beta/models/{model}:generateContent")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"contents\": [\n {}\n ],\n \"contents[].role\": \"<string>\",\n \"contents[].parts\": [\n {}\n ],\n \"contents[].parts[].text\": \"<string>\",\n \"contents[].parts[].inlineData\": {},\n \"contents[].parts[].inlineData.mimeType\": \"<string>\",\n \"contents[].parts[].inlineData.data\": \"<string>\",\n \"generationConfig\": {},\n \"generationConfig.responseModalities\": [\n \"<string>\"\n ],\n \"generationConfig.imageConfig\": {},\n \"generationConfig.imageConfig.aspectRatio\": \"<string>\",\n \"generationConfig.imageConfig.imageSize\": \"<string>\",\n \"safetySettings\": [\n {}\n ]\n}"
response = http.request(request)
puts response.read_body{
"candidates": [
{
"content": {
"role": "model",
"parts": [
{
"inlineData": {
"mimeType": "image/png",
"data": "BASE64_OR_URL"
}
}
]
},
"finishReason": "STOP"
}
],
"usageMetadata": {
"promptTokenCount": 123,
"candidatesTokenCount": 456,
"totalTokenCount": 579,
"trafficType": "ON_DEMAND"
},
"modelVersion": "gemini-3-pro-image-preview",
"createTime": "2026-05-21T00:00:00Z"
}
Gemini 图像生成 API
Gemini 图像模型统一使用官方generateContent 格式生图,适合直接复用 contents / parts 结构。
- 路径为
POST /v1beta/models/{model}:generateContent。 - 文生图和图生图都走同一套
contents[].parts[]结构。 - 参考图通过
parts[].inlineData传入。 generationConfig.responseModalities建议同时请求IMAGE和TEXT。- 返回里既可能直接给
inlineData.dataBase64,也可能给图片 URL。
支持模型
gemini-3-pro-image-previewgemini-2.5-flash-image-previewgemini-3.1-flash-image-previewgemini-3.1-flash-lite-image
模型差异
| 模型 | imageSize 行为 | 说明 |
|---|---|---|
gemini-3-pro-image-preview | 支持 1K、2K | 会按请求里的 imageSize 真实下发 |
gemini-2.5-flash-image-preview | 实际回落为 1K | 即使请求中传 2K,最终也会按 1K 处理 |
gemini-3.1-flash-image-preview | 实际回落为 1K | 即使请求中传 2K,最终也会按 1K 处理 |
gemini-3.1-flash-lite-image | 实际回落为 1K | 即使请求中传 2K,最终也会按 1K 处理 |
Body
输入内容列表。每项通常包含
role 和 parts。角色字段,常用值为
user。内容片段数组。提示词和参考图都在这里构造。
文本提示词。
参考图输入。包含
mimeType 和 data 两个字段。图片 MIME 类型,常见值为
image/jpeg、image/png、image/webp。Base64 编码的图片内容。
生成配置对象。
返回模态列表。建议同时请求
IMAGE 和 TEXT。图像配置对象。
图片比例。常见值包括
1:1、16:9、9:16、4:3、3:4、3:2、2:3、21:9。图片清晰度。
gemini-3-pro-image-preview 支持 1K 和 2K;gemini-2.5-flash-image-preview、gemini-3.1-flash-image-preview 与 gemini-3.1-flash-lite-image 会实际回落为 1K。安全设置。可不传。
图生图请求结构
Gemini 不提供单独的编辑接口。图生图请求会将参考图直接作为输入内容写入contents[].parts[]。
可简化理解为:
- 文生图:
parts[]里只有文本。 - 图生图:
parts[]里同时包含文本和图片。
文生图 vs 图生图
| 场景 | parts[] 内容 | 说明 |
|---|---|---|
| 文生图 | 只有 text | 纯提示词生成 |
| 图生图 | text + 一个或多个 inlineData | 让模型参考已有图片风格、主体或构图 |
图生图字段构造
请求构造可遵循以下规则:- 第一类内容是提示词:
{ "text": "..." } - 第二类内容是参考图:
{ "inlineData": { "mimeType": "...", "data": "BASE64..." } }
parts[]。
图生图示例
{
"contents": [
{
"role": "user",
"parts": [
{ "text": "保留参考图的主体氛围,重做成更高级的海报" },
{
"inlineData": {
"mimeType": "image/jpeg",
"data": "BASE64_IMAGE"
}
}
]
}
],
"generationConfig": {
"responseModalities": ["TEXT", "IMAGE"],
"imageConfig": {
"aspectRatio": "16:9",
"imageSize": "2K"
}
}
}
方法与路径
POST /v1beta/models/{model}:generateContent
请求示例
curl -X POST https://www.geeknow.top/v1beta/models/gemini-3-pro-image-preview:generateContent \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"contents": [
{
"role": "user",
"parts": [
{ "text": "一张未来感 AI 工作台场景,冷色氛围,电影级布光" }
]
}
],
"generationConfig": {
"responseModalities": ["TEXT", "IMAGE"],
"temperature": 1.0,
"topP": 0.95,
"maxOutputTokens": 8192,
"imageConfig": {
"aspectRatio": "16:9",
"imageSize": "2K"
}
}
}'
import requests
resp = requests.post(
"https://www.geeknow.top/v1beta/models/gemini-3-pro-image-preview:generateContent",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Accept": "application/json",
"Content-Type": "application/json",
},
json={
"contents": [
{
"role": "user",
"parts": [
{"text": "一张未来感 AI 工作台场景,冷色氛围,电影级布光"}
],
}
],
"generationConfig": {
"responseModalities": ["TEXT", "IMAGE"],
"temperature": 1.0,
"topP": 0.95,
"maxOutputTokens": 8192,
"imageConfig": {
"aspectRatio": "16:9",
"imageSize": "2K",
},
},
},
timeout=60,
)
print(resp.json())
const response = await fetch(
"https://www.geeknow.top/v1beta/models/gemini-3-pro-image-preview:generateContent",
{
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
Accept: "application/json",
"Content-Type": "application/json",
},
body: JSON.stringify({
contents: [
{
role: "user",
parts: [{ text: "一张未来感 AI 工作台场景,冷色氛围,电影级布光" }],
},
],
generationConfig: {
responseModalities: ["TEXT", "IMAGE"],
temperature: 1.0,
topP: 0.95,
maxOutputTokens: 8192,
imageConfig: {
aspectRatio: "16:9",
imageSize: "2K",
},
},
}),
}
);
console.log(await response.json());
图生图示例
{
"contents": [
{
"role": "user",
"parts": [
{ "text": "融合参考图风格,输出一张高清横版海报" },
{
"inlineData": {
"mimeType": "image/jpeg",
"data": "BASE64_IMAGE_1"
}
},
{
"inlineData": {
"mimeType": "image/jpeg",
"data": "BASE64_IMAGE_2"
}
}
]
}
],
"generationConfig": {
"responseModalities": ["TEXT", "IMAGE"],
"imageConfig": {
"aspectRatio": "16:9",
"imageSize": "2K"
}
}
}
图生图字段解释
| 字段 | 图生图里的作用 |
|---|---|
parts[].text | 告诉模型“你要怎么改、保留什么、输出成什么风格” |
parts[].inlineData.mimeType | 声明参考图格式 |
parts[].inlineData.data | 参考图的 Base64 内容 |
imageConfig.aspectRatio | 约束最终出图比例 |
imageConfig.imageSize | 约束最终出图清晰度 |
参考图数量
多参考图可以按顺序追加多个inlineData:
- 支持 1 张参考图
- 也支持多张参考图
- 多张时就是连续放多个
inlineData
返回值说明
Gemini 生图返回的图片通常在:candidates[0].content.parts[].inlineData.data
- 直接是 Base64 图片数据
- 直接是图片 URL
BASE64_OR_URL 表示这两种可能的返回形式。
响应示例
{
"candidates": [
{
"content": {
"role": "model",
"parts": [
{
"inlineData": {
"mimeType": "image/png",
"data": "BASE64_OR_URL"
}
}
]
},
"finishReason": "STOP"
}
],
"usageMetadata": {
"promptTokenCount": 123,
"candidatesTokenCount": 456,
"totalTokenCount": 579,
"trafficType": "ON_DEMAND"
},
"modelVersion": "gemini-3-pro-image-preview",
"createTime": "2026-05-21T00:00:00Z"
}
Response
返回图片 MIME 类型。
图片数据。可能是 Base64,也可能直接是图片 URL。
Token 统计信息。
异步调用
Gemini 图像模型也支持通过统一图像异步入口提交任务:POST /v1/images/generations/async
contents[].parts[] 请求体。model 可以传 gemini-3-pro-image-preview、gemini-2.5-flash-image-preview、gemini-3.1-flash-image-preview 或 gemini-3.1-flash-lite-image。提交成功后读取返回的 id / task_id,再通过 GET /v1/images/generations/async/{taskId} 查询状态和结果。
相关接口
⌘I