ComfyUI 多工作流 API

服务地址

身份认证

/health/api.md/v1/crypto/public-key 和带签名的成果地址外,所有接口均需 API Key:

Authorization: Bearer <API_KEY>

或:

X-API-Key: <API_KEY>

API Key 由服务提供方单独分发,本文档不包含真实密钥。

创建任务成功后会额外返回仅属于该任务的 job_token。查询任务状态或通过鉴权接口下载文件时,必须同时提交 API Key 和该任务的 job_token

X-Job-Token: <JOB_TOKEN>

job_token 只在创建响应中返回一次,不会在后续状态响应中回显。不同任务的令牌不能互用。

健康检查

curl http://proxy.cyberran.com:50010/health
{
  "status": "ok",
  "comfyui": true,
  "workflow_ready": true,
  "qwen3_tts": {
    "service": true,
    "node_ready": true,
    "ready": true,
    "dtype": "bfloat16",
    "attention": "sdpa",
    "models": {
      "preset_voice": true,
      "voice_design": true,
      "voice_clone": true
    }
  }
}

查询接口结构

查询已经注册的工作流:

curl http://proxy.cyberran.com:50010/v1/workflows \
  -H "X-API-Key: <API_KEY>"
{
  "default_workflow": "minimax-h3",
  "workflows": [
    {
      "name": "minimax-h3",
      "display_name": "MiniMax H3 多模态视频",
      "adapter": "minimax_h3",
      "schema_url": "/v1/workflows/minimax-h3/schema"
    },
    {
      "name": "minimax-h3-realism-people",
      "display_name": "MiniMax H3 Realism People",
      "adapter": "minimax_h3",
      "schema_url": "/v1/workflows/minimax-h3-realism-people/schema"
    },
    {
      "name": "flux2",
      "display_name": "FLUX.2 Text to Image",
      "adapter": "flux2",
      "schema_url": "/v1/workflows/flux2/schema"
    },
    {
      "name": "flux2-edit",
      "display_name": "FLUX.2 Edit",
      "adapter": "flux2_edit",
      "schema_url": "/v1/workflows/flux2-edit/schema"
    },
    {
      "name": "z-image-turbo-full",
      "display_name": "Z-Image-Turbo Full BF16",
      "adapter": "z_image_turbo",
      "schema_url": "/v1/workflows/z-image-turbo-full/schema"
    },
    {
      "name": "qwen3-tts-1.7b",
      "display_name": "Qwen3-TTS Local 1.7B",
      "adapter": "qwen3_tts",
      "schema_url": "/v1/workflows/qwen3-tts-1.7b/schema"
    }
  ]
}

查询指定工作流结构:

curl http://proxy.cyberran.com:50010/v1/workflows/minimax-h3/schema \
  -H "X-API-Key: <API_KEY>"

兼容接口 /v1/schema 返回默认工作流结构;也可以指定名称:

curl "http://proxy.cyberran.com:50010/v1/schema?workflow=minimax-h3" \
  -H "X-API-Key: <API_KEY>"

上传参考素材

POST /v1/assets?u={user_namespace}&kind={image|video|audio}&filename={文件名}
Content-Type: application/octet-stream
X-API-Key: <API_KEY>

<原始文件字节>

上传图片:

curl -X POST \
  "http://proxy.cyberran.com:50010/v1/assets?kind=image&filename=character.png" \
  -H "X-API-Key: <API_KEY>" \
  -H "Content-Type: image/png" \
  --data-binary "@character.png"

上传视频:

curl -X POST \
  "http://proxy.cyberran.com:50010/v1/assets?kind=video&filename=motion.mp4" \
  -H "X-API-Key: <API_KEY>" \
  -H "Content-Type: video/mp4" \
  --data-binary "@motion.mp4"

上传音频:

curl -X POST \
  "http://proxy.cyberran.com:50010/v1/assets?kind=audio&filename=voice.wav" \
  -H "X-API-Key: <API_KEY>" \
  -H "Content-Type: audio/wav" \
  --data-binary "@voice.wav"

响应中的 asset_id 用于创建任务:

{
  "asset_id": "comfy-api-assets/96972a52da114732a8667bb2d6ec62ce.png",
  "kind": "image",
  "filename": "character.png",
  "size": 238015
}

单文件最大 512 MiB。支持格式:

创建任务

POST /v1/jobs
Content-Type: application/json
X-API-Key: <API_KEY>

创建任务接口只接受加密信封,不接受明文任务 JSON。工作流名、user_namespaceuser_task_idparametersinputs 和其中的提示词会作为一个完整 JSON 一起加密:

这一层可以让普通 HTTP 抓包看不到任务参数,但 API Key 仍位于请求头中,而且 HTTP 页面和公钥可能被主动篡改。需要抵御主动中间人、保护 API Key 和素材文件时,仍必须使用 HTTPS;服务端集成也建议预先核对并固定 kid

先取得当前 RSA 公钥:

GET /v1/crypto/public-key

返回 kidpublic_key_pem、算法名称和时间窗口。公钥可以缓存;如果创建任务返回 HTTP 409,应重新获取公钥并重新加密。实际发送到 /v1/jobs 的请求体格式如下,所有二进制字段均采用无填充 Base64URL:

{
  "version": 1,
  "alg": "RSA-OAEP-256",
  "enc": "A256GCM",
  "kid": "公钥标识",
  "encrypted_key": "RSA 加密后的 32 字节 AES 密钥",
  "iv": "12 字节随机 IV",
  "ciphertext": "AES-GCM 密文与 16 字节认证标签"
}

加密前的任务对象由 parametersinputs 两部分组成。下文展示的任务 JSON 均为“加密前对象”,不能直接作为 /v1/jobs 的 HTTP 请求体发送。

顶层 workflow 用于选择已注册工作流;省略时使用 minimax-h3user_namespace 用作上传和输出文件的隔离目录;user_task_id 是调用方自己的任务编号,用于跨系统关联:

{
  "workflow": "minimax-h3",
  "user_namespace": "customer_001",
  "user_task_id": "order-20260814-0001",
  "parameters": {},
  "inputs": {}
}

user_task_id 可选,类型为字符串,长度 1–128 个字符,不能包含控制字符。网关不会修改该值;创建响应、状态查询、完成/失败结果及成果网页都会原样返回。省略时返回 null

user_namespace 可选,省略时为 api。只允许 1–64 位小写英文字母、数字、下划线和连字符,并且必须以字母或数字开头。上传素材时的查询参数 u 必须与加密任务对象中的 user_namespace 一致;生成结果将保存到该命名空间的子目录。

parameters

参数 类型 范围或选项 默认工作流值
prompt string 最长 8000 字符 工作流提示词
seed integer 0–4294967295 随机
duration number 1–15 秒 5
aspect_ratio string 见比例列表 16:9 (Widescreen)
megapixels number 0.1–2.5 0.4
multiple integer 8–128 32
steps integer 1–100 20
denoise number 0–1 1
scheduler string simplesgm_uniformkarrasexponentialddim_uniformbetanormallinear_quadratickl_optimal simple
sampler string res_multistepeulerheundpmpp_2mdpmpp_2m_sdedpmpp_3m_sdeuni_pc res_multistep
bit_depth integer 8 或 10 8
output_format string automp4 auto
codec string autoh264 auto
lora_strength number 0–1.5;仅 minimax-h3-realism-people 1.0

minimax-h3-realism-people 使用 fal/MiniMax-H3-Realism-People-LoRA。网关会自动在提示词前加入触发词 r34l1sm;如果提示词已包含该词则不会重复。官方目标强度为 1.0,需要更轻效果时可使用 0.60.8

画面比例:

1:1 (Square)
2:3 (Portrait Photo)
3:2 (Photo)
3:4 (Portrait Standard)
4:3 (Standard)
9:16 (Portrait Widescreen)
16:9 (Widescreen)
21:9 (Ultrawide)

inputs

参数 类型 限制 说明
first_frame string 图片 asset_id 起始帧
last_frame string 图片 asset_id 结束帧
reference_images string[] 最多 9 个 Omni Reference 图片
reference_videos string[] 最多 3 个 Omni Reference 视频,建议 2–15 秒
reference_video_audios (string或null)[] 最多 3 个 按索引匹配参考视频的独立音轨
reference_audios string[] 最多 3 个 独立参考音频/声音参考
use_embedded_video_audio boolean 默认 false 使用参考视频自带音轨
reference_image_size string matchmax max 身份保持更强,但可能慢数倍

首尾帧模式不能与 Omni Reference 素材混用。只传 first_framelast_frame 时自动进入首尾帧模式;传任一 reference_* 数组时自动进入 Omni Reference 模式。

Realism People 人物写实工作流

该工作流支持与 minimax-h3 相同的文生视频、首尾帧和 Omni Reference 输入,只需切换工作流名称,并可选传入 LoRA 强度:

{
  "workflow": "minimax-h3-realism-people",
  "user_task_id": "people-video-0001",
  "parameters": {
    "prompt": "A cinematic close-up of a real person walking through a city street",
    "lora_strength": 1.0,
    "duration": 5,
    "aspect_ratio": "16:9 (Widescreen)",
    "megapixels": 0.4,
    "steps": 20
  },
  "inputs": {}
}

在 Omni Reference 提示词中使用以下标签指代素材:

<Picture 1>、<Picture 2> ...
<Video 1>、<Video 2> ...
<Audio 1>、<Audio 2> ...

文生视频

{
  "workflow": "minimax-h3",
  "user_task_id": "order-20260814-0001",
  "parameters": {
    "prompt": "雨后的未来城市,电影摄影,车辆快速驶过,原生环境音",
    "seed": 123456,
    "duration": 5,
    "aspect_ratio": "16:9 (Widescreen)",
    "megapixels": 0.4,
    "steps": 20,
    "sampler": "res_multistep"
  }
}

首尾帧视频

{
  "workflow": "minimax-h3",
  "parameters": {
    "prompt": "The character turns toward the camera while the city lights come alive.",
    "duration": 5,
    "aspect_ratio": "16:9 (Widescreen)",
    "megapixels": 0.4
  },
  "inputs": {
    "first_frame": "comfy-api-assets/FIRST_IMAGE.png",
    "last_frame": "comfy-api-assets/LAST_IMAGE.png"
  }
}

多参考图与声音参考

{
  "workflow": "minimax-h3",
  "parameters": {
    "prompt": "Keep the identity and clothing of <Picture 1>. Use the environment style from <Picture 2>. The protagonist speaks in the voice and delivery of <Audio 1>: This shot is simply amazing!",
    "seed": 123456,
    "duration": 5,
    "aspect_ratio": "16:9 (Widescreen)",
    "megapixels": 0.4,
    "steps": 20
  },
  "inputs": {
    "reference_images": [
      "comfy-api-assets/CHARACTER.png",
      "comfy-api-assets/ENVIRONMENT.png"
    ],
    "reference_audios": [
      "comfy-api-assets/VOICE.wav"
    ],
    "reference_image_size": "match"
  }
}

参考视频与配套音轨

{
  "workflow": "minimax-h3",
  "parameters": {
    "prompt": "Follow the motion and camera rhythm of <Video 1>, while using its associated <Audio 1> as the voice and timing reference.",
    "duration": 5,
    "aspect_ratio": "16:9 (Widescreen)",
    "megapixels": 0.4
  },
  "inputs": {
    "reference_videos": [
      "comfy-api-assets/MOTION.mp4"
    ],
    "reference_video_audios": [
      "comfy-api-assets/MOTION_VOICE.wav"
    ]
  }
}

如果要直接使用视频内嵌音轨:

{
  "inputs": {
    "reference_videos": ["comfy-api-assets/MOTION.mp4"],
    "use_embedded_video_audio": true
  }
}

Python 整包加密并创建任务

安装依赖:pip install requests cryptographyrequest_body 可以替换为本节任一工作流示例:

import base64
import json
import os
import time

import requests
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

BASE_URL = "http://proxy.cyberran.com:50010"
API_KEY = os.environ["COMFY_API_KEY"]
AAD = b"comfy-api:v1:jobs"


def b64url(value: bytes) -> str:
    return base64.urlsafe_b64encode(value).decode("ascii").rstrip("=")


def encrypt_request(request_body: dict) -> dict:
    metadata = requests.get(f"{BASE_URL}/v1/crypto/public-key", timeout=15).json()
    public_key = serialization.load_pem_public_key(metadata["public_key_pem"].encode("ascii"))
    aes_key = os.urandom(32)
    iv = os.urandom(12)
    protected = {
        "issued_at": int(time.time() * 1000),
        "nonce": b64url(os.urandom(18)),
        "request": request_body,
    }
    plaintext = json.dumps(protected, ensure_ascii=False, separators=(",", ":")).encode("utf-8")
    ciphertext = AESGCM(aes_key).encrypt(iv, plaintext, AAD)
    encrypted_key = public_key.encrypt(
        aes_key,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None,
        ),
    )
    return {
        "version": 1,
        "alg": "RSA-OAEP-256",
        "enc": "A256GCM",
        "kid": metadata["kid"],
        "encrypted_key": b64url(encrypted_key),
        "iv": b64url(iv),
        "ciphertext": b64url(ciphertext),
    }


request_body = {
    "workflow": "minimax-h3",
    "user_task_id": "order-20260814-0001",
    "parameters": {
        "prompt": "雨后的未来城市,电影摄影,车辆快速驶过,原生环境音",
        "duration": 5,
        "aspect_ratio": "16:9 (Widescreen)",
        "megapixels": 0.4,
        "steps": 20,
    },
    "inputs": {},
}

response = requests.post(
    f"{BASE_URL}/v1/jobs",
    headers={"X-API-Key": API_KEY},
    json=encrypt_request(request_body),
    timeout=30,
)
response.raise_for_status()
print(response.json())

响应:

{
  "id": "ae736d94-f406-4812-b599-af553eb349d6",
  "user_task_id": "order-20260814-0001",
  "workflow": "minimax-h3",
  "status": "queued",
  "job_token": "<JOB_TOKEN>",
  "elapsed_seconds": 0.0,
  "mode": "omni_reference",
  "status_url": "/v1/jobs/ae736d94-f406-4812-b599-af553eb349d6",
  "result_page_url": "http://proxy.cyberran.com:50010/results/ae736d94-f406-4812-b599-af553eb349d6?sig=..."
}

mode 可能为 textfirst_last_frameomni_referencetext_to_imageimage_edit

请在收到创建响应后立即安全保存 job_token;令牌遗失后无法通过状态接口取回。

FLUX.2 文生图

工作流名称:flux2。使用 FLUX.2 Klein 9B FP8 蒸馏模型与 Qwen 3 8B FP8 文本编码器,默认 4 步、CFG 1、Euler 采样。

许可提醒:FLUX.2 Klein 9B 权重采用 FLUX Non-Commercial License,仅用于该许可证允许的非商业、非生产用途;如需生产或商业使用,应另行取得相应授权。

{
  "workflow": "flux2",
  "user_task_id": "image-0001",
  "parameters": {
    "prompt": "A red sports car parked on a rainy Shanghai street at night, cinematic photography",
    "seed": 12345,
    "width": 1024,
    "height": 1024,
    "steps": 4,
    "cfg": 1.0,
    "sampler": "euler"
  },
  "inputs": {}
}

文生图参数:

参数 类型 范围/选项 默认值
prompt string 最长 8000 字符 内置示例提示词
seed integer 0–4294967295 0
width integer 256–2048,必须是 16 的倍数 1024
height integer 256–2048,必须是 16 的倍数 1024
steps integer 1–20 4
cfg number 0–10 1.0
sampler string eulereuler_cfg_ppheundpmpp_2mres_multistep euler

创建请求使用前文“Python 整包加密并创建任务”的方法,把 request_body 替换为本节的 FLUX.2 对象。

FLUX.2 Edit 图生图

工作流名称:flux2-edit。先通过素材接口上传图片,再把返回的 asset_id 放到 inputs.reference_image。需要组合人物、商品、风格等多个参考时,可改用 inputs.reference_images 数组,接口最多接受 4 张图片。

curl -X POST \
  "http://proxy.cyberran.com:50010/v1/assets?kind=image&filename=source.png" \
  -H "X-API-Key: <API_KEY>" \
  -H "Content-Type: image/png" \
  --data-binary "@source.png"
{
  "workflow": "flux2-edit",
  "user_task_id": "edit-0001",
  "parameters": {
    "prompt": "Change the background to a snowy mountain landscape while preserving the person",
    "seed": 12345,
    "steps": 4,
    "cfg": 1.0,
    "sampler": "euler",
    "megapixels": 1.0,
    "upscale_method": "nearest-exact"
  },
  "inputs": {
    "reference_image": "comfy-api-assets/返回的素材文件名.png"
  }
}

图像编辑参数:

参数 类型 范围/选项 默认值
prompt string 最长 8000 字符,填写编辑指令 内置示例指令
seed integer 0–4294967295 0
steps integer 1–20 4
cfg number 0–10 1.0
sampler string flux2 相同 euler
megapixels number 0.25–4.0,输出保持参考图宽高比 1.0
upscale_method string nearest-exactbilinearareabicubiclanczos nearest-exact

inputs.reference_imageinputs.reference_images 二选一,不能同时提交。前者是单个图片 asset_id;后者是 1–4 个图片 asset_id 的数组,第一张图片决定输出宽高比。文生图和图像编辑的创建响应、任务隔离、状态查询、GPU 数据、耗时和成果地址与视频工作流一致;mode 分别返回 text_to_imageimage_edit

可分别查询实时参数结构:

GET /v1/workflows/flux2/schema
GET /v1/workflows/flux2-edit/schema

Z-Image-Turbo Full 文生图

工作流名称:z-image-turbo-full。使用完整 BF16 的 Z-Image-Turbo 主模型、Qwen 3 4B BF16 文本编码器和原版 VAE。官方推荐默认值为 8 步、CFG 1、res_multistep 采样器、simple 调度器和 Shift 3。

{
  "workflow": "z-image-turbo-full",
  "user_task_id": "z-image-0001",
  "parameters": {
    "prompt": "一张电影感产品摄影,桌上放着一杯咖啡,背景招牌清晰写着‘早上好’,自然晨光",
    "seed": 20260814,
    "width": 1024,
    "height": 1024,
    "steps": 8,
    "cfg": 1.0,
    "sampler": "res_multistep",
    "scheduler": "simple",
    "shift": 3.0
  },
  "inputs": {}
}

参数:

参数 类型 范围/选项 默认值
prompt string 最长 8000 字符,支持中文和英文 内置示例提示词
seed integer 0–4294967295 0
width integer 256–2048,必须是 16 的倍数 1024
height integer 256–2048,必须是 16 的倍数 1024
steps integer 1–30,Turbo 推荐 8 8
cfg number 0–10,Turbo 推荐 1 1.0
sampler string res_multistepeulereuler_cfg_ppheundpmpp_2m res_multistep
scheduler string simplesgm_uniformkarrasexponentialbetanormal simple
shift number 0–10 3.0

实时参数结构:

GET /v1/workflows/z-image-turbo-full/schema

创建任务仍使用 POST /v1/jobs;创建响应中的 modetext_to_image,状态查询、耗时、GPU 数据、任务隔离和成果链接与其他工作流一致。

Qwen3-TTS 本地声音生成

工作流名称:qwen3-tts-1.7b。三个官方 1.7B 模型均在本机运行,使用 BF16 与 PyTorch SDPA;不调用外部语音生成服务。支持中文、英文、日语、韩语、德语、法语、俄语、葡萄牙语、西班牙语和意大利语。

可查询音色、语言、模式和模型就绪状态:

GET /v1/audio/voices
X-API-Key: <API_KEY>

预设音色

{
  "workflow": "qwen3-tts-1.7b",
  "user_task_id": "audio-20260821-001",
  "parameters": {
    "mode": "preset_voice",
    "text": "欢迎使用本地 Qwen3-TTS 声音接口。",
    "language": "Chinese",
    "speaker": "Vivian",
    "instruct": "自然、清晰、语速适中",
    "reference_text": "",
    "x_vector_only": false,
    "seed": 42,
    "max_new_tokens": 2048,
    "temperature": 0.9,
    "top_p": 0.9,
    "repetition_penalty": 1.05,
    "unload_after_generate": true
  },
  "inputs": {}
}

预设音色包括 VivianSerenaUncle_FuDylanEricRyanAidenOno_AnnaSohee

自然语言设计音色

mode 改为 voice_design,并用 instruct 详细描述声音:

{
  "workflow": "qwen3-tts-1.7b",
  "user_task_id": "audio-design-001",
  "parameters": {
    "mode": "voice_design",
    "text": "夜色缓缓落在安静的海面上。",
    "language": "Chinese",
    "speaker": "Vivian",
    "instruct": "温暖沉静的成年女性声音,低音区,纪录片旁白风格,语速稍慢",
    "reference_text": "",
    "x_vector_only": false,
    "seed": 42,
    "max_new_tokens": 2048,
    "temperature": 0.9,
    "top_p": 0.9,
    "repetition_penalty": 1.05,
    "unload_after_generate": true
  },
  "inputs": {}
}

参考音频克隆声音

先通过素材接口上传参考音频,再把返回的 asset_id 放入加密任务 JSON。建议参考音频为 5–15 秒,超过 30 秒的部分会被自动截断。

{
  "workflow": "qwen3-tts-1.7b",
  "user_task_id": "audio-clone-001",
  "parameters": {
    "mode": "voice_clone",
    "text": "这是使用参考声音生成的新内容。",
    "language": "Chinese",
    "speaker": "Vivian",
    "instruct": "",
    "reference_text": "这里填写参考音频中实际说出的原文。",
    "x_vector_only": false,
    "seed": 42,
    "max_new_tokens": 2048,
    "temperature": 0.9,
    "top_p": 0.9,
    "repetition_penalty": 1.05,
    "unload_after_generate": true
  },
  "inputs": {
    "reference_audio": "comfy-api-assets/返回的声音素材文件名.wav"
  }
}

x_vector_only=true 时可以不传 reference_text,但声音克隆质量通常会下降。unload_after_generate=true 会在任务结束后释放语音模型显存,适合与生图、生视频工作流共用显卡。

声音任务与其他工作流一样,完整任务 JSON 必须先按前文方式加密,再发送到 POST /v1/jobs。创建响应中的 modetext_to_audio,完成后 files[].kindaudio,返回 MP3 预览、下载地址、总耗时和 GPU 状态。

实时参数结构:

GET /v1/workflows/qwen3-tts-1.7b/schema

查询任务

curl http://proxy.cyberran.com:50010/v1/jobs/{id} \
  -H "X-API-Key: <API_KEY>" \
  -H "X-Job-Token: <JOB_TOKEN>"

完成响应:

{
  "id": "ae736d94-f406-4812-b599-af553eb349d6",
  "user_task_id": "order-20260814-0001",
  "workflow": "minimax-h3",
  "status": "completed",
  "elapsed_seconds": 10.47,
  "gpu": {
    "available": true,
    "name": "NVIDIA GeForce RTX 5090",
    "utilization_percent": 100,
    "temperature_c": 79,
    "memory_used_mib": 26718,
    "memory_total_mib": 32607,
    "memory_used_percent": 81.9
  },
  "files": [
    {
      "kind": "video",
      "filename": "MiniMax_H3_00003_.mp4",
      "url": "/v1/jobs/ae736d94-f406-4812-b599-af553eb349d6/files/0",
      "public_url": "http://proxy.cyberran.com:50010/public/jobs/ae736d94-f406-4812-b599-af553eb349d6/files/0?sig=..."
    }
  ],
  "errors": [],
  "result_page_url": "http://proxy.cyberran.com:50010/results/ae736d94-f406-4812-b599-af553eb349d6?sig=..."
}

elapsed_seconds 为任务从提交到当前或完成时的耗时,单位为秒,保留最多三位小数。旧任务缺少可用时间数据时可能返回 null

gpu 是查询状态时的实时显卡数据:

无法读取 NVIDIA 状态时返回 {"available": false}。GPU 数据最多缓存 1 秒。

成果 Web 服务

任务创建后立刻返回 result_page_url。该网页在任务运行时每 5 秒自动刷新,完成后显示耗时、播放器和下载链接。

带签名的成果链接不需要 API Key。任何获得链接的人都能访问对应成果,请勿公开敏感内容。

HTTP 状态码

状态码 说明
200 请求成功
201 素材上传成功
202 任务进入队列
400 参数、素材类型或组合不合法
401 API Key 无效
403 公开成果签名无效
404 接口、成果或任务访问凭据不存在/不匹配
413 JSON 或上传文件过大
500 网关内部错误
502 ComfyUI 拒绝任务
503 ComfyUI 不可用

安全提示

  1. 当前公网入口为 HTTP,生产使用建议在服务器前增加 HTTPS。
  2. 不要把 API Key 写入公开网页或仓库。
  3. 不要在不同用户之间共享 job_token;每个令牌只能访问对应任务。
  4. 素材和成果可能包含隐私信息,应妥善保管 API Key、任务令牌与签名成果链接。