一个地址,接入文本、图片与视频模型
XYtoken 是多模型 API 网关。所有请求发往同一个域名,用同一把 API Key 鉴权,按同一个质量档位结算。你只需要在请求里写模型名,路由、重试、计量由网关完成。
curl https://api.xytoken.com/v1/chat/completions \
-H "Authorization: Bearer $XYTOKEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4.1-flash",
"messages": [{"role":"user","content":"你好"}],
"stream": true
}'
data: {"choices":[{"delta":{"content":"你好"}}]}
data: {"choices":[{"delta":{"content":",我是"}}]}
data: {"choices":[{"delta":{"content":" XYtoken。"}}]}
data: [DONE]
02为什么是 XYtoken
接入一家模型供应商并不复杂。难的是同时接入十家:每家一套 SDK 与 Key,每上一个新模型就要改一次代码,每次故障只能等厂商恢复,账单还散落在不同后台。这些成本不会写在发票上,却会持续发生。
XYtoken 把这些差异收敛到一个接入面,同时保留三件事不变:协议原生、模型可替换、用量可核对。
四条做法
-
协议原生。OpenAI 与 Anthropic
各自保持原生请求与响应格式。迁移通常只需替换
base_url与模型名,已有 SDK、框架和工具链继续可用。 - 档位可选。同一个模型按官方、混合云、订阅号池、特价分开售卖,价格与稳定性由你选择,平台不会在你不知情时换成更弱的模型。
- 失败明说。参数错误、权限不足、上游异常都返回明确的状态码与错误信息;重试只发生在同一模型的多条供给之间。
-
计量可核对。请求开始预扣、结束按实际用量结算,差额退回;每一笔都能在用量日志里按
request_id对上。
一句话区分:模型能力由厂商提供,XYtoken 提供的是接入成本、供给稳定性和账单清晰度。需要同时用多家模型、或希望随时能换模型的团队,收益最明显。
请求如何流转
请求先到网关:完成鉴权与模型权限校验,按 Key 绑定的质量档位选择供给,转换协议并转发;返回时写入用量与账单。客户端只与网关通信,上游换渠道、加重试,业务代码不需要感知。
| 环节 | 网关做的事 | 你需要关心的 |
|---|---|---|
| 鉴权 | 校验 Key、模型范围、IP 白名单与额度 | Key 是否绑定了正确的质量档位 |
| 选路 | 在所选档位内按优先级与权重选择供给 | 该模型在你所在档位是否有货 |
| 结算 | 按实际 token、张数或时长计费,失败不计费 | 用量日志里的单价与档位是否一致 |
03快速开始
先建一把 Key 并选定质量档位,再替换一个地址,就能完成第一次调用。下面的流程以文本模型为例,图片与视频在后续章节展开。
创建 API Key,并选择质量档位
登录控制台,进入「API 密钥」→「新建密钥」。填写名称后,在模型质量下拉框中选择 官方 / 混合云 / 订阅号池 / 特价,再勾选允许访问的模型、设置额度上限,创建并复制 Key。完整 Key 只显示一次。
这个选择决定了两件事:这把 Key 能走哪一档供给,以及按哪一档的单价计费。同一模型在不同档位的价格不同,可以先在质量档位了解差异,再到模型广场核对具体价格。
一把 Key 只对应一个档位。需要同时使用多个档位时,按档位分别创建 Key(例如
prod-official、batch-special),这样在用量日志里也能直接看出成本来源。
确认接入地址
两套原生协议共用同一个域名,只是前缀不同:
| 协议 | Base URL | 常用接口 |
|---|---|---|
| OpenAI 兼容 | https://api.xytoken.com/v1 |
Chat Completions、Responses、Images、Videos |
| Anthropic | https://api.xytoken.com |
Messages API、Anthropic SDK |
本文示例统一使用
https://api.xytoken.com。实际地址以控制台「API
接入」页展示的为准。
发送第一个请求
下面三份代码做的是同一件事:把一句话发给
deepseek-v4.1-flash。用的是你刚创建的那把
Key,因此也自动使用它绑定的质量档位。
curl https://api.xytoken.com/v1/chat/completions \
-H "Authorization: Bearer $XYTOKEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4.1-flash",
"messages": [
{ "role": "system", "content": "你是一位简洁的技术编辑。" },
{ "role": "user", "content": "用三句话说明 API 网关解决了什么问题。" }
]
}'
from openai import OpenAI
import os
client = OpenAI(
api_key=os.environ["XYTOKEN_API_KEY"],
base_url="https://api.xytoken.com/v1",
)
completion = client.chat.completions.create(
model="deepseek-v4.1-flash",
messages=[
{"role": "system", "content": "你是一位简洁的技术编辑。"},
{"role": "user", "content": "用三句话说明 API 网关解决了什么问题。"},
],
)
print(completion.choices[0].message.content)
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.XYTOKEN_API_KEY,
baseURL: "https://api.xytoken.com/v1",
});
const completion = await client.chat.completions.create({
model: "deepseek-v4.1-flash",
messages: [
{ role: "system", content: "你是一位简洁的技术编辑。" },
{ role: "user", content: "用三句话说明 API 网关解决了什么问题。" },
],
});
console.log(completion.choices[0].message.content);
成功时返回标准的 Chat Completions 结构:
{
"id": "chatcmpl-9f3c2a7d",
"object": "chat.completion",
"created": 1761643200,
"model": "deepseek-v4.1-flash",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "API 网关把多家模型的差异收敛成一个入口:你只需要维护一套地址和密钥。它同时负责鉴权、路由、限流与计费,让业务不必为每家供应商写一套适配。换模型时,通常只需要改一个模型名。"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 42,
"completion_tokens": 78,
"total_tokens": 120
}
}
查看用量与账单
控制台「用量日志」会记录每次调用的模型、质量档位、token
或张数、金额、耗时和 request_id。核对成本时,先按
Key 过滤,再按档位看单价。
请求失败时,先看响应里的 error.message 与
error.code,再对照错误码处理。
工具与 SDK 兼容性
只要工具支持自定义 Base URL,通常不需要改业务代码:
| 工具 / SDK | 接入方式 | 备注 |
|---|---|---|
| OpenAI SDK | base_url = https://api.xytoken.com/v1 |
Python / Node / Go / Java 均可 |
| Anthropic SDK | base_url = https://api.xytoken.com |
走 /v1/messages |
| LangChain / LlamaIndex | OpenAI-compatible 配置 | 填 Base URL 与 Key |
| Dify / n8n / FastGPT | 自定义 OpenAI 渠道 | 模型名填控制台展示的 ID |
04模型质量档位
同一个模型 ID 可以在四个质量档位下售卖。档位不是模型的“能力等级”,而是供给来源、稳定性、速率限制与价格的组合。模型广场会针对每个模型、每个档位分别标价。
官方
OFFICIAL厂商官方渠道直供。
- 适合
- 核心生产链路、对版本一致性要求高的业务
- 价格
- 稳定性
混合云
HYBRID通过混合云方式接入的渠道。
- 适合
- 大多数通用业务,平衡成本与可用性
- 价格
- 稳定性
订阅号池
SUBSCRIPTION订阅账号池按可用额度供给。
- 适合
- 成本敏感的批量任务与辅助场景
- 价格
- 稳定性
特价
SPECIAL按特价策略供给的渠道。
- 适合
- 测试、离线批处理、内部工具
- 价格
- 稳定性
价格与稳定性仅为档位之间的相对关系实际可售档位、单价与并发以模型广场为准
不是每个模型都开放四个档位。同一档位也可能有多条供给。下单前在模型广场确认该模型实际开放的档位与库存,避免按错误的预期估预算。
在模型广场看价格
打开控制台「模型广场」,搜索模型并进入详情页。「供应渠道」会按官方、混合云、订阅号池、特价分别列出该档位的计费方式、销售倍率与单价;同屏就能比价。不同模型开放的档位不同,价格也不同,选型时把“模型”和“档位”一起看。
| 你在模型详情页看到 | 含义 |
|---|---|
| 供应渠道 | 该模型当前开放的档位列表,未开放的档位不会出现 |
| 计费方式 | 按输入/输出 token、按张、按秒折算或按次 |
| 销售倍率 / 单价 | 不同档位分别标价,倍率越低通常单价越低 |
| 并发与限速 | 档位级别的速率上限,批量任务前先确认 |
创建 Key 时必须选质量
质量写在 Key 上,不写在请求里。新建密钥时选择的档位,决定了这把 Key 后续所有请求走哪一档供给、按哪一档结算;请求体里没有 quality 参数,也无法在单次调用中临时切换。需要换档位,换一把 Key。
{
"name": "prod-chat",
"model_quality": "official", // official | hybrid | subscription | special
"models": ["deepseek-v4.1-flash", "kimi-k3.1-pro"],
"quota": 50000000, // token 或金额上限,按账户设置
"ip_allowlist": ["203.0.113.24"]
}
按场景选档位
| 场景 | 建议档位 | 原因 |
|---|---|---|
| 面向用户的核心对话 | 官方 | 版本一致、行为可预期,出问题影响面最大 |
| 常规业务与内部系统 | 混合云 | 价格更低,稳定性仍然够用 |
| 离线批量、数据清洗 | 订阅号池 | 可以接受排队与偶发限流,成本优先 |
| 压测、Demo、一次性脚本 | 特价 | 价格最低,不承载持续流量 |
不要把低价档位当成“同一个模型的折扣”。档位改变的是供给链路,高峰期可用性与并发上限会不同。核心链路用特价档省下的钱,往往会在一次故障里还回去。
05核心概念
文档里反复出现的几个词,先统一含义:
| 概念 | 说明 |
|---|---|
| API Key |
调用凭证,放在
Authorization: Bearer <key>
中;Anthropic 路径也接受 x-api-key。每把 Key
可单独设置模型范围、额度与 IP 白名单。
|
| 模型质量 | Key 绑定的供给档位:官方 / 混合云 / 订阅号池 / 特价。它决定请求走哪一档、按哪一档计价,详见质量档位。 |
| Base URL |
https://api.xytoken.com/v1。SDK 里的
base_url / baseURL 填这里。
|
| 模型 ID |
请求体 model 的取值,例如
deepseek-v4.1-flash。完整清单以模型广场为准,也可用
GET /v1/models 拉取当前 Key 可用的集合。
|
| 端点 | 模型对外提供的接口形态,例如对话、图片生成、视频任务。同一模型可能支持多个端点,以模型详情页标注为准。 |
| 令牌额度 | Key 级别的用量上限,可按总额或周期设置。额度耗尽时请求被拒绝,不会产生欠费。 |
| 异步任务 | 视频等长任务不阻塞连接:先提交拿到任务 ID,再查询状态,完成后下载产物。 |
| request_id | 每次请求的唯一标识。报障、对账、查日志时提供它,可以直接定位到那一次调用。 |
06模型与端点
接口按能力分组,全部使用同一个域名和同一把 Key。模型 ID 本身不区分档位,档位由 Key 绑定。
| 能力 | 方法与路径 | 说明 |
|---|---|---|
| 对话补全 |
POST/v1/chat/completions
|
OpenAI Chat Completions 格式,支持流式与工具调用 |
| Responses |
POST/v1/responses
|
OpenAI Responses 格式,适合 Agent 与内置工具场景 |
| Anthropic Messages |
POST/v1/messages
|
Anthropic 原生格式 |
| 图片生成 |
POST/v1/images/generations
|
OpenAI Images 格式,同步返回图片 |
| 图片编辑 |
POST/v1/images/edits
|
multipart/form-data,支持蒙版与多图输入
|
| 视频生成 |
POST/v1/videos
|
创建异步视频任务,返回公开任务 ID |
| 视频查询 |
GET/v1/videos/{task_id}
|
查询状态、进度与结果地址 |
| 视频下载 |
GET/v1/videos/{task_id}/content
|
由网关代理上游视频文件流 |
| 模型列表 |
GET/v1/models
|
返回当前 Key 可用的模型 |
兼容别名。视频也接受旧路径
/v1/video/generations(创建)与
/v1/video/generations/{task_id}(查询)。新接入建议直接使用 /v1/videos。
查看当前可用模型
不同 Key 看到的模型不同,用模型列表接口确认:
curl https://api.xytoken.com/v1/models \
-H "Authorization: Bearer $XYTOKEN_API_KEY"
返回的 data[].id 就是请求里应填的模型
ID。价格、上下文长度与参数边界在模型详情页查看;是否可用,还要看你的
Key 是否绑定了该档位、是否勾选了该模型。
07文本模型
文本接口同时提供 OpenAI Chat Completions、OpenAI Responses 与 Anthropic Messages 三种格式。选你现有 SDK 对应的那套即可;跨协议调用同一个模型也可以,只要模型在对应端点可用。
四款常用模型
下面四款覆盖了从高频轻量到长上下文的常见场景,仅作选型参考,实际可售型号与 ID 以模型广场为准:
| 模型 | 特点 | 适合 |
|---|---|---|
| DeepSeek V4.1 Flashdeepseek-v4.1-flash | 性价比高,中文稳定,响应快 | 客服、摘要、分类、批量处理 |
| Kimi K3.1 Prokimi-k3.1-pro | 长上下文,代码与 Agent 能力强 | 仓库级代码任务、长报告、知识库问答 |
| GLM 5.3glm-5.3 | 中文与工具调用稳定 | 政企问答、流程自动化、信息抽取 |
| MiniMax M3.1 FlashMiniMax-M3.1-Flash | 首字延迟低,成本低,适合高并发 | 实时对话、内容审核、批量生成 |
模型 ID 大小写与连字符需完全一致,例如
MiniMax-M3.1-Flash 不能写成
minimax-m3.1-flash。
对话补全
最常用的接口是
POST /v1/chat/completions,请求体与响应格式和 OpenAI
一致。下面这段用长上下文模型处理一份长文档:
curl https://api.xytoken.com/v1/chat/completions \
-H "Authorization: Bearer $XYTOKEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "kimi-k3.1-pro",
"messages": [
{ "role": "system", "content": "你是严谨的研究助理,只依据给定材料回答。" },
{ "role": "user", "content": "把这份 80 页的行业报告整理成 10 条结论,每条不超过 40 字。……" }
],
"temperature": 0.3,
"max_tokens": 1200
}'
| 参数 | 类型 | 说明 |
|---|---|---|
model |
string | 必填,模型 ID |
messages |
array |
必填,system / user /
assistant / tool 消息
|
temperature |
number | 采样温度,通常 0–2;越低越稳定。部分推理模型会忽略该参数 |
top_p |
number | 核采样,与 temperature 二选一调整即可 |
max_tokens |
integer | 输出上限。不设时按模型默认值与上下文窗口约束 |
stream |
boolean | 是否流式返回,默认 false |
stop |
string / array | 遇到指定字符串时停止生成 |
tools |
array |
函数工具定义;模型支持时返回 tool_calls
|
response_format |
object | 结构化输出,如 {"type":"json_object"} |
user |
string | 终端用户标识,便于在日志中区分调用方 |
响应里的 usage 是计费依据:prompt_tokens
按输入价、completion_tokens
按输出价,缓存命中的部分单独列出。
流式输出
把 stream 设为 true,服务端以 SSE
逐块返回,最后发送
data: [DONE]。对延迟敏感的对话,首字时间比完整响应时间更重要。
stream = client.chat.completions.create(
model="MiniMax-M3.1-Flash",
messages=[{"role": "user", "content": "写一段 100 字的产品介绍。"}],
stream=True,
stream_options={"include_usage": True},
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
# 最后一个 chunk 可能只带 usage,用于对账
print()
print("usage:", getattr(chunk, "usage", None))
流式被缓冲?如果前面还有反向代理,SSE
可能变成“一次性返回”。关闭该路径的缓冲(例如 Nginx 的
proxy_buffering off),并透传
Content-Type: text/event-stream。
协议接入
同一把 Key 支持 OpenAI 与 Anthropic 两种原生协议,OpenAI 还提供 Responses 接口。换协议不改变模型能力,只是字段名不同。
from openai import OpenAI
import os
client = OpenAI(
api_key=os.environ["XYTOKEN_API_KEY"],
base_url="https://api.xytoken.com/v1",
)
resp = client.chat.completions.create(
model="glm-5.3",
messages=[{"role": "user", "content": "用一句话解释什么是 API 网关。"}],
)
print(resp.choices[0].message.content)
from anthropic import Anthropic
import os
client = Anthropic(
api_key=os.environ["XYTOKEN_API_KEY"],
base_url="https://api.xytoken.com",
)
message = client.messages.create(
model="kimi-k3.1-pro",
max_tokens=1024,
messages=[{"role": "user", "content": "写一段产品发布会的开场白。"}],
)
print(message.content[0].text)
curl https://api.xytoken.com/v1/responses \
-H "Authorization: Bearer $XYTOKEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4.1-flash",
"input": "用表格对比 TCP 与 UDP 的适用场景。",
"stream": false
}'
迁移顺序:先保持原协议不变,只替换 Base URL 与 Key;确认链路通了,再考虑换更便宜的模型或档位。不要第一步同时换协议、换模型、换档位。
图片输入
支持视觉的模型可以在 messages 里传图片 URL 或 base64
Data URL:
{
"model": "kimi-k3.1-pro",
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "这张图里有几个按钮?分别是什么?" },
{ "type": "image_url", "image_url": { "url": "https://example.com/ui.png" } }
]
}
]
}
图片按输入 token 计费,尺寸越大消耗越高。生产环境先把图片压到业务可接受的分辨率,再做识别。
错误与重试
只对可恢复的错误重试,并且带退避与抖动。盲目重试会把一次小故障放大成一次限流。
| 状态码 | 是否重试 | 建议 |
|---|---|---|
400 / 404 / 422
|
否 | 参数或模型 ID 有误,重试结果不会变 |
401 / 403 |
否 | 检查 Key、模型权限、IP 白名单与额度 |
408 / 409 |
可重试一次 | 确认业务幂等后再重试 |
429 |
是 | 指数退避,优先遵循响应里的 Retry-After |
500 / 502 / 503 /
504
|
是 | 退避 + 抖动,建议最多 2–3 次 |
import random
import time
RETRYABLE = {408, 409, 429, 500, 502, 503, 504}
def call_with_retry(fn, attempts=3):
for i in range(attempts):
try:
return fn()
except Exception as exc:
status = getattr(exc, "status_code", None)
if status not in RETRYABLE or i == attempts - 1:
raise
delay = min(2 ** i, 8) + random.random()
print(f"retry in {delay:.1f}s after {status}")
time.sleep(delay)
流式请求如果中途断开,不建议整体自动重试——已输出的内容无法撤回,容易造成重复文本或重复计费。记录断点,让用户手动继续更稳妥。
08图片模型
图片接口是同步的:请求返回时图片已经生成,响应里给出一个 URL 或
base64 数据。生成与编辑都兼容 OpenAI Images
格式,换模型通常只需要改 model。
选型
图片模型之间的差异,主要不在“画得好不好”,而在中文语义、画面内文字、编辑一致性和分辨率上限。先按用途选,再用同一句提示词做小样对比。
| 模型 | 特点 | 适合 |
|---|---|---|
| Seedream 5.0 Prodoubao-seedream-5-0-pro-260628 | 细节与材质完整,复杂构图稳定,支持高分辨率 | 品牌视觉、精细产品图、复杂场景 |
| Qwen-Image 3.0 Proqwen-image-3.0-pro | 中文文字渲染突出,版式理解好 | 中文海报、信息图、带文案的配图 |
| GPT-Image 2 / 2.5gpt-image-2 · gpt-image-2.5-flare | 指令遵循与编辑一致性强,擅长局部修改 | 创意合成、改图、系列化视觉 |
以上为当前在售的示例型号,模型 ID 会随版本更新。实际可售型号、价格与参数边界以模型广场与模型详情页为准;图片模型同样按质量档位分别定价。
生成图片
用
POST /v1/images/generations
文生图。下面的请求生成一张 2K 方形海报底图:
curl https://api.xytoken.com/v1/images/generations \
-H "Authorization: Bearer $XYTOKEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "doubao-seedream-5-0-pro-260628",
"prompt": "极简香水广告海报:磨砂玻璃瓶置于浅灰石台,左上冷白侧光,米白渐变背景,右上角留白用于标题,商业摄影质感",
"size": "2048x2048",
"n": 1,
"response_format": "url",
"watermark": false
}'
image = client.images.generate(
model="doubao-seedream-5-0-pro-260628",
prompt="极简香水广告海报:磨砂玻璃瓶置于浅灰石台,左上冷白侧光,米白渐变背景,右上角留白用于标题,商业摄影质感",
size="2048x2048",
n=1,
response_format="url",
extra_body={"watermark": False},
)
print(image.data[0].url)
成功时返回图片数组:
{
"created": 1761643200,
"data": [
{
"url": "https://files.xytoken.com/images/2026/10/9f3c2a7d.webp",
"revised_prompt": "极简香水广告海报,磨砂玻璃瓶置于浅灰石台……"
}
]
}
及时转存。返回的 URL 由存储侧签发,通常有有效期,也可能因清理策略失效。生产环境拿到地址后应立即下载到自己的对象存储,不要把临时 URL 直接写进数据库或前端缓存。
换模型只需要改
model。画面里要出现准确的中文文案时,换用 Qwen-Image
3.0 Pro,把标题、副标题用引号单独写出来:
curl https://api.xytoken.com/v1/images/generations \
-H "Authorization: Bearer $XYTOKEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-image-3.0-pro",
"prompt": "竖版中文海报:暖米色背景,中央一只白色陶瓷咖啡杯,杯口有热气,主标题“深秋暖饮”,副标题“10 月 30 日上新”,宋体,居中排版",
"size": "1024x1536",
"n": 1
}'
编辑图片
编辑接口使用
multipart/form-data,可以传参考图、蒙版与提示词。常见用途:换背景、改材质、局部重绘、扩图、风格迁移。需要更严格的指令遵循、一次改多处时,把
model 换成 gpt-image-2.5-flare。
curl https://api.xytoken.com/v1/images/edits \
-H "Authorization: Bearer $XYTOKEN_API_KEY" \
-F "model=gpt-image-2" \
-F "image=@./product.png" \
-F "mask=@./mask.png" \
-F "prompt=把背景替换成浅灰色影棚背景,保留产品、投影和右侧文字" \
-F "size=1024x1024" \
-F "n=1"
-
image:要编辑的图片,支持 PNG / JPEG / WebP;部分模型支持多张参考图。 -
mask:可选。蒙版的透明区域表示允许修改的范围;不传时由模型根据提示词判断。 -
prompt:明确写“改什么”和“保留什么”,比只写风格词有效得多。 - 尺寸、格式与文件大小上限随模型不同,超出时返回 400,并给出具体限制。
参数、尺寸与成本
| 参数 | 类型 | 说明 |
|---|---|---|
model |
string | 必填,模型 ID |
prompt |
string | 必填,画面描述;建议控制在几百字以内 |
n |
integer | 生成张数,常见上限 1–4,按模型而定 |
size |
string |
1024x1024、1536x1024、2048x2048
等;各模型支持的档位不同
|
quality |
string |
standard / hd 或
low / medium /
high,视模型而定
|
response_format |
string | url(默认)或 b64_json |
output_format |
string |
png / jpeg /
webp,部分模型支持
|
background |
string |
transparent / opaque /
auto,部分模型支持
|
watermark |
boolean | 是否加水印,豆包等模型支持 |
seed |
integer | 随机种子,部分模型支持,用于复现结果 |
尺寸怎么选:先确认模型支持的档位,再按投放位置选比例。方形适合社媒与商品主图,横版适合 banner,竖版适合开屏与海报。不要用超出模型能力的尺寸让上游裁切,那会白白多付像素钱。
| 计费方式 | 典型模型 | 注意 |
|---|---|---|
| 按张 | Seedream、Qwen-Image |
单价随分辨率档位变化;n 张计
n 次
|
| 按输出 token | GPT-Image 系列 | 输入图与输出图分别折算;编辑任务也计输入图 |
具体单价以模型详情页为准,同一模型在官方、混合云等档位下价格不同。做批量任务前,先用 1 张低分辨率样片确认效果,再按最终尺寸跑量。
提示词建议
图像模型对“具体”的敏感度远高于“华丽”。把模糊描述拆成可执行的视觉要素,效果会稳定很多:
| 模糊写法 | 更有效的写法 |
|---|---|
| “好看的海报” | “极简香水广告海报,磨砂玻璃瓶置于浅灰石台,左上方冷白侧光,米白渐变背景,右上角留白,商业摄影质感” |
| “把背景改成蓝色” | “只把背景改为雾蓝色,保留产品、投影和右侧文字,光线方向不变” |
| “赛博朋克城市” | “雨夜霓虹街道,低机位广角,湿地面反光,紫青色霓虹,远处有行人剪影,电影剧照质感” |
- 结构:主体 → 场景 → 构图/机位 → 光线 → 材质 → 风格。顺序稳定,模型更容易抓住重点。
- 文字:需要画面内文字时,把文案用引号单独写出,并尽量短;中文长句容易糊。
-
反向词:多数模型不支持
negative_prompt,直接描述“要什么”,比依赖“不要什么”更有效。 - 迭代:一次只改一个变量(构图、光线或风格),否则无法判断是哪句话起了作用。
图片常见问题
返回 URL 还是 base64?
默认返回 URL,可以用 response_format 改为
b64_json。base64
适合需要立即落库或内网处理的场景,但响应体会明显变大,不建议大图批量使用。
为什么我传的尺寸报 400?
不同模型支持的尺寸档位不同,size
必须是该模型支持的预设值,而不是任意宽高。先查模型详情页的参数说明,或先用
1024x1024 验证链路。
能生成透明背景的 PNG 吗?
取决于模型。支持
background: "transparent"
的模型可以;不支持的模型即使传了也可能返回不透明背景。需要透明素材时,先确认模型能力,或生成后接抠图流程。
审核不通过会扣费吗?
请求被上游内容审核拒绝时不会产生图片费用,响应会返回明确的错误信息。调整提示词,避免真实人物肖像、商标、暴力或敏感内容后再试。
09视频模型
视频生成是异步任务:先提交,拿到任务 ID,再查询状态,完成后下载。一次生成通常需要几十秒到几分钟,不要在 HTTP 连接里一直等。
失败任务会进入
failed,返回错误原因并自动释放预扣额度,不计费。
提交文生视频任务
用 POST /v1/videos 提交。下面的例子生成一段 10
秒、1080p、16:9 的横版视频:
curl https://api.xytoken.com/v1/videos \
-H "Authorization: Bearer $XYTOKEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "doubao-seedance-2-5-260628",
"prompt": "清晨的薄雾中,一列老式火车穿过山谷,镜头从高处缓慢俯冲,电影感,暖色调",
"seconds": "10",
"metadata": {
"resolution": "1080p",
"ratio": "16:9",
"generate_audio": true,
"watermark": false,
"seed": 42
}
}'
创建成功后立即返回任务对象,不会等待视频生成完成:
{
"id": "task_9f3c2a7d",
"object": "video",
"model": "doubao-seedance-2-5-260628",
"status": "queued",
"progress": 0,
"created_at": 1761643200
}
id 是网关生成的公开任务
ID,后续查询与下载都用它。不要把它和上游厂商的任务 ID 混用。
| 参数 | 类型 | 说明 |
|---|---|---|
model |
string | 必填,模型 ID |
prompt |
string | 必填,画面与镜头描述 |
images |
string[] | 参考图,公网 URL 或 base64 Data URL;用于首帧/图生视频 |
seconds |
string |
输出时长,字符串形式;"-1"
表示自适应(仅部分模型支持)
|
size |
string |
兼容字段,部分模型不读取;分辨率优先用
metadata.resolution
|
metadata.resolution |
string |
480p / 720p /
1080p / 4k,按模型支持范围
|
metadata.ratio |
string |
16:9 / 4:3 / 1:1 /
3:4 / 9:16 / 21:9 /
adaptive
|
metadata.seed |
integer | 随机种子,用于复现 |
metadata.watermark |
boolean | 是否加水印 |
metadata.generate_audio |
boolean | 是否生成音频,支持该能力的模型生效 |
metadata.camera_fixed |
boolean | 固定镜头,减少运镜漂移 |
metadata.content |
array | 多模态输入数组,用于首尾帧、视频/音频参考 |
时长不是统一值:Seedance 2.5 接受 4–30 秒,Seedance 2.0 接受 4–15
秒,Wan 3.0 接受 2–30 秒,MiniMax H3 接受 4–15 秒;填
-1 时由模型决定默认时长,Wan 3.0 不支持
-1。超出范围会在提交时返回
400,而不是生成到一半才失败。
图生视频与首尾帧
单图首帧:把图片放进
images,模型以它为第一帧生成后续画面。
{
"model": "doubao-seedance-2-5-260628",
"prompt": "让画面中的女孩缓缓转头,微风吹动头发,背景保持静止",
"images": ["https://cdn.example.com/first-frame.png"],
"seconds": "5",
"metadata": { "resolution": "1080p", "ratio": "adaptive" }
}
首尾帧:需要明确图片角色时,改用
metadata.content。一旦传了
content,它会整组替换
images 拼出的素材数组。
{
"model": "doubao-seedance-2-0-260128",
"prompt": "从首帧自然过渡到尾帧,镜头缓慢推近,光线逐渐变暖",
"seconds": "-1",
"metadata": {
"resolution": "1080p",
"content": [
{
"type": "image_url",
"image_url": { "url": "https://cdn.example.com/first.png" },
"role": "first_frame"
},
{
"type": "image_url",
"image_url": { "url": "https://cdn.example.com/last.png" },
"role": "last_frame"
}
]
}
}
首尾帧与参考素材通常互斥。last_frame
不能单独提交。不同模型对角色命名的支持有差异,跨模型迁移前先查模型详情页,再做一次小样验证。
参考视频与音频
支持多模态参考的模型(当前为 Seedance
2.5),可以把视频、音频和图片一起放进
metadata.content,用于模仿运镜、节奏、音色或人物形象:
{
"model": "doubao-seedance-2-5-260628",
"prompt": "参考视频的运镜与色调,让画面中的舞者在雨夜街头起舞,节奏与背景音乐一致",
"seconds": "8",
"metadata": {
"resolution": "720p",
"ratio": "16:9",
"omni_reference_task_type": "reference",
"content": [
{ "type": "video_url", "video_url": { "url": "https://cdn.example.com/reference.mp4" } },
{ "type": "audio_url", "audio_url": { "url": "https://cdn.example.com/bgm.mp3" } },
{ "type": "image_url", "image_url": { "url": "https://cdn.example.com/actor.png" } }
]
}
}
-
素材必须是公网可访问的 HTTPS URL,或图片的
base64 Data URL。内网地址、带鉴权的链接、
file://都不行。 - 每类媒体(图 / 视频 / 音频)各自最多 128 个,超出返回 400。
- 含视频输入的任务通常按不同单价档计费,提交前先确认价格。
- 参考素材不是越多越好。选 1–3 个最关键的参考,模型更容易抓住重点。
查询任务与下载
用创建时返回的 id 轮询:
curl https://api.xytoken.com/v1/videos/task_9f3c2a7d \
-H "Authorization: Bearer $XYTOKEN_API_KEY"
{
"id": "task_9f3c2a7d",
"object": "video",
"model": "doubao-seedance-2-5-260628",
"status": "completed",
"progress": 100,
"created_at": 1761643200,
"completed_at": 1761643268,
"metadata": {
"url": "https://files.xytoken.com/videos/2026/10/9f3c2a7d.mp4"
}
}
| status | 含义 | progress | 下一步 |
|---|---|---|---|
queued |
已受理,等待调度 | 0–10 | 继续轮询 |
in_progress |
正在生成 | 10–99 | 继续轮询 |
completed |
生成成功 | 100 | 读取 metadata.url 或走下载接口 |
failed |
生成失败 | — | 读 error.message,调整后重提 |
推荐 5 秒起步、逐步退避、设置总超时。下面的脚本同时演示提交、轮询与落盘:
import os
import time
import requests
BASE = "https://api.xytoken.com/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['XYTOKEN_API_KEY']}"}
created = requests.post(
f"{BASE}/videos",
headers=HEADERS,
json={
"model": "doubao-seedance-2-5-260628",
"prompt": "雨夜的霓虹街头,镜头缓慢推进,电影感",
"seconds": "5",
"metadata": {"resolution": "720p", "ratio": "16:9"},
},
timeout=60,
).json()
task_id = created["id"]
delay = 5
while True:
task = requests.get(f"{BASE}/videos/{task_id}", headers=HEADERS, timeout=30).json()
print(task["status"], task.get("progress"))
if task["status"] in ("completed", "failed"):
break
time.sleep(delay)
delay = min(delay * 1.5, 20)
if task["status"] == "completed":
with requests.get(task["metadata"]["url"], stream=True) as resp:
resp.raise_for_status()
with open("output.mp4", "wb") as f:
for chunk in resp.iter_content(1 << 20):
f.write(chunk)
print("已保存 output.mp4")
else:
print("任务失败:", task.get("error"))
也可以让网关代理下载,适合需要统一鉴权或隐藏上游地址的场景:
curl -L https://api.xytoken.com/v1/videos/task_9f3c2a7d/content \
-H "Authorization: Bearer $XYTOKEN_API_KEY" \
-o output.mp4
产物链接由上游签发,通常有有效期。生成成功后应尽快转存;MiniMax H3 的任务查询窗口为最近 7 天,超出后可能无法重新获取链接。
模型差异与限制
下表是当前主推的四款视频模型。换模型前先确认时长、分辨率、比例与素材规则,参数不要跨模型套用。
| 模型 | 输出时长 | 分辨率 | 特点 |
|---|---|---|---|
| Seedance 2.5doubao-seedance-2-5-260628 | 4–30 秒或 -1 |
480p / 720p / 1080p | 音频生成、视频/音频参考、首尾帧 |
| Seedance 2.0doubao-seedance-2-0-260128 | 4–15 秒或 -1 |
720p / 1080p / 4k | 高分辨率输出、首尾帧 |
| Wan 3.0wan3.0-video | 2–30 秒 | 480p / 720p / 1080p | 首尾帧、参考图;不支持 -1,按次计费 |
| MiniMax H3MiniMax-H3 | 4–15 秒 | 768p / 2k | 首尾帧、参考视频/音频;查询窗口 7 天 |
- 本地文件不能直接用。先把图片/视频/音频上传到对象存储,生成可公开访问的 HTTPS 链接,再提交任务。
-
参数不是通用的。换模型时重新确认时长、分辨率、比例与素材规则;
size在部分模型上只是兼容字段。 -
不要把视频模型塞进聊天接口。视频是任务型
API,统一走
/v1/videos。 - 幂等要自己做。提交前记录业务侧的任务请求标识;网络超时后先查任务日志,不要直接重复提交。
计费与失败处理
Seedance 2.x 按输出分辨率与时长折算 token:提交时按“预估输出
token”预扣,完成后按实际用量结算,多退少补。分辨率与是否包含视频输入会影响单价档;ratio: "adaptive"
会按该分辨率下的最大像素面积预扣。
Wan 3.0 按次计费,MiniMax H3 按输出秒数与分辨率计价。无论哪种方式,失败任务都会自动释放预扣额度,不产生费用。
新场景先跑 5 秒 + 720p 的样片。确认镜头和主体动作符合预期,再上 1080p / 4K 与更长时长。视频的试错成本主要来自分辨率与时长,而不是提示词。
写视频提示词
一条提示词只讲一个镜头。把下面四件事写清楚,结果会稳定很多:
- 主体与动作:谁在做什么。动作要单一、可执行,避免“然后……接着……”的多段叙事。
- 场景与光线:地点、时间、光源方向。逆光、侧光、阴天会直接改变画面质感。
- 镜头运动:推、拉、摇、移、跟,选一个主运动;固定机位也是有效选择。
- 风格与节奏:写实、动画、胶片或广告感;快慢决定观众的情绪节奏。
10计费与额度
XYtoken 按实际用量计费:文本按 token,图片按张或输出 token,视频按秒折算或按次。没有固定席位费,不用不花钱;所有价格在模型广场按质量档位公示。
| 能力 | 主要计费单位 | 说明 |
|---|---|---|
| 文本 | 输入 / 输出 token | 输出单价通常是输入的 2–8 倍;缓存命中按缓存价单独计 |
| 图片 | 张 / 输出 token | 分辨率、质量、张数影响金额;编辑任务还会计输入图 |
| 视频 | 输出秒数折算 token / 按次 | 分辨率与是否含视频输入影响单价档 |
| 异步任务 | 按任务结果结算 | 失败不计费,预扣额度会释放 |
一次请求如何扣费
- 请求开始:按当前 Key 档位的价格预扣一笔额度,防止并发请求把余额透支。
- 请求结束:按实际 token、张数或时长结算,多扣的部分退回额度。
- 失败或超时:不产生费用;平台在内部换供给重试,也不会重复收费。
- 账单可追溯:每次请求记录模型、档位、用量、单价与金额,可以逐笔核对。
在「用量日志」里能看到每一笔的预扣、结算与退款。对账时以日志中的
request_id 为准,而不是客户端本地时间。
额度与限流
- Key 额度:每把 API Key 可单独设置上限,适合按业务、按环境隔离。
- 账户余额:余额不足时请求被拒绝,不会产生欠费;充值后即时恢复。
- 模型权限:Key 只能调用被授权的模型。无权限返回 403,不会悄悄降级。
-
限流:按
Key、模型或分组配置速率与并发上限。触发时返回 429,并尽量带上
Retry-After。
图片和视频的并发成本远高于文本。批量任务请控制并发数,先在模型详情页确认该模型在当前档位的并发与速率限制,再决定 worker 数量。
用量日志里有什么
| 字段 | 用途 |
|---|---|
request_id |
唯一标识,报障与对账的主键 |
| 时间 / 模型 / 端点 | 定位是哪一次调用、走的哪个协议 |
| 质量档位 | 确认这笔按哪一档单价结算 |
| 输入 / 输出用量 | token、张数、秒数,按能力不同展示 |
| 金额 | 当次结算金额(含预扣与退款) |
| 耗时 / 状态 | 端到端耗时、HTTP 状态与错误码 |
| Key / 用户 | 成本归因与权限审计 |
五个省钱习惯
- 分级用模:简单请求走 Flash 级模型,难题再升级到 Pro,通常能省一半以上。
- 选对档位:核心链路用官方或混合云,离线批量用订阅号池或特价,别让核心流量跑在最低价档。
-
控制输出:设置
max_tokens,要求结构化短输出;输出比输入贵得多。 - 图片先样片:低分辨率、1 张确认效果,再按最终尺寸跑量。
- 视频先试片:5 秒 720p 验证镜头与动作,再上 1080p / 4K 与长时长。
11错误码
错误响应统一为 OpenAI 风格,附带
request_id,便于在日志中检索:
{
"error": {
"message": "当前 API Key 没有访问模型 doubao-seedance-2-5-260628 的权限",
"type": "permission_denied",
"code": "model_not_entitled",
"request_id": "req_8f2c1a90"
}
}
| HTTP | 典型 code | 含义与处理 |
|---|---|---|
400 |
invalid_request |
参数缺失、类型错误、尺寸/时长不支持。按
message 修正请求
|
401 |
invalid_api_key |
Key 缺失、无效、被禁用或已过期。检查请求头与 Key 状态 |
403 |
permission_denied /
model_not_entitled
|
无模型权限、IP 不在白名单、账户被限制 |
404 |
model_not_found |
模型 ID 不存在或已下线。用
GET /v1/models 确认
|
413 |
payload_too_large |
请求体或素材超过上限。压缩图片、拆分请求 |
429 |
rate_limit_exceeded |
触发速率或并发限制。退避后重试,遵循
Retry-After
|
429 / 403 |
insufficient_quota |
额度或余额不足。充值、调整 Key 额度或换用其他 Key |
500 |
internal_error |
网关内部错误。可重试 |
502 / 503 |
upstream_error /
service_unavailable
|
上游异常或服务暂不可用。指数退避重试 |
504 |
upstream_timeout |
上游超时。视频任务请改用查询接口确认状态,不要直接重提 |
处理顺序:先看 error.type 判断类别,再看
error.code 决定动作,最后把
request_id 记入日志。不要只按 HTTP
状态码分支——不同上游在同一状态码下的语义可能不同。
12常见问题
XYtoken 和直接调用官方 API 有什么区别?
模型本身由厂商提供,能力没有差别。区别在接入链路:一套地址、一把 Key 覆盖多家模型,在同一模型的多条供给之间做重试与切换;账单、权限、用量日志也统一在一处。
对需要同时使用多家模型、或希望保留随时换模型能力的团队,收益主要是接入成本和运维复杂度。
同一个模型为什么有不同价格?
同一个模型 ID 可能由不同质量档位供给:官方、混合云、订阅号池、特价。档位不同,供给来源、稳定性、速率限制和单价都不同,模型广场会按档位分别标价。
API Key 创建时绑定一个档位,请求只走该档位。需要多个档位时分别创建 Key,详见质量档位。
请求里能指定质量档位吗?
不能。档位写在 Key 上,请求体里没有对应参数,也无法在单次调用中临时切换。这样做的好处是同一把 Key 的单价和行为始终可预期。需要换档位,新建一把 Key 并在代码里按场景选择。
迁移需要改多少代码?
OpenAI SDK 通常只改 base_url 和
api_key;Anthropic SDK 改
base_url。业务里如果写死了模型名,需要替换成控制台展示的模型 ID。
建议先在一个非核心场景灰度,确认协议、流式和错误处理都符合预期,再切生产。
支持流式吗?图片和视频呢?
文本支持 SSE 流式,stream: true
即可。图片是同步接口,一次返回结果;视频是异步任务,通过轮询获取状态。三种形态的计费方式也不同。
图片和视频的 URL 会过期吗?
会。产物地址由存储或上游签发,通常有有效期。生成成功后应尽快下载到自己的对象存储,不要把临时 URL 长期保存在数据库里。
视频任务失败会扣费吗?
不会。失败任务会释放预扣额度并标记为
failed,不产生结算金额。先查
error.message 定位原因,再决定是否重提。
可以限制某个 Key 只能用某些模型吗?
可以。创建或编辑 Key 时选择可用模型范围,并设置额度上限与 IP 白名单。未授权的模型返回 403,不会回落到其他模型。
数据会被用于训练吗?
不会。平台不训练模型,也不把客户请求用于模型改进。日志保留周期以控制台说明为准;涉及敏感数据的业务,建议按 Key 或用户隔离。
模型下线了怎么办?
控制台会提前标记即将下线的模型,并给出推荐替代型号。代码里不要把模型名写死在一个地方,集中配置更容易切换;下线通知也会出现在站内通知中。
如何对账和开票?
以控制台用量日志为准,按
request_id
可以逐笔核对模型、档位、用量、金额与状态。账单周期、发票类型与开票信息以「账单」页或商务说明为准;差异排查优先看模型是否选错、上下文是否超档、图片/视频规格是否超出预期。
你的反馈会用来改进文档与示例。