# Ark Global 计费价格表（人民币口径）

面向国内下游部署的计费配置手册。覆盖三条计费链路：Seedance **按量**（token）、Seedance **按秒**、Seedream **按次**。

口径：**直接用官方的国内人民币价，不按汇率换算**。

> 官方国内价与海外美元价并不是固定汇率关系：逐档对比下来，人民币 ÷ 美元在 **6.50 ~ 6.67** 之间浮动（例如 2.0 的 1080p 不含参考是 51 ÷ 7.7 ≈ 6.62，4K 含参考是 16 ÷ 2.4 ≈ 6.67）。所以国内客户用本表、海外客户用美元表，两边各自照官方牌价配置，**不要拿 6.7 去换算另一边的价格**。

> 官方海外模型写作 `dreamina-seedance-*`，本站与插件使用 `doubao-seedance-*`，两者是同一个模型。

## 下游配置步骤

1. 安装 `doubao` 任务插件（`plugin.js` 自带模型清单与计量口径，不改）。
2. 建渠道：类型选 **New API（60）**，Base URL 填上游网关地址，Key 填上游令牌。插件自动补 `/doubao` 前缀。
3. 配价格：在定价编辑器为每个要卖的模型填一行表达式，公式复制下文即可。
4. 验账：先发一条短视频，核对账单与「秒数 × 每秒单价」是否一致。

## 通用规则

| 项 | 说明 |
| --- | --- |
| 表达式返回值的单位 | **人民币（元）**。系统再乘以 `QuotaPerUnit` 换算成额度 |
| 额度换算 | 表达式返回「元」，系统再乘 `QuotaPerUnit` 得额度。**这里是关键：`QuotaPerUnit` 本身不带币种**，站点还有个独立的「额度展示类型」设置（美元 / 人民币 / 自定义），人民币展示会再乘一次汇率（默认 7.3）。所以人民币站要按下面第 2 条配，否则会重复乘汇率 |
| 优先级 | 先查插件级，命中即返回；未命中才回落模型级。**两处都改了务必核对一致**，否则旧值仍生效 |
| 未配表达式时 | 该模型回落到普通模型倍率，账会跑偏。**每个要卖的模型都必须配一行** |

### 人民币站的额度与展示要怎么配

表达式返回的是「元」。系统先把返回值乘 `QuotaPerUnit` 得到内部额度，页面展示时再按「额度展示类型」换算回货币：美元类型乘以 1，人民币类型乘以汇率（默认 7.3），自定义类型乘自定义汇率。两处都设成人民币，就会把 7.3 乘两次。

两种可用配法，任选一种，**不要混用**：

**A. 额度按元、展示用自定义（推荐）**

| 设置项 | 值 |
| --- | --- |
| `QuotaPerUnit` | `500000` |
| 额度展示类型 | 自定义（`CUSTOM`） |
| 自定义货币符号 | `¥` |
| 自定义汇率 | `1` |

这样 1 元 = 500000 额度，页面显示 ¥，数值与表达式结果一致。

**B. 额度按元、展示用美元**

`QuotaPerUnit` 保持 `500000`，额度展示类型选美元。金额数值正确，但符号会显示 `$`，对国内客户容易误解，只适合后台自己核对。

**不要用人民币展示类型**：它会再乘一次 7.3，页面金额会比实际扣费大 7.3 倍。

## 一、Seedance 按量（token）计费

### 计量事实

插件按请求和上游回报给出三项事实：

| 事实 | 取值 | 含义 |
| --- | --- | --- |
| `tokens` | 数字 | 上游 `usage.completion_tokens`，提交时按 `秒数 × 宽 × 高 × 24 ÷ 1024` 预估 |
| `resolution` | `480p` / `720p` / `1080p` / `4k` | 输出档位，单价随之变化 |
| `video_input` | `none` / `video` | 是否带参考视频，带视频走更低单价 |

### 公式

```
费用（元） = tokens × 该档每百万 token 人民币单价 ÷ 1,000,000
```

### 每百万 token 人民币单价（官方国内价）

| 模型 | 480p / 720p | 1080p | 4K |
| --- | --- | --- | --- |
| `doubao-seedance-2-0-260128` | 46 / 28 | 51 / 31 | 26 / 16 |
| `doubao-seedance-2-0-fast-260128` | 37 / 22 | — | — |
| `doubao-seedance-2-0-mini-260615` | 23 / 14 | — | — |
| `doubao-seedance-2-5-260628` | 70 / 42 | 77 / 46 | — |

每格写作「**无参考视频 / 有参考视频**」。

说明：

- `—` 表示官方不支持该档位。
- Seedance 1.0（pro / pro fast / lite）与 1.5 pro **已下架**，本表不再列出；插件也不再声明这些模型。

### 可直接粘贴的计费表达式

以下表达式里的数字都是**人民币单价**，原样粘贴即可，不要换算成美元。

每个模型逐档列出「分辨率 × 参考视频」，最后一个分支兜底，不留裸条件。

**`doubao-seedance-2-0-260128`**

```
u("resolution") == "480p" && u("video_input") == "none" ? tier("480p·none", u("tokens") * 46 / 1000000) : u("resolution") == "480p" && u("video_input") == "video" ? tier("480p·video", u("tokens") * 28 / 1000000) : u("resolution") == "720p" && u("video_input") == "none" ? tier("720p·none", u("tokens") * 46 / 1000000) : u("resolution") == "720p" && u("video_input") == "video" ? tier("720p·video", u("tokens") * 28 / 1000000) : u("resolution") == "1080p" && u("video_input") == "none" ? tier("1080p·none", u("tokens") * 51 / 1000000) : u("resolution") == "1080p" && u("video_input") == "video" ? tier("1080p·video", u("tokens") * 31 / 1000000) : u("resolution") == "4k" && u("video_input") == "none" ? tier("4k·none", u("tokens") * 26 / 1000000) : tier("4k·video", u("tokens") * 16 / 1000000)
```

**`doubao-seedance-2-0-fast-260128`**

```
u("resolution") == "480p" && u("video_input") == "none" ? tier("480p·none", u("tokens") * 37 / 1000000) : u("resolution") == "480p" && u("video_input") == "video" ? tier("480p·video", u("tokens") * 22 / 1000000) : u("resolution") == "720p" && u("video_input") == "none" ? tier("720p·none", u("tokens") * 37 / 1000000) : tier("720p·video", u("tokens") * 22 / 1000000)
```

**`doubao-seedance-2-0-mini-260615`**

```
u("resolution") == "480p" && u("video_input") == "none" ? tier("480p·none", u("tokens") * 23 / 1000000) : u("resolution") == "480p" && u("video_input") == "video" ? tier("480p·video", u("tokens") * 14 / 1000000) : u("resolution") == "720p" && u("video_input") == "none" ? tier("720p·none", u("tokens") * 23 / 1000000) : tier("720p·video", u("tokens") * 14 / 1000000)
```

**`doubao-seedance-2-5-260628`**

```
u("resolution") == "480p" && u("video_input") == "none" ? tier("480p·none", u("tokens") * 70 / 1000000) : u("resolution") == "480p" && u("video_input") == "video" ? tier("480p·video", u("tokens") * 42 / 1000000) : u("resolution") == "720p" && u("video_input") == "none" ? tier("720p·none", u("tokens") * 70 / 1000000) : u("resolution") == "720p" && u("video_input") == "video" ? tier("720p·video", u("tokens") * 42 / 1000000) : u("resolution") == "1080p" && u("video_input") == "none" ? tier("1080p·none", u("tokens") * 77 / 1000000) : tier("1080p·video", u("tokens") * 46 / 1000000)
```

## 二、Seedance 按秒计费

按秒计费是一层**计划名**，与上游模型名不同。客户端请求里的 `model` 就是下面四个之一，渠道 `model_mapping` 负责映射到火山方舟的真实 endpoint：

`seedance-2.0`、`seedance-2.0-fast`、`seedance-2.0-mini`、`seedance-2.5`

### 计量事实

| 事实 | 取值 | 含义 |
| --- | --- | --- |
| `seconds` | 数字 | **参考视频时长 + 生成时长**的合计 |
| `resolution` | 计划支持的档位 | 输出档位，每秒单价随之变化 |
| `video_input` | `none` / `video` | 是否带参考视频 |

按秒模型的 usage **没有 `tokens`**，表达式写成 `u("tokens")` 会在求值时抛 `invalid operation: <nil> * float64`。

### 公式

```
费用（元） = seconds × 该档每秒人民币单价
```

`seconds` 由 Ark 返回的计费 token 反算，不是按请求时长：

```
seconds = usage.completion_tokens ÷ 该档 tokens/秒
```

`tokens/秒` 由 16:9 最大像素按官方公式 `宽 × 高 × 24 ÷ 1024` 得出：

| 档位 | 16:9 像素 | tokens/秒 |
| --- | --- | --- |
| 480p（2.0 / fast / mini） | 864 × 496 | 10044 |
| 480p（2.5） | 854 × 480 | 9607.5 |
| 720p | 1280 × 720 | 21600 |
| 1080p | 1920 × 1080 | 48600 |
| 4K | 3840 × 2160 | 194400 |

### 每秒人民币单价

```
每秒单价 = 该档 tokens/秒 × 该档每百万 token 人民币单价 ÷ 1,000,000
```

结果**保留四位小数并向上取整**，与美元版完全相同的算法，只是把美元单价换成官方人民币单价。每格写「**无参考视频 / 有参考视频**」：

| 计划 | 480p | 720p | 1080p | 4K |
| --- | --- | --- | --- | --- |
| `seedance-2.0` | 0.4621 / 0.2813 | 0.9936 / 0.6048 | 2.4786 / 1.5066 | 5.0544 / 3.1104 |
| `seedance-2.0-fast` | 0.3717 / 0.2210 | 0.7992 / 0.4752 | — | — |
| `seedance-2.0-mini` | 0.2311 / 0.1407 | 0.4968 / 0.3024 | — | — |
| `seedance-2.5` | 0.6726 / 0.4036 | 1.5120 / 0.9072 | 3.7422 / 2.2356 | — |

### 可直接粘贴的计费表达式

**`seedance-2.0`**

```
u("resolution") == "480p" && u("video_input") == "none" ? tier("480p·none", u("seconds") * 0.4621) : u("resolution") == "480p" && u("video_input") == "video" ? tier("480p·video", u("seconds") * 0.2813) : u("resolution") == "720p" && u("video_input") == "none" ? tier("720p·none", u("seconds") * 0.9936) : u("resolution") == "720p" && u("video_input") == "video" ? tier("720p·video", u("seconds") * 0.6048) : u("resolution") == "1080p" && u("video_input") == "none" ? tier("1080p·none", u("seconds") * 2.4786) : u("resolution") == "1080p" && u("video_input") == "video" ? tier("1080p·video", u("seconds") * 1.5066) : u("resolution") == "4k" && u("video_input") == "none" ? tier("4k·none", u("seconds") * 5.0544) : tier("4k·video", u("seconds") * 3.1104)
```

**`seedance-2.0-fast`**

```
u("resolution") == "480p" && u("video_input") == "none" ? tier("480p·none", u("seconds") * 0.3717) : u("resolution") == "480p" && u("video_input") == "video" ? tier("480p·video", u("seconds") * 0.2210) : u("resolution") == "720p" && u("video_input") == "none" ? tier("720p·none", u("seconds") * 0.7992) : tier("720p·video", u("seconds") * 0.4752)
```

**`seedance-2.0-mini`**

```
u("resolution") == "480p" && u("video_input") == "none" ? tier("480p·none", u("seconds") * 0.2311) : u("resolution") == "480p" && u("video_input") == "video" ? tier("480p·video", u("seconds") * 0.1407) : u("resolution") == "720p" && u("video_input") == "none" ? tier("720p·none", u("seconds") * 0.4968) : tier("720p·video", u("seconds") * 0.3024)
```

**`seedance-2.5`**

```
u("resolution") == "480p" && u("video_input") == "none" ? tier("480p·none", u("seconds") * 0.6726) : u("resolution") == "480p" && u("video_input") == "video" ? tier("480p·video", u("seconds") * 0.4036) : u("resolution") == "720p" && u("video_input") == "none" ? tier("720p·none", u("seconds") * 1.5120) : u("resolution") == "720p" && u("video_input") == "video" ? tier("720p·video", u("seconds") * 0.9072) : u("resolution") == "1080p" && u("video_input") == "none" ? tier("1080p·none", u("seconds") * 3.7422) : tier("1080p·video", u("seconds") * 2.2356)
```

### 验证

发一条带 5 秒参考视频、生成 5 秒的 `seedance-2.0` 720p 请求：

| 项 | 期望值 |
| --- | --- |
| 日志里的 `seconds` | 10 |
| 账单 | 10 × 0.6048 = 6.048 元 |

若 `seconds` 显示 5，说明参考视频没被识别，检查 `content` 里 `video_url` 项的 `role` 是否为 `reference_video`。

## 三、Seedream 按次计费

### 计量事实

图片任务按**成功交付的张数**计价，失败的组图成员不计费。四个事实：

| 事实 | 类型 | 含义 |
| --- | --- | --- |
| `images_up_to_1_5k` | 数字 | 像素面积 ≤ 2610000 的输出张数（1K / 1.5K 及以下） |
| `images_above_1_5k` | 数字 | 像素面积 > 2610000 的输出张数（2K 及以上） |
| `input_images` | 数字 | 参考图张数，取自上游 `usage.input_images` |
| `layer_decomposition` | 布尔 | 是否开启图层拆分 |

分档边界 `2610000` 像素对应官方的「261 万像素」线，1K 与 1.5K 同价。

参考图按张数收费，**第 1 张也计费**。官方价目是「首张免费」，本站刻意不设这个减免：首张免费要写成 `max(input_images - 1, 0)`，而价格表展开器只识别线性项，这种写法会让模型详情页退化成「特殊计费表达式」。差额是每单带参考图时多收 0.02 元。

### 公式

```
费用（元） = images_up_to_1_5k × 低档单价
           + images_above_1_5k × 高档单价
           + input_images × 参考图单价
```

### 人民币单价

| 模型 | `images_up_to_1_5k` | `images_above_1_5k` | `input_images` |
| --- | --- | --- | --- |
| `doubao-seedream-5-0-pro-260628` | 0.30 | 0.60 | 0.02 |
| `doubao-seedream-5-0-flash-260915` | 0.12 | 0.12 | 0 |

要点：

- **flash 单图统一 0.12 元**，参考图不单独收费。
- **pro 的高档单价是低档的两倍**（0.60 / 0.30）；参考图每张 0.02 元，第 1 张也计费。

### 可直接粘贴的计费表达式

**`doubao-seedream-5-0-pro-260628`**

```
tier("base", u("images_above_1_5k") * 0.6 + u("images_up_to_1_5k") * 0.3 + u("input_images") * 0.02)
```

**`doubao-seedream-5-0-flash-260915`**

```
tier("base", u("images_above_1_5k") * 0.12 + u("images_up_to_1_5k") * 0.12 + u("input_images") * 0)
```

图层拆分：拆出的每一层本身就是一次输出，已经计入 `images_*`，按正常出图价收费，不加价、不打折。

## 注意事项

- 以上为**官方国内价，零毛利**。模型折扣，在令牌单价上乘分组系数；按量、按秒、按次三套各自独立调整互不影响。
- 未指定分辨率时，插件按 720p 预留计费（2.0 / 2.5 / fast / mini 一致，为方舟自身的默认档），并把该档位写进提交体，Ark 按此出片，预扣与实出档位一致。
- 参考视频的时长已包含在 Ark 返回的计费 token 内，由完成回调换算成秒，不需要额外加时长。
- 按秒模型的 `seconds` 保留小数，不做整数取整，否则每条短视频会漏掉最多半秒。
