> ## 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.

# Text to Image

> Bandingkan model text-to-image Krea API — Krea 2, Flux, Nano Banana Pro, dan lainnya — lengkap dengan harga, kemampuan, dan contoh kode untuk memilih yang tepat.

export const ModelOverviewCard = ({name, description, icon, href}) => {
  const resolvedIcon = (() => {
    if (typeof icon !== "string" || !icon.startsWith("/") || icon.startsWith("//")) return icon;
    if (typeof window === "undefined") return icon;
    const base = "/docs";
    const under = window.location.pathname === base || window.location.pathname.startsWith(base + "/");
    return under && !icon.startsWith(base + "/") ? base + icon : icon;
  })();
  return <a href={href} className="group relative block rounded-xl border border-gray-200 dark:border-gray-800 bg-white dark:bg-black overflow-hidden hover:border-black dark:hover:border-white transition-all duration-200 p-6">
      {}
      <div className="flex items-center justify-center w-8 h-8 rounded-lg mb-4 transition-colors duration-200">
        {icon && <img src={resolvedIcon} alt={`${name} logo`} className="w-8 h-8 object-contain transition-all duration-200" />}
      </div>

      {}
      <div className="space-y-2">
        <h3 className="text-lg font-semibold text-black dark:text-white transition-colors">
          {name}
        </h3>
        <p className="text-sm text-gray-600 dark:text-gray-400 line-clamp-4">
          {description}
        </p>
      </div>

      {}
      <div className="absolute top-6 right-6 opacity-0 group-hover:opacity-100 transition-opacity duration-200">
        <svg className="w-4 h-4 text-black dark:text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
          <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
        </svg>
      </div>
    </a>;
};

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-text-to-image.webp" title="Text to Image" description="Hasilkan gambar berkualitas tinggi dari prompt teks. Ciptakan apa saja, dari gambar fotorealistis hingga ilustrasi artistik, dengan model AI mutakhir." />

## Model Populer

<div className="grid grid-cols-1 md:grid-cols-2 gap-4 hidden dark:grid">
  <ModelOverviewCard name="Krea 2" href="/developers/krea-2/overview" icon="/images/logo/krea-logo-icon-dark.svg" description="Model foundation dari Krea — style transfer, moodboards, dan kreativitas yang dapat disesuaikan." />

  <ModelOverviewCard name="Flux" href="/api-reference/image/flux" icon="/images/logo/bfl-dark.svg" description="Generasi cepat dan serbaguna dengan dukungan gaya yang luas dan rasio kustom." />

  <ModelOverviewCard name="Nano Banana Pro" href="/api-reference/image/nano-banana-pro" icon="/images/logo/deepmind-dark.svg" description="Model terbaru dari Google dengan tipografi unggul dan detail fotorealistis." />

  <ModelOverviewCard name="Seedream 4" href="/api-reference/image/seedream-4" icon="/images/logo/bytedance-dark.svg" description="Text-to-image dan image-to-image berkualitas tinggi, detail fotorealistis, dan resolusi fleksibel." />

  <ModelOverviewCard name="GPT Image 2" href="/api-reference/image/chatgpt-2" icon="/images/logo/openai-dark.svg" description="Model gambar terbaru dari OpenAI untuk generasi dan editing berkualitas tinggi." />
</div>

<div className="grid grid-cols-1 md:grid-cols-2 gap-4 block dark:hidden">
  <ModelOverviewCard name="Krea 2" href="/developers/krea-2/overview" icon="/images/logo/krea-logo-icon-light.svg" description="Model foundation dari Krea — style transfer, moodboards, dan kreativitas yang dapat disesuaikan." />

  <ModelOverviewCard name="Flux" href="/api-reference/image/flux" icon="/images/logo/bfl-light.svg" description="Generasi cepat dan serbaguna dengan dukungan gaya yang luas dan rasio kustom." />

  <ModelOverviewCard name="Nano Banana Pro" href="/api-reference/image/nano-banana-pro" icon="/images/logo/deepmind-light.svg" description="Model terbaru dari Google dengan tipografi unggul dan detail fotorealistis." />

  <ModelOverviewCard name="Seedream 4" href="/api-reference/image/seedream-4" icon="/images/logo/bytedance-light.svg" description="Text-to-image dan image-to-image berkualitas tinggi, detail fotorealistis, dan resolusi fleksibel." />

  <ModelOverviewCard name="GPT Image 2" href="/api-reference/image/chatgpt-2" icon="/images/logo/openai-light.svg" description="Model gambar terbaru dari OpenAI untuk generasi dan editing berkualitas tinggi." />
</div>

***

## Ikhtisar

Hasilkan gambar dari deskripsi teks menggunakan Flux, Nano Banana Pro, dan model AI mutakhir lainnya. Contoh ini memandu Anda melalui alur lengkap, dari mengirim permintaan generasi hingga mengambil gambar akhir.

<Note>
  Pembuatan gambar bersifat asinkron. Anda akan menerima job ID segera, lalu melakukan polling untuk hasil hingga gambar siap.
</Note>

## Playground Interaktif

Berikut contoh lengkap dalam berbagai bahasa:

<CodeGroup>
  ```javascript Node.js theme={null}
  // npm install @krea-ai/sdk
  import { Krea } from "@krea-ai/sdk";

  const krea = new Krea({ apiKey: process.env.KREA_API_KEY });

  const result = await krea.subscribe("image/bfl/flux-1-dev", {
    input: {
      prompt: "a serene mountain landscape at sunset",
      width: 1024,
      height: 576,
      steps: 28
    }
  });

  console.log(`Image ready: ${result.data?.urls[0]}`);
  ```

  ```python Python theme={null}
  import requests
  import time

  API_BASE = "https://api.krea.ai"
  API_TOKEN = "your-token-secret"

  # Step 1: Create generation job
  response = requests.post(
      f"{API_BASE}/generate/image/bfl/flux-1-dev",
      headers={
          "Authorization": f"Bearer {API_TOKEN}",
          "Content-Type": "application/json"
      },
      json={
          "prompt": "a serene mountain landscape at sunset",
          "width": 1024,
          "height": 576,
          "steps": 28
      }
  )
  job = response.json()
  job_id = job["job_id"]

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

      if job["status"] == "completed":
          image_url = job["result"]["urls"][0]
          print(f"Image ready: {image_url}")
          break
      if job["status"] in ("failed", "cancelled"):
          raise Exception(f"Job failed: {job['status']}")

      print(f"Status: {job['status']}")
      time.sleep(2)
  ```

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

  import (
      "bytes"
      "encoding/json"
      "fmt"
      "net/http"
      "time"
  )

  func main() {
      apiBase := "https://api.krea.ai"
      apiToken := "your-token-secret"
      client := &http.Client{}

      // Step 1: Create generation job
      payload := map[string]interface{}{
          "prompt": "a serene mountain landscape at sunset",
          "width":  1024,
          "height": 576,
          "steps":  28,
      }
      jsonData, _ := json.Marshal(payload)

      req, _ := http.NewRequest("POST", apiBase+"/generate/image/bfl/flux-1-dev", bytes.NewBuffer(jsonData))
      req.Header.Set("Authorization", "Bearer "+apiToken)
      req.Header.Set("Content-Type", "application/json")

      resp, _ := client.Do(req)
      var job map[string]interface{}
      json.NewDecoder(resp.Body).Decode(&job)
      resp.Body.Close()

      jobID := job["job_id"].(string)

      // Step 2: Poll for completion
      for {
          req, _ := http.NewRequest("GET", apiBase+"/jobs/"+jobID, nil)
          req.Header.Set("Authorization", "Bearer "+apiToken)

          resp, _ := client.Do(req)
          var jobStatus map[string]interface{}
          json.NewDecoder(resp.Body).Decode(&jobStatus)
          resp.Body.Close()

          switch jobStatus["status"] {
          case "completed":
              result := jobStatus["result"].(map[string]interface{})
              imageURL := result["urls"].([]interface{})[0].(string)
              fmt.Printf("Image ready: %s\n", imageURL)
              return
          case "failed", "cancelled":
              fmt.Printf("Job failed: %s\n", jobStatus["status"])
              return
          }

          fmt.Printf("Status: %s\n", jobStatus["status"])
          time.Sleep(2 * time.Second)
      }
  }
  ```

  ```bash cURL theme={null}
  # Step 1: Create generation job
  curl -X POST https://api.krea.ai/generate/image/bfl/flux-1-dev \
    -H "Authorization: Bearer YOUR_API_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
      "prompt": "a serene mountain landscape at sunset",
      "width": 1024,
      "height": 576,
      "steps": 28
    }'

  # Response: {"job_id": "550e8400-e29b-41d4-a716-446655440000", ...}

  # Step 2: Poll for completion (repeat until completed)
  curl -X GET https://api.krea.ai/jobs/550e8400-e29b-41d4-a716-446655440000 \
    -H "Authorization: Bearer YOUR_API_TOKEN"
  ```
</CodeGroup>

<Info>
  **Ganti dengan API Token Anda**

  Untuk mengganti placeholder YOUR\_API\_TOKEN pada contoh di atas, Anda perlu membuat API token di [krea.ai/settings/api-tokens](https://www.krea.ai/settings/api-tokens). Ikuti instruksi di halaman [API Keys & Billing](/developers/api-keys-and-billing) jika perlu bantuan.
</Info>

Untuk menemukan semua model yang tersedia, lihat halaman [Model APIs](/api-reference/introduction).

***

## Rinciannya

Di bawah ini, kami akan memandu Anda melalui alur lengkap, dari mengirim permintaan generasi hingga mengambil gambar akhir.

## Langkah 1: Buat Job Generasi Gambar

Kirim POST request ke `/generate/image/bfl/flux-1-dev` dengan prompt dan parameter Anda. API mengembalikan job ID segera—generasi terjadi secara asinkron.

<CodeGroup>
  ```javascript Node.js theme={null}
  // npm install @krea-ai/sdk
  import { Krea } from "@krea-ai/sdk";

  const krea = new Krea({ apiKey: process.env.KREA_API_KEY });

  const job = await krea.image("bfl/flux-1-dev", {
    prompt: "a serene mountain landscape at sunset",
    width: 1024,
    height: 576,
    steps: 28
  });

  console.log(`Job ID: ${job.job_id}`);
  ```

  ```bash cURL theme={null}
  curl -X POST https://api.krea.ai/generate/image/bfl/flux-1-dev \
    -H "Authorization: Bearer YOUR_API_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
      "prompt": "a serene mountain landscape at sunset",
      "width": 1024,
      "height": 576,
      "steps": 28
    }'
  ```

  ```python Python theme={null}
  import requests

  API_BASE = "https://api.krea.ai"
  API_TOKEN = "your-token-secret"

  response = requests.post(
      f"{API_BASE}/generate/image/bfl/flux-1-dev",
      headers={
          "Authorization": f"Bearer {API_TOKEN}",
          "Content-Type": "application/json"
      },
      json={
          "prompt": "a serene mountain landscape at sunset",
          "width": 1024,
          "height": 576,
          "steps": 28
      }
  )

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

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

  import (
      "bytes"
      "encoding/json"
      "fmt"
      "net/http"
  )

  func main() {
      apiBase := "https://api.krea.ai"
      apiToken := "your-token-secret"

      payload := map[string]interface{}{
          "prompt": "a serene mountain landscape at sunset",
          "width": 1024,
          "height": 576,
          "steps": 28,
      }

      jsonData, _ := json.Marshal(payload)
      req, _ := http.NewRequest("POST", apiBase+"/generate/image/bfl/flux-1-dev", bytes.NewBuffer(jsonData))
      req.Header.Set("Authorization", "Bearer "+apiToken)
      req.Header.Set("Content-Type", "application/json")

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

      var job map[string]interface{}
      json.NewDecoder(resp.Body).Decode(&job)
      fmt.Printf("Job ID: %s\n", job["job_id"])
  }
  ```
</CodeGroup>

**Contoh Respons**

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

***

## Langkah 2: Polling untuk Hasil

Lakukan polling `/jobs/{job_id}` setiap 2 detik hingga job selesai. Krea API menyediakan output generasi menengah untuk beberapa model.

<CodeGroup>
  ```javascript Node.js theme={null}
  // npm install @krea-ai/sdk
  import { Krea } from "@krea-ai/sdk";

  const krea = new Krea({ apiKey: process.env.KREA_API_KEY });

  async function waitForJob(jobId) {
    const completed = await krea.jobs.wait(jobId, { intervalMs: 2000 });
    return completed.result.urls[0];
  }

  const imageUrl = await waitForJob(job.job_id);
  console.log(`Image ready: ${imageUrl}`);
  ```

  ```bash cURL theme={null}
  # Check job status
  curl -X GET https://api.krea.ai/jobs/YOUR_JOB_ID \
    -H "Authorization: Bearer YOUR_API_TOKEN"
  ```

  ```python Python theme={null}
  import time

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

          if job["status"] == "completed":
              return job["result"]["urls"][0]
          if job["status"] in ("failed", "cancelled"):
              raise Exception(f"Job failed: {job['status']}")

          print(f"Status: {job['status']}")
          time.sleep(2)

  image_url = wait_for_job(job["job_id"])
  print(f"Image ready: {image_url}")
  ```

  ```go Go theme={null}
  func waitForJob(jobID string) (string, error) {
      for {
          req, _ := http.NewRequest("GET", apiBase+"/jobs/"+jobID, nil)
          req.Header.Set("Authorization", "Bearer "+apiToken)

          resp, _ := client.Do(req)
          var job map[string]interface{}
          json.NewDecoder(resp.Body).Decode(&job)
          resp.Body.Close()

          switch job["status"] {
          case "completed":
              result := job["result"].(map[string]interface{})
              urls := result["urls"].([]interface{})
              return urls[0].(string), nil
          case "failed", "cancelled":
              return "", fmt.Errorf("job failed: %s", job["status"])
          }

          fmt.Printf("Status: %s\n", job["status"])
          time.Sleep(2 * time.Second)
      }
  }
  ```
</CodeGroup>

<Note>
  **Webhooks tersedia!**

  Siapkan webhooks untuk menerima notifikasi saat job selesai. Lihat [Panduan Webhooks](/developers/webhooks) untuk memulai.
</Note>

<Tip>
  Untuk daftar parameter mendetail dari semua model, lihat halaman [Model APIs](/api-reference/introduction).
</Tip>

**Contoh Respons Selesai**

```json theme={null}
{
  "job_id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "completed",
  "created_at": "2025-01-15T10:30:00.000Z",
  "completed_at": "2025-01-15T10:30:25.000Z",
  "result": {
    "urls": [
      "https://krea.ai/generations/your-image.png"
    ]
  }
}
```

<Tip>
  Untuk mempelajari semua status job yang mungkin dan siklus hidup job lengkap, lihat halaman [Job Lifecycle](/developers/job-lifecycle).
</Tip>
