异步任务(图像/视频/文本)
异步任务(图像 / 视频 / 文本)
适用于 图像生成、视频生成、长文本异步处理 等场景。提交任务后轮询状态,或配置 Webhook 接收完成通知。
注意:HTTP 入口当前使用
videoParams/imageParams/textParams结构(非旧版扁平prompt+params格式)。
端点一览
| 方法 | 路径 | 说明 |
|---|---|---|
POST | /api/ai/tasks | 提交任务 |
GET | /api/ai/tasks/{taskId} | 查询状态 |
POST | /api/ai/tasks/{taskId}/cancel | 取消任务 |
Base URL:https://aiservice.jellytoken.com
两种接入方式
| 平台异步任务 API(本页) | 供应商原生接口兼容 | |
|---|---|---|
| 路径 | POST /api/ai/tasks | /bailian/...、/ark/... |
| 参数格式 | 平台标准字段(videoParams 等) | 厂商原生请求体 |
| 平台处理 | 自动映射参数、施加默认值与约束 | 不做字段翻译,原样转发 |
| 适合 | 新项目、快速集成、不需要厂商深度参数 | 迁移已有厂商代码、需要厂商最新/全量参数 |
| 鉴权与计费 | 平台统一 | 平台统一(仍经过 JELLYTOKEN) |
| 查询结果 | GET /api/ai/tasks/{taskId} | 同左,或厂商原生查单 |
两种方式都经过 JELLYTOKEN 鉴权和计费,区别在于平台是否帮你翻译参数。详见 供应商原生接口兼容。
提交任务
请求
POST /api/ai/tasks
Authorization: Bearer uas_xxx
Content-Type: application/json
必须提供以下三者之一:videoParams、imageParams、textParams。
视频任务示例
{
"modelKey": "wan2.6-i2v",
"callbackId": "my-video-001",
"callbackUrl": "https://your-server.com/webhook/jellytoken",
"requestContext": {
"user_id": "user-123"
},
"videoParams": {
"prompt": "一只猫在草地上奔跑,电影感",
"firstFrame": "https://example.com/start.jpg",
"duration": 5,
"resolution": "720p",
"aspectRatio": "16:9",
"extraParamsJson": "{\"generate_audio\":true}"
}
}
图像任务示例
{
"modelKey": "qwen-image-plus",
"callbackId": "my-image-001",
"imageParams": {
"prompt": "赛博朋克风格城市夜景",
"resolution": "2k",
"aspectRatio": "1:1"
}
}
文本任务示例
{
"modelKey": "qwen-plus",
"callbackId": "my-text-001",
"textParams": {
"messages": [
{"role": "user", "content": "总结以下要点:..."}
],
"temperature": 0.7,
"maxTokens": 2048
}
}
字段说明
| 字段 | 必填 | 说明 |
|---|---|---|
modelKey | 是 | 模型 ID(平台异步 API 请求字段名) |
callbackId | 建议 | 幂等 ID;平台将其组合为 taskId |
callbackUrl | 否 | 完成/失败时 POST 回调 |
requestContext | 否 | 透传键值,如 user_id、request_id |
videoParams.prompt | 视频建议 | 提示词 |
videoParams.firstFrame / lastFrame | 否 | 首尾帧 URL |
videoParams.refImages | 否 | 参考图 URL 数组 |
videoParams.duration | 否 | 时长(秒) |
videoParams.resolution | 否 | 如 720p、1080p |
videoParams.aspectRatio | 否 | 如 16:9 |
videoParams.extraParamsJson | 否 | 模型特有参数 JSON 字符串;必须是合法 JSON 对象字符串 |
imageParams.prompt / refImages / resolution / aspectRatio / extraParamsJson | 图像建议 | 图像任务字段;无 duration |
textParams.messages | 文本 | Chat 消息数组 |
textParams.temperature / maxTokens / extraParamsJson | 否 | 文本任务可选参数 |
平台字段处理说明
平台异步任务 API 不是简单透传——提交后,平台会将
videoParams/imageParams/textParams中的标准字段(如resolution、aspectRatio、duration)映射为对应厂商的原生参数(如parameters.ratio、parameters.size),并可能施加默认值或范围约束。
extraParamsJson必须是合法 JSON 对象字符串,非法 JSON 会被拒绝。- 平台仅映射各系列文档中 [平台字段映射] 表格列出的键;未列出的
extraParamsJson键可能被忽略或按模型不同有差异。- 如需完全控制厂商请求体,请使用 供应商原生接口兼容。
各模型具体映射与支持的扩展键见 模型接入说明 中对应系列文档。
提交响应
{
"taskId": "12345__my-video-001",
"status": "queued",
"resultUrl": null,
"error": null,
"errorCode": null,
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
| 字段 | 说明 |
|---|---|
taskId | 平台返回的任务 ID,提交响应中给出 |
status | 提交成功时为 queued(仅出现在提交响应,查单接口不返回此值) |
查询任务
GET /api/ai/tasks/12345__my-video-001
Authorization: Bearer uas_xxx
{
"taskId": "12345__my-video-001",
"status": "completed",
"progress": 100,
"resultUrl": "https://cdn.example.com/result/xxx.mp4",
"resultUrlPublic": "https://cdn.example.com/result/xxx.mp4",
"resultContent": null,
"error": null,
"errorCode": null,
"notFound": false,
"usage": {
"promptTokens": 0,
"completionTokens": 0,
"totalTokens": 0
},
"externalDataJson": "{}"
}
status 取值
查单接口(GET /api/ai/tasks/{taskId})返回以下状态(与提交响应的 queued 不同):
| status | 说明 |
|---|---|
pending | 排队中 / 等待执行 |
running | 执行中 |
completed | 成功 |
failed | 失败 |
cancelled | 已取消 |
not_found | 任务不存在 |
执行中示例:
{
"taskId": "12345__my-video-001",
"status": "running",
"progress": 51,
"notFound": false
}
- 视频/图像:优先使用
resultUrlPublic(预签名 URL) - 文本任务:结果可能在
resultContent
取消任务
POST /api/ai/tasks/{taskId}/cancel
Authorization: Bearer uas_xxx
取消成功时,reason 因任务所处阶段不同而略有差异:
尚未开始执行(查单 status 为 pending):
{
"success": true,
"reason": "cancelled"
}
已在执行(查单 status 为 running):
{
"success": true,
"reason": "cancel_flag_set"
}
两种情况下 success 均为 true,表示取消请求已受理。执行中取消时,请继续轮询查单,直至 status 变为 cancelled。
reason 取值
| reason | success | 说明 |
|---|---|---|
cancelled | true | 取消已生效 |
cancel_flag_set | true | 取消请求已受理(执行中取消时返回;继续轮询直至 status 为 cancelled) |
invalid_api_key | false | API Key 无效 |
not_found | false | 任务不存在或不属于当前租户 |
already_finished | false | 任务已完成或已失败,无法取消 |
推荐集成模式
轮询
POST /api/ai/tasks → 获得 taskId,记录响应头 x-request-id
loop:
GET /api/ai/tasks/{taskId}
Header: x-request-id: (与 submit 相同,可选)
if status in (completed, failed, cancelled): break
# 进行中为 running,排队为 pending
sleep 2~5s
- 查单用
taskId;联系平台排查用 submit 时的x-request-id(详见 鉴权 · 请求追踪) - poll / cancel 响应头会回显本次请求的
x-request-id
Webhook(推荐生产)
配置 callbackUrl,详见 Webhook 回调。
cURL 完整示例
以下示例只需要替换 API_KEY;若你要测试其他模型,把 modelKey 换成控制台复制的模型 ID。
export API_KEY="uas_你的密钥"
export API_BASE_URL="https://aiservice.jellytoken.com"
# 可选:自定义请求 ID,便于排查
TRACE_ID="demo-trace-$(date +%s)"
# 提交任务
TASK=$(curl -s -X POST "$API_BASE_URL/api/ai/tasks" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "x-request-id: $TRACE_ID" \
-d '{
"modelKey": "qwen-image-plus",
"callbackId": "demo-001",
"imageParams": {
"prompt": "一只可爱的机器人,干净背景,产品渲染风格",
"aspectRatio": "1:1",
"resolution": "2k"
}
}')
echo "$TASK"
# 轮询一次;建议每 2~5 秒轮询,或使用 Webhook
TASK_ID=$(echo "$TASK" | jq -r .taskId)
curl -s -D - "$API_BASE_URL/api/ai/tasks/$TASK_ID" \
-H "Authorization: Bearer $API_KEY" \
-H "x-request-id: $TRACE_ID" | jq .
本示例依赖 jq 解析 taskId。如果没有安装 jq,也可以先从提交响应中手动复制 taskId,再调用查询接口。