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)
}