Flux 2 Klein 4b Text To Image LoRA API Documentation
Playground
Try it on WaveSpeedAI!FLUX.2 [klein] 4B with LoRA support is a compact 4-billion-parameter text-to-image model that delivers fast generation with quality results and LoRA customization. Ready-to-use REST inference API, best performance, no cold starts, affordable pricing.
Features
FLUX.2 Klein 4B Text-to-Image LoRA is a lightweight yet powerful text-to-image generation model with full LoRA support. Describe your vision in text, optionally apply custom LoRA adapters for personalized styles — all with fast generation and affordable pricing.
Why Choose This?
-
High-quality generation Generate detailed, high-fidelity images from text descriptions with strong prompt adherence.
-
LoRA support Apply custom LoRA adapters for personalized styles, characters, or visual aesthetics.
-
Flexible sizing Custom width and height controls for any aspect ratio.
-
Prompt Enhancer Built-in tool to automatically improve your prompts for better results.
-
Lightweight and fast 4B parameter model optimized for quick turnaround at affordable pricing.
Parameters
| Parameter | Required | Description |
|---|---|---|
| prompt | Yes | Text description of the image you want to generate |
| width | No | Output width in pixels (default: 1024) |
| height | No | Output height in pixels (default: 1024) |
| loras | No | List of LoRA adapters to apply |
| seed | No | Random seed for reproducibility (-1 for random) |
LoRA Format
Each LoRA in the loras array has:
- path (required) — URL to the LoRA weights file
- scale (optional) — Weight multiplier, default 1
How to Use
- Write your prompt — describe the image including subject, style, lighting, and mood.
- Set size — adjust width and height for your desired dimensions.
- Add LoRAs (optional) — click ”+ Add Item” to include custom LoRA adapters.
- Set seed — use -1 for random, or specify a number for reproducibility.
- Run — submit and download the generated image.
Pricing
| Item | Cost |
|---|---|
| Per image | $0.013 |
Simple flat-rate pricing regardless of image size or LoRA count.
Best Use Cases
- Custom Character Generation — Apply character LoRAs for consistent identity.
- Style Personalization — Use style LoRAs for unique visual aesthetics.
- Brand Content — Create on-brand visuals with trained LoRA styles.
- Rapid Prototyping — Fast, affordable generation for creative iteration.
- Batch Generation — Low cost enables large-scale image production.
Pro Tips
- Be specific in your prompts — include subject, style, lighting, colors, and atmosphere.
- Start with LoRA scale 1.0 and adjust based on results.
- Combine multiple LoRAs for hybrid styles (e.g., character + art style).
- Use the same seed to compare different prompts or LoRA combinations.
- If your LoRA uses trigger words, include them in your prompt.
Notes
- LoRAs can be stacked for combined effects.
- For best results, use LoRAs trained on FLUX-compatible models.
- Processing speed is optimized for quick turnaround.
Related Models
- FLUX.2 Klein 4B Text-to-Image — Standard version without LoRA support.
- FLUX.2 Klein 4B Edit LoRA — Image editing with LoRA support.
- FLUX.2 Pro — Flagship-quality text-to-image generation.
Authentication
For authentication details, please refer to the Authentication Guide.
API Endpoints
Submit Task & Query Result
set -euo pipefail
export WAVESPEED_API_KEY="your-api-key"
REQUEST_BODY=$(cat <<'JSON'
{
"prompt": "A cinematic ocean wave at sunrise, highly detailed",
"size": "1024*1024"
}
JSON
)
# 1. Submit the prediction once. Never retry this request automatically:
# a retry after an unclear failure can create a second, billed task.
CHECK='The task may already exist. Check History or the predictions list before submitting again.'
if ! SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
--connect-timeout 10 --max-time 60 \
-X POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/flux-2-klein-4b/text-to-image-lora" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
-H "Content-Type: application/json" \
-d "${REQUEST_BODY}"); then
printf 'Submit failed. %s\n' "${CHECK}" >&2
exit 1
fi
TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; then
printf 'Submission response did not contain a prediction id. %s\n' "${CHECK}" >&2
exit 1
fi
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"
# 2. Poll until the prediction reaches a final status.
BODY_FILE=$(mktemp)
trap 'rm -f "${BODY_FILE}"' EXIT
while true; do
# Transient errors (429, 5xx) are retried, honoring Retry-After.
HTTP_CODE=$(curl --silent --show-error --fail-with-body \
--connect-timeout 10 --max-time 60 --retry 5 --retry-delay 2 \
--output "${BODY_FILE}" --write-out '%{http_code}' \
"${RESULT_URL}" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}" || true)
case "${HTTP_CODE}" in
2??) ;;
000|429|5??) # dropped connection or temporary error: keep polling
printf 'Task %s: HTTP %s, polling again in 10s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
sleep 10; continue ;;
*) printf 'Task %s: HTTP %s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
cat "${BODY_FILE}" >&2; exit 1 ;;
esac
RESULT=$(jq 'if type == "object" and has("data") then .data else . end' "${BODY_FILE}")
STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')
case "${STATUS}" in
completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
failed|cancelled|timeout|deleted)
printf 'Task %s ended with status %s\n' "${PREDICTION_ID}" "${STATUS}" >&2
printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
*) sleep 2 ;;
esac
doneRetry temporary errors only while polling, never the submit request. Errors, retries and timeouts
Parameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| prompt | string | Yes | - | The positive prompt for the generation. | |
| size | string | No | 1024*1024 | 256 ~ 2048 | The size of the generated media in pixels (width*height). |
| loras | array<object> | No | 0 ~ 3 items | List of LoRAs to apply (max 3). | |
| loras[].path | string | Yes | - | - | URL or the path to the LoRA weights. |
| loras[].scale | number | No | 1 | 0 ~ 4 | The scale of the LoRA weights. This is used to scale the LoRA weight before merging it with the base model. |
| seed | integer | No | - | - | The random seed to use for the generation. -1 means a random seed will be used. |
| enable_sync_mode | boolean | No | false | - | If set to `true`, the request attempts to wait for the generated result and return outputs in the same response. If the result is not ready within the sync wait window, the API can return a timeout body while the task continues processing. This option is only available via the API and is supported only by some models. |
| enable_base64_output | boolean | No | false | - | If set to `true`, the prediction's `output` strings are returned as **naked base64** (no `data:<mime>;base64,` prefix). When `false` (default), outputs are returned as URLs pointing to our CDN. |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Output values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.status | string | Task status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses. |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction |
| data.model | string | Model ID used for the prediction |
| data.outputs | array<string | object> | Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model. |
| data.urls | object | Object containing related API endpoints |
| data.status | string | Status: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses |
| data.created_at | string | ISO timestamp of when the request was created |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |