Flux 2 Klein Base 9b Edit LoRA API Documentation

Flux 2 Klein Base 9b Edit LoRA API Documentation

Playground

Try it on WaveSpeedAI!

FLUX.2 [klein] Base 9B Edit with LoRA support is a high-quality image editing model with 9B parameters, offering precise modifications using natural language instructions and personalized styles via custom LoRA adapters. Ready-to-use REST inference API, best performance, no cold starts, affordable pricing.

Features

WaveSpeed AI FLUX.2 Klein Base 9B Edit LoRA is a high-quality image editing model with full LoRA support. Built on a 9B-parameter architecture, it delivers stronger detail, better prompt understanding, and more refined edits than the 4B variant. Upload one or more source images, describe the edit in natural language, and optionally apply custom LoRA adapters for personalized styles or character consistency.


Why Choose This?

  • Higher-quality editing The 9B model produces richer detail, stronger prompt adherence, and better overall edit quality than the 4B variant.

  • Natural-language editing Describe the change you want in plain language — transform style, modify content, add effects, or refine the scene.

  • Full LoRA support Apply custom LoRA adapters for personalized styles, characters, aesthetics, or branded visual directions.

  • Multi-image support Upload multiple source images for more context-aware editing and compositing workflows.

  • Flexible output sizing Optionally set output dimensions, or leave size empty to preserve the original input dimensions.

  • Prompt Enhancer Built-in prompt enhancement can help improve edit quality and prompt clarity.

  • Production-ready workflow Suitable for high-quality retouching, style transfer, compositing, and more advanced creative editing tasks.


Parameters

ParameterRequiredDescription
promptYesText description of the desired edit.
imagesYesSource images to edit. Multiple images are supported.
lorasNoList of LoRA adapters to apply during editing.
sizeNoOutput dimensions. Leave empty to match the input image dimensions.
seedNoRandom seed for reproducibility. Use -1 for random generation.

LoRA Format

Each item in the loras array supports:

FieldRequiredDescription
pathYesURL to the LoRA weights file.
scaleNoLoRA weight multiplier. Default: 1.

How to Use

  1. Write your prompt — describe the edit you want, such as “make it a real picture” or “add sunset lighting.”
  2. Upload your images — add one or more source images using the image input.
  3. Add LoRAs (optional) — include one or more LoRA adapters if you want custom style or character control.
  4. Adjust LoRA scale (optional) — start with 1 and fine-tune if needed.
  5. Set size (optional) — specify output dimensions, or leave it empty to preserve the original dimensions.
  6. Set seed (optional) — use -1 for random generation, or enter a fixed seed for reproducible results.
  7. Submit — run the model and download the edited image.

Example Prompt

Turn this illustration into a realistic cinematic portrait, keep the same composition and facial features, add soft sunset lighting and natural skin texture.


Pricing

ItemCost
Per image$0.026

Billing Rules

  • Pricing is fixed at $0.026 per generated image
  • size, seed, and the number of LoRAs do not affect pricing
  • Flat-rate pricing applies regardless of image dimensions or LoRA count

Best Use Cases

  • Style transfer — Transform images using custom LoRA styles or aesthetics.
  • Reality enhancement — Convert illustrations, renders, or stylized images into more photorealistic results.
  • Character consistency — Apply character LoRAs while editing to maintain a recognizable identity.
  • High-quality retouching — Use the 9B model when the 4B variant is not sufficient for professional work.
  • Production editing — Balance strong detail and prompt fidelity with practical cost and speed.
  • Complex image refinement — Handle edits that need stronger scene understanding and more precise visual control.

Pro Tips

  • Be specific about what should change and what should stay the same.
  • Use LoRAs when you want a consistent style or character look across multiple edits.
  • Leave size empty when you want to preserve the original image dimensions.
  • Start with LoRA scale = 1 and adjust based on how strongly you want the adapter to influence the result.
  • Use the same seed when comparing different prompts or LoRA combinations.
  • For best results, use high-quality source images and clearly written prompts.

Notes

  • Both prompt and images are required.
  • If size is not specified, the output matches the input image dimensions.
  • LoRAs can be stacked for combined effects.
  • The 9B model offers better detail and prompt understanding than the 4B variant at a slightly higher cost.
  • For best results, use high-quality source images.

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",
  "images": [
    "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
  ],
  "seed": -1
}
JSON
)

# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  -X POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/flux-2-klein-base-9b/edit-lora" \
  -H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
  -H "Content-Type: application/json" \
  -d "${REQUEST_BODY}")

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
' >&2
  exit 1
fi
RESULT_URL=$(printf '%s' "${TASK}" | jq -r '.urls.get // empty')
if [ -z "${RESULT_URL}" ]; then RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"; fi

# 2. Poll until the prediction finishes.
while true; do
  RESPONSE=$(curl --silent --show-error --fail-with-body \
    "${RESULT_URL}" \
    -H "Authorization: Bearer ${WAVESPEED_API_KEY}")
  RESULT=$(printf '%s' "${RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
  STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')

  case "${STATUS}" in
    completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
    failed|cancelled|timeout) printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
    created|processing) sleep 2 ;;
    *) printf 'Unexpected status: %s
' "${STATUS}" >&2; exit 1 ;;
  esac
done

Parameters

Task Submission Parameters

Request Parameters

ParameterTypeRequiredDefaultRangeDescription
promptstringYes-The editing instruction.
imagesarray<string>Yes-0 ~ 3 itemsList of reference image URLs (1-3 images).
lorasarray<object>No0 ~ 3 itemsList of LoRAs to apply (max 3).
seedintegerNo-1-The random seed to use for the generation. -1 means a random seed will be used.
enable_sync_modebooleanNofalse-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_outputbooleanNofalse-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

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
data.idstringUnique identifier for the prediction, Task Id
data.modelstringModel ID used for the prediction
data.outputsarrayOutput values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed)
data.urlsobjectObject containing related API endpoints
data.urls.getstringURL to retrieve the prediction result
data.statusstringStatus of the task: created, processing, completed, or failed
data.created_atstringISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”)
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds

Result Request Parameters

ParameterTypeRequiredDefaultDescription
idstringYes-Task ID

Result Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
dataobjectThe prediction data object containing all details
data.idstringUnique identifier for the prediction
data.modelstringModel ID used for the prediction
data.outputsarray<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.urlsobjectObject containing related API endpoints
data.urls.getstringURL to poll for the prediction result
data.statusstringStatus: created, processing, completed, or failed
data.created_atstringISO timestamp of when the request was created
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds
© 2026 WaveSpeedAI. All rights reserved.