同一套模型、同一份积分。用工作台签发的 Key 调图片 / 视频生成,提交拿任务号,再查任务拿结果。 本页的示例域名就是当前站点,可直接复制。
工作台 →「API 对接」→「+ 创建 API Key」,给它起个名字(比如「连载脚本」),完整 Key 会立刻弹出来。
Key 以 wl_ 开头,只在创建或重置时完整显示一次,服务端只存它的 sha256 指纹,丢了只能重置。
| 你能做的事 | 结果 |
|---|---|
| 创建 | 生成一把新 Key,立刻可用;每账号最多 20 把 |
| 停用 / 启用 | 停用立刻生效(调用返回 401),随时可再打开 |
| 重置 | 旧 Key 立即失效,同时给你一把新的 |
| 删除 | 永久作废,不可恢复 |
所有接口都用标准 Bearer 头,不要把 Key 写进 query 或前端代码里:
Authorization: Bearer wl_你的key
Key 能做什么:查模型 / 出图 / 出视频 / 出文本 / 查任务 / 查余额。它只能访问自己账号的数据与积分。
| 方法 | 路径 | 作用 | 计费 |
|---|---|---|---|
| GET | /v1/models | 可用模型与单价 | 免费 |
| GET | /v1/credits | 积分余额 | 免费 |
| POST | /v1/images/generations | 出图 | 按张扣 |
| POST | /v1/videos/generations | 出视频 | 按秒/按次扣 |
| POST | /v1/chat/completions | 出文本(可流式) | 按千字扣 |
| GET | /v1/tasks/{id} | 查任务状态与产物 | 免费 |
GET /v1/models —— 返回启用中的模型,带单价(视频 credits_per_second、图片 credits_per_image、文本 credits_per_1k_chars)。
curl __BASE__/v1/models -H "Authorization: Bearer wl_你的key"
{
"ok": true,
"credits": 16328.43,
"data": [
{ "id": "seedance-mini-480", "object": "model", "type": "video", "name": "特价渠道 Seedance 2.0 mini 480p", "credits_per_second": 3 },
{ "id": "gpt-image-2", "object": "model", "type": "image", "name": "GPT-image-2", "credits_per_image": 0.3 },
{ "id": "wolong-script", "object": "model", "type": "text", "name": "卧龙剧本", "credits_per_1k_chars": 2 }
]
}
POST /v1/images/generations
| 参数 | 必填 | 说明 |
|---|---|---|
| prompt | 是 | 画面描述,最长 500 字 |
| model | 否 | 模型 id,默认第一个启用模型 |
| n | 否 | 张数,后台可售集合里的值(通常 1 / 4 / 8) |
| imageSize | 否 | 仅可选画质型号接受;以目录中该型号的 1K / 2K / 4K 规格为准 |
| ratio | 否 | 画面比例,如 4:5 / 1:1 / 16:9 |
| style | 否 | 风格 id(国漫 / 日漫 / 霓虹 / 水墨 / 厚涂) |
| wait | 否 | 1 = 等到出结果再返回(最长 2 分钟) |
curl -X POST "__BASE__/v1/images/generations?wait=1" \
-H "Authorization: Bearer wl_你的key" \
-H "Content-Type: application/json" \
-d '{"prompt":"雨夜霓虹下的女主","model":"gpt-image-2","n":4,"ratio":"4:5"}'
{
"ok": true,
"task": {
"id": "task_xxx",
"status": "succeeded",
"cost": 1.2,
"data": [{ "url": "/media/outputs/task_xxx/01.svg", "mime": "image/svg+xml" }]
},
"credits": 16327.23
}
const BASE = "__BASE__";
const KEY = "wl_你的key";
const r = await fetch(BASE + "/v1/images/generations?wait=1", {
method: "POST",
headers: { Authorization: "Bearer " + KEY, "Content-Type": "application/json" },
body: JSON.stringify({ prompt: "雨夜霓虹下的女主", model: "gpt-image-2", n: 4, ratio: "4:5" })
});
const data = await r.json();
console.log(data.task.status, data.task.cost);
data.task.data.forEach((f) => console.log(BASE + f.url));
import requests
r = requests.post("__BASE__/v1/images/generations", params={"wait": 1},
headers={"Authorization": "Bearer wl_你的key"},
json={"prompt": "雨夜霓虹下的女主", "model": "gpt-image-2", "n": 4, "ratio": "4:5"},
timeout=180)
task = r.json()["task"]
print(task["status"], task["cost"])
for f in task["data"]:
print("__BASE__" + f["url"])
POST /v1/videos/generations —— 默认异步:提交拿任务号,再轮询;加 ?wait=1 同步等(最长 3 分钟)。
| 参数 | 必填 | 说明 |
|---|---|---|
| prompt | 是 | 画面 / 剧情描述 |
| model | 否 | 模型 id,如 seedance-mini-480 / minimax-h3 |
| duration | 否 | 必须使用所选型号与画质支持的秒数;Seedance mini 480p 为 4–15 秒,Seedance 2.5 部分型号支持 30 秒 |
| quality | 否 | 该型号提供的画质档(如 480p、720p、768p、1080p);不同型号互不通用 |
| ratio | 否 | 必须使用该型号支持的比例;Seedance mini 480p 支持 16:9、9:16、1:1、4:3、3:4 |
| wait | 否 | 1 = 等到出结果 |
curl -X POST "__BASE__/v1/videos/generations" \
-H "Authorization: Bearer wl_你的key" \
-H "Content-Type: application/json" \
-d '{"prompt":"天桥上撑伞走过","model":"seedance-mini-480","duration":8,"quality":"480p","ratio":"9:16"}'
const BASE = "__BASE__";
const KEY = "wl_你的key";
const H = { Authorization: "Bearer " + KEY, "Content-Type": "application/json" };
const created = await (await fetch(BASE + "/v1/videos/generations", {
method: "POST", headers: H,
body: JSON.stringify({ prompt: "天桥上撑伞走过", model: "seedance-mini-480", duration: 8, quality: "480p", ratio: "9:16" })
})).json();
let task = created.task;
while (task.status !== "succeeded" && task.status !== "failed") {
await new Promise((r) => setTimeout(r, 3000));
task = (await (await fetch(BASE + "/v1/tasks/" + task.id, { headers: H })).json()).task;
console.log(task.status, task.progress + "%", task.stage || "");
}
console.log(task.data);
curl __BASE__/v1/tasks/task_xxx -H "Authorization: Bearer wl_你的key"
curl __BASE__/v1/credits -H "Authorization: Bearer wl_你的key"
任务状态:queued → running → succeeded / failed / canceled(接口里的 status 已把 done 映射成 succeeded)。失败会自动退积分。
POST /v1/chat/completions —— 和图片、视频共用一把 Key、一份积分,按「提示 + 回复」总字数计费。
| 参数 | 必填 | 说明 |
|---|---|---|
| messages | 否 | OpenAI 风格消息数组(system / user / assistant),最多 12 条 |
| prompt | 否 | 也可以直接给一句话,等价于一条 user 消息 |
| system | 否 | 给 prompt 模式加的系统指令 |
| model | 否 | 文本模型 id,如 wolong-script |
| max_chars | 否 | 这次最多生成多少字 |
| stream | 否 | true = SSE 流式 |
curl -X POST __BASE__/v1/chat/completions \
-H "Authorization: Bearer wl_你的key" \
-H "Content-Type: application/json" \
-d '{"model":"wolong-script","messages":[{"role":"user","content":"雨夜天台,女主回头,写 6 个镜头"}]}'
响应是 OpenAI 兼容结构:choices[0].message.content 是正文,usage 是字数,另外多给 cost / credits。
加 "stream": true,返回 text/event-stream:每行 data: {...},增量在 choices[0].delta.content,末尾 data: [DONE],最后一条带 usage 与 cost。
curl -N -X POST __BASE__/v1/chat/completions \
-H "Authorization: Bearer wl_你的key" \
-H "Content-Type: application/json" \
-d '{"model":"wolong-script","stream":true,"messages":[{"role":"user","content":"雨夜天台,写 3 个镜头"}]}'
const res = await fetch("__BASE__/v1/chat/completions", {
method: "POST",
headers: { Authorization: "Bearer wl_你的key", "Content-Type": "application/json" },
body: JSON.stringify({ model: "wolong-script", stream: true, prompt: "雨夜天台,写 3 个镜头" })
});
const reader = res.body.getReader();
const dec = new TextDecoder();
let buf = "";
for (;;) {
const { value, done } = await reader.read();
if (done) break;
buf += dec.decode(value, { stream: true });
let i;
while ((i = buf.indexOf("\n\n")) >= 0) {
const line = buf.slice(0, i).trim();
buf = buf.slice(i + 2);
if (!line.startsWith("data:")) continue;
const payload = line.slice(5).trim();
if (payload === "[DONE]") return;
const obj = JSON.parse(payload);
const piece = (obj.choices && obj.choices[0] && obj.choices[0].delta && obj.choices[0].delta.content) || "";
if (piece) process.stdout.write(piece);
}
}
中途断开也按已经写出来的字数结算;余额只够多少字就写多少字,不会写超。
| 读取中… |
| 读取中… |
| 读取中… |
价格由平台实时下发(后台改价立即生效);按提交时的价格结算并立即扣除,失败自动退回。
限流按 Key 计:普通接口每分钟 120 次;文本(含流式)每分钟 30 次。超了返回 429,退避几秒再试即可。
| HTTP | 含义 | 处理 |
|---|---|---|
| 401 | Key 缺失、无效、已停用或已重置 | 检查 Authorization: Bearer;重置过就换新 Key |
| 402 | 积分不足 | 看返回里的 need / balance,充值或换便宜模型 |
| 400 | 参数不对(时长 / 张数 / 比例不在可售范围等) | 看 error 文案,或先 GET /v1/models + 价格页确认可售集合 |
| 404 | 任务或接口不存在 | 确认任务号属于当前 Key |
| 429 | 调用太快 | 退避重试(见上面的限流说明) |
| 502 | 上游通道报错(文本流式) | 看 error;后台「系统设置 → 日志」能看到上游返回 |
失败的任务会按 refundOnFailure 自动退积分,流水在<工作台 → 账号 → 积分明细>里能查到。