# FLUX.1 [dev] with Controlnets and Loras API

> FLUX.1 [dev] text-to-image dengan LoRA, ControlNet, IP-Adapter, EasyControl, dan panduan gambar referensi

Menghasilkan gambar dari `prompt` dengan beberapa metode conditioning: `loras`, `control_loras`, `controlnets`, `controlnet_unions`, `ip_adapters`, dan `easycontrols`, serta `fill_image` untuk area bermasker. Juga menerima `reference_image_url`, prompt negatif, dan pilihan scheduler euler atau dpmpp_2m. Hingga 10 gambar per panggilan, dalam png atau jpeg.

- Model id: `flux-general`
- Made by: Black Forest Labs
- Category: Text to Image
- Output: image
- Estimated price per run: $0.30 / image (cheapest run $0.30 (300 API credits))
- Run: `POST https://api.doitong.com/v1/run/flux-general`
- Quote: `POST https://api.doitong.com/v1/quote/flux-general`
- Docs page: https://doitong.com/id/developers/models/flux-general

## Pricing

Price: **$0.30 / image**. Estimated from the typical cost of one run, per output (`num_images`). The quote is exactly what the run charges.

The full example input below costs $0.30 = 300 API credits (1 image × 300 API credits).

Prices are the upstream price in USD, paid from the API balance in API credits (1000 API credits = 1 USD). `POST https://api.doitong.com/v1/quote/flux-general` with the same JSON body returns the exact price for that input; the quote is exactly what a run charges. Invalid input is never charged and failed or canceled requests are refunded automatically.

## Input parameters

Send either the canonical name or the native field name (not both). Canonical names are the same across models.

| Parameter | Canonical name | Type | Required | Default | Allowed values / range | Description |
|---|---|---|---|---|---|---|
| `prompt` |  | string | yes |  |  | Prompt yang memandu pembuatan gambar. |
| `image_size` |  | object {width, height} \| enum (string) | no |  | `square_hd`, `square`, `portrait_4_3`, `portrait_16_9`, `landscape_4_3`, `landscape_16_9` | Dimensi gambar yang dihasilkan. |
| `num_inference_steps` |  | integer | no | `28` | 1 – 50 | Jumlah langkah inferensi yang dijalankan. |
| `seed` |  | integer \| null | no |  |  | Seed untuk gambar yang dapat direproduksi: prompt dan seed identik menghasilkan gambar identik jika versi model tidak berubah. |
| `loras` |  | array of object {path, scale} | no | `[]` |  | LoRA yang efek gabungannya menghasilkan gambar yang dibuat, tanpa batas jumlah yang dapat diberikan. |
| `loras[].path` |  | string | yes |  |  | Lokasi bobot LoRA, yang ditentukan sebagai URL atau path. |
| `loras[].scale` |  | object \| number | no | `1` |  | Penskalaan yang diterapkan pada bobot LoRA sebelum digabungkan ke model dasar. Berikan dictionary dalam bentuk {"layer_name":layer_scale} untuk menetapkan skala setiap layer; layer yang tidak ditentukan menggunakan 1.0. |
| `control_loras` |  | array of object {path, scale, control_image_url, preprocess} | no | `[]` |  | LoRA gambar kontrol yang digabungkan ke konfigurasi gabungan untuk membuat gambar akhir; jumlah yang diberikan tidak dibatasi. |
| `control_loras[].path` |  | string | yes |  |  | Lokasi bobot LoRA, yang ditentukan sebagai URL atau path. |
| `control_loras[].scale` |  | object \| number | no | `1` |  | Penskalaan yang diterapkan pada bobot LoRA sebelum digabungkan ke model dasar. Berikan dictionary dalam bentuk {"layer_name":layer_scale} untuk menetapkan skala setiap layer; layer yang tidak ditentukan menggunakan 1.0. |
| `control_loras[].control_image_url` |  | string (image URL) | yes |  |  | URL gambar yang menyediakan gambar kontrol. |
| `control_loras[].preprocess` |  | enum (string) | no | `None` | `canny`, `depth`, `None` | Metode prapemrosesan yang diterapkan pada gambar yang diberikan. |
| `controlnets` |  | array of object {path, config_url, variant, control_image_url, mask_image_url, mask_threshold, conditioning_scale, start_percentage, end_percentage} | no | `[]` |  | Konfigurasi ControlNet untuk pembuatan gambar, saat ini dibatasi hingga satu ControlNet. |
| `controlnets[].path` |  | string | yes |  |  | Lokasi bobot ControlNet, ditentukan sebagai URL atau path. |
| `controlnets[].config_url` |  | string \| null | no |  |  | URL opsional yang mengarah ke file config.json milik ControlNet. |
| `controlnets[].variant` |  | string \| null | no |  |  | Varian opsional untuk digunakan dengan kunci repositori Hugging Face. |
| `controlnets[].control_image_url` |  | string (image URL) | yes |  |  | URL gambar yang menyediakan gambar kontrol. |
| `controlnets[].mask_image_url` |  | string (image URL) | no |  |  | URL mask terkait dengan gambar kontrol. |
| `controlnets[].mask_threshold` |  | number | no | `0.5` | 0.01 – 0.99 | Nilai ambang mask. |
| `controlnets[].conditioning_scale` |  | number | no | `1` | 0 – 2 | Penskalaan yang diterapkan pada bobot ControlNet sebelum digabungkan ke model dasar. |
| `controlnets[].start_percentage` |  | number | no | `0` | 0 – 1 | Persentase dari total timestep saat ControlNet mulai memengaruhi pembuatan gambar. |
| `controlnets[].end_percentage` |  | number | no | `1` | 0 – 1 | Persentase dari total timestep saat ControlNet berhenti memengaruhi pembuatan gambar. |
| `controlnet_unions` |  | array of object {path, config_url, variant, controls} | no | `[]` |  | Konfigurasi union ControlNet untuk pembuatan gambar, mengikuti pembatasan satu ControlNet saat ini. |
| `controlnet_unions[].path` |  | string | yes |  |  | Lokasi bobot ControlNet, ditentukan sebagai URL atau path. |
| `controlnet_unions[].config_url` |  | string \| null | no |  |  | URL opsional yang mengarah ke file config.json milik ControlNet. |
| `controlnet_unions[].variant` |  | string \| null | no |  |  | Varian opsional untuk digunakan dengan kunci repositori Hugging Face. |
| `controlnet_unions[].controls` |  | array of object {control_image_url, mask_image_url, control_mode, conditioning_scale, mask_threshold, start_percentage, end_percentage} | yes |  |  | Gambar kontrol dan mode terkait yang diberikan ke ControlNet. |
| `controlnet_unions[].controls[].control_image_url` |  | string (image URL) | yes |  |  | URL gambar yang menyediakan gambar kontrol. |
| `controlnet_unions[].controls[].mask_image_url` |  | string (image URL) | no |  |  | URL mask terkait dengan gambar kontrol. |
| `controlnet_unions[].controls[].control_mode` |  | enum (string) | yes |  | `canny`, `tile`, `depth`, `blur`, `pose`, `gray`, `low-quality` | Mode kontrol yang digunakan oleh Flux Controlnet Union. Opsi: canny memandu pembuatan dengan tepi; tile memandunya dengan tile; depth memandunya dengan peta kedalaman grayscale; blur memburamkan gambar; pose memandu pembuatan dengan pose gambar; gray membuat gambar menjadi grayscale; low-quality menghasilkan versi gambar berkualitas rendah. |
| `controlnet_unions[].controls[].conditioning_scale` |  | number | no | `1` | 0 – 2 | Penskalaan yang diterapkan pada bobot ControlNet sebelum digabungkan ke model dasar. |
| `controlnet_unions[].controls[].mask_threshold` |  | number | no | `0.5` | 0.01 – 0.99 | Nilai ambang mask. |
| `controlnet_unions[].controls[].start_percentage` |  | number | no | `0` | 0 – 1 | Persentase dari total timestep saat ControlNet mulai memengaruhi pembuatan gambar. |
| `controlnet_unions[].controls[].end_percentage` |  | number | no | `1` | 0 – 1 | Persentase dari total timestep saat ControlNet berhenti memengaruhi pembuatan gambar. |
| `ip_adapters` |  | array of object {path, subfolder, weight_name, image_encoder_path, image_encoder_subfolder, image_encoder_weight_name, image_url, mask_image_url, mask_threshold, scale} | no | `[]` |  | IP-Adapter yang diterapkan selama pembuatan gambar. |
| `ip_adapters[].path` |  | string | yes |  |  | Lokasi IP-Adapter di Hugging Face. |
| `ip_adapters[].subfolder` |  | string \| null | no |  |  | Subfolder yang berisi bobot ip_adapter. |
| `ip_adapters[].weight_name` |  | string \| null | no |  |  | Nama file safetensors untuk bobot IP-Adapter. |
| `ip_adapters[].image_encoder_path` |  | string | yes |  |  | Lokasi gambar encoder IP-Adapter, seperti 'openai/clip-vit-large-patch14'. |
| `ip_adapters[].image_encoder_subfolder` |  | string \| null | no |  |  | Subfolder yang berisi bobot gambar encoder. |
| `ip_adapters[].image_encoder_weight_name` |  | string \| null | no |  |  | Nama gambar encoder. |
| `ip_adapters[].image_url` |  | string (image URL) | yes |  |  | URL gambar conditioning yang diberikan ke IP-Adapter. |
| `ip_adapters[].mask_image_url` |  | string (image URL) \| null | no |  |  | URL mask terkait dengan gambar kontrol. |
| `ip_adapters[].mask_threshold` |  | number | no | `0.5` | 0.01 – 0.99 | Nilai ambang mask. |
| `ip_adapters[].scale` |  | number | yes |  |  | Faktor penskalaan IP-Adapter. |
| `easycontrols` |  | array of object {control_method_url, scale, image_url, image_control_type} | no | `[]` |  | Input EasyControl yang diterapkan selama pembuatan gambar. |
| `easycontrols[].control_method_url` |  | string | yes |  |  | URL bobot safetensor metode kontrol, atau identifier yang didukung: `canny`, `depth`, `hedsketch`, `inpainting`, `pose`, `seg`, `subject`, `ghibli`. |
| `easycontrols[].scale` |  | number | no | `1` | 0 – 2 | Faktor penskalaan metode kontrol. |
| `easycontrols[].image_url` |  | string (image URL) | yes |  |  | URL gambar yang menyediakan input kontrol. |
| `easycontrols[].image_control_type` |  | enum (string) | yes |  | `subject`, `spatial` | Mode kontrol gambar; menerima `spatial` atau `subject`. |
| `fill_image` |  | object {fill_image_url} \| null | no |  |  | Gambar input yang memandu pembuatan dan dapat menyediakan konten untuk area bermask. |
| `fill_image.fill_image_url` |  | string (image URL) \| array of image URL | no | `[]` |  | URL gambar untuk diisi melalui prompting redux. |
| `guidance_scale` |  | number | no | `3.5` | 0 – 20 | Kekuatan kepatuhan terhadap prompt untuk pemilihan gambar, dinyatakan sebagai CFG (Classifier Free Guidance). |
| `real_cfg_scale` |  | number | no | `3.5` | 0 – 5 | Kekuatan kepatuhan terhadap prompt untuk pemilihan gambar, dinyatakan sebagai CFG (Classifier Free Guidance). |
| `use_real_cfg` |  | boolean | no | `false` |  | Sakelar CFG klasik, yang otomatis diaktifkan dengan XLabs IP-Adapter v1. Perilaku guidance sama seperti pada model seperti SD1.5 dan SDXL. |
| `use_cfg_zero` |  | boolean | no | `false` |  | Mengaktifkan sampling inisialisasi CFG-zero, yang dijelaskan di https://arxiv.org/abs/2503.18886. |
| `num_images` | `num_outputs` | integer | no | `1` | 1 – 10 | Tentukan jumlah gambar yang akan dibuat; pilihan ini ditetapkan ke 1 saat output dialirkan. |
| `enable_safety_checker` |  | boolean | no | `true` |  | Pemeriksaan keamanan, yang mengembalikan gambar hitam sebagai pengganti gambar yang ditandai tidak aman. Nilai true mengaktifkan pemeriksaan; false menonaktifkannya hanya untuk akun yang berwenang, sedangkan permintaan tanpa otorisasi tetap diperiksa. |
| `reference_image_url` |  | string (image URL) | no |  |  | URL gambar yang digunakan untuk guidance Reference-Only. |
| `reference_strength` |  | number | no | `0.65` | -3 – 3 | Pengaruh gambar referensi selama pembuatan reference_only; tanpa gambar referensi yang diberikan, pengaturan kekuatan ini tidak berpengaruh. |
| `reference_start` |  | number | no | `0` | 0 – 1 | Titik awal reference guidance, dinyatakan sebagai persentase dari semua timestep. |
| `reference_end` |  | number | no | `1` | 0 – 1 | Titik akhir reference guidance, dinyatakan sebagai persentase dari semua timestep. |
| `base_shift` |  | number | no | `0.5` | 0.01 – 5 | Pergeseran dasar yang diterapkan pada timestep terjadwal. |
| `max_shift` |  | number | no | `1.15` | 0.01 – 5 | Pergeseran maksimum yang diterapkan pada timestep terjadwal. |
| `output_format` |  | enum (string) | no | `png` | `jpeg`, `png` | Format file untuk gambar hasil. |
| `use_beta_schedule` |  | boolean | no | `false` |  | Mengontrol apakah beta sigmas digunakan. |
| `sigma_schedule` |  | string \| null | no |  |  | Jadwal sigma yang digunakan selama denoising. |
| `scheduler` |  | enum (string) | no | `euler` | `euler`, `dpmpp_2m` | Scheduler yang digunakan selama denoising. |
| `negative_prompt` |  | string | no | `` |  | Negative prompt yang secara bawaan diproses dengan NAG untuk mencegah fitur yang tidak diinginkan muncul pada gambar yang dibuat. |
| `nag_scale` |  | number | no | `3` | ≤ 10, > 1 | Penghindaran negative prompt yang dikontrol oleh skala NAG: meningkatkannya membuat gambar yang dibuat semakin tidak mirip dengan deskripsi negatif. |
| `nag_tau` |  | number | no | `2.5` | > 0 | Pengaturan NAG tau untuk normalisasi hidden state; disarankan untuk membiarkannya tidak berubah. Menaikkannya melemahkan normalisasi dan berisiko menyebabkan penyimpangan tak terduga dari gambar asli. |
| `nag_alpha` |  | number | no | `0.25` | ≤ 1, > 0 | NAG alpha menentukan seberapa besar positive prompt mengarahkan ulang guidance yang dinormalisasi dengan menggabungkan positive prompt dan negative prompt. Pembobotan akhir ini memberi positive prompt pengaruh lebih besar pada pengaturan rendah dan mengurangi pengalihan pada pengaturan tinggi. |
| `nag_end` |  | number | no | `0.25` | ≤ 1, > 0 | Batas NAG yang dinyatakan sebagai proporsi langkah pembuatan. Proses attention asli FLUX mengambil alih setelah NAG berjalan selama proporsi awal tersebut. |

File parameters (`reference_image_url`) take a public `https://` URL, a `data:` URI up to 10 MB, or the `file_url` of an upload from `POST /files`.

## Example input

Required parameters only:

```json
{
  "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
}
```

A fuller example:

```json
{
  "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
}
```

## Run it

Set `DOITONG_API_KEY` to a key from https://doitong.com/developers/dashboard#keys. `?wait=20` returns the finished request in the same call when it is ready within 20 seconds; otherwise poll `GET /requests/{id}` (it also accepts `?wait=`), or pass `webhook_url`.

### curl

```bash
# Run the model; wait up to 20 s for the finished result in the same call
curl -X POST "https://api.doitong.com/v1/run/flux-general?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
  }'

# Still "queued" or "running"? Poll with the id from the response:
curl "https://api.doitong.com/v1/requests/REQUEST_ID?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY"
```

### JavaScript

```javascript
const API = "https://api.doitong.com/v1";
const headers = {
  "Authorization": "Bearer " + process.env.DOITONG_API_KEY,
  "Content-Type": "application/json",
};

// Run the model; wait up to 20 s for the finished result in the same call
let res = await fetch(API + "/run/flux-general?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
  }),
});
let request = await res.json();
if (!res.ok) throw new Error(request.error.code + ": " + request.error.message);

// Not finished yet: long-poll until it is
while (request.status === "queued" || request.status === "running") {
  res = await fetch(API + "/requests/" + request.id + "?wait=20", { headers });
  request = await res.json();
}
if (request.status !== "succeeded") throw new Error(JSON.stringify(request.error));
console.log(request.outputs.map((o) => o.url), request.cost.credits + " API credits ($" + request.cost.usd + ")");
```

### Python

```python
import os
import requests

API = "https://api.doitong.com/v1"
headers = {"Authorization": "Bearer " + os.environ["DOITONG_API_KEY"]}

payload = {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/flux-general", params={"wait": 20}, json=payload, headers=headers)
request = r.json()
if not r.ok:
    raise RuntimeError(request["error"]["code"] + ": " + request["error"]["message"])

# Not finished yet: long-poll until it is
while request["status"] in ("queued", "running"):
    request = requests.get(API + "/requests/" + request["id"], params={"wait": 20}, headers=headers).json()
if request["status"] != "succeeded":
    raise RuntimeError(request["error"])
print([o["url"] for o in request["outputs"]], request["cost"]["credits"], "API credits", "$" + request["cost"]["usd"])
```

### MCP

The MCP server at `https://api.doitong.com/v1/mcp` exposes the tools `search_models`, `get_model`, `quote`, `run`, `get_request`, `cancel_request`, `list_requests`, `create_upload` and `get_account`. A `run` call for this model:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "run",
    "arguments": {
      "model_id": "flux-general",
      "input": {
        "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
      },
      "wait_seconds": 20
    }
  }
}
```

## Response

Every call returns a request object. `status` is one of `queued`, `running`, `succeeded`, `failed`, `canceled`. `outputs` lists the generated files with URLs on our storage (kept forever, or 7 days with `?storage=temporary`; `storage` says which); `output` is the model's own result object with the same URLs.

```json
{
  "id": "req_8k2m4q7x1z9c3v5b6n0p2r4t",
  "object": "request",
  "model": "flux-general",
  "status": "succeeded",
  "created_at": "2026-10-20T12:00:00Z",
  "started_at": "2026-10-20T12:00:02Z",
  "completed_at": "2026-10-20T12:00:09Z",
  "queue_position": null,
  "cost": {
    "credits": 300,
    "usd": "0.30",
    "charged": 300,
    "refunded": 0
  },
  "input": {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
  },
  "output": {
    "images": [
      {
        "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.jpeg",
        "width": 1024,
        "height": 768,
        "content_type": "image/jpeg"
      }
    ],
    "timings": {},
    "seed": 42,
    "has_nsfw_concepts": [
      false
    ],
    "prompt": "string"
  },
  "outputs": [
    {
      "type": "image",
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.jpeg",
      "content_type": "image/jpeg",
      "file_size": 1843200,
      "width": 1024,
      "height": 768,
      "stored": true
    }
  ],
  "error": null,
  "metrics": {
    "inference_seconds": 6.8
  },
  "urls": {
    "self": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
    "cancel": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
  }
}
```

### Output fields (`output`)

| Field | Type | Description |
|---|---|---|
| `images` | array of object {url, width, height, content_type} | Informasi file untuk gambar yang dihasilkan. |
| `timings` | object |  |
| `seed` | integer | Seed pembuatan gambar, termasuk nilai yang dipilih secara acak jika input tidak menyertakan seed; jika tidak, nilai yang diberikan akan diulang. |
| `has_nsfw_concepts` | array of boolean | Menunjukkan apakah konsep NSFW muncul dalam gambar yang dihasilkan. |
| `prompt` | string | Prompt yang digunakan selama pembuatan gambar. |

## Related models

- [FLUX.1 \[dev\] with Controlnets and Loras · Differential Diffusion](https://doitong.com/developers/models/flux-general/differential-diffusion.md) (`flux-general/differential-diffusion`): $0.138 / image
- [FLUX.1 \[dev\] with Controlnets and Loras · Image to Image](https://doitong.com/developers/models/flux-general/image-to-image.md) (`flux-general/image-to-image`): $0.15 / image
- [FLUX.1 \[dev\] with Controlnets and Loras · Inpainting](https://doitong.com/developers/models/flux-general/inpainting.md) (`flux-general/inpainting`): $0.192 / image
- [FLUX.1 \[dev\] with Controlnets and Loras · Rf Inversion](https://doitong.com/developers/models/flux-general/rf-inversion.md) (`flux-general/rf-inversion`): $0.025 / image
- [FLUX.1 \[dev\]](https://doitong.com/developers/models/flux/dev.md) (`flux/dev`): $0.025 / megapixel
- [FLUX.1 \[schnell\]](https://doitong.com/developers/models/flux/schnell.md) (`flux/schnell`): $0.003 / megapixel
- [FLUX.2 \[dev\]](https://doitong.com/developers/models/flux-2.md) (`flux-2`): $0.012 / megapixel
- [FLUX.2 \[pro\]](https://doitong.com/developers/models/flux-2-pro.md) (`flux-2-pro`): $0.015 / megapixel of output image

## Links

- HTML page: https://doitong.com/developers/models/flux-general
- All models and guides for AI agents: https://doitong.com/developers/llms.txt
- OpenAPI 3.1 with this model's typed request body: https://doitong.com/developers/openapi.json?model=flux-general
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.com/v1/models/flux-general
