一个地址,接入文本、图片与视频模型

XYtoken 是多模型 API 网关。所有请求发往同一个域名,用同一把 API Key 鉴权,按同一个质量档位结算。你只需要在请求里写模型名,路由、重试、计量由网关完成。

更新于 2026 年 10 月 28 日 约 22 分钟阅读 API v1
POST /v1/chat/completions KEY · 官方档
REQUEST
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
  }'
RESPONSE · SSE
data: {"choices":[{"delta":{"content":"你好"}}]}
data: {"choices":[{"delta":{"content":",我是"}}]}
data: {"choices":[{"delta":{"content":" XYtoken。"}}]}
data: [DONE]
Base URLapi.xytoken.com/v1
鉴权Authorization: Bearer
质量档位创建 Key 时选择
4质量档位
8 家模型来源
2 套原生协议
1 个接入地址
模型来源 OpenAIAnthropicDeepSeek通义千问豆包Kimi智谱MiniMax

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 结构:

200 OK · application/json
{
  "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 看到的模型不同,用模型列表接口确认:

GET /v1/models
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 一致。下面这段用长上下文模型处理一份长文档:

POST /v1/chat/completions
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]。对延迟敏感的对话,首字时间比完整响应时间更重要。

Python · streaming
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:

POST /v1/chat/completions · vision
{
  "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 次
Python · 带退避的重试
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)

成功时返回图片数组:

200 OK · application/json
{
  "created": 1761643200,
  "data": [
    {
      "url": "https://files.xytoken.com/images/2026/10/9f3c2a7d.webp",
      "revised_prompt": "极简香水广告海报,磨砂玻璃瓶置于浅灰石台……"
    }
  ]
}

及时转存。返回的 URL 由存储侧签发,通常有有效期,也可能因清理策略失效。生产环境拿到地址后应立即下载到自己的对象存储,不要把临时 URL 直接写进数据库或前端缓存。

换模型只需要改 model。画面里要出现准确的中文文案时,换用 Qwen-Image 3.0 Pro,把标题、副标题用引号单独写出来:

POST /v1/images/generations · 中文文案海报
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。

POST /v1/images/edits · multipart
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 连接里一直等。

提交POST /v1/videos
排队queued
生成in_progress
完成completed
下载metadata.url

失败任务会进入 failed,返回错误原因并自动释放预扣额度,不计费。

提交文生视频任务

用 POST /v1/videos 提交。下面的例子生成一段 10 秒、1080p、16:9 的横版视频:

POST /v1/videos
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
    }
  }'

创建成功后立即返回任务对象,不会等待视频生成完成:

200 OK · application/json
{
  "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,用于模仿运镜、节奏、音色或人物形象:

多模态参考 · video / audio / image
{
  "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 轮询:

GET /v1/videos/{task_id}
curl https://api.xytoken.com/v1/videos/task_9f3c2a7d \
  -H "Authorization: Bearer $XYTOKEN_API_KEY"
200 OK · completed
{
  "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 秒起步、逐步退避、设置总超时。下面的脚本同时演示提交、轮询与落盘:

Python · submit + poll + download
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"))

也可以让网关代理下载,适合需要统一鉴权或隐藏上游地址的场景:

GET /v1/videos/{task_id}/content
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 / 按次 分辨率与是否含视频输入影响单价档
异步任务 按任务结果结算 失败不计费,预扣额度会释放

一次请求如何扣费

  1. 请求开始:按当前 Key 档位的价格预扣一笔额度,防止并发请求把余额透支。
  2. 请求结束:按实际 token、张数或时长结算,多扣的部分退回额度。
  3. 失败或超时:不产生费用;平台在内部换供给重试,也不会重复收费。
  4. 账单可追溯:每次请求记录模型、档位、用量、单价与金额,可以逐笔核对。

在「用量日志」里能看到每一笔的预扣、结算与退款。对账时以日志中的 request_id 为准,而不是客户端本地时间。

额度与限流

  • Key 额度:每把 API Key 可单独设置上限,适合按业务、按环境隔离。
  • 账户余额:余额不足时请求被拒绝,不会产生欠费;充值后即时恢复。
  • 模型权限:Key 只能调用被授权的模型。无权限返回 403,不会悄悄降级。
  • 限流:按 Key、模型或分组配置速率与并发上限。触发时返回 429,并尽量带上 Retry-After。

图片和视频的并发成本远高于文本。批量任务请控制并发数,先在模型详情页确认该模型在当前档位的并发与速率限制,再决定 worker 数量。

用量日志里有什么

字段 用途
request_id 唯一标识,报障与对账的主键
时间 / 模型 / 端点 定位是哪一次调用、走的哪个协议
质量档位 确认这笔按哪一档单价结算
输入 / 输出用量 token、张数、秒数,按能力不同展示
金额 当次结算金额(含预扣与退款)
耗时 / 状态 端到端耗时、HTTP 状态与错误码
Key / 用户 成本归因与权限审计

五个省钱习惯

  1. 分级用模:简单请求走 Flash 级模型,难题再升级到 Pro,通常能省一半以上。
  2. 选对档位:核心链路用官方或混合云,离线批量用订阅号池或特价,别让核心流量跑在最低价档。
  3. 控制输出:设置 max_tokens,要求结构化短输出;输出比输入贵得多。
  4. 图片先样片:低分辨率、1 张确认效果,再按最终尺寸跑量。
  5. 视频先试片:5 秒 720p 验证镜头与动作,再上 1080p / 4K 与长时长。

11错误码

错误响应统一为 OpenAI 风格,附带 request_id,便于在日志中检索:

403 Forbidden
{
  "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 可以逐笔核对模型、档位、用量、金额与状态。账单周期、发票类型与开票信息以「账单」页或商务说明为准;差异排查优先看模型是否选错、上下文是否超档、图片/视频规格是否超出预期。

已复制