# LTX-2.3 22B Video Trainer API

> یک LoRA مدل LTX-2.3 22B را برای سبک‌ها و جلوه‌های ویدیویی سفارشی، با صوت اختیاری، آموزش می‌دهد

یک LoRA را روی مدل LTX-2.3 22B برای سبک‌ها و جلوه‌های سفارشی از zip ویدیوها یا تصاویر آموزش می‌دهد؛ در حالت ایده‌آل 10 فایل یا بیشتر. `number_of_steps` از 100 تا 6000 است (پیش‌فرض 2000)، مقدار پیش‌فرض `frame_rate` برابر 25 و مقدار پیش‌فرض `first_frame_conditioning_p` برابر 0.5 است. `with_audio` آموزش صوتی را اجباری یا غیرفعال می‌کند و `generate_audio_in_validation` صوت را در پیش‌نمایش‌ها کنترل می‌کند.

- Model id: `ltx23-video-trainer`
- Made by: Lightricks
- Category: Training
- Output: file
- Price: $0.0048 / step (cheapest run $9.60 (9600 API credits))
- Run: `POST https://api.doitong.ru/v1/run/ltx23-video-trainer`
- Quote: `POST https://api.doitong.ru/v1/quote/ltx23-video-trainer`
- Docs page: https://doitong.com/fa/developers/models/ltx23-video-trainer

## Pricing

Price: **$0.0048 / step**. Billed per training step (`number_of_steps`).

The full example input below costs $9.60 = 9600 API credits (2000 steps × 4.8 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.ru/v1/quote/ltx23-video-trainer` 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

| Parameter | Canonical name | Type | Required | Default | Allowed values / range | Description |
|---|---|---|---|---|---|---|
| `training_data_url` |  | string | yes |  |  | URL آرشیو ZIP برای مجموعه‌داده‌ای که منحصراً شامل تصویر یا منحصراً شامل ویدیو است؛ مجموعه‌داده‌های رسانه‌ای ترکیبی پشتیبانی نمی‌شوند. دست‌کم 10 فایل و ترجیحاً مجموعه‌ای بزرگ‌تر در نظر بگیرید. پسوندهای پذیرفته‌شده برای تصویر .png، .jpg، .jpeg و برای ویدیو .mp4، .mov، .avi، .mkv هستند. فایل‌های متنی کپشن اختیاری می‌توانند همراه رسانه باشند و نام هر فایل کپشن باید با فایل رسانه متناظر یکسان باشد. |
| `rank` |  | enum (integer) | no | `32` | `8`, `16`, `32`, `64`, `128` | رتبه سازگارسازی LoRA که با افزایش مقدار، مصرف حافظه بیشتر و ظرفیت بالاتری ایجاد می‌کند. |
| `number_of_steps` |  | integer | no | `2000` | 100 – 6,000 | تعداد کل گام‌های آموزشی. |
| `learning_rate` |  | number | no | `0.0002` | 0.000001 – 1 | نرخ یادگیری بهینه‌سازی که میان افزایش احتمالی سرعت آموزش و خطر بیش‌برازش در مقادیر بالاتر تعادل برقرار می‌کند. |
| `number_of_frames` |  | integer | no | `89` | 9 – 121 | تعداد فریم هر نمونه آموزشی. تقسیم این تعداد بر 8 باید باقیمانده 1 داشته باشد؛ نمونه‌ها شامل 1، 9، 17، 25، 33، 41، 49، 57، 65، 73، 81، 89، 97 هستند. |
| `frame_rate` |  | integer | no | `25` | 8 – 60 | نرخ فریم ویدیوی هدف، برحسب فریم بر ثانیه. |
| `resolution` |  | enum (string) | no | `medium` | `low`, `medium`, `high` | وضوح آموزشی. افزایش وضوح نیاز حافظه را بیشتر می‌کند. |
| `aspect_ratio` |  | enum (string) | no | `1:1` | `16:9`, `1:1`, `9:16` | نسبت تصویر آموزشی. |
| `trigger_phrase` |  | string | no | `` |  | عبارت فعال‌سازی سبک LoRA که هنگام آموزش در ابتدای کپشن‌ها درج می‌شود. |
| `auto_scale_input` |  | boolean | no | `false` |  | تنظیم خودکار ویدیو برای تطبیق با FPS و تعداد فریم درخواستی هنگام فعال‌بودن؛ مجموعه‌داده‌های تصویری بدون تغییر می‌مانند. |
| `split_input_into_scenes` |  | boolean | no | `true` |  | تقسیم صحنه برای ویدیوهای طولانی‌تر از آستانه مدت‌زمان که در صورت true فعال می‌شود. |
| `split_input_duration_threshold` |  | number | no | `30` | 1 – 60 | محرک تقسیم صحنه که به‌صورت مدت برحسب ثانیه بیان می‌شود: فقط ویدیوهای طولانی‌تر از آستانه تقسیم می‌شوند. |
| `debug_dataset` |  | boolean | no | `false` |  | حالت بررسی پیش‌پردازش برای وارسی ویدیوها، تصاویر و کپشن‌ها پیش از اجرای کامل آموزش. فعال‌کردن آن باعث می‌شود آموزش‌دهنده مجموعه‌داده آموزشی پردازش‌شده را در یک بایگانی قابل‌دانلود برای بررسی دستی برگرداند. |
| `with_audio` |  | boolean \| null | no |  |  | برای اجباری‌کردن آموزش صوت در کنار آموزش ویدیو True یا برای حذف صوت False را انتخاب کنید. باقی‌گذاشتن تنظیم روی مقدار پیش‌فرض None انتخاب را بر اساس وجود صوت در ویدیوهای ارائه‌شده خودکار می‌کند. |
| `audio_normalize` |  | boolean | no | `true` |  | نرمال‌سازی دامنه اوج، که برای یکدست‌کردن سطح صوت در سراسر مجموعه‌داده با رساندن اوج‌ها به سطحی مشترک توصیه می‌شود. |
| `audio_preserve_pitch` |  | boolean | no | `true` |  | حفظ زیر و بم هنگام تفاوت طول صوت و ویدیو: فعال‌بودن از کشش یا فشرده‌سازی زمانی استفاده می‌کند؛ غیرفعال‌بودن به‌جای آن از برش یا افزودن سکوت استفاده می‌کند. |
| `first_frame_conditioning_p` |  | number | no | `0.5` | 0 – 1 | عملکرد image-to-video را با افزایش دفعات استفاده آموزش از شرطی‌سازی فریم اول بهبود می‌دهد؛ این مقدار آن احتمال را تعیین می‌کند. |
| `validation` |  | array of object {prompt, image_url} | no | `[]` | ≤ 2 items | فهرست پرامپت‌های اعتبارسنجی آموزش که ورودی‌های آن باید همگی تصویر داشته باشند یا همگی فاقد تصویر باشند. |
| `validation[].prompt` |  | string | yes |  |  | پرامپت استفاده‌شده هنگام اعتبارسنجی. |
| `validation[].image_url` |  | string (image URL) \| null | no |  |  | تصویر برای اعتبارسنجی image-to-video؛ فقط زمانی مجاز است که همه ورودی‌های اعتبارسنجی دیگر نیز تصویر داشته باشند. |
| `validation_negative_prompt` |  | string | no | `worst quality, inconsistent motion, blurry, jittery, distorted` |  | پرامپت منفی اعمال‌شده هنگام اعتبارسنجی. |
| `validation_number_of_frames` |  | integer | no | `89` | 9 – 121 | تعداد فریم هر ویدیوی اعتبارسنجی. |
| `validation_frame_rate` |  | integer | no | `25` | 8 – 60 | نرخ فریم ویدیوی اعتبارسنجی هدف، برحسب فریم بر ثانیه. |
| `validation_resolution` |  | enum (string) | no | `high` | `low`, `medium`, `high` | وضوح استفاده‌شده هنگام اعتبارسنجی. |
| `validation_aspect_ratio` |  | enum (string) | no | `1:1` | `16:9`, `1:1`, `9:16` | نسبت تصویر استفاده‌شده هنگام اعتبارسنجی. |
| `stg_scale` |  | number | no | `1` | 0 – 3 | مقیاس راهنمایی مکانی-زمانی (STG)؛ مقدار پیشنهادی 1.0 است و 0.0، STG را خاموش می‌کند. |
| `generate_audio_in_validation` |  | boolean | no | `true` |  | کنترل می‌کند که نمونه‌های اعتبارسنجی شامل صوت تولیدشده باشند یا نه. |

## Example input

Required parameters only:

```json
{
  "training_data_url": "https://example.com/your-file.zip"
}
```

A fuller example:

```json
{
  "training_data_url": "https://example.com/your-file.zip"
}
```

## 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.ru/v1/run/ltx23-video-trainer?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "training_data_url": "https://example.com/your-file.zip"
  }'

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

### JavaScript

```javascript
const API = "https://api.doitong.ru/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/ltx23-video-trainer?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "training_data_url": "https://example.com/your-file.zip"
  }),
});
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.ru/v1"
headers = {"Authorization": "Bearer " + os.environ["DOITONG_API_KEY"]}

payload = {
    "training_data_url": "https://example.com/your-file.zip",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/ltx23-video-trainer", 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.ru/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": "ltx23-video-trainer",
      "input": {
        "training_data_url": "https://example.com/your-file.zip"
      },
      "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": "ltx23-video-trainer",
  "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": 9600,
    "usd": "9.60",
    "charged": 9600,
    "refunded": 0
  },
  "input": {
    "training_data_url": "https://example.com/your-file.zip"
  },
  "output": {
    "video": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.jpeg",
      "content_type": "image/jpeg",
      "file_name": "0-output.jpeg",
      "file_size": 1843200
    },
    "lora_file": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.jpeg",
      "content_type": "image/jpeg",
      "file_name": "0-output.jpeg",
      "file_size": 1843200
    },
    "config_file": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.jpeg",
      "content_type": "image/jpeg",
      "file_name": "0-output.jpeg",
      "file_size": 1843200
    },
    "debug_dataset": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.jpeg",
      "content_type": "image/jpeg",
      "file_name": "0-output.jpeg",
      "file_size": 1843200
    }
  },
  "outputs": [
    {
      "type": "file",
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.jpeg",
      "content_type": "image/jpeg",
      "file_size": 1843200,
      "stored": true
    }
  ],
  "error": null,
  "metrics": {
    "inference_seconds": 6.8
  },
  "urls": {
    "self": "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
    "cancel": "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
  }
}
```

### Output fields (`output`)

| Field | Type | Description |
|---|---|---|
| `video` | object {url, content_type, file_name, file_size} \| null | URL هر ویدیوی اعتبارسنجی موجود. |
| `lora_file` | object {url, content_type, file_name, file_size} | URL وزن‌های آموزش‌دیده LoRA در قالب .safetensors. |
| `config_file` | object {url, content_type, file_name, file_size} | پیکربندی راه‌اندازی نقطه پایانی استنتاج. |
| `debug_dataset` | object {url, content_type, file_name, file_size} \| null | آرشیو اشکال‌زدایی قابل‌دانلود که فقط برای ورودی‌های دارای `debug_dataset` فعال برگردانده می‌شود؛ این آرشیو مجموعه‌داده آموزش ازپیش‌پردازش‌شده، شامل صوت و ویدیوی رمزگشایی‌شده، را در خود دارد. |

## Related models

- [LTX 2.3 Trainer (V2) - Audio Inpainting](https://doitong.com/developers/models/ltx23-trainer-v2/audio-inpaint.md) (`ltx23-trainer-v2/audio-inpaint`): $0.0023 / step
- [LTX 2.3 Trainer (V2) - Audio+Video Reference IC-LoRA](https://doitong.com/developers/models/ltx23-trainer-v2/ic-lora/av2av.md) (`ltx23-trainer-v2/ic-lora/av2av`): $0.0068 / step
- [LTX 2.3 Trainer (V2) - Audio+Video Reference Transformation](https://doitong.com/developers/models/ltx23-trainer-v2/av2av.md) (`ltx23-trainer-v2/av2av`): $0.0068 / step
- [LTX 2.3 Trainer (V2) - Audio-to-Audio](https://doitong.com/developers/models/ltx23-trainer-v2/a2a.md) (`ltx23-trainer-v2/a2a`): $0.0023 / step
- [LTX 2.3 Trainer (V2) - Audio-to-Audio IC-LoRA](https://doitong.com/developers/models/ltx23-trainer-v2/ic-lora/a2a.md) (`ltx23-trainer-v2/ic-lora/a2a`): $0.0023 / step
- [LTX 2.3 Trainer (V2) - Audio-to-Video](https://doitong.com/developers/models/ltx23-trainer-v2/a2v.md) (`ltx23-trainer-v2/a2v`): $0.006 / step
- [LTX 2.3 Trainer (V2) - Backward Audio Extension](https://doitong.com/developers/models/ltx23-trainer-v2/audio-extend-suffix.md) (`ltx23-trainer-v2/audio-extend-suffix`): $0.0023 / step
- [LTX 2.3 Trainer (V2) - Backward Video Extension](https://doitong.com/developers/models/ltx23-trainer-v2/extend-suffix.md) (`ltx23-trainer-v2/extend-suffix`): $0.0061 / step

## Links

- HTML page: https://doitong.com/developers/models/ltx23-video-trainer
- 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=ltx23-video-trainer
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.ru/v1/models/ltx23-video-trainer
