图片生成(Gemini原生协议)¶
1. 概述¶
google推出的文生图/图生图模型。
2. 请求说明¶
- 请求方法:
POST -
请求地址:
https://gateway.serevixai.ai/v1/v1beta/models/{model}:generateContent
3. 请求参数¶
3.1 Header 参数¶
| 参数名称 | 类型 | 必填 | 说明 | 示例值 |
|---|---|---|---|---|
Content-Type |
string | 是 | 设置请求头类型,必须为 application/json |
application/json |
Authorization |
string | 是 | 身份验证所需的 API_KEY,格式 Bearer $YOUR_API_KEY |
Bearer $YOUR_API_KEY |
3.2 Body 参数 (application/json)¶
| 参数名称 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
| contents | array | 是 | 与模型当前对话的内容。对于单轮查询,这是单个实例。对于多轮查询(例如聊天),这是包含对话历史记录和最新请求的重复字段。 | [{"role":"user","parts":[{"text":"A cute baby sea otter"}]}] |
| content.role | string | 是 | 消息角色。必须是user或model。 |
user |
| content.parts | array | 否 | 构成单条消息的有序 Parts。部分可能具有不同的 MIME 类型。 | [{"text":"A cute baby sea otter"}]}] |
| content.parts.text | string | 否 | 内嵌文本。 | A cute baby sea otter |
| content.parts.inlineData | struct | 否 | 内嵌媒体字节。 | |
| content.parts.inlineData.mimeType | string | 是 | 来源数据的 IANA 标准 MIME 类型。 | image/png |
| content.parts.inlineData.data | string | 是 | 媒体格式的原始字节。使用 base64 编码的字符串。 | |
| generationConfig | struct | 否 | 模型生成和输出的配置选项。 | |
| generationConfig.imageConfig | struct | 否 | 图片生成配置。如果为不支持这些配置选项的模型设置此字段,系统将返回错误。 | |
| generationConfig.imageConfig.aspectRatio | string | 否 | 可选。要生成的图片的宽高比。支持的宽高比:1:1 2:3 3:2 3:4 4:3 9:16 16:9 21:9。 |
16:9 |
| generationConfig.imageConfig.imageSize | string | 否 | 指定生成图片的大小。支持的值为 1K、2K、4K。 |
1K |
4. 请求示例¶
4.1 文生图¶
POST /v1/v1beta/models/gemini-2.5-flash-image:generateContent
Content-Type: application/json
Accept: application/json
Authorization: Bearer $YOUR_API_KEY
{
"contents": [{
"role": "user",
"parts": [{
"text": "A cute baby sea otter"
}]
}],
"generationConfig": {
"imageConfig": {
"aspectRatio": "4:3",
"imageSize": "1K"
}
}
}
curl https://gateway.serevixai.ai/v1/v1beta/models/gemini-2.5-flash-image:generateContent \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer $YOUR_API_KEY" \
-d "{
\"contents\": [{
\"role\": \"user\",
\"parts\": [{
\"text\": \"A cute baby sea otter\"
}]
}],
\"generationConfig\": {
\"imageConfig\": {
\"aspectRatio\": \"4:3\",
\"imageSize\": \"1K\"
}
}
}"
package main
import (
"context"
"fmt"
"os"
"google.golang.org/genai"
)
func main() {
apiKey := "sk-123456789012345678901234567890123456789012345678"
exampleFilePath := "example.png"
client, err := genai.NewClient(
context.Background(),
&genai.ClientConfig{
APIKey: apiKey,
Backend: genai.BackendGeminiAPI,
HTTPOptions: genai.HTTPOptions{
BaseURL: "https://gateway.serevixai.ai",
},
})
if err != nil {
fmt.Println("error creating client:", err)
return
}
resp, err := client.Models.GenerateContent(
context.Background(),
"gemini-2.5-flash-image",
[]*genai.Content{
{
Role: "user",
Parts: []*genai.Part{
{Text: "A cute baby sea otter"},
},
},
},
&genai.GenerateContentConfig{
ImageConfig: &genai.ImageConfig{
AspectRatio: "4:3",
ImageSize: "1K",
},
},
)
if err != nil {
fmt.Println("error:", err)
return
}
var imageData []byte
for _, candidate := range resp.Candidates {
for _, part := range candidate.Content.Parts {
if part.InlineData != nil && part.InlineData.MIMEType == "image/png" {
imageData = part.InlineData.Data
break
}
}
if imageData != nil {
break
}
}
if imageData == nil {
fmt.Println("error: no image data found")
return
}
if err := os.WriteFile(exampleFilePath, imageData, 0644); err != nil {
fmt.Println("error:", err)
return
}
fmt.Println("success to write to file", exampleFilePath)
}
#!/usr/bin/env python3
from google import genai
def main():
api_key = "sk-123456789012345678901234567890123456789012345678"
example_file_path = "example.png"
client = genai.Client(
api_key=api_key,
http_options={
"base_url": "https://gateway.serevixai.ai"
}
)
response = client.models.generate_content(
model="gemini-2.5-flash-image",
contents="A cute baby sea otter",
config=genai.types.GenerateContentConfig(
image_config=genai.types.ImageConfig(
aspect_ratio="4:3",
image_size="1K"
)
)
)
image_data = None
for candidate in response.candidates:
for part in candidate.content.parts:
if part.inline_data and part.inline_data.mime_type == "image/png":
image_data = part.inline_data.data
break
if image_data:
break
if not image_data:
print("error: no image data found")
return
with open(example_file_path, "wb") as f:
f.write(image_data)
print(f"success to write to file {example_file_path}")
if __name__ == "__main__":
main()
4.2 图生图¶
支持的内联图片类型
`image/png` `image/jpeg` `image/webp` `image/heic` `image/heif`POST /v1/v1beta/models/gemini-2.5-flash-image:generateContent
Content-Type: application/json
Accept: application/json
Authorization: Bearer $YOUR_API_KEY
{
"contents": [{
"role": "user",
"parts": [{
"text": "add a rainbow"
}, {
"inlineData": {
"mimeType": "image/png",
"data": "..."
}
}]
}],
"generationConfig": {
"imageConfig": {
"aspectRatio": "4:3",
"imageSize": "1K"
}
}
}
base64_image=$(base64 -i "Path/to/agi/image.png");
curl https://gateway.serevixai.ai/v1/v1beta/models/gemini-2.5-flash-image:generateContent \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer $YOUR_API_KEY" \
-d "{
\"contents\": [{
\"role\": \"user\",
\"parts\": [{
\"text\": \"add a rainbow\"
}, {
\"inlineData\": {
\"mimeType\": \"image/png\",
\"data\": \"${base64_image}\"
}
}]
}],
\"generationConfig\": {
\"imageConfig\": {
\"aspectRatio\": \"4:3\",
\"imageSize\": \"1K\"
}
}
}"
package main
import (
"context"
"fmt"
"os"
"google.golang.org/genai"
)
func main() {
apiKey := "sk-123456789012345678901234567890123456789012345678"
inputPath := "example.png"
outputPath := "example2.png"
inputData, err := os.ReadFile(inputPath)
if err != nil {
fmt.Println("error:", err)
return
}
client, err := genai.NewClient(
context.Background(),
&genai.ClientConfig{
APIKey: apiKey,
Backend: genai.BackendGeminiAPI,
HTTPOptions: genai.HTTPOptions{
BaseURL: "https://gateway.serevixai.ai",
},
})
if err != nil {
fmt.Println("error:", err)
return
}
resp, err := client.Models.GenerateContent(
context.Background(),
"gemini-2.5-flash-image",
[]*genai.Content{
{
Role: "user",
Parts: []*genai.Part{
{Text: "add a rainbow"},
{
InlineData: &genai.Blob{
MIMEType: "image/png",
Data: inputData,
},
},
},
},
},
&genai.GenerateContentConfig{
ImageConfig: &genai.ImageConfig{
AspectRatio: "4:3",
ImageSize: "1K",
},
},
)
if err != nil {
fmt.Println("error:", err)
return
}
var imageData []byte
for _, candidate := range resp.Candidates {
for _, part := range candidate.Content.Parts {
if part.InlineData != nil && part.InlineData.MIMEType == "image/png" {
imageData = part.InlineData.Data
break
}
}
if imageData != nil {
break
}
}
if imageData == nil {
fmt.Println("error: no image data found")
return
}
if err := os.WriteFile(outputPath, imageData, 0644); err != nil {
fmt.Println("error:", err)
return
}
fmt.Println("success to write to file", outputPath)
}
#!/usr/bin/env python3
from google import genai
def main():
api_key = "sk-123456789012345678901234567890123456789012345678"
input_path = "example.png"
output_path = "example2.png"
with open(input_path, "rb") as f:
input_data = f.read()
client = genai.Client(
api_key=api_key,
http_options={
"base_url": "https://gateway.serevixai.ai"
}
)
response = client.models.generate_content(
model="gemini-2.5-flash-image",
contents=[
"add a rainbow",
genai.types.Part(
inline_data=genai.types.Blob(
mime_type="image/png",
data=input_data
)
)
],
config=genai.types.GenerateContentConfig(
image_config=genai.types.ImageConfig(
aspect_ratio="4:3",
image_size="1K"
)
)
)
image_data = None
for candidate in response.candidates:
for part in candidate.content.parts:
if part.inline_data and part.inline_data.mime_type == "image/png":
image_data = part.inline_data.data
break
if image_data:
break
if not image_data:
print("error: no image data found")
return
with open(output_path, "wb") as f:
f.write(image_data)
print(f"success to write to file {output_path}")
if __name__ == "__main__":
main()
5. 响应示例¶
{
"candidates": [
{
"content": {
"role": "model",
"parts": [
{
"inlineData": {
"mimeType": "image/png",
"data": "..."
}
}
]
},
"finishReason": "STOP"
}
],
"usageMetadata": {
"promptTokenCount": 5,
"candidatesTokenCount": 1290,
"totalTokenCount": 1295,
"trafficType": "ON_DEMAND",
"promptTokensDetails": [
{
"modality": "TEXT",
"tokenCount": 5
}
],
"candidatesTokensDetails": [
{
"modality": "IMAGE",
"tokenCount": 1290
}
]
},
"modelVersion": "gemini-2.5-flash-image",
"createTime": "2025-12-02T05:44:30.324935Z",
"responseId": "vmU2acfqE--ijeYP-9ykgAI"
}