# 全量分轨
> 把已有歌曲拆成全部独立音轨，异步任务
> 鼓、贝斯、吉他、键盘、人声各一条
> 需要做二次编曲或混音时用这个
`POST /v1/music/generations/stemsAll`
## 认证
- `Authorization` (string / 必填) — 所有接口均使用 Bearer Token 进行认证。 获取 API Key：[访问控制台](https://api.oairoute.com/keys) 创建。 请求时在请求头中添加： ```http Authorization: Bearer YOUR_OAIRoute_KEY ```
## 请求参数
- `model` (string / 可选) — 音频模型，默认 `suno`。当前只有这一个取值。
- `task_id` (string / 必填) — 此前产出源音轨那次任务的 `task_id`。 缺失或无法解析到源音轨时，**提交阶段就返回 400**，不会建任务也不扣费。
- `audio_index` (integer / 可选) — 指定源任务结果 `data.result.music[]` 里的第几首，**从 1 起**，默认 `1`。 一次生成通常产出 2 首，所以要明确指定是哪一首。
- `audio_format` (string / 可选) — 输出音频格式，取值 `mp3`、`m4a`、`wav`。
## 不接受的参数
这几个字段传了也不会生效：
| 字段 | 说明 |
|---|---|
| `version` | 本端点没有版本维度，传了会被丢弃，也不影响计费 |
| `stem_type` | 本接口不发送该字段 |
| Max 相关字段 | 本接口不发送 |
> **Note:** 
> 引用源音轨只靠 `task_id` 加 `audio_index`，不需要记录任何额外的 id。不要试图传 `audio_id`、`music_id` 或 `audio_url`，那些都不认。
## 提交响应
- `code` (integer) — 状态码，成功为 200。
- `data[].status` (string) — 提交成功时为 `submitted`。
- `data[].task_id` (string) — 任务唯一标识，用于轮询 `GET /v1/music/tasks/{task_id}`。
## 任务状态
轮询间隔建议 3 到 5 秒，直到 `status` 变为 `completed` 或 `failed`。
状态取值：`pending`、`processing`、`completed`、`failed`。`progress` 是 0 到 100 的整数，变化节点不固定。
完成时结果里包含各分轨的 URL。失败时 `data.error.message` 给出原因，并自动退回预扣额度。
## 错误
| HTTP | type | 说明 |
|---|---|---|
| 400 | invalid_request_error | 请求参数无效 |
| 401 | authentication_error | 身份验证失败，请检查您的API密钥 |
| 402 | payment_required | 账户余额不足，请充值后再试 |
| 429 | rate_limit_error | 请求过于频繁，请稍后再试 |
更多状态码与重试建议见[错误码与限流](../../../support/errors.html)，常见报错的排查步骤见[常见问题](../../../support/faq.html)。
## 使用示例
提交一个任务并拿到 `task_id`：
> **Note:** 
> 提交成功只表示任务已受理。真正的产物要拿返回的 `task_id` 去任务查询接口轮询，`status` 变成 `completed` 之后才有结果。
**全量分轨{All stems}::cURL**
```
curl --request POST \
  --url 'https://api.oairoute.com/v1/music/generations/stemsAll' \
  --header 'Authorization: Bearer YOUR_OAIRoute_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "model": "suno",
    "task_id": "task_01K8SGYNNNVBQTXNR4MM964S7K",
    "audio_index": 1,
    "audio_format": "wav"
  }'
```
**全量分轨{All stems}::Python**
```
import time, requests
HEAD = {"Authorization": "Bearer YOUR_OAIRoute_KEY",
        "Content-Type": "application/json"}
res = requests.post(
    "https://api.oairoute.com/v1/music/generations/stemsAll",
    headers=HEAD,
    json={
        "model": "suno",
        "task_id": "task_01K8SGYNNNVBQTXNR4MM964S7K",
        "audio_index": 1,
        "audio_format": "wav",
    },
)
task_id = res.json()["data"][0]["task_id"]
while True:
    d = requests.get(
        f"https://api.oairoute.com/v1/music/tasks/{task_id}",
        headers=HEAD,
    ).json()["data"]
    if d["status"] == "completed":
        for stem in d["result"]["stems"]:
            print(stem.get("name"), stem.get("url"))
        break
    if d["status"] == "failed":
        raise RuntimeError(d.get("error"))
    time.sleep(4)
```
**全量分轨{All stems}::JavaScript**
```
const url = "https://api.oairoute.com/v1/music/generations/stemsAll";
const options = {
  method: "POST",
  headers: {
    "Authorization": "Bearer YOUR_OAIRoute_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "model": "suno",
    "task_id": "task_01K8SGYNNNVBQTXNR4MM964S7K",
    "audio_index": 1,
    "audio_format": "wav"
  }),
};
fetch(url, options)
  .then((res) => res.json())
  .then((json) => console.log(json))
  .catch((err) => console.error(err));
```
**200 全量分轨{All stems}**
```
{
  "code": 200,
  "data": [
    { "status": "submitted", "task_id": "task_01K8B22M0HP1GJWBJYZMKX1XS1" }
  ]
}
```
