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

# Melatih Gaya Kustom

> Latih gaya gambar kustom dari dataset Anda sendiri dan hasilkan output yang konsisten dengan panduan tentang kurasi, tagging, dan praktik iterasi terbaik.

export const HeroHeader = ({image, video, title, description}) => {
  return <div className="relative aspect-[2/1] h-[30vh] w-full rounded-lg overflow-hidden mb-8">
      {}
      {video && <video autoPlay muted loop playsInline className="absolute top-0 left-0 w-full h-full object-cover hidden md:block m-0" style={{
    zIndex: 1,
    objectPosition: "20% 20%"
  }}>
          <source src={video} type="video/webm" />
        </video>}

      {}
      <img src={image} alt="" className={`absolute top-0 left-0 m-0 w-full h-full object-cover ${video ? "md:hidden" : "block"}`} style={{
    zIndex: 1,
    objectPosition: "20% 20%"
  }} />

      {}
      <div className="absolute inset-0 bg-gradient-to-t from-black/70 via-black/30 to-black/10 flex flex-col justify-end p-8 dark:hidden" style={{
    zIndex: 2
  }}>
        <h1 className="text-4xl font-bold text-white m-0 drop-shadow-[0_2px_4px_rgba(0,0,0,0.5)]">
          {title}
        </h1>
        <p className="text-lg text-white/95 mt-2 drop-shadow-[0_1px_2px_rgba(0,0,0,0.5)]">
          {description}
        </p>
      </div>

      {}
      <div className="absolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-black/20 hidden dark:flex flex-col justify-end p-8" style={{
    zIndex: 2
  }}>
        <h1 className="text-4xl font-bold text-white m-0 drop-shadow-[0_2px_4px_rgba(0,0,0,0.5)]">
          {title}
        </h1>
        <p className="text-lg text-white/95 mt-2 drop-shadow-[0_1px_2px_rgba(0,0,0,0.5)]">
          {description}
        </p>
      </div>
    </div>;
};

<HeroHeader image="https://s.krea.ai/docs-lora.webp" title="Latih Gaya Kustom (LoRA)" description="Latih gaya kustom menggunakan gambar Anda sendiri untuk menghasilkan seni AI dengan estetika visual yang konsisten." />

## Ikhtisar

LoRA (Low-Rank Adaptation) adalah teknik fine-tuning yang mengajarkan model AI sebuah gaya visual baru menggunakan sekumpulan kecil gambar contoh. Cara kerjanya adalah dengan menyuntikkan “style weights” baru ke model yang sudah ada, membuat pelatihan cepat sekaligus efisien.

Panduan ini memandu Anda melalui alur lengkap:

<Steps>
  <Step title="Siapkan Gambar Pelatihan" icon="images">
    Kurasi dan unggah gambar berkualitas tinggi yang mewakili gaya yang Anda inginkan
  </Step>

  <Step title="Kirim Job Pelatihan" icon="play">
    Kirim POST request ke `/styles/train` dengan URL gambar dan konfigurasi Anda
  </Step>

  <Step title="Pantau Progres" icon="clock">
    Lacak status job pelatihan Anda menggunakan `job_id` yang dikembalikan
  </Step>

  <Step title="Hasilkan dengan Gaya Anda" icon="sparkles">
    Terapkan gaya yang telah Anda latih ke generasi gambar
  </Step>
</Steps>

***

## Siapkan Gambar Pelatihan

### Mengurasi Dataset Anda

Kualitas gambar pelatihan Anda berdampak langsung pada hasil. Jenis pelatihan yang berbeda memiliki persyaratan yang berbeda:

| Jenis         | Kasus Penggunaan                           | Tips                                |
| ------------- | ------------------------------------------ | ----------------------------------- |
| **Style**     | Gaya artistik, estetika visual             | Gaya konsisten di berbagai subjek   |
| **Character** | Kemiripan pribadi, karakter yang konsisten | Beragam pose, ekspresi, pencahayaan |
| **Object**    | Objek atau produk tertentu                 | Beragam sudut, objek konsisten      |

### Berapa Banyak Gambar?

Kualitas jauh lebih penting daripada kuantitas. Sekumpulan kecil gambar yang sangat baik akan mengungguli sekumpulan besar gambar yang biasa saja.

| Ukuran Dataset   | Panduan                                                              |
| ---------------- | -------------------------------------------------------------------- |
| **5 gambar**     | Minimum yang layak. Bisa berhasil untuk gaya sederhana dan konsisten |
| **10-30 gambar** | Direkomendasikan. Keseimbangan terbaik antara kualitas dan cakupan   |
| **50+ gambar**   | Diminishing returns kecuali jika gaya memiliki variasi tinggi        |

<Warning>
  **Kualitas > Kuantitas**

  15 gambar berkualitas tinggi akan menghasilkan hasil yang lebih baik daripada 50 gambar berkualitas rendah. Prioritaskan:

  * Resolusi tinggi (minimum 1024x1024)
  * Gaya konsisten di semua gambar
  * Tidak ada watermark, teks overlay, atau artefak kompresi
  * Subjek yang bervariasi sambil menjaga koherensi gaya
</Warning>

<Info>
  **Contoh Dataset**

  * **Pelatihan character**: Foto seseorang dengan beragam pose, ekspresi, dan kondisi pencahayaan. Hindari menyertakan orang lain di dalam gambar.
  * **Pelatihan style**: Kumpulan karya seni dalam gaya yang konsisten. Misalnya, [The Metropolitan Museum of Art Ukiyo-E Dataset](https://www.kaggle.com/datasets/kengoichiki/the-metropolitan-museum-of-art-ukiyoe-dataset) menyediakan cetakan kayu Jepang yang ideal untuk melatih gaya artistik.
</Info>

### Unggah Gambar

Sebelum pelatihan, unggah gambar Anda untuk mendapatkan URL yang di-hosting. Gunakan endpoint `/assets`:

<CodeGroup>
  ```python Python theme={null}
  import requests
  import os
  from dotenv import load_dotenv
  import mimetypes

  load_dotenv()

  API_BASE = "https://api.krea.ai"
  API_TOKEN = os.getenv("API_TOKEN")

  image_dir = "training_images"
  uploaded_urls = []

  for filename in os.listdir(image_dir):
      if filename.lower().endswith(('.jpg', '.jpeg', '.png', '.webp')):
          filepath = os.path.join(image_dir, filename)
          mime_type, _ = mimetypes.guess_type(filepath)

          with open(filepath, 'rb') as f:
              response = requests.post(
                  f"{API_BASE}/assets",
                  headers={"Authorization": f"Bearer {API_TOKEN}"},
                  files={"file": (filename, f, mime_type)},
                  data={"description": f"Training image: {filename}"}
              )

          if response.ok:
              data = response.json()
              uploaded_urls.append(data["image_url"])
              print(f"Uploaded: {filename}")
          else:
              print(f"Failed: {filename}")

  print(f"\nUploaded {len(uploaded_urls)} images")
  ```

  ```bash cURL theme={null}
  # Upload a single image
  curl -X POST https://api.krea.ai/assets \
    -H "Authorization: Bearer YOUR_API_TOKEN" \
    -F "file=@/path/to/image.jpg" \
    -F "description=Training image"

  # Response: {"id": "...", "image_url": "https://..."}
  ```
</CodeGroup>

<Tip>
  Simpan nilai `image_url` yang dikembalikan—Anda akan mengirimnya ke endpoint pelatihan.
</Tip>

***

## Latih Gaya Anda

### Contoh Pelatihan Dasar

Kirim URL gambar Anda untuk memulai pelatihan:

<CodeGroup>
  ```python Python theme={null}
  import requests
  import os
  from dotenv import load_dotenv

  load_dotenv()

  API_BASE = "https://api.krea.ai"
  API_TOKEN = os.getenv("API_TOKEN")

  # Training URLs from the upload step
  urls = [
      "https://krea.ai/assets/img1.jpg",
      "https://krea.ai/assets/img2.jpg",
      "https://krea.ai/assets/img3.jpg",
      # ... more images
  ]

  response = requests.post(
      f"{API_BASE}/styles/train",
      headers={
          "Authorization": f"Bearer {API_TOKEN}",
          "Content-Type": "application/json"
      },
      json={
          "name": "Ukiyo-E Style",
          "urls": urls,
          "model": "flux_dev",
          "type": "Style",
          "max_train_steps": 500
      }
  )

  response.raise_for_status()
  job = response.json()
  print(f"Training started! Job ID: {job['job_id']}")
  ```

  ```bash cURL theme={null}
  curl -X POST https://api.krea.ai/styles/train \
    -H "Authorization: Bearer YOUR_API_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Ukiyo-E Style",
      "urls": [
        "https://krea.ai/assets/img1.jpg",
        "https://krea.ai/assets/img2.jpg",
        "https://krea.ai/assets/img3.jpg"
      ],
      "model": "flux_dev",
      "type": "Style",
      "max_train_steps": 500
    }'
  ```
</CodeGroup>

### Jenis Pelatihan

Parameter `type` menetapkan default cerdas yang dioptimalkan untuk kasus penggunaan Anda:

| Jenis       | Cocok untuk                                |
| ----------- | ------------------------------------------ |
| `Style`     | Gaya artistik, estetika visual             |
| `Character` | Kemiripan pribadi, karakter yang konsisten |
| `Object`    | Objek atau produk tertentu                 |
| `Default`   | Pelatihan generik                          |

### Parameter

#### Parameter Wajib

<ParamField path="name" type="string" required>
  Nama deskriptif untuk gaya kustom Anda.

  **Contoh:** `"Ukiyo-E Style"`, `"Product Photos"`
</ParamField>

<ParamField path="urls" type="array" required>
  Array URL gambar untuk dilatih. Sertakan lebih banyak gambar untuk hasil yang lebih baik.
</ParamField>

#### Parameter Opsional

<ParamField path="model" type="string" default="flux_dev">
  Model dasar untuk pelatihan:

  **Model gambar:**

  * `flux_dev` - Berkualitas tinggi, serbaguna
  * `flux_schnell` - Model realtime dari BFL
  * `qwen` - Model dari Alibaba
  * `z-image` - Model gambar efisien dari Alibaba
  * `wan22` - Hanya untuk generasi gambar

  **Model video:**

  * `wan` - Model video dari Alibaba
</ParamField>

<ParamField path="type" type="string" default="Default">
  Kategori pelatihan: `Style`, `Object`, `Character`, atau `Default`
</ParamField>

<ParamField path="trigger_word" type="string">
  Kata kustom untuk mengaktifkan gaya ini di prompt. Jika tidak ditentukan, akan menggunakan nama gaya.

  <Tip>Pilih trigger word unik yang tidak akan muncul di prompt biasa. Gunakan underscore untuk trigger multi-kata: `ukiyo_style`</Tip>
</ParamField>

<Accordion title="Parameter Lanjutan" icon="sliders">
  <ParamField path="learning_rate" type="number">
    Mengontrol intensitas pelatihan. Nilai yang lebih tinggi melatih lebih cepat tetapi bisa overfit.

    **Rentang yang direkomendasikan:** 0.0001 - 0.001
  </ParamField>

  <ParamField path="max_train_steps" type="integer">
    Iterasi pelatihan maksimum. Rentang: 1-2000
  </ParamField>

  <ParamField path="batch_size" type="integer">
    Gambar yang diproses secara bersamaan. Batch lebih besar = pelatihan lebih cepat tetapi memori lebih banyak.
  </ParamField>
</Accordion>

### Menyesuaikan Parameter Lanjutan

Mulai dengan default yang ditetapkan oleh field `type`—cocok untuk sebagian besar kasus. Hanya sesuaikan ini bila Anda melihat masalah tertentu:

<AccordionGroup>
  <Accordion title="Learning Rate" icon="gauge">
    Mengontrol seberapa agresif model beradaptasi dengan gambar pelatihan Anda.

    | Nilai                           | Kapan Digunakan                                   |
    | ------------------------------- | ------------------------------------------------- |
    | **0.0001** (lebih rendah)       | Masalah overfitting, gaya kompleks, dataset kecil |
    | **0.0003** (default)            | Sebagian besar kasus penggunaan                   |
    | **0.0005-0.001** (lebih tinggi) | Pelatihan lebih cepat                             |

    **Tanda perlu penyesuaian:**

    * Output terlihat identik dengan gambar pelatihan → turunkan rate
    * Pengaruh gaya lemah setelah pelatihan → naikkan rate sedikit
  </Accordion>

  <Accordion title="Training Steps" icon="shoe-prints">
    Berapa lama model berlatih pada gambar Anda.

    | Ukuran Dataset | Steps yang Direkomendasikan |
    | -------------- | --------------------------- |
    | 5-10 gambar    | 300-500 steps               |
    | 15-30 gambar   | 500-800 steps               |
    | 50+ gambar     | 800-1500 steps              |

    **Tanda perlu penyesuaian:**

    * Output terlalu kaku, mengabaikan prompt → kurangi steps
    * Pengaruh gaya lemah → tambah steps
    * Gambar yang dihasilkan terlihat persis seperti data pelatihan → kurangi steps (overfitting)
  </Accordion>
</AccordionGroup>

<Tip>
  **Penyesuaian Iteratif**

  Jika percobaan pelatihan pertama Anda tidak menghasilkan hasil yang diinginkan:

  1. Mulai dengan menyesuaikan `max_train_steps` (perbaikan paling umum)
  2. Kemudian coba `learning_rate` jika steps saja tidak membantu
</Tip>

### Format Respons

```json theme={null}
{
  "job_id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "queued",
  "created_at": "2024-01-15T10:30:00Z"
}
```

***

## Pantau Progres Pelatihan

Pelatihan biasanya memakan waktu 5-15 menit. Lakukan polling Jobs API untuk memeriksa status:

<CodeGroup>
  ```python Python theme={null}
  import requests
  import time
  import os
  from dotenv import load_dotenv

  load_dotenv()

  API_BASE = "https://api.krea.ai"
  API_TOKEN = os.getenv("API_TOKEN")
  job_id = "your-job-id"

  while True:
      response = requests.get(
          f"{API_BASE}/jobs/{job_id}",
          headers={"Authorization": f"Bearer {API_TOKEN}"}
      )
      job = response.json()
      status = job["status"]

      print(f"Status: {status}")

      if status == "completed":
          style_id = job["result"]["style_id"]
          print(f"Training complete! Style ID: {style_id}")
          break
      elif status in ["failed", "cancelled"]:
          print(f"Training {status}")
          break

      time.sleep(30)
  ```

  ```bash cURL theme={null}
  # Check job status (repeat until completed)
  curl -X GET https://api.krea.ai/jobs/YOUR_JOB_ID \
    -H "Authorization: Bearer YOUR_API_TOKEN"
  ```
</CodeGroup>

<Accordion title="Nilai Status Job" icon="diagram-project">
  Job pelatihan berjalan melalui status ini:

  1. **queued** - Menunggu di antrean
  2. **processing** - Pelatihan aktif
  3. **completed** - Pelatihan selesai dengan sukses
  4. **failed** - Pelatihan mengalami kesalahan
  5. **cancelled** - Job dibatalkan secara manual
</Accordion>

***

## Gunakan Gaya Terlatih Anda

Setelah pelatihan selesai, terapkan gaya Anda ke generasi gambar menggunakan parameter `styles`:

<Warning>
  **Kepemilikan gaya antara aplikasi dan API**

  API dan aplikasi web Krea beroperasi sebagai identitas pengguna terpisah di dalam workspace Anda. Gaya bersifat privat bagi pengguna yang membuatnya, sehingga:

  * **Gaya yang dilatih via aplikasi** tidak dapat diakses via API kecuali dibagikan
  * **Gaya yang dilatih via API** tidak dapat diakses di aplikasi kecuali dibagikan

  Untuk membagikan gaya ke workspace Anda (berlaku di kedua arah):

  ```bash theme={null}
  curl -X POST https://api.krea.ai/styles/YOUR_STYLE_ID/share/workspace \
    -H "Authorization: Bearer YOUR_API_TOKEN"
  ```
</Warning>

<CodeGroup>
  ```python Python theme={null}
  import requests
  import time
  import os
  from dotenv import load_dotenv

  load_dotenv()

  API_BASE = "https://api.krea.ai"
  API_TOKEN = os.getenv("API_TOKEN")
  STYLE_ID = "w29t6pvy0"

  response = requests.post(
      f"{API_BASE}/generate/image/krea/krea-2/medium",
      headers={
          "Authorization": f"Bearer {API_TOKEN}",
          "Content-Type": "application/json"
      },
      json={
          "prompt": "An abstract, colorful, surreal composition of symmetry and balance. Swirling colors, imagery of trees and coalescing patterns converge. The lantern of light and death. It is as if the world was at once dark, and yet again lit.",
          "aspect_ratio": "1:1",
          "resolution": "1K",
          "styles": [
              {
                  "id": STYLE_ID,
                  "strength": 0.95
              }
          ]
      }
  )

  job = response.json()
  job_id = job["job_id"]
  print(f"Generation started! Job ID: {job_id}")

  # Poll for completion
  while True:
      check = requests.get(
          f"{API_BASE}/jobs/{job_id}",
          headers={"Authorization": f"Bearer {API_TOKEN}"}
      )
      status_data = check.json()

      if status_data["status"] == "completed":
          image_url = status_data["result"]["urls"][0]
          print(f"Image ready: {image_url}")
          break
      elif status_data["status"] == "failed":
          print("Generation failed")
          break

      time.sleep(2)
  ```

  ```bash cURL theme={null}
  # Generate with style
  curl -X POST https://api.krea.ai/generate/image/krea/krea-2/medium \
    -H "Authorization: Bearer YOUR_API_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
      "prompt": "An abstract, colorful, surreal composition of symmetry and balance. Swirling colors, imagery of trees and coalescing patterns converge. The lantern of light and death. It is as if the world was at once dark, and yet again lit.",
      "aspect_ratio": "1:1",
      "resolution": "1K",
      "styles": [
        {
          "id": "w29t6pvy0",
          "strength": 0.95
        }
      ]
    }'

  # Then poll /jobs/{job_id} for the result
  ```
</CodeGroup>

### Kekuatan Gaya

Parameter `strength` (0.0-1.0) mengontrol seberapa kuat gaya Anda diterapkan:

| Strength | Efek                                                             |
| -------- | ---------------------------------------------------------------- |
| 0.5-0.7  | Pengaruh halus, mempertahankan fleksibilitas prompt              |
| 0.8-0.9  | Penerapan gaya yang kuat, titik awal yang direkomendasikan       |
| 0.95-1.0 | Kepatuhan gaya maksimum, mungkin mengurangi responsivitas prompt |

<Tip>
  Mulai dengan `strength` 0.8 dan sesuaikan berdasarkan hasil. Nilai lebih rendah memberikan kebebasan kreatif lebih; nilai lebih tinggi memaksakan kepatuhan gaya yang lebih ketat.
</Tip>

### Menggabungkan Beberapa Gaya

Terapkan beberapa gaya dengan menambahkannya ke array `styles`:

```python theme={null}
"styles": [
    {"id": "style-id-1", "strength": 0.6},
    {"id": "style-id-2", "strength": 0.4}
]
```

***

## Praktik Terbaik

<AccordionGroup>
  <Accordion title="Pemilihan Gambar" icon="images">
    * Gunakan sebanyak mungkin gambar berkualitas tinggi untuk hasil optimal
    * Pastikan gaya konsisten di semua gambar pelatihan
    * Sertakan variasi subjek sambil menjaga koherensi gaya
    * Hindari watermark, teks overlay, atau artefak
    * Gunakan gambar dengan resolusi minimum 1024x1024
  </Accordion>

  <Accordion title="Konfigurasi Pelatihan" icon="sliders">
    * Mulai dengan parameter default menggunakan field `type`
    * Untuk gaya: 500-1000 steps biasanya cukup
    * Learning rate rendah (0.0001-0.0003) mencegah overfitting
    * Tambah steps jika gaya belum cukup kuat
    * Kurangi steps jika output terlalu kaku
  </Accordion>

  <Accordion title="Trigger Words" icon="wand-magic-sparkles">
    * Gunakan trigger word yang sama jika Anda berencana menggabungkan beberapa gaya
    * Trigger word otomatis disuntikkan ke prompt jika Anda menyertakan gaya
    * Hindari kata umum yang muncul di prompt biasa
    * Gunakan underscore untuk trigger multi-kata: `my_custom_style`
  </Accordion>
</AccordionGroup>
