# 放大与变体（Midjourney）
> 放大与变体都通过 `/mj/submit/action` 触发
> 动作由父任务 `buttons` 里的 `customId` 决定
> 四宫格里的每一张都能单独放大或生成变体
`POST /mj/submit/action`
## 认证
- `Authorization` (string / 必填) — 所有接口均使用 Bearer Token 进行认证。 获取 API Key：[访问控制台](https://api.oairoute.com/keys) 创建。 请求时在请求头中添加： ```http Authorization: Bearer YOUR_OAIRoute_KEY ```
## 请求参数
- `customId` (string / 必填) — 动作标识，从父任务 `buttons` 里取，例如放大第一张是 `MJ::JOB::upsample::1::UUID`。
- `taskId` (string / 必填) — 父任务 ID，必须是 `SUCCESS` 状态。
- `notifyHook` (string / 可选) — 回调地址。
- `state` (string / 可选) — 自定义透传字段。
- `noStorage` (boolean / 可选) — 为 `true` 时返回官方链接，默认 `false`。
- `enableRemix` (boolean / 可选) — 是否启用 remix 模式，默认 `false`。
## 常用按钮
| 按钮 | `label` | 效果 |
|---|---|---|
| 放大 | `U1` 到 `U4` | 把对应那一张单独放大 |
| 变体 | `V1` 到 `V4` | 围绕那一张重新生成四宫格 |
| 轻微变体 | `Vary (Subtle)` | 改动幅度小 |
| 大幅变体 | `Vary (Strong)` | 改动幅度大 |
| 重掷 | `Reroll` | 用相同提示词重新生成 |
> **Note:** 
> `customId` 里有 UUID，与父任务绑定。父任务重掷后旧的 `customId` 会失效，点击前先 fetch 一次拿最新的 `buttons`。
## 两步流程
| 步骤 | 端点 | 作用 |
|---|---|---|
| 1 | `POST /mj/submit/imagine` | 生成四宫格，拿父任务 ID |
| 2 | `GET /mj/task/{id}/fetch` | 取 `buttons` 里的 `customId` |
| 3 | `POST /mj/submit/action` | 传 `customId` + `taskId` 执行放大或变体 |
## 放大后的用途
放大得到的单图才能做向外扩展与局部重绘，四宫格不行。想做后续编辑时，先放大再操作。
## 错误码
| HTTP | 含义 |
|---|---|
| 200 | 请求已受理，看 `code` 判断是否成功 |
| 401 | Token 缺失或无效 |
| 429 | 触发限流 |
常见失败：`taskId` 不是 `SUCCESS` 状态；`customId` 与 `taskId` 不匹配；`customId` 已过期。
更多状态码与重试建议见[错误码与限流](../../../support/errors.html)，常见报错的排查步骤见[常见问题](../../../support/faq.html)。
## 使用示例
### 放大第一张
父任务成功后，用 `U1` 的 `customId` 提交，得到一个单图任务。
### 生成变体
用 `V1` 到 `V4` 的 `customId`，围绕指定那一张重新出四宫格。
### 带 remix 的变体
`enableRemix: true` 允许在变体时改提示词，适合微调方向。
**放大{Upscale}::cURL**
```
curl --request POST \
  --url 'https://api.oairoute.com/mj/submit/action' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "customId": "MJ::JOB::upsample::1::UUID",
  "taskId": "1320098173412546"
}'
```
**放大{Upscale}::Python**
```
import requests

res = requests.post(
    "https://api.oairoute.com/mj/submit/action",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={
        "customId": "MJ::JOB::upsample::1::UUID",
        "taskId": "1320098173412546",
    },
)
print(res.json())
```
**放大{Upscale}::JavaScript**
```
const res = await fetch("https://api.oairoute.com/mj/submit/action", {
  method: "POST",
  headers: {
    Authorization: "Bearer YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    customId: "MJ::JOB::upsample::1::UUID",
    taskId: "1320098173412546",
  }),
});
console.log(await res.json());
```
**生成变体{Variation}::cURL**
```
curl --request POST \
  --url 'https://api.oairoute.com/mj/submit/action' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "customId": "MJ::JOB::variation::1::UUID",
  "taskId": "1320098173412546"
}'
```
**生成变体{Variation}::Python**
```
import requests

res = requests.post(
    "https://api.oairoute.com/mj/submit/action",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={
        "customId": "MJ::JOB::variation::1::UUID",
        "taskId": "1320098173412546",
    },
)
print(res.json())
```
**生成变体{Variation}::JavaScript**
```
const res = await fetch("https://api.oairoute.com/mj/submit/action", {
  method: "POST",
  headers: {
    Authorization: "Bearer YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    customId: "MJ::JOB::variation::1::UUID",
    taskId: "1320098173412546",
  }),
});
console.log(await res.json());
```
**200 放大{Upscale}**
```
{
  "code": 1,
  "description": "提交成功",
  "result": "1320098173412550"
}
```
**200 生成变体{Variation}**
```
{
  "code": 1,
  "description": "提交成功",
  "result": "1320098173412551"
}
```
