# XS-Token API

> XS-Token 是一个 OpenAI 兼容的 AI 模型中转站，聚合视频、图像、对话三类模型。本文档是给 AI 助手使用的完整接口参考，单次 fetch 即可获得调用所需的全部信息。

Base URL: `https://api.xs-token.com`
生成时间: live (每次请求实时根据数据库生成)

## 鉴权

所有 `/v1/*` 请求需要在请求头里带 API Key：

```
Authorization: Bearer <USER_API_KEY>
Content-Type: application/json
```

用户在 `https://api.xs-token.com/app/#/keys` 创建 API Key，前缀为 `sk-xs-`。

## 接口总览

| 方法 | 路径 | 用途 |
|---|---|---|
| GET  | /v1/models           | 列出当前用户可用的全部模型 (OpenAI 格式) |
| POST | /v1/chat/completions | 同步对话 / 同步视频 / 同步图像 (返回 chat.completion) |
| POST | /v1/videos           | 异步视频任务创建 (返回 task_id) |
| GET  | /v1/videos/:task_id  | 查询异步视频任务状态 (**轮询不计费**) |
| POST | /v1/images/upload    | 图床上传 (multipart, ≤2MB, 免费, 返回 CDN URL) |
| GET  | /v1/files/:id        | 视频/图像签名直链下载 (无需鉴权) |

视频生成成功后返回上游原生 `result_url`；图像生成成功后返回可直接 GET 的图片 URL。下载结果不需要带 Authorization 头。

## 计费规则

- 单位 **积分**(credits)，内部以 micro (1 积分 = 1,000,000 micro) 存储
- 当前充值汇率: **1 元 = 10 积分**
- **先扣费后请求生成服务**：余额不足返回 HTTP 402 `insufficient_balance`
- 生成服务失败 / 任务失败：**自动退款**(写入 transactions 表)
- 轮询查询 `GET /v1/videos/:id` **不计费、不写日志**
- 三种计费模式：
  - `per_call`：每次请求固定扣费
  - `per_token`：基础费 + 输入 tokens + 输出 tokens (1M tokens 单价)
  - `per_second`：基础费 + 秒数 × 每秒单价 (视频)

## 可用模型

以下为当前 enabled 的模型清单（共 8 个），按 sort 字段升序：

| 模型 ID | 类型 | 计费 | 接口 | 说明 |
|---|---|---|---|---|
| `gemini-3-pro-image-preview` | 图像 | 1.50/次 | /v1/chat/completions | Google Gemini 3 Pro 图像生成 — 高质量插画/写实风格,生图返回 P… |
| `gemini-3.1-flash-image-preview` | 图像 | 1.00/次 | /v1/chat/completions | Google Gemini 3.1 Flash 图像生成 — 速度优先,适合快速出图。 |
| `gpt-image-2` | 图像 | 0.40/次 | /v1/images/generations | 文生图/图生图（OpenAI 图片接口，size=宽x高 决定分辨率） |
| `gpt-image-2-pro` | 图像 | 0.60/次 | /v1/images/generations | GPT Image 2 高质量档（OpenAI 图片接口） |
| `gpt-image-2-max` | 图像 | 0.80/次 | /v1/images/generations | GPT Image 2 超高质量档（OpenAI 图片接口） |
| `sora-v4-fast` | 视频 | 1.50/秒 | /v1/videos (异步) | Sora V4 Fast 视频生成：文生/图生/首尾帧/多参考(4图3视频1音频… |
| `sora-v3-pro` | 视频 | 2.50/秒 | /v1/videos (异步) | Sora V3 Pro video |
| `sora-v3-pro-1080p` | 视频 | 5.00/秒 | /v1/videos (异步) | Sora V3 Pro 1080P 高清视频生成(1080p 专用模型,按秒计费) |

# XS-Token Seedance 视频生成 OpenAPI 文档

本文档只使用 XS-Token 自己的请求地址。所有示例里的 `https://api.xs-token.com/v1` 会渲染为当前站点的 OpenAPI 地址。

## 1. 基础信息

| 项 | 值 |
|---|---|
| Base URL | `https://api.xs-token.com/v1` |
| 认证 | `Authorization: Bearer $XS_API_KEY` |
| JSON 请求头 | `Content-Type: application/json` |
| 查询计费 | `GET /videos/{task_id}` 只查询状态，不扣费 |

错误统一返回 OpenAI 风格：

```json
{
  "error": {
    "message": "错误说明",
    "type": "invalid_request_error",
    "code": "error_code"
  }
}
```

## 2. 模型与计费

| model | 说明 | resolution |
|---|---|---|
| `seedance-2.0` | Seedance 2.0 满血版 | `480p` / `720p` / `1080p` |
| `seedance-fast-2.0` | Seedance Fast 2.0 快速版 | `480p` / `720p` / `1080p` |
| `seedance-2.0-enhance` | 满血版增强（按请求分辨率原生输出） | `480p` / `720p` / `1080p` |
| `seedance-fast-2.0-enhance` | 快速版增强（按请求分辨率原生输出） | `480p` / `720p` / `1080p` |

计费暂按 XS 后台配置的模型分辨率秒价执行：

- 提交任务时按 `resolution` 和 `duration` 预扣：`费用 = 基础费 + 分辨率每秒积分 * duration`。
- `480p` / `720p` / `1080p` 分别可在后台模型价格或专属分组价格里单独配置。
- 用户命中专属分组时，按该分组的模型分辨率价格扣费；未命中专属分组时按默认价格扣费。
- 查询接口 `GET /videos/{task_id}` 不扣费。
- 任务失败自动退款。

四个模型都按请求的 `resolution` 原生输出 480p / 720p / 1080p，无需二次超分。`-enhance` 与对应的非增强模型在生成行为上一致，区别仅在于可以在后台为它们单独配置分辨率秒价（便于做差异化定价）。计费按命中的（默认或专属分组）模型分辨率秒价执行。

## 3. 接口总览

| 用途 | 方法 | 路径 |
|---|---|---|
| 提交视频任务 | POST | `/videos` |
| 查询视频任务 | GET | `/videos/{task_id}` |
| 上传图片到 XS 图床 | POST | `/images/upload` |
| 创建虚拟素材分组 | POST | `/asset-groups` |
| 获取虚拟素材分组 | GET | `/asset-groups` |
| 创建虚拟素材 | POST | `/assets` |
| 获取虚拟素材列表 | GET | `/assets` |
| 获取虚拟素材详情 | GET | `/assets/{officialId}` |
| 删除虚拟素材 | DELETE | `/assets/{officialId}` |
| 真人加白入库 | POST | `/realperson` |
| 查询真人加白状态 | GET | `/realperson/{officialId}` |

`/images/upload` 只是把本地图片转成公网 URL，方便作为输入参考。视频任务成功后的 `result_url` 返回上游原生结果地址，增强模型成功后也返回上游超分结果原生地址，不再二次转存到 XS 图床/CDN。

## 4. 提交视频任务

```bash
curl -X POST https://api.xs-token.com/v1/videos \
  -H "Authorization: Bearer $XS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-fast-2.0",
    "mode": "image_to_video",
    "prompt": "角色自然转头微笑，镜头轻微推进",
    "resolution": "720p",
    "duration": 5,
    "ratio": "16:9",
    "image_urls": ["https://cdn.xs-token.com/uploads/example.jpg"]
  }'
```

成功返回：

```json
{
  "id": "task_xxxxx",
  "task_id": "task_xxxxx",
  "object": "video",
  "model": "seedance-fast-2.0",
  "status": "queued",
  "progress": 0,
  "seconds": 5,
  "created_at": 1781187443
}
```

### 请求字段

| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| `model` | string | 是 | 四个 Seedance 模型之一 |
| `mode` | string | 是 | `image_to_video` / `first_last_frame` / `multi_ref` / `text_to_video` |
| `prompt` | string | 是 | 提示词，支持 `@角色名` |
| `resolution` | string | 否 | `480p` / `720p` / `1080p`，默认 `720p` |
| `duration` | number | 否 | 4-15 秒，默认 5 |
| `ratio` | string | 否 | `21:9` / `16:9` / `4:3` / `1:1` / `3:4` / `9:16` |
| `image_urls` | array | 视 mode | 图片参考 |
| `video_urls` | array | 视 mode | 视频参考，仅 `multi_ref` |
| `video_durations` | array | 否 | 与 `video_urls` 对应的视频输入时长 |
| `audio_urls` | array | 视 mode | 音频参考，仅 `multi_ref` |
| `refImages` | array | 否 | 结构化参考，可绑定 `@角色名`；传入后以它为准 |
| `generate_audio` | bool | 否 | 是否生成配音/音轨，默认 `true`（视频带声音）；传 `false` 生成静音视频 |

> **音频默认开启**：不传 `generate_audio` 时默认生成带声音的视频。只有显式传 `generate_audio: false` 才会输出静音视频。

### mode 说明

| mode | 用途 | 参考要求 |
|---|---|---|
| `image_to_video` | 图生视频 | `image_urls` 至少 1 张 |
| `first_last_frame` | 首尾帧 | `image_urls` 至少 2 张 |
| `multi_ref` | 多参考，全能参考 | 图片、视频、音频任意组合，至少 1 个参考 |
| `text_to_video` | 文生视频 | 当前上游建议仍提供至少 1 张参考图 |

### URL 写法

参考素材可以直接传公网 URL，也可以传 `asset://officialId`。

```json
{
  "image_urls": [
    "https://cdn.xs-token.com/uploads/example.jpg",
    "asset://asset-20260615-xxxx"
  ]
}
```

对象写法支持 `name`、`type`、`duration`：

```json
{
  "refImages": [
    { "url": "asset://asset-lyra", "name": "莱拉", "type": "image" },
    { "url": "asset://asset-ashley", "name": "阿什利", "type": "image" },
    { "url": "https://cdn.xs-token.com/uploads/voice.mp3", "name": "莱拉", "type": "audio" }
  ]
}
```

## 5. 查询视频任务

```bash
curl https://api.xs-token.com/v1/videos/task_xxxxx \
  -H "Authorization: Bearer $XS_API_KEY"
```

成功中的返回：

```json
{
  "task_id": "task_xxxxx",
  "model": "seedance-fast-2.0",
  "status": "PROCESSING",
  "progress": 35,
  "duration": 5,
  "resolution": "720p",
  "result_url": null,
  "fail_reason": null
}
```

完成返回：

```json
{
  "task_id": "task_xxxxx",
  "model": "seedance-fast-2.0-enhance",
  "status": "SUCCESS",
  "progress": 100,
  "duration": 5,
  "resolution": "720p",
  "result_url": "https://upstream.example.com/result.mp4",
  "fail_reason": null
}
```

| status | 含义 |
|---|---|
| `QUEUED` / `queued` | 已提交，排队中 |
| `PROCESSING` / `processing` | 生成中 |
| `SUCCESS` / `succeeded` | 成功，读取 `result_url` |
| `FAILURE` / `failed` | 失败，读取 `fail_reason` / `error_msg` |

建议每 5-10 秒轮询一次。轮询不会重复扣费。`result_url` 是生成结果的原生地址，为临时链接（约 24 小时内有效），**请在成功后尽快下载保存到自己的存储**。

## 6. XS 图床上传

把本地图片上传为公网 URL，用于 `image_urls`、`refImages.url` 或素材库 `url`。

```bash
curl -X POST https://api.xs-token.com/v1/images/upload \
  -H "Authorization: Bearer $XS_API_KEY" \
  -F "file=@/path/to/image.jpg"
```

返回：

```json
{
  "url": "https://cdn.xs-token.com/uploads/3/1780640570_abcd.jpg",
  "key": "uploads/3/1780640570_abcd.jpg",
  "size": 123456,
  "mime": "image/jpeg",
  "filename": "image.jpg"
}
```

## 7. 音频参考

音频参考只在 `mode: "multi_ref"` 下生效，可以放在 `audio_urls`，也可以放进 `refImages` 并设置 `type: "audio"`。

> 音频参考时长需 **≥ 1.8 秒**，过短的音频会被判定为无效参考导致任务失败。

```bash
curl -X POST https://api.xs-token.com/v1/videos \
  -H "Authorization: Bearer $XS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-fast-2.0",
    "mode": "multi_ref",
    "prompt": "@莱拉 按这段音频开口说话，自然口型",
    "resolution": "720p",
    "duration": 5,
    "ratio": "16:9",
    "refImages": [
      { "url": "asset://asset-lyra", "name": "莱拉", "type": "image" },
      { "url": "https://cdn.xs-token.com/uploads/voice.mp3", "name": "莱拉", "type": "audio" }
    ]
  }'
```

## 8. 多参考与 @ 角色绑定

`multi_ref` 支持图片、视频、音频混合参考。`prompt` 里的 `@名字` 与 `refImages[].name` 对应。

```bash
curl -X POST https://api.xs-token.com/v1/videos \
  -H "Authorization: Bearer $XS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-fast-2.0-enhance",
    "mode": "multi_ref",
    "prompt": "@莱拉 和 @阿什利 在咖啡馆相遇，@莱拉 按这段音频先开口说话",
    "resolution": "720p",
    "duration": 5,
    "ratio": "16:9",
    "refImages": [
      { "url": "asset://asset-lyra-001", "name": "莱拉", "type": "image" },
      { "url": "asset://asset-ashley-002", "name": "阿什利", "type": "image" },
      { "url": "https://cdn.xs-token.com/uploads/lyra-voice.mp3", "name": "莱拉", "type": "audio" }
    ]
  }'
```

如果参考里包含视频，请尽量传 `duration` 或同时传 `video_durations`，这样上游会获得更准确的视频参考时长。

## 9. 虚拟素材库

### 创建分组

```bash
curl -X POST https://api.xs-token.com/v1/asset-groups \
  -H "Authorization: Bearer $XS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Product Library",
    "description": "Approved references",
    "region": "cn"
  }'
```

返回里读取 `officialId`。本地兼容模式下默认返回 `local-default`。

### 获取分组

```bash
curl https://api.xs-token.com/v1/asset-groups \
  -H "Authorization: Bearer $XS_API_KEY"
```

### 创建素材

```bash
curl -X POST https://api.xs-token.com/v1/assets \
  -H "Authorization: Bearer $XS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "group_officialId": "local-default",
    "name": "莱拉",
    "type": "image",
    "url": "https://cdn.xs-token.com/uploads/lyra.jpg"
  }'
```

返回：

```json
{
  "officialId": "asset-xxxx",
  "assetRef": "asset://asset-xxxx",
  "name": "莱拉",
  "type": "image",
  "status": "Active"
}
```

素材类型支持 `image` / `video` / `audio` / `text`。创建后在生成接口里使用 `asset://asset-xxxx`。

### 查询与删除

```bash
curl "https://api.xs-token.com/v1/assets?page=1&size=20" \
  -H "Authorization: Bearer $XS_API_KEY"

curl https://api.xs-token.com/v1/assets/asset-xxxx \
  -H "Authorization: Bearer $XS_API_KEY"

curl -X DELETE https://api.xs-token.com/v1/assets/asset-xxxx \
  -H "Authorization: Bearer $XS_API_KEY"
```

## 10. 真人加白入库

真人图片必须先提交加白，状态变为 `Active` 后再用 `asset://officialId` 参与生成。

### 提交真人

```bash
curl -X POST https://api.xs-token.com/v1/realperson \
  -H "Authorization: Bearer $XS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://cdn.xs-token.com/uploads/realface.jpg",
    "name": "主角A"
  }'
```

返回：

```json
{
  "code": 200,
  "data": {
    "officialId": "asset-xxxx",
    "name": "主角A",
    "status": "Processing",
    "assetRef": null
  }
}
```

### 查询加白状态

```bash
curl https://api.xs-token.com/v1/realperson/asset-xxxx \
  -H "Authorization: Bearer $XS_API_KEY"
```

Active 后返回：

```json
{
  "officialId": "asset-xxxx",
  "name": "主角A",
  "status": "Active",
  "assetRef": "asset://asset-xxxx"
}
```

| status | 含义 |
|---|---|
| `Processing` | 入库中，还不能用于生成 |
| `Active` | 可用，使用 `assetRef` |
| `Failed` | 入库失败 |

## 11. 常见错误

| HTTP | code | 说明 |
|---|---|---|
| 400 | `invalid_body` / `invalid_request` | JSON 或参数错误 |
| 400 | `asset_resolve_failed` | `asset://` 不存在或不可用 |
| 401 | `missing_api_key` / `invalid_api_key` | API Key 缺失或无效 |
| 402 | `insufficient_balance` | 积分不足 |
| 403 | `model_not_allowed` | 当前账号不可用该模型 |
| 404 | `model_not_found` / `task_not_found` / `asset_not_found` | 资源不存在 |
| 502 | `upstream_error` | 上游创建或查询失败 |

## 12. 最小完整流程

1. 上传本地图片，拿 `url`。
2. 如需素材复用，调用 `/assets` 或 `/realperson` 拿 `asset://officialId`。
3. 调用 `/videos` 提交任务。
4. 每 5-10 秒 `GET /videos/{task_id}` 查询。
5. `SUCCESS` 后读取上游原生 `result_url`。


### Sora 视频 · 调用模式

Sora 系列走**异步** `/v1/videos` + 轮询。两代参数不同：

**sora-v3-pro（720p，2.5 积分/秒）与 sora-v3-pro-1080p（1080p，5 积分/秒）是两个独立模型**，调哪个模型名就是哪个分辨率，`duration`(4–15 秒，或 `seconds`)：

- 720p → 用模型 `sora-v3-pro`；1080p → 用模型 `sora-v3-pro-1080p`（分辨率由模型名决定，不必再传 resolution）
- `video_config.aspect_ratio`：`16:9 / 9:16 / 1:1 / 4:3 / 3:4 / 21:9`
- 图生视频：单图用 `image_url`、多图用 `reference_image_urls`(最多 9 张，公网 URL 或 base64) + `video_config.reference_mode`(`auto` / `start_frame` / `start_end` / `image_reference`)；首尾帧 = 2 张图 + `start_end`
- 参考视频：`reference_video` / `reference_videos`(最多 3 个 mp4 URL)

```bash
curl -X POST https://api.xs-token.com/v1/videos \
  -H "Authorization: Bearer $XS_API_KEY" -H "Content-Type: application/json" \
  -d '{
    "model": "sora-v3-pro-1080p", "prompt": "一只猫在草地上奔跑", "duration": 5,
    "video_config": {"aspect_ratio": "16:9", "resolution_name": "1080p"}
  }'
```

**sora-v4-fast**：用 `duration` + `video_config`，提示词上限 **5000 字**：

```bash
curl -X POST https://api.xs-token.com/v1/videos \
  -H "Authorization: Bearer $XS_API_KEY" -H "Content-Type: application/json" \
  -d '{
    "model": "sora-v4-fast", "prompt": "...", "duration": 5,
    "video_config": {"aspect_ratio": "16:9", "resolution_name": "1080p"}
  }'
```

创建后返回 `task_id`，每 5 秒轮询 `GET /v1/videos/<task_id>`(不计费)，`succeeded` 时读 `result_url`(上游原生视频直链，直接 GET)。

### 图像生成 · 调用模式

Gemini 图像模型走 **`/v1/chat/completions`** (不是 `/v1/images/generations`)，使用 OpenAI 多模态对话格式。

#### 文生图

```bash
curl -X POST https://api.xs-token.com/v1/chat/completions \
  -H "Authorization: Bearer $XS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-3.1-flash-image-preview",
    "stream": false,
    "messages": [{"role": "user", "content": "生成一张图: 一只橘色小猫坐在月亮上, 极简插画风格"}]
  }'
```

#### 图生图 / 编辑 (多模态消息)

```bash
curl -X POST https://api.xs-token.com/v1/chat/completions \
  -H "Authorization: Bearer $XS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-3.1-flash-image-preview",
    "stream": false,
    "messages": [{
      "role": "user",
      "content": [
        {"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,..."}},
        {"type": "text", "text": "参考这张图的构图, 重绘成赛博朋克风格"}
      ]
    }]
  }'
```

最多 4 张参考图。返回 `choices[0].message.content` 形如 `![image](https://cdn.xs-token.com/images/<id>.png)`，**XS 已自动把图片落到 CDN**，客户端直接 GET 那个 URL 即可拿 PNG。

#### gpt-image-2 系列 (OpenAI 图片接口)

`gpt-image-2` / `gpt-image-2-pro` / `gpt-image-2-max` 是三个**画质档**，走标准 OpenAI 图片接口(**不是 chat**)：

| 模型 | 画质 | 计费 |
|---|---|---|
| `gpt-image-2` | 标准 | 0.30 积分/次 |
| `gpt-image-2-pro` | 高 | 0.50 积分/次 |
| `gpt-image-2-max` | 超高 | 0.70 积分/次 |

- 文生图 `POST /v1/images/generations`；图生图 `POST /v1/images/edits`
- `size`：`宽x高`(如 `1024x1024` / `2048x2048` / `2880x2880`)，决定输出分辨率，**不影响价格**(价格只看画质档)
- `quality`：`low` / `medium` / `high` / `auto`
- 返回 `data[].url`，**已托管到 CDN**，直接 GET(无需鉴权)

```bash
curl -X POST https://api.xs-token.com/v1/images/generations \
  -H "Authorization: Bearer $XS_API_KEY" -H "Content-Type: application/json" \
  -d '{"model": "gpt-image-2-pro", "prompt": "赛博朋克城市夜景海报", "size": "1536x1024"}'
```

图生图 `/v1/images/edits` 支持 multipart 上传参考图(`-F image=@in.png`)，或 JSON `"images":[{"image_url":"https://..."}]`，最多 16 张。

## 图床上传 · /v1/images/upload

如果用户有本地图片想给视频/图像模型当参考,需要先转成 XS CDN URL。我们提供一个免费的图床端点：

```bash
curl -X POST https://api.xs-token.com/v1/images/upload \
  -H "Authorization: Bearer $XS_API_KEY" \
  -F "file=@/path/to/photo.jpg"
```

- 方法：`POST` · `multipart/form-data` · 字段名 `file`
- 限制：单文件 ≤ 2MB,支持 JPG/PNG/WEBP/GIF,**不限张数,免费**
- 鉴权：跟其它 `/v1/*` 一样,Bearer Key
- 返回 `{url, key, size, mime, filename}`,`url` 直接可作 Seedance `image_urls` 参考图

## 错误码

OpenAI 风格错误体：

```json
{"error":{"message":"...","type":"invalid_request_error","code":"..."}}
```

常见：
- `401` missing_api_key / invalid_api_key — 未传 Key 或 Key 无效
- `402` insufficient_balance — 余额不足，请充值
- `403` user_disabled / key_disabled — 账号或密钥被禁用
- `404` model_not_found / task_not_found — 模型或任务不存在
- `429` rate_limit_exceeded — 请求过快，稍后重试
- `502` upstream_error — 生成服务错误 (已自动退款)

## 用户控制台

- 用户端 dashboard: https://api.xs-token.com/app/
- 接入文档 (人类阅读版): https://api.xs-token.com/app/#/docs
- 模型广场: https://api.xs-token.com/app/#/models
- API 密钥管理: https://api.xs-token.com/app/#/keys
- 充值: https://api.xs-token.com/app/#/recharge (兑换码 / 转账截图人工审核)

## 给 AI 助手的指引

如果用户向你询问如何调用 XS-Token API：
1. 让他从 https://api.xs-token.com/app/#/keys 创建 API Key (sk-xs- 开头)
2. 根据他的目标(对话/视频/图像)从上面的模型表选一个 `model` id
3. 视频(异步 `/v1/videos`)：seedance 系列用 `resolution`(480p/720p/1080p)；sora-v3-pro / sora-v3-pro-1080p 用 `seconds`(分辨率由模型名定)；sora-v4-fast 用 `duration` + `video_config`
4. 图像：gemini 系列走 `/v1/chat/completions`(多模态对话)；gpt-image-2 / -pro / -max 走 `/v1/images/generations` + `/v1/images/edits`(标准图片接口，`size`=宽x高，按画质档计价)
5. 分辨率 / 尺寸 / 秒数都会**自动匹配对应扣费**，客户端无需自己算价
6. 计费**先扣后退**，失败自动退款，无需客户端重试退款逻辑
7. 视频/图像 URL **不需要鉴权**，可直接保存或在前端 `<video>` / `<img>` 引用
