# Arkcli Gen

> 火山方舟 Ark 图片/视频生成入口：支持 profile 默认资源与临时 API Key/Base URL/Endpoint；显式 Endpoint 不受当前 plan profile 误导。图片同步返回，视频异步轮询。

- Skill: `volcengine/arkcli-gen` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add volcengine/arkcli-gen`
- Raw SKILL.md: https://api.skillmd.com/api/skills/volcengine/arkcli-gen/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: volcengine (https://skillmd.com/u/volcengine)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/volcengine/arkcli-gen

---


# arkcli 生成工作流（+gen）

**CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../arkcli-shared/SKILL.md`](../arkcli-shared/SKILL.md)（认证闸门、模型查找回退、共享安全规则）。**

**CRITICAL — 这是一段三步工作流，不是单条命令。生成图/视频 MUST 按 `Step 1 → Step 2 → Step 3` 顺序执行。禁止跳过 Step 1/2 直接 `+gen`：会因模型名形态不对（404）或传了模型不支持的参数而失败。执行前务必读 [`references/arkcli-gen.md`](references/arkcli-gen.md)。**

**CRITICAL — 用户显式给出 API Key / Base URL / Endpoint 时，MUST 先读 [`../arkcli-shared/references/execution-context.md`](../arkcli-shared/references/execution-context.md)。显式 Endpoint 的权威元数据优先于当前 profile。**

**火山额外约束：不要因为 active profile 是 Agent/Coding Plan 就把用户给出的 Endpoint 当套餐模型调用。**

## 为什么是工作流（核心，先理解再执行）

用户说"生成一个视频/一张图"，本质是**三件独立的事，必须按序**：

```
① 本次资源从哪里来           ── 用户显式 Endpoint 优先；否则看当前 profile
② 该模型支持哪些参数          ── 不查就传参 = 瞎猜 = 被校验拒/被后端拒
③ 按可用参数真去生成
```

把这三步压成"直接 `+gen` 猜一条命令"，正是失败之源：模型名形态不对会 404，参数模型不支持会被拒。

## 模态解析硬契约

`+gen` 的生产调用按以下固定优先级解析能力：

```text
explicit --modality > output_modalities > task types > unknown
```

- 直接传版本化模型 ID 时，读取 ArkModels 返回的 `output_modalities`；缺失时再读取 FoundationModel 的 `task_types` / `filter_task_types`。
- 传 `ep-*` 时，先读取 Endpoint 的 `ModelReference.FoundationModel(name, version)`，再精确匹配同版本模型的上述结构化元数据。
- **模型名与 DisplayName 只用于定位模型，不参与模态判断**。不要从 `seedream`、`seedance` 或任何国内/海外品牌前缀推断 image/video。
- 结构化元数据缺失或互相冲突时返回 `unknown`，提示用户显式传 `--modality image|video`；禁止静默猜测。
- `+gen --dry-run` 是纯本地 Client Preview：不读取 Endpoint/模型元数据、不调用
  生成 API，也不下载或打开文件。显式 `--modality` 最可靠；已知
  `seedream`/`seedance` 模型名可本地判断，其他模型或 Endpoint 必须显式传
  `--modality image|video`。在线才能补齐的执行上下文会以 `unresolved` 和
  `fidelity=partial` 明示。

## 适用场景

- "生成一张图" / "文生图" / "画一个 X"
- "生成一个视频" / "文生视频"
- 图生图 / image-edit / 加参考图；图生视频(I2V)；参考视频(R2V)；参考音频
- "用这张图当首帧生成视频" / "保持这个参考视频的运动"

## 工作流总览

```text
用户意图: "生成 X"
  │
  ▼ Step 1【强制】解析本次资源
  │     用户给 Endpoint → arkcli resources resolve <ep-id>
  │     未给 Endpoint   → arkcli resources list --modality image|video
  │
  │     当前 profile 可用资源：
  │     platform    → 列 EP (ep-xxx)           ┐
  │     agent-plan  → 列视觉模型名              ├─ 选一个，记为 $MODEL
  │     coding-plan → 列 EP (借道 platform)     ┘
  │
  ▼ Step 2【强制·EP 除外】查 $MODEL 可用参数  ──► arkcli models get $MODEL --transform supported_params
  │     模型名 + 有 sp → **只能**用列出的参数，取值落 min/max/enum 内
  │     模型名 + sp 空(未配置或当前不可解析) → +gen 自动套 modality 兜底默认(video 720p/5s, image 2048)
  │     EP(ep-xxx)            → 跳过, 不强填(背后能力未知), 服务端裁决
  │
  ▼ Step 3 据可用参数生成  ──► arkcli +gen --model $MODEL [Step2 允许的参数] "prompt"
  │
  ▼ Step 4【结果处理】
        视频 = 异步：返回 task_id + status=queued(**不是失败!**) → arkcli gen get <task_id> 轮询;轮到 succeeded 自动下载到本地(local_path);要同步阻塞加 --wait
        图片 = 同步：直接返回 output_url + local_path
```


## Step 1【强制】解析显式 Endpoint，或列出 profile 可用资源

用户已经显式给出 Endpoint 时，不要先用 active profile 的模型池覆盖它：

```bash
arkcli resources resolve "$ENDPOINT" --format json
```

- 读取 `generation_modality` 决定 image/video；`image_or_video` 或 `unknown` 时再结合
  用户意图，必要时显式补 `--modality`。
- 读取 `resource_region`；Endpoint + 显式 API Key 且未给 Base URL 时，CLI 用该
  region 派生 platform Base URL。
- 不按 Endpoint ID 或绑定模型名称里的 `seedream` / `seedance` 子串猜模态。
- 显式 Endpoint + API Key 是临时调用，不切换 active profile，也不把值写回。

用户未给显式 Endpoint 时，再按 profile 列资源：

```bash
# 按目标模态列；输出 items[].id 就是可作 --model 的候选
arkcli resources list --modality video   # 或 image
```

- **平台差异（resources list 已自动按 profile 分流，你只管读 items）**：
  - `platform` profile → items 是**推理接入点 EP**（`ep-xxx`），每个 EP 内部绑定一个模型
  - `agent-plan` profile → items 是**视觉模型名**（如 `doubao-seedance-2.0-fast`）
  - `coding-plan` profile → 自身不含视觉模型，`+gen image/video` 会自动借道 platform 数据面，**`--model` 必须显式传一个 platform 上的 EP**
- `is_default: true` 标记的是该模态当前默认；用户没指定时优先用它
- **选定一个 id，记为 `$MODEL`，贯穿 Step 2/3**
- 用户已明确给了模型/EP 时，仍建议 `resources list` 核对它在当前 profile 可用；若与默认不同，按 [`../arkcli-shared/references/profile-defaults.md`](../arkcli-shared/references/profile-defaults.md) "Default 漂移检测与 promote nudge" 处理


## Step 2【强制·EP 除外】查 $MODEL 的可用参数

```bash
arkcli models get "$MODEL" --transform supported_params
```

- **`$MODEL` 是模型名**：拿到该模型的 `supported_params` 清单（每项含 `name / type / support / min / max / enum / required`）。
  - > **MUST：Step 3 只能使用这里 `support=true` 的参数，且取值必须落在 `min/max/enum` 范围内。** 不在清单里的参数（或 `support=false`）传了会被 `+gen` 拒绝。
  - **可直接使用 Step 1 选出的模型 id**（点号 / display 形态如 `doubao-seedance-2.0-fast` 都行）：`models get` 会自动按 DisplayName 归一化到规范连字符 name，无需手动转。极个别仍报 `not found` 才用 `arkcli models search <族名>` 核对名字。
  - 查到模型但 `supported_params` 为空 / `null` → 该版本未配置参数目录，或上游目录当前不可解析；若 stderr 有 `warn: model supported_params enrichment failed: ...`，保留该告警用于排障。**不要手动猜参数**：`+gen` 会自动用内置 modality 兜底默认（video: `resolution=720p` / `duration=5` / `ratio=adaptive`；image: `size=2048x2048`）填充你没指定的参数。直接进 Step 3。
- **`$MODEL` 是 EP（`ep-xxx`）**：跳过本步。EP 查不到 supported_params 是正常的；且 `+gen` **不会**对 EP 套兜底默认（EP 背后模型可能支持更高能力，强填会误降级），直接 degrade-open 由服务端裁决。
  - 这里只是跳过 **supported_params 查询**；真实 `+gen` 仍会沿 `Endpoint → ModelReference → FoundationModel 元数据` 自动解析 image/video。
  - 只有结构化元数据缺失/冲突时，才需要显式补 `--modality`。

## Step 3 据可用参数生成

```bash
# 文生图 / 文生视频
arkcli +gen --model "$MODEL" "<prompt>"

# 带 Step 2 确认过的参数（示例：视频 1080p + 优先级 9，前提是 supported_params 列了它们）
arkcli +gen --model "$MODEL" --resolution 1080p --priority 9 "<prompt>"

# 图生图 / 图生视频 / 参考素材：--input 可重复
arkcli +gen --model "$MODEL" --input @ref.jpg "<prompt>"
```

- 参数全集、多模态 `--input` 规则、新增 `--n/--priority/--wait` 见 [`references/arkcli-gen.md`](references/arkcli-gen.md)
- Endpoint 的模态由 Step 1 权威元数据自动解析；仅在元数据为 `unknown` /
  `image_or_video` 且用户意图仍不足时要求显式 `--modality`。
- **产物默认自动下载到 CWD**（或 `--save-to <dir>`）；JSON 里的 `local_path` 是持久产物，预签名 `output_url` 24h 失效，优先引用 `local_path`。`--save-to=""` 关闭
- **自动用系统默认程序打开产物**：默认仅当 stdout 是交互式终端（人直接在终端跑）才打开——agent / 管道 / CI 抓 stdout（非 TTY）时**不弹窗**，只返回 `local_path`。`--open` 强制打开、`--no-open` 强制不打开。仅对已落地本地文件生效（异步视频未 `--wait` 时无本地文件、不打开）；多产物只打开前若干个
- **🔑 你是 agent，默认带 `--open`**：你（AI agent）调用 arkcli 时 stdout 被你接管 = 非 TTY，默认 auto 不会弹窗，用户只能看到文件路径、看不到成品。**为了让用户直接看到生成的图/视频，凡是给真人出图/出视频的 `+gen` 与轮询到 `succeeded` 的 `gen get`，默认都加 `--open`**（`--open` 无视 TTY 强制在用户桌面打开）。例外只在：用户明确说"别打开/在脚本里/批量/不要弹窗"，或一次出图 >4 张批量场景 → 这时省略 `--open` 或显式 `--no-open`。

## Step 4【结果处理】视频异步 / 图片同步

| 模态 | 默认行为 | 你该怎么读结果 |
|------|---------|---------------|
| **视频** | **异步**：立即返回 `task_id` + `status: queued` | `queued` **不是失败**。用 `arkcli gen get <task_id> --open` 轮询到 `succeeded`——**这次 `gen get` 会顺手把产物下载到本地并回带 `local_path`**（默认 CWD，`<task-id>.mp4`），`--open` 让成品直接在用户桌面弹出（你是 agent，非 TTY，不加就只有路径）；不必再手动 curl `output_url`；**不要**因为没拿到视频就重提 `+gen`（会建新任务） |
| 视频 + `--wait` | 同步：阻塞到完成再返回 | `arkcli +gen ... --wait --open`，直接拿 `output_url` / `local_path` 并弹出成品 |
| **图片** | **同步**：直接返回 `output_url` + `local_path` | `arkcli +gen ... --open` 让图片直接弹给用户看 |

> **⚠️ 行为变更（2.0）**：视频任务默认已从"自动等待完成"改为"提交即返回 task_id"。需要旧的同步阻塞行为，显式加 `--wait`。

### 已有 task 的脚本轮询契约

`gen get --format json` 的 `status` 是对象，终态必须读 `.status.phase`，不是把整个 `.status` 与字符串比较。生成 shell 轮询脚本时必须遵守：

- 轮询阶段用 `arkcli gen get "$TASK_ID" --save-to="" --format json` 禁用自动下载，每轮只读状态。
- `PHASE=$(printf '%s' "$RESULT" | jq -r '.status.phase // empty')`，再对 `succeeded` / `failed` / `cancelled` 做显式分支。
- `succeeded` 时最多再执行一次带目标 `--save-to` 的 `gen get` 下载产物，然后立即 `break`；`failed` / `cancelled` 报告 `status.message` 或 `error` 后立即 `break`。
- `queued` / `running` 才 sleep 后继续；未知 phase 或 `gen get` 自身失败应停止并报错，不能当作 running 无限循环。
- 整个脚本只查已有 task，禁止在轮询或失败分支重新执行 `+gen`。

## 快速决策

- 用户要一步到位出图/视频 → 走本工作流（Step 1→2→3）
- 用户还没定模型 → Step 1 `resources list` 列当前 profile 候选；模型族不确定 → 转 [`../arkcli-models/SKILL.md`](../arkcli-models/SKILL.md)
- 图生图 / 参考素材 → Step 3 加 `--input @<file>`（可重复）
- 视频生成后"没看到视频" → 多半是异步 `queued`，用 `arkcli gen get <task_id> --open` 轮询；轮到 `succeeded` 那次会自动下载到本地（看返回的 `local_path`）并弹出成品，别重提
- **给真人出图/视频默认加 `--open`** → 你是 agent（非 TTY），不加用户只能看到路径、看不到成品；只有"别打开/脚本里/批量 >4 张"才省略或 `--no-open`

## 进阶 flag 自然语言触发词表

| 用户怎么说 | 对应 flag / 命令 |
|---|---|
| "生成完直接打开/帮我打开看看/出来就弹给我" | `arkcli +gen --open`（强制用系统默认程序打开；默认在交互终端已自动打开） |
| "别自动打开/不要弹窗/我在脚本里跑别开" | `arkcli +gen --no-open`（强制不打开） |
| "预览/别真发/只看参数/dry run/试跑/先看一下" | `arkcli +gen ... --dry-run --format json`；核对 `steps`、`unresolved` 和 `fidelity`，不要把 partial 预览当作服务端校验 |
| "不要下载/只要 URL/不要保存到本地/关闭自动下载" | 命令显式加 `--save-to=""`；即使同时是 `--dry-run` 也要保留，以便预览能核对真实执行时的关闭下载意图 |
| "草稿/快速预览/越快越便宜/省钱先看" | 视频命令显式加 `--draft`（草稿模式：更快、更便宜、质量更低）；不能只缩短 duration 代替草稿语义 |
| "固定镜头/镜头不动/锁定相机/只拍光影变化" | 视频命令显式加 `--camera-fixed`；不能只把固定镜头要求写进 prompt |
| "不带水印/不要水印/关闭水印" | 省略 `--watermark`（默认 false）；禁止使用裸 `--watermark`，它表示开启水印 |
| "强制执行/跳过校验/我知道不支持但想试一下" | `arkcli +gen --force` |
| "连贯多张/按顺序/统一风格/4格漫画/连续图片" | `arkcli +gen --sequential` |
| "我之前的任务/生成历史/任务列表/任务状态" | `arkcli gen list`（列出所有异步生成任务） |
| "那个任务跑完没/查进度/查状态" | `arkcli gen get <task_id>`

## 命令一览

| 命令 | 角色 |
|------|------|
| `arkcli resources list --modality image\|video` | **Step 1** — 当前 profile 可用模型/EP |
| `arkcli resources resolve <endpoint-id>` | **Step 1（显式 EP）** — 权威解析模态、工作流与 region |
| [`arkcli models get <model> --transform supported_params`](../arkcli-models/SKILL.md) | **Step 2** — 查模型可用参数 |
| [`arkcli +gen`](references/arkcli-gen.md) | **Step 3** — 按可用参数生成 |
| [`arkcli +gen --stream`](references/image-stream.md) | 图片任务流式 NDJSON 输出 |
| [`arkcli gen get <task-id>`](references/gen-meta.md) | **Step 4** — 轮询/查询异步视频任务 |
| [`arkcli gen list`](references/gen-meta.md) | 列出/过滤异步生成任务 |
| [`arkcli gen delete <task-id>`](references/gen-meta.md) | 删除异步生成任务 |

## 常见降级

- 模型名报 `not found` → `models get` 已自动归一化点号/display 形态，仍报多半是名字真写错了，用 `arkcli models search <族名>` 核对
- 参数被拒（`param_not_supported`）→ 回到 Step 2 看 `supported_params`，只用列出的；确需强制可加 `+gen --force` 跳过校验（服务端仍有最终裁决）
- **内容被审核拦截**（`ContentRiskBlocked` / `*SensitiveContentDetected` / 命中敏感 / 版权）→ 不是参数问题、`--force` 也绕不过；调整 prompt / 输入素材里的敏感内容后重试。要结构化的拦截原因 + 修复指引，转 [`../arkcli-doctor/SKILL.md`](../arkcli-doctor/SKILL.md) 的 `arkcli doctor error <code>`（生视频拦截 5 个 subtype 全覆盖）
- 鉴权错误 → 转 [`../arkcli-auth/SKILL.md`](../arkcli-auth/SKILL.md)

## 参考

- [arkcli-shared](../arkcli-shared/SKILL.md) — 认证和全局参数（必读）
- [arkcli-models](../arkcli-models/SKILL.md) — Step 2 模型查询/`supported_params` 详解
- [references/arkcli-gen.md](references/arkcli-gen.md) — `+gen` 全参数 + 多模态 + 异步语义

