> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tokenlab.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Buat Variasi Gambar

> Membuat variasi dari gambar yang diberikan

## Ikhtisar

Endpoint ini dipertahankan untuk client variasi legacy yang kompatibel dengan OpenAI. Ini bukan jalur yang direkomendasikan untuk workflow image-to-image saat ini; gunakan `/v1/images/edits` dengan `gpt-image-2` atau `/v1/images/generations` dengan model image-to-image seperti `nano-banana-pro` jika memungkinkan. Memerlukan `multipart/form-data`.

## Isi Permintaan

**Timeout permintaan sinkron:** beberapa penyedia gambar yang dirutekan mengembalikan gambar final secara inline dan menunggu proses generasi selesai. Permintaan resolusi tinggi atau kualitas tinggi dapat memakan waktu hampir satu menit atau lebih, jadi atur timeout HTTP client Anda minimal `120s`. Jika respons pembuatan berisi `status: "pending"`, `task_id`, atau `poll_url`, ikuti `poll_url` yang dikembalikan.

<ParamField body="image" type="file" required>
  Gambar yang digunakan sebagai dasar untuk variasi. Harus berupa file PNG yang valid, kurang dari 50MB, dan berbentuk persegi.
</ParamField>

<ParamField body="model" type="string" required>
  ID model wajib untuk rute legacy yang kompatibel dengan variasi. Tidak ada default implisit; untuk workflow image-to-image saat ini, pilih `/v1/images/edits` atau `/v1/images/generations` dengan model saat ini.
</ParamField>

<ParamField body="n" type="integer" default="1">
  Jumlah gambar yang akan dihasilkan. Harus antara 1 dan 10.
</ParamField>

<ParamField body="size" type="string">
  Ukuran gambar yang dihasilkan untuk rute legacy yang kompatibel dengan variasi. Nilai yang didukung bergantung pada model yang dipilih.
</ParamField>

<ParamField body="response_format" type="string" default="url">
  Format pengembalian gambar yang dihasilkan. Harus `url` atau `b64_json`.
</ParamField>

<ParamField body="user" type="string">
  Pengidentifikasi unik yang mewakili pengguna akhir Anda untuk pemantauan penyalahgunaan.
</ParamField>

## Respons

<ResponseField name="created" type="integer">
  Timestamp Unix saat gambar dibuat.
</ResponseField>

<ResponseField name="data" type="array">
  Array variasi gambar yang dihasilkan.

  Setiap objek berisi:

  * `url` (string): URL gambar variasi (jika response\_format adalah `url`)
  * `b64_json` (string): Gambar yang dikodekan Base64 (jika response\_format adalah `b64_json`)
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST "https://api.tokenlab.sh/v1/images/variations" \
    -H "Authorization: Bearer sk-your-api-key" \
    -F "model=your-legacy-variation-model" \
    -F "image=@cat.png" \
    -F "n=2" \
    -F "size=1024x1024"
  ```

  ```python Python theme={null}
  from openai import OpenAI

  client = OpenAI(
      api_key="sk-your-api-key",
      base_url="https://api.tokenlab.sh/v1"
  )

  response = client.images.create_variation(
      model="your-legacy-variation-model",
      image=open("cat.png", "rb"),
      n=2,
      size="1024x1024"
  )

  for image in response.data:
      print(image.url)
  ```

  ```javascript JavaScript theme={null}
  import OpenAI from 'openai';
  import fs from 'fs';

  const client = new OpenAI({
    apiKey: 'sk-your-api-key',
    baseURL: 'https://api.tokenlab.sh/v1'
  });

  const response = await client.images.createVariation({
    model: 'your-legacy-variation-model',
    image: fs.createReadStream('cat.png'),
    n: 2,
    size: '1024x1024'
  });

  response.data.forEach(image => console.log(image.url));
  ```

  ```go Go theme={null}
  package main

  import (
      "bytes"
      "fmt"
      "io"
      "mime/multipart"
      "net/http"
      "os"
  )

  func main() {
      body := &bytes.Buffer{}
      writer := multipart.NewWriter(body)

      writer.WriteField("model", "your-legacy-variation-model")

      file, _ := os.Open("cat.png")
      defer file.Close()
      part, _ := writer.CreateFormFile("image", "cat.png")
      io.Copy(part, file)

      writer.WriteField("n", "2")
      writer.WriteField("size", "1024x1024")
      writer.Close()

      req, _ := http.NewRequest("POST", "https://api.tokenlab.sh/v1/images/variations", body)
      req.Header.Set("Authorization", "Bearer sk-your-api-key")
      req.Header.Set("Content-Type", writer.FormDataContentType())

      client := &http.Client{}
      resp, _ := client.Do(req)
      defer resp.Body.Close()

      result, _ := io.ReadAll(resp.Body)
      fmt.Println(string(result))
  }
  ```

  ```php PHP theme={null}
  <?php
  $ch = curl_init('https://api.tokenlab.sh/v1/images/variations');

  $image = new CURLFile('cat.png', 'image/png', 'cat.png');

  curl_setopt_array($ch, [
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_POST => true,
      CURLOPT_HTTPHEADER => [
          'Authorization: Bearer sk-your-api-key'
      ],
      CURLOPT_POSTFIELDS => [
          'model' => 'your-legacy-variation-model',
          'image' => $image,
          'n' => 2,
          'size' => '1024x1024'
      ]
  ]);

  $response = curl_exec($ch);
  curl_close($ch);

  $data = json_decode($response, true);
  foreach ($data['data'] as $image) {
      echo $image['url'] . "\n";
  }
  ```
</RequestExample>

<ResponseExample>
  ```json Respons theme={null}
  {
    "created": 1706000000,
    "data": [
      {
        "url": "https://..."
      },
      {
        "url": "https://..."
      }
    ]
  }
  ```
</ResponseExample>

## Catatan

<Note>
  Ini adalah endpoint kompatibilitas legacy. Endpoint ini tidak termasuk dalam katalog model gambar rekomendasi saat ini. Untuk integrasi baru, gunakan `/v1/images/edits` dengan `gpt-image-2`, atau `/v1/images/generations` dengan `operation: "image-to-image"` dan model image-to-image saat ini.
</Note>
