article
Nano Banana (Google Gemini Image)
google推出的文生图/图生图模型。
gemini-2.5-flash-image (Nano-Banana)
gemini-3-pro-image-preview (Nano-Banana-Pro)
https://gateway.theturbo.ai/v1/v1beta/models/{model}:generateContent
| 参数名称 |
类型 |
必填 |
说明 |
示例值 |
Content-Type |
string |
是 |
设置请求头类型,必须为application/json |
application/json |
Authorization |
string |
是 |
身份验证所需的 API_KEY,格式Bearer $YOUR_API_KEY |
Bearer $YOUR_API_KEY |
3.2 Body 参数 (application/json) link
| 参数名称 |
类型 |
必填 |
说明 |
示例(默认值) |
| 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 |
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.theturbo.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 (
"encoding/base64"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"os"
"strings"
)
const (
MODEL = "gemini-2.5-flash-image"
YOUR_API_KEY = "sk-123456789012345678901234567890123456789012345678"
REQUEST_PAYLOAD = `{
"contents": [{
"role": "user",
"parts": [{
"text": "A cute baby sea otter"
}]
}],
"generationConfig": {
"imageConfig": {
"aspectRatio": "4:3",
"imageSize": "1K"
}
}
}`
EXAMPLE_OUTPUT_PATH = "output.png"
)
type InlineData struct {
MimeType string `json:"mimeType"`
Data string `json:"data"`
}
type Part struct {
InlineData *InlineData `json:"inlineData"`
}
type Content struct {
Role string `json:"role"`
Parts []Part `json:"parts"`
}
type Candidate struct {
Content Content `json:"content"`
}
type ResponseJSON struct {
Candidates []Candidate `json:"candidates"`
}
func main() {
requestURL := fmt.Sprintf("https://gateway.theturbo.ai/v1/v1beta/models/%s:generateContent", MODEL)
requestMethod := "POST"
requestPayload := strings.NewReader(REQUEST_PAYLOAD)
req, err := http.NewRequest(requestMethod, requestURL, requestPayload)
if err != nil {
fmt.Println("Create request failed, err: ", err)
return
}
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Accept", "application/json")
req.Header.Add("Authorization", "Bearer "+YOUR_API_KEY)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("Do request failed, err: ", err)
return
}
defer resp.Body.Close()
respBodyBytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Read response body failed, err: ", err)
return
}
if resp.StatusCode != 200 {
fmt.Printf("status code: %d\n", resp.StatusCode)
fmt.Println(string(respBodyBytes))
return
}
var responseJSON ResponseJSON
if err := json.Unmarshal(respBodyBytes, &responseJSON); err != nil {
fmt.Println("Parse response body failed, err: ", err)
return
}
var base64JSON string
for _, candidate := range responseJSON.Candidates {
for _, part := range candidate.Content.Parts {
if part.InlineData != nil && part.InlineData.MimeType == "image/png" && part.InlineData.Data != "" {
base64JSON = part.InlineData.Data
break
}
}
if base64JSON != "" {
break
}
}
if base64JSON == "" {
fmt.Println("Parse response body failed, err: empty b64_json")
return
}
imageData, err := base64.StdEncoding.DecodeString(base64JSON)
if err != nil {
fmt.Println("Parse b64_json failed, err: ", err)
return
}
imageFile, err := os.Create(EXAMPLE_OUTPUT_PATH)
if err != nil {
fmt.Printf("Create file %s failed, err: %v\n", EXAMPLE_OUTPUT_PATH, err)
return
}
if _, err := imageFile.Write(imageData); err != nil {
fmt.Printf("Write to file %s failed, err: %v\n", EXAMPLE_OUTPUT_PATH, err)
imageFile.Close()
return
}
imageFile.Close()
fmt.Println("success to write to file ", EXAMPLE_OUTPUT_PATH)
}
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.theturbo.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 (
"encoding/base64"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"os"
"strings"
)
const (
MODEL = "gemini-2.5-flash-image"
YOUR_API_KEY = "sk-123456789012345678901234567890123456789012345678"
REQUEST_PAYLOAD = `{
"contents": [{
"role": "user",
"parts": [{
"text": "add a rainbow"
}, {
"inlineData": {
"mimeType": "image/png",
"data": "%s"
}
}]
}],
"generationConfig": {
"imageConfig": {
"aspectRatio": "4:3",
"imageSize": "1K"
}
}
}`
EXAMPLE_INPUT_PATH = "input.png"
EXAMPLE_OUTPUT_PATH = "output.png"
)
type InlineData struct {
MimeType string `json:"mimeType"`
Data string `json:"data"`
}
type Part struct {
InlineData *InlineData `json:"inlineData"`
}
type Content struct {
Role string `json:"role"`
Parts []Part `json:"parts"`
}
type Candidate struct {
Content Content `json:"content"`
}
type ResponseJSON struct {
Candidates []Candidate `json:"candidates"`
}
func main() {
inputFileData, err := os.ReadFile(EXAMPLE_INPUT_PATH)
if err != nil {
fmt.Println("Read input file failed, err: ", err)
return
}
requestPayloadString := fmt.Sprintf(REQUEST_PAYLOAD, base64.StdEncoding.EncodeToString(inputFileData))
requestURL := fmt.Sprintf("https://gateway.theturbo.ai/v1/v1beta/models/%s:generateContent", MODEL)
requestMethod := "POST"
requestPayload := strings.NewReader(requestPayloadString)
req, err := http.NewRequest(requestMethod, requestURL, requestPayload)
if err != nil {
fmt.Println("Create request failed, err: ", err)
return
}
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Accept", "application/json")
req.Header.Add("Authorization", "Bearer "+YOUR_API_KEY)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("Do request failed, err: ", err)
return
}
defer resp.Body.Close()
respBodyBytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Read response body failed, err: ", err)
return
}
if resp.StatusCode != 200 {
fmt.Printf("status code: %d\n", resp.StatusCode)
fmt.Println(string(respBodyBytes))
return
}
var responseJSON ResponseJSON
if err := json.Unmarshal(respBodyBytes, &responseJSON); err != nil {
fmt.Println("Parse response body failed, err: ", err)
return
}
var base64JSON string
for _, candidate := range responseJSON.Candidates {
for _, part := range candidate.Content.Parts {
if part.InlineData != nil && part.InlineData.MimeType == "image/png" && part.InlineData.Data != "" {
base64JSON = part.InlineData.Data
break
}
}
if base64JSON != "" {
break
}
}
if base64JSON == "" {
fmt.Println("Parse response body failed, err: empty b64_json")
return
}
imageData, err := base64.StdEncoding.DecodeString(base64JSON)
if err != nil {
fmt.Println("Parse b64_json failed, err: ", err)
return
}
imageFile, err := os.Create(EXAMPLE_OUTPUT_PATH)
if err != nil {
fmt.Printf("Create file %s failed, err: %v\n", EXAMPLE_OUTPUT_PATH, err)
return
}
if _, err := imageFile.Write(imageData); err != nil {
fmt.Printf("Write to file %s failed, err: %v\n", EXAMPLE_OUTPUT_PATH, err)
imageFile.Close()
return
}
imageFile.Close()
fmt.Println("success to write to file ", EXAMPLE_OUTPUT_PATH)
}
{
"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"
}