gemini-3-pro-image-preview 生图 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",
"promptTokensDetails": [
{
"modality": "TEXT",
"tokenCount": 23
}
],
"candidatesTokensDetails": [
{
"modality": "IMAGE",
"tokenCount": 456
}
]
},
"modelVersion": "gemini-3-pro-image-preview",
"createTime": "2026-05-21T00:00:00Z"
}
gemini-3-pro-image-preview 生图 API
使用 POST /v1beta/models/gemini-3-pro-image-preview:generateContent 调用 Gemini 官方格式生图接口。
POST
https://www.geeknow.top
/
v1beta
/
models
/
{model}
:generateContent
gemini-3-pro-image-preview 生图 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",
"promptTokensDetails": [
{
"modality": "TEXT",
"tokenCount": 23
}
],
"candidatesTokensDetails": [
{
"modality": "IMAGE",
"tokenCount": 456
}
]
},
"modelVersion": "gemini-3-pro-image-preview",
"createTime": "2026-05-21T00:00:00Z"
}
gemini-3-pro-image-preview 生图 API
这个模型使用 Gemini 官方generateContent 格式生图,适合直接复用 contents / parts 结构,并且支持 2K 尺寸档位。
- 路径为
POST /v1beta/models/{model}:generateContent。 model固定传gemini-3-pro-image-preview。- 文生图和图生图都走同一套
contents[].parts[]结构。 generationConfig.responseModalities建议同时请求IMAGE和TEXT。- 返回里既可能直接给
inlineData.dataBase64,也可能给图片 URL。
先看懂图生图
Gemini 这里的图生图,本质上就是:- 把文字提示词放进
parts[].text - 把参考图按顺序继续塞进同一个
parts[] - 让模型在同一次
generateContent里同时看到“文字要求 + 图片参考”
- 文生图:
parts[]里只有text - 图生图:
parts[]里除了text,还会追加一个或多个inlineData
generateContent 里,把图片当作输入的一部分传进去。
文生图 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/gemini-3-pro-image-preview: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())
图生图示例
{
"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 表示这两种可能的返回形式。
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。图片清晰度。这个模型支持
1K 和 2K。安全设置。可不传。
响应示例
{
"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",
"promptTokensDetails": [
{
"modality": "TEXT",
"tokenCount": 23
}
],
"candidatesTokensDetails": [
{
"modality": "IMAGE",
"tokenCount": 456
}
]
},
"modelVersion": "gemini-3-pro-image-preview",
"createTime": "2026-05-21T00:00:00Z"
}
Response
返回图片 MIME 类型。
图片数据。可能是 Base64,也可能直接是图片 URL。
Token 统计信息。
gemini-3-pro-image-preview 会按请求里的 imageSize 下发,2K 会保留,不会被强制回落到 1K。异步调用
gemini-3-pro-image-preview 也支持通过统一图像异步入口提交任务:
POST /v1/images/generations/async
id / task_id,再通过 GET /v1/images/generations/async/{taskId} 查询状态和结果。
相关接口
⌘I