Langsung ke konten utama
Panduan ini menunjukkan cara menggunakan model gambar Gemini melalui CometAPI dengan Google Gen AI SDK. Panduan ini mencakup:
  • Pembuatan text-to-image
  • Pengeditan image-to-image
  • Komposisi multi-gambar
  • Menyimpan gambar yang dihasilkan
  • Base URL: https://api.cometapi.com
  • Instal SDK: pip install google-genai (Python) atau npm install @google/genai (Node.js)

Setup

Inisialisasi client dengan base URL CometAPI:
from google import genai
from google.genai import types
import os

COMETAPI_KEY = os.environ["COMETAPI_KEY"]

client = genai.Client(
    http_options={"api_version": "v1beta", "base_url": "https://api.cometapi.com"},
    api_key=COMETAPI_KEY,
)

Pembuatan gambar dari teks

Hasilkan gambar dari prompt teks dan simpan ke file.
from google import genai
from google.genai import types
from PIL import Image
import os

client = genai.Client(
    http_options={"api_version": "v1beta", "base_url": "https://api.cometapi.com"},
    api_key=os.environ.get("COMETAPI_KEY"),
)

response = client.models.generate_content(
    model="gemini-3.1-flash-image-preview",
    contents="Create a picture of a nano banana dish in a fancy restaurant with a Gemini theme",
    config=types.GenerateContentConfig(
        response_modalities=["TEXT", "IMAGE"],
    ),
)

final_image = None
for part in response.parts:
    if getattr(part, "thought", False):
        continue
    if part.text is not None:
        print(part.text)
    elif part.inline_data is not None:
        final_image = part.as_image()

if final_image:
    final_image.save("generated_image.png")
    print("Image saved to generated_image.png")
Simpan bagian gambar final: Data gambar berada di candidates[0].content.parts, yang dapat berisi bagian teks dan/atau gambar. Model gambar Gemini juga dapat mengembalikan bagian thought perantara sebelum gambar final, terutama saat Anda meminta teks dan gambar sekaligus atau secara eksplisit mengaktifkan output thinking. Jangan langsung menyimpan inlineData pertama; lewati bagian dengan thought bernilai true, lalu simpan bagian gambar terakhir yang tersisa. Respons tipikal yang hanya berisi gambar final:
{
  "candidates": [{
    "content": {
      "parts": [
        { "text": "Here is your image..." },
        {
          "inlineData": {
            "mimeType": "image/png",
            "data": "<base64-encoded-image>"
          }
        }
      ]
    }
  }]
}
Respons dengan bagian teks, gambar thought perantara, dan gambar final:
{
  "candidates": [{
    "content": {
      "role": "model",
      "parts": [
        { "text": "Here is your image..." },
        {
          "inlineData": {
            "mimeType": "image/jpeg",
            "data": "<base64-encoded-intermediate-image>"
          },
          "thought": true
        },
        {
          "inlineData": {
            "mimeType": "image/jpeg",
            "data": "<base64-encoded-final-image>"
          },
          "thought": false,
          "thoughtSignature": "<signature>"
        }
      ]
    },
    "finishReason": "STOP"
  }]
}
Gunakan aturan parsing ini untuk setiap respons gambar Gemini:
const imageParts = response.candidates[0].content.parts.filter(
  (part) => part.inlineData && part.thought !== true,
);
const finalImagePart = imageParts.at(-1);

Pembuatan image-to-image

Unggah gambar input dan transformasikan dengan Prompt teks.
from google import genai
from google.genai import types
from PIL import Image
import os

client = genai.Client(
    http_options={"api_version": "v1beta", "base_url": "https://api.cometapi.com"},
    api_key=os.environ.get("COMETAPI_KEY"),
)

# Load the source image
source_image = Image.open("source.jpg")

response = client.models.generate_content(
    model="gemini-3.1-flash-image-preview",
    contents=["Transform this into a watercolor painting", source_image],
    config=types.GenerateContentConfig(
        response_modalities=["TEXT", "IMAGE"],
    ),
)

final_image = None
for part in response.parts:
    if getattr(part, "thought", False):
        continue
    if part.text is not None:
        print(part.text)
    elif part.inline_data is not None:
        final_image = part.as_image()

if final_image:
    final_image.save("watercolor_output.png")
  • SDK Python menerima objek PIL.Image secara langsung — tidak perlu encoding Base64 manual.
  • Jangan sertakan prefiks data:image/jpeg;base64, saat meneruskan string Base64 mentah.

Komposisi multi-image

Hasilkan image baru dari beberapa image input. CometAPI mendukung dua pendekatan:

Metode 1: Satu image kolase

Gabungkan beberapa image sumber menjadi satu kolase, lalu deskripsikan output yang diinginkan.
Contoh kolase input
Output yang dihasilkan
from google import genai
from google.genai import types
from PIL import Image
import os

client = genai.Client(
    http_options={"api_version": "v1beta", "base_url": "https://api.cometapi.com"},
    api_key=os.environ.get("COMETAPI_KEY"),
)

collage = Image.open("collage.jpg")

response = client.models.generate_content(
    model="gemini-3.1-flash-image-preview",
    contents=[
        "A model is posing and leaning against a pink BMW with a green alien keychain attached to a pink handbag, a pink parrot on her shoulder, and a pug wearing a pink collar and gold headphones",
        collage,
    ],
    config=types.GenerateContentConfig(
        response_modalities=["TEXT", "IMAGE"],
    ),
)

final_image = None
for part in response.parts:
    if getattr(part, "thought", False):
        continue
    if part.inline_data is not None:
        final_image = part.as_image()

if final_image:
    final_image.save("composition_output.png")

Metode 2: Beberapa image terpisah (hingga 14)

Teruskan beberapa image secara langsung. Model Gemini 3 mendukung hingga 14 image referensi (objek + karakter):
from google import genai
from google.genai import types
from PIL import Image
import os

client = genai.Client(
    http_options={"api_version": "v1beta", "base_url": "https://api.cometapi.com"},
    api_key=os.environ.get("COMETAPI_KEY"),
)

image1 = Image.open("image1.jpg")
image2 = Image.open("image2.jpg")
image3 = Image.open("image3.jpg")

response = client.models.generate_content(
    model="gemini-3.1-flash-image-preview",
    contents=["Merge the three images", image1, image2, image3],
    config=types.GenerateContentConfig(
        response_modalities=["TEXT", "IMAGE"],
    ),
)

final_image = None
for part in response.parts:
    if getattr(part, "thought", False):
        continue
    if part.inline_data is not None:
        final_image = part.as_image()

if final_image:
    final_image.save("merged_output.png")
Hasil generasi multi-image

Pembuatan gambar 4K

Tentukan image_config dengan aspect_ratio dan image_size untuk output resolusi tinggi:
from google import genai
from google.genai import types
import os

client = genai.Client(
    http_options={"api_version": "v1beta", "base_url": "https://api.cometapi.com"},
    api_key=os.environ.get("COMETAPI_KEY"),
)

response = client.models.generate_content(
    model="gemini-3.1-flash-image-preview",
    contents="Da Vinci style anatomical sketch of a Monarch butterfly on textured parchment",
    config=types.GenerateContentConfig(
        response_modalities=["TEXT", "IMAGE"],
        image_config=types.ImageConfig(
            aspect_ratio="1:1",
            image_size="4K",
        ),
    ),
)

final_image = None
for part in response.parts:
    if getattr(part, "thought", False):
        continue
    if part.text is not None:
        print(part.text)
    elif image := part.as_image():
        final_image = image

if final_image:
    final_image.save("butterfly_4k.png")
Untuk permintaan resolusi tinggi, nilai output berdasarkan bagian gambar non-thought terakhir. Jika integrasi Anda menyimpan bagian inlineData pertama, integrasi tersebut mungkin menyimpan gambar thought perantara yang resolusinya lebih rendah daripada imageSize yang diminta.

Pengeditan gambar multi-turn (chat)

Gunakan fitur chat SDK untuk menyempurnakan gambar secara iteratif:
from google import genai
from google.genai import types
import os

client = genai.Client(
    http_options={"api_version": "v1beta", "base_url": "https://api.cometapi.com"},
    api_key=os.environ.get("COMETAPI_KEY"),
)

chat = client.chats.create(
    model="gemini-3.1-flash-image-preview",
    config=types.GenerateContentConfig(
        response_modalities=["TEXT", "IMAGE"],
    ),
)

## First turn: Generate
response = chat.send_message(
    "Create a vibrant infographic explaining photosynthesis as a recipe, styled like a colorful kids cookbook"
)

final_image = None
for part in response.parts:
    if getattr(part, "thought", False):
        continue
    if part.text is not None:
        print(part.text)
    elif image := part.as_image():
        final_image = image

if final_image:
    final_image.save("photosynthesis.png")

Tips

Tentukan kata kunci gaya (misalnya, “cyberpunk, grain film, kontras rendah”), aspect ratio, subjek, latar belakang, pencahayaan, dan tingkat detail.
Saat menggunakan HTTP mentah, jangan sertakan prefiks data:image/png;base64, — gunakan hanya string Base64 mentah. SDK Python menangani ini secara otomatis dengan objek PIL.Image.
Setel "responseModalities" ke ["IMAGE"] saja untuk menjamin output gambar tanpa teks.
Periksa apakah kode Anda menyimpan gambar thought perantara. Respons gambar Gemini dapat menyertakan bagian gambar di mana thought bernilai true; ini bukan output akhir. Lewati bagian thought: true dan simpan bagian gambar terakhir di mana inlineData ada dan thought tidak bernilai true. Jika Anda tidak memerlukan output teks, minta "responseModalities": ["IMAGE"] untuk mengurangi penanganan respons campuran teks/gambar.
Untuk detail lebih lanjut, lihat Referensi API. Dokumentasi resmi: Pembuatan gambar Nano Banana