# LTX 2.3 Trainer (V2) - Keyframe Interpolation API

> 訓練 LoRA，生成第一個與最後一個關鍵幀之間的動態，也可選擇加入中間關鍵幀

訓練用於關鍵幀插值的 LoRA：推論時提供第一幀與最後一幀，模型會生成中間的影片。啟用 `include_middle_keyframe` 後，會以第一幀、中間幀與最後一幀進行訓練；此時每個驗證樣本都必須提供 `middle_image_url`。資料透過 `training_data_url` 以 zip 提供，最多可包含 2 個驗證項目。

- Model id: `ltx23-trainer-v2/interpolate`
- Made by: Lightricks
- Category: Training
- Output: file
- Price: $0.0024 / step (cheapest run $4.80 (4800 API credits))
- Run: `POST https://api.doitong.ru/v1/run/ltx23-trainer-v2/interpolate`
- Quote: `POST https://api.doitong.ru/v1/quote/ltx23-trainer-v2/interpolate`
- Docs page: https://doitong.com/zh-TW/developers/models/ltx23-trainer-v2/interpolate

## Pricing

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

The full example input below costs $4.80 = 4800 API credits (2000 steps × 2.4 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-trainer-v2/interpolate` 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 |  |  | 包含訓練資料的 `.zip` URL，資料依選取的訓練模式組織。每個媒體檔案可搭配具有相同基本名稱的 `.txt` 說明檔。 |
| `rank` |  | enum (integer) | no | `32` | `8`, `16`, `32`, `64`, `128` | LoRA 適配階數；設定越高，記憶體消耗越大，但容量也越高。 |
| `number_of_steps` |  | integer | no | `2000` | 100 – 10,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 | `24` | 8 – 60 | 訓練影片的目標影格率（每秒影格數）。LTX-2.3 的原生速率為 24。 |
| `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` |  | 預處理檢查模式，用於完整訓練前檢查影片、圖像與說明。啟用後，訓練器會將處理過的訓練資料集放入可下載的封存檔，供手動檢查。 |
| `validation` |  | array of object {prompt, start_image_url, end_image_url, middle_image_url} | no | `[]` | ≤ 2 items | 以清單提供的驗證資料；每個項目將關鍵影格圖像與提示詞結合。 |
| `validation[].prompt` |  | string | yes |  |  | 驗證期間使用的提示詞。 |
| `validation[].start_image_url` |  | string (image URL) | yes |  | ≥ 1 characters | 初始影格的關鍵影格圖像 URL。 |
| `validation[].end_image_url` |  | string (image URL) | yes |  | ≥ 1 characters | 最終影格的關鍵影格圖像 URL。 |
| `validation[].middle_image_url` |  | string (image URL) \| null | no |  |  | 用於第一+中間+最後插值的中間關鍵影格圖像 URL。使用 `include_middle_keyframe=true` 的執行要求提供此值；否則為選填。 |
| `validation_negative_prompt` |  | string | no | `blurry, out of focus, overexposed, underexposed, low contrast, washed out colors, excessive noise, grainy texture, poor lighting, flickering, motion blur, distorted proportions, unnatural skin tones, deformed facial features, asymmetrical face, missing facial features, extra limbs, disfigured hands, wrong hand count, artifacts around text, inconsistent perspective, camera shake, incorrect depth of field, background too sharp, background clutter, distracting reflections, harsh shadows, inconsistent lighting direction, color banding, cartoonish rendering, 3D CGI look, unrealistic materials, uncanny valley effect, incorrect ethnicity, wrong gender, exaggerated expressions, wrong gaze direction, mismatched lip sync, silent or muted audio, distorted voice, robotic voice, echo, background noise, off-sync audio, incorrect dialogue, added dialogue, repetitive speech, jittery movement, awkward pauses, incorrect timing, unnatural transitions, inconsistent framing, tilted camera, flat lighting, inconsistent tone, cinematic oversaturation, stylized filters, or AI artifacts.` |  | 驗證期間套用的負面提示詞；驗證使用單階段預覽流程。由於該流程近似兩階段的蒸餾生產推論，其引導方式與預覽品質會不同於最終結果。 |
| `validation_number_of_frames` |  | integer | no | `89` | 9 – 121 | 每部驗證影片的影格數。 |
| `validation_frame_rate` |  | integer | no | `24` | 8 – 60 | 驗證影片的目標影格率（每秒影格數）；LTX-2.3 的原生速率為 24。 |
| `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。 |
| `include_middle_keyframe` |  | boolean | no | `false` |  | 影片生成的中間關鍵影格納入設定：true 要求每個驗證樣本都有 `middle_image_url`，並保留中間影格及第一和最後影格，而非只使用第一和最後影格。 |

## 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-trainer-v2/interpolate?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-trainer-v2/interpolate?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-trainer-v2/interpolate", 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-trainer-v2/interpolate",
      "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-trainer-v2/interpolate",
  "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": 4800,
    "usd": "4.80",
    "charged": 4800,
    "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
    },
    "audio": {
      "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 | 驗證產生的合併影片預覽；對可產生影片的端點，若有提供則包含此欄位。 |
| `audio` | object {url, content_type, file_name, file_size} \| null | 驗證產生的合併音訊；對以下音訊專用路由，若有提供則作為預覽：/audio-inpaint、/audio-extend-suffix、/audio-extend-prefix、/t2a、/a2a 與 /v2a。 |
| `lora_file` | object {url, content_type, file_name, file_size} | `.safetensors` 格式訓練 LoRA 權重的 URL。 |
| `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-trainer-v2/interpolate
- 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-trainer-v2/interpolate
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.ru/v1/models/ltx23-trainer-v2/interpolate
