Pruna AI P Image Text To Image Trainer API Documentation

Pruna AI P Image Text To Image Trainer API Documentation

Playground

Try it on WaveSpeedAI!

Pruna AI P-Image Text to Image Trainer is a fast AI model training workflow for customizing text-to-image generation models with user-provided data. Ready-to-use REST inference API for training custom styles, brand-specific visuals, character concepts, product image generation, marketing creatives, and personalized AI image workflows with simple integration, no coldstarts, and affordable pricing.

Features

Pruna AI P-Image Text-to-Image Trainer is a fast training workflow for creating custom LoRAs for the Pruna text-to-image ecosystem. Upload your training image data, optionally provide a default caption, choose the number of training steps, and generate a LoRA that can be used to steer future image generation toward your style, subject, or brand look.


Why Choose This?

  • Fast custom LoRA training Train a text-to-image LoRA for specialized styles, subjects, or branded visuals.

  • Simple training interface Provide your training image data, optional default caption, and training steps without a complex setup process.

  • Optional caption guidance Use default_caption to provide consistent text conditioning across the training dataset.

  • Flexible training depth Use steps to balance speed, cost, and how strongly the LoRA learns your dataset.

  • Built for the Pruna image stack Trained outputs are intended for downstream use with Pruna text-to-image LoRA workflows.

  • Production-ready API Suitable for custom style pipelines, branded asset generation, and repeatable image workflow customization.


Parameters

ParameterRequiredDescription
image_dataYesTraining image data used to create the LoRA.
default_captionNoOptional default caption applied across the training workflow for more consistent conditioning.
stepsNoNumber of training steps. Higher values generally increase training time and cost. Default: 101.

How to Use

  1. Upload your training data — provide the image dataset you want to use for training.
  2. Add a default caption (optional) — use a short caption if you want more consistent text conditioning across the dataset.
  3. Set training steps — choose how many steps to run based on your desired balance of speed and training strength.
  4. Submit — start the training job.
  5. Use the trained LoRA — apply the resulting LoRA in downstream Pruna text-to-image LoRA workflows.

Example Workflow

Train a custom style LoRA from a curated image set, optionally using a shared default caption, then use the resulting weights in Pruna AI P-Image Text-to-Image LoRA for generation.


Pricing

Pricing is based on the selected steps value.

StepsCost
100$0.18
101$0.1818
250$0.45
500$0.90
1000$1.80
2000$3.60

Billing Rules

  • Pricing scales linearly with steps
  • Cost is $1.80 per 1,000 steps
  • Higher steps values increase total training cost proportionally
  • default_caption does not affect pricing

Best Use Cases

  • Custom style training — Create LoRAs for a distinct visual style or art direction.
  • Brand consistency — Train reusable LoRAs for campaigns, products, or branded aesthetics.
  • Subject-focused generation — Teach the model a recurring character, fashion look, or visual concept.
  • Creative workflow personalization — Build specialized LoRAs for repeatable prompt-driven generation.
  • Marketing asset pipelines — Create tailored generation tools for ongoing content production.

Pro Tips

  • Use a clean, consistent training dataset for better LoRA quality.
  • Add a default_caption when your dataset shares a common concept, subject, or style cue.
  • Start with a moderate number of steps before pushing to larger training runs.
  • Increase steps gradually if the initial LoRA is too weak or underfit.
  • Keep your dataset focused on the style or subject you want the LoRA to learn.
  • Test the trained LoRA in downstream generation workflows before scaling up training volume.

Notes

  • image_data is required.
  • default_caption is optional.
  • steps defaults to 101.
  • Pricing depends only on the selected steps value.
  • LoRAs trained here are intended for Pruna text-to-image LoRA usage.

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'
{
  "image_data": "https://github.com/mdn/interactive-examples/archive/refs/heads/main.zip",
  "steps": 101
}
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/pruna-ai/p-image/text-to-image-trainer" \
  -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
done

Retry temporary errors only while polling, never the submit request. Errors, retries and timeouts

Parameters

Task Submission Parameters

Request Parameters

ParameterTypeRequiredDefaultRangeDescription
image_datastringYes--Training image archive URL.
stepsintegerNo1011 ~ ∞Number of training steps.
default_captionstringNo--Default caption for images without .txt files. If captions are missing and this is empty, training can fail.

Every model also accepts the global request options enable_sync_mode and enable_base64_output; see their pages for details.

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.statusstringTask status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses.
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.statusstringStatus: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses
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.