FRAMEGATE · DEVELOPER GUIDE

客户 API 接入文档

从密钥配置到生成结果,一份面向客户开发者的接入指南。
统一调用文本、视频和图片,查询用量与余额。

API v1更新 2026-10-29HTTPS · JSON · Bearer

01 / FRAMEGATE API开始接入

通过统一 API 调用已授权的文本、视频和图片模型,并查询账户余额与用量。视频通常异步完成:提交任务后保存任务 ID,再轮询获取结果。

  1. 由服务方开通账户、分配模型并确认余额;登录控制台,在 API Key 页面创建密钥并妥善保存。
  2. 调用 GET /v1/models 获取当前 Key 可用的模型 ID、售价与上限。
  3. 每个新生成业务创建一个幂等键,保存请求内容;同一业务重试必须复用该键和请求体。
  4. 提交生成请求;视频和异步图片按任务 ID 查询,成功后及时保存结果文件。
项目配置
服务地址https://api.myanimforge.com
API Base URLhttps://api.myanimforge.com/v1
客户后台https://47.111.229.99/user/
鉴权Authorization: Bearer YOUR_API_KEY
请求格式POST 使用 Content-Type: application/json,UTF-8
计价币种CNY 人民币;模型是否可用及当前售价以您的账户配置为准

建议由客户自己的后端调用 API。当前未提供面向第三方网页的跨域直连能力,勿将 API Key 放入浏览器、前端源码或公开仓库。

02 / FRAMEGATE API鉴权与幂等

所有 /v1/ 接口均使用 Bearer API Key,无需携带控制台 Cookie。控制台登录密码不能代替 API Key。密钥必须同时具备有效账户、模型授权以及适用的 Key 模型范围。

HTTP 请求头
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
Idempotency-Key: customer-order-20261027-000001

Idempotency-Key 是所有生成 POST 请求的必填请求头,长度为 8–100 字符。推荐使用业务订单号或 UUID。一次生成对应一个键:网络超时、连接中断或重试时保持键和请求体一致;只有明确创建新的生成任务时才使用新键。

  • 同一账户、同一生成类型下,复用相同键及内容会返回已有任务或可重放的响应,不重复派发。
  • 同一键对应不同内容返回 409 idempotency_conflict。
  • 非流式文本在响应仍保留时可重放;流式或无法重放的文本请求返回 409 request_already_exists,此时查询用量或联系服务方。
  • 先保存幂等键和请求体,再发起 POST。视频返回的 id 是后续查询使用的网关任务 ID。

API 的 X-Request-ID 响应头是单次 HTTP 请求追踪号,区别于生成任务 ID。联系客服时可一并提供。

03 / FRAMEGATE API接口一览

方法路径用途
GET/v1/models查询当前 Key 的模型、售价和限制
POST/v1/chat/completions文本生成;支持非流式和 SSE
POST/v1/videos创建异步视频任务
GET/v1/videos/{id}查询视频任务、结果和计费状态
POST/v1/images/generations生成图片;同步或异步返回
GET/v1/images/{id}查询图片任务、结果和计费状态
GET/v1/balance查询账户余额和预占额度
GET/v1/usage按模型汇总账户用量与费用

下文 cURL 使用 Bash 语法,适用于 Linux、macOS 或 Git Bash。Windows PowerShell 建议运行文末 Python 示例,避免换行与引号差异。示例环境变量:

Bash
export FRAMEGATE_API_KEY='YOUR_API_KEY'
export FRAMEGATE_BASE_URL='https://api.myanimforge.com'

04 / FRAMEGATE API查询模型与售价

Bash
curl --fail-with-body "$FRAMEGATE_BASE_URL/v1/models" \
  -H "Authorization: Bearer $FRAMEGATE_API_KEY"
JSON
{
  "object": "list",
  "data": [
    {
      "id": "YOUR_VIDEO_MODEL_ID",
      "kind": "video",
      "billing_unit": "seconds",
      "pricing_rules": [],
      "input_price": "0.00000000",
      "output_price": "0.15000000",
      "max_input": 32768,
      "max_output": 4096,
      "max_seconds": 30
    }
  ]
}

上例仅演示结构。model 必须填写查询结果里的 id,不要使用显示名称或自行推测上游模型名。空数组表示当前 Key 没有可见模型,请联系服务方确认授权、开放状态和定价。

字段含义
kindtext 文本、video 视频、image 图片
billing_unittokens:元/百万输入、输出 Token;total_tokens:元/百万总 Token;seconds:元/秒;videos:元/条视频;images:元/张。model 表示按类型默认单位(文本 Token、视频秒、图片张)。
input_price / output_price单一价格模型使用这两个字段;多档模型显示首档单价,实际计费请读取 pricing_rules。
pricing_rules / pricing_defaultspricing_rules 列出规格 when、名称 label、输入价 input_rate 和输出价 output_rate。按分辨率、参考视频、音频、错峰、时长或实际输入 Token 档位匹配。when.input_min 和 input_max 均含边界;缺少 input_max 表示无上界。pricing_defaults.options 为省略参数时实际发送给上游的默认值;fixed_resolution 为模型固定分辨率。未报价规格返回 unpriced_variant,不发起生成。
video_token_budget仅 Token 计费视频使用的预占预算,结算仍使用上游实际总 Token;实际费用可能高于或低于预占金额。
max_input文本安全输入预算;当前同时用请求 JSON 的 UTF-8 字节数做保守校验,不是上游上下文长度承诺。
max_output文本允许的 max_tokens 上限。
max_seconds视频允许的请求时长上限;仍受具体模型自身时长规则限制。

金额使用十进制字符串返回,请用 Decimal 等十进制定点方式处理,不要用二进制浮点做账。模型价格可能调整;已受理请求按受理时保存的价格快照结算。

05 / FRAMEGATE API视频生成与轮询

创建视频

POST /v1/videos 成功受理返回 HTTP 202;202 表示已接收任务,不代表生成已成功。

参数必填规则
model是当前 Key 可用的 video 模型 ID,最长 80 字符
prompt是1–12000 字符;Vidu 最多 5000,海螺最多 2000
duration_seconds是整数,1–3600,且不得超过模型 max_seconds;具体可选时长由模型决定。Seedance 2.5 最短 5 秒;不足 5 秒返回 invalid_duration,不预占、不提交上游
media否素材数组,网关通用上限 50 项;每项含 type、url、可选 role;模型可能要求素材并有更低上限
options否模型专属参数对象,默认 {};只允许支持的字段,不能在此覆盖 model、duration 或回调地址

以下为 Vidu Q3 Turbo 主体参考视频示例:将模型 ID 替换为您获授权的对应模型,将图片替换为公开可读取的 HTTPS 图片链接。该模型需要 1–7 张参考图。

JSON
{
  "model": "REPLACE_WITH_AUTHORIZED_VIDU_Q3_TURBO_ID",
  "prompt": "参考主体 [@image1],固定镜头,柔和自然光,光影缓慢移动,无文字。",
  "duration_seconds": 5,
  "media": [
    {
      "type": "image",
      "url": "https://your-public-assets.example/reference.jpg",
      "role": "reference_image"
    }
  ],
  "options": {
    "resolution": "540p",
    "aspect_ratio": "16:9",
    "audio": false,
    "bgm": false,
    "off_peak": false
  }
}

将上面的 JSON 保存为 video-request.json,同一业务使用固定幂等键提交:

Bash
curl --fail-with-body "$FRAMEGATE_BASE_URL/v1/videos" \
  -H "Authorization: Bearer $FRAMEGATE_API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: customer-video-order-000001' \
  --data-binary @video-request.json
JSON
{
  "id": "11111111-1111-4111-8111-111111111111",
  "model": "YOUR_VIDEO_MODEL_ID",
  "status": "queued",
  "usage": {
    "video_seconds": null,
    "video_count": null,
    "total_tokens": null,
    "input_tokens": null,
    "output_tokens": null
  },
  "billing": {
    "currency": "CNY",
    "amount": "0.00000000",
    "status": "reserved",
    "reserved_amount": "0.75000000"
  },
  "result": {
    "url": null,
    "urls": []
  },
  "error_code": null
}

查询任务

保存返回的 id,建议每 10 秒查询一次。查询接口只返回您账户自己的任务。

Bash
curl --fail-with-body "$FRAMEGATE_BASE_URL/v1/videos/11111111-1111-4111-8111-111111111111" \
  -H "Authorization: Bearer $FRAMEGATE_API_KEY"
JSON
{
  "id": "11111111-1111-4111-8111-111111111111",
  "model": "YOUR_VIDEO_MODEL_ID",
  "status": "succeeded",
  "usage": {
    "video_seconds": "5.0000",
    "video_count": 1,
    "total_tokens": 0,
    "input_tokens": 0,
    "output_tokens": 0
  },
  "billing": {
    "currency": "CNY",
    "amount": "0.75000000",
    "status": "settled",
    "reserved_amount": "0.75000000"
  },
  "result": {
    "url": "https://media.example/result.mp4",
    "urls": [
      "https://media.example/result.mp4"
    ]
  },
  "error_code": null
}

result.url 为第一个视频链接,result.urls 为全部结果链接。优先按 status 判断生成结果,再按 billing.status 判断费用是否已结算;二者互相独立。

视频未提供 Token 计量时,未结算响应可能为 null,已结算记录或汇总也可能显示 0;不要据此推断模型消耗为零。视频按模型 billing_unit 和 pricing_rules 计费:按秒使用实际时长、按条使用成功视频数量、按总 Token 使用实际 total_tokens。缺少对应实际用量时进入待对账;不能用请求时长推算 Token。

06 / FRAMEGATE API视频模型参数说明

下表列出网关支持传递的参数名。模型授权不等于所有参数组合都可用;分辨率、时长、音频及素材组合仍受具体模型限制。首次接入建议从最少参数开始,再逐项增加。未列出的字段会被拒绝。

模型系列options 可传字段关键规则
Vidu Q3 系列aspect_ratio、resolution、audio、bgm、movement_amplitude、seed、off_peakresolution 为 540p/720p/1080p;aspect_ratio 为 16:9/9:16/1:1/3:4/4:3;movement_amplitude 为 auto/small/medium/large。Q3 和 Q3 Turbo 必须传 1–7 张主体参考图片(role 省略或 reference_image),按顺序可用 [@image1] 等引用。
Kling v3 系列size、aspect_ratio、audio_generation、negative_prompt、cfg_scalesize 为 720P/1080P;aspect_ratio 为 16:9/9:16/1:1;cfg_scale 为 0–1 数字。当前只支持图片素材。
Hailuo 系列resolution、prompt_optimizer、fast_pretreatment、aigc_watermark时长 6 或 10 秒;resolution 为 768P/1080P;1080P 仅允许 6 秒。当前只支持图片素材。
MiniMax H3ratio、resolution可传图片或视频素材,素材不要填写 role。
Seedance 与 Seedance Literatio、resolution、watermark、generate_audio、seed、camera_fixed、return_last_frameLite i2v 需要图片;Lite t2v 不接受素材。Seedance face 当前仅支持 ratio,分辨率由模型决定。
Wan 视频系列ratio、resolution、watermark、prompt_extend、shot_type、seedWan 2.6 i2v 使用图片素材;其他素材组合以具体模型支持为准。

布尔参数使用 JSON 的 true/false,不要写成字符串。Vidu 与 Kling 等协议的 seed 使用 0–4294967295 的整数。参数大小写需保持一致。

素材格式

JSON
{
  "type": "image",
  "url": "https://your-public-assets.example/reference.jpg",
  "role": "reference_image"
}

type 可取 image、video、audio,但并非每个模型都支持全部类型。url 必须为可公开访问的 HTTPS 文件地址,不能使用本地路径、内网链接或需要额外 Cookie 的地址;须在任务完成前保持有效。当前 API 不提供文件上传接口。

通用 role 枚举为 first_frame、last_frame、reference_image、reference_video、reference_audio、video、driving_audio。仅填写对应模型支持的用途:Kling/Hailuo 的图片角色支持 first_frame 或 reference_image;Vidu Q3 / Q3 Turbo 仅支持主体参考用途,不支持 first_frame / last_frame;Vidu Q3 Mix 首尾帧需各一张且不混用其他图片。不要把完整枚举理解为所有模型均支持。

07 / FRAMEGATE API文本生成

POST /v1/chat/completions 提供 Chat Completions 风格接口。当前消息 content 接受字符串或 null,不接受图片/音频内容数组。消息角色可为 system、developer、user、assistant、tool。

Bash
curl --fail-with-body "$FRAMEGATE_BASE_URL/v1/chat/completions" \
  -H "Authorization: Bearer $FRAMEGATE_API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: customer-text-order-000001' \
  -d '{
    "model": "YOUR_TEXT_MODEL_ID",
    "messages": [{"role": "user", "content": "写一个五秒短视频的镜头脚本"}],
    "max_tokens": 512,
    "stream": false
  }'
参数说明
model / messages必填;messages 为 1–256 条消息。消息仅支持 role、content、name、tool_calls、tool_call_id、refusal 字段。
service_tier可选 standard / priority。只有模型报价包含对应服务档位时可用;默认 standard。
max_tokens默认 1024,范围 1–65536,且不超过模型 max_output。
stream默认 false;true 使用 SSE。
temperature / top_p可选,分别为 0–2 和 0–1。
tools / tool_choice / response_format / stop可选,是否可用由具体模型决定;tools 最多 64 项。其他未声明的顶层字段会被拒绝。

非流式 HTTP 200 响应通常含 choices、usage,并增加以下网关信息。即使生成返回 200,仍须查看账务状态;缺失实际用量时会进入 pending。

JSON
{
  "gateway": {
    "request_id": "11111111-1111-4111-8111-111111111111",
    "billing": {
      "currency": "CNY",
      "amount": "0.00200000",
      "status": "settled",
      "reserved_amount": "0.02000000"
    }
  }
}

流式输出

将 stream 改为 true,cURL 添加 -N。响应类型为 text/event-stream,逐条解析 data:,遇到 [DONE] 结束。使用响应头 X-Gateway-Request-ID 保存网关请求 ID;SSE 不附加上述非流式 gateway 对象。流式结束后的费用通过用量或控制台查询。

无需传 stream_options,网关会请求上游返回用量。连接中断不代表服务端任务被撤销,也不保证免收费;不要更换幂等键自动重新生成。

08 / FRAMEGATE API图片生成

POST /v1/images/generations 的基础参数为 model、prompt、n、media、options。model 和 prompt 必填;prompt 为 1–12000 字符;n 默认 1,范围 1–10,当前 Seedream 每次仅支持 1 张。

Bash
curl --fail-with-body "$FRAMEGATE_BASE_URL/v1/images/generations" \
  -H "Authorization: Bearer $FRAMEGATE_API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: customer-image-order-000001' \
  -d '{"model":"YOUR_IMAGE_MODEL_ID","prompt":"白色桌面上的蓝色陶瓷杯,柔和自然光","n":1}'

可选 media 最多 10 项,当前只接受 image 类型。options 允许 size、watermark、seed、prompt_extend、negative_prompt;合法值与支持组合由所选模型决定。

JSON
{
  "id": "22222222-2222-4222-8222-222222222222",
  "model": "YOUR_IMAGE_MODEL_ID",
  "status": "succeeded",
  "data": [
    {
      "url": "https://media.example/result.png"
    }
  ],
  "usage": {
    "image_count": 1
  },
  "billing": {
    "currency": "CNY",
    "amount": "0.10000000",
    "status": "settled",
    "reserved_amount": "0.10000000"
  },
  "error_code": null
}

同步生成通常返回 HTTP 200;异步受理返回 202,data 可能为空,此时使用 GET /v1/images/{id} 每 10 秒查询,响应结构相同。HTTP 200 也可能是待对账记录,最终以 status 与 billing.status 为准。成功图片在 data 数组中,每项含 url,建议及时保存。

09 / FRAMEGATE API余额与用量统计

Bash
curl --fail-with-body "$FRAMEGATE_BASE_URL/v1/balance" \
  -H "Authorization: Bearer $FRAMEGATE_API_KEY"
JSON
{
  "balance": "100.00000000",
  "reserved": "2.00000000",
  "available": "98.00000000",
  "currency": "CNY"
}

balance 为账面余额,reserved 为当前账户冻结的预占额度,available = balance - reserved 为可用余额。生成前先预占、确认实际用量后结算;余额不足以预占时返回 402。

类型预占实际结算
文本(max_input × 输入单价 + 请求 max_tokens × 输出单价) ÷ 1,000,000(实际输入 Token × 输入单价 + 实际输出 Token × 输出单价) ÷ 1,000,000
视频请求 duration_seconds × 视频秒价实际返回总视频秒数 × 视频秒价
图片请求 n × 图片单价成功图片数量 × 图片单价

实际用量缺失时保留预占并进入待对账,不使用估算用量自动结算。若实际消费超出预占,按实际消费记账,可能形成欠费;余额不足后续调用会被拒绝。任务响应中的 billing.reserved_amount 是该任务最初的预占金额,结算后仍保留作记录,不代表当前仍在冻结;实时冻结金额看 /v1/balance。

按模型统计

Bash
curl --fail-with-body --get "$FRAMEGATE_BASE_URL/v1/usage" \
  -H "Authorization: Bearer $FRAMEGATE_API_KEY" \
  --data-urlencode 'start=2026-10-01T00:00:00+08:00' \
  --data-urlencode 'end=2026-11-01T00:00:00+08:00'
JSON
{
  "data": [
    {
      "model_id": "YOUR_VIDEO_MODEL_ID",
      "kind": "video",
      "calls": 2,
      "settled_calls": 1,
      "input_tokens": "0",
      "output_tokens": "0",
      "video_seconds": "5.0000",
      "image_count": 0,
      "amount": "0.75000000"
    }
  ],
  "currency": "CNY"
}
  • 不传时间默认最近 30 天;start、end 必须含时区,区间为 [start, end),最多 366 天。
  • 按请求创建时间筛选,范围为整个账户的历史请求,不局限于当前 Key 的模型范围。
  • calls 为调用记录数,包含失败或待对账记录;settled_calls 为已结算数。
  • amount 为累计记录的消费额,退款不会冲减此统计;净余额及退款请以控制台流水为准。
  • 统计可能随异步结算更新。Token 汇总值可为字符串;视频或图片显示 0 不代表上游声明零 Token 消耗。

10 / FRAMEGATE API任务状态与重试策略

status含义与处理
created / dispatching任务已记录或正在提交;继续查询,勿重复创建。
queued / running排队或处理中;通常每 10 秒查询。
succeeded生成已成功;读取结果,再检查 billing.status。
failed生成失败;检查 error_code 与账务状态。失败不一定等于预占已释放。
unknown结果暂无法确认;联系服务方对账,不要以新幂等键重发。
billing.status含义与处理
reserved已预占,尚未完成结算。
settled已按实际用量结算,amount 为本次消费额。
released本次预占已释放,不扣该次消费。
pending待对账,额度可能仍被冻结。即使 status=succeeded,也可能尚未结算;保存结果并联系服务方。

处理顺序:成功则保存结果;failed、unknown 或 pending 则停止自动重发并记录任务 ID;仅在 queued/running 等处理中状态继续轮询。遇 429 遵从 Retry-After,其他查询网络故障可退避重试 GET。

提交超时或 5xx 时,先保留原幂等键与请求体;若已有任务 ID 则查询任务,否则使用原键和原内容恢复查询式提交,或联系服务方。不要因为客户端等候结束就重新创建任务。当前不提供取消或回调接口。

限流按账户计算,多个 Key 共用账户额度,查询也计入请求频率;具体 RPM 由服务方设置。每账户最多 20 个执行中或待对账请求。通常视频服务端跟踪最长 24 小时,配置低峰策略的 Vidu 渠道可能为 72 小时;超时后可能转待对账,并不代表自动退款。

11 / FRAMEGATE API错误码与排查

JSON
{
  "error": {
    "code": "insufficient_balance",
    "message": "可用余额不足以预占本次调用额度",
    "request_id": "HTTP_TRACE_ID"
  }
}
HTTP常见 error.code处理方式
400idempotency_key_required / invalid_request 类参数错误检查必填头、字段类型、模型参数;具体格式错误通常返回 422。
400invalid_model / model_not_ready / limit_exceeded / input_limit查询可用模型,确认类型、价格配置及输入输出限制。
400unsupported_options / invalid_options / image_required / invalid_duration / unsupported_media按模型规则修正参数和素材,查看 message。
400unpriced_variant模型没有匹配此参数组合的报价;查看 /v1/models 的 pricing_rules,调整规格或联系服务方。
400upstream_rejected上游拒绝本次参数,该拒绝分支会释放预占;修正参数后作为新业务提交。
401invalid_api_key检查 Bearer 前缀、密钥、有效期、账户状态及是否已撤销。
402insufficient_balance查询 available,联系服务方处理充值或预占对账。
403model_not_allowed / key_scope_denied / account_disabled / origin_denied检查账户及 Key 授权;从服务端接入,勿从其他网站跨域直调。
404not_found检查任务 ID,确认任务属于当前账户及正确的接口类型。
409idempotency_conflict / request_already_exists保留原业务键;内容冲突需检查业务映射,已存在请求应查询记录。
413body_too_large请求体上限 256 KiB;素材用 URL 引用,不内嵌大文件。
422invalid_request按 error.fields 定位字段,额外字段也会被拒绝。
429rate_limit_exceeded / concurrency_limit等待 Retry-After,降低频率或先处理未完成任务。
502submit_outcome_unknown / upstream_outcome_unknown / task_id_missing结果不确定,可能已保留预占;不要换新键自动生成。
503no_available_channel暂时无可用渠道;稍后用原键重试或联系服务方确认配置。
500internal_error保留追踪号、幂等键和业务记录,联系服务方;避免盲目创建新任务。

并非所有错误 JSON 都含 request_id,优先保存响应头 X-Request-ID。中间代理也可能返回非 JSON 错误,客户端应同时检查 HTTP 状态、Content-Type 和响应文本。提交排障信息时提供时间、接口、模型、HTTP 状态、错误码、任务 ID、追踪号和幂等键,不要发送完整 API Key。

12 / FRAMEGATE API下载与 Python 示例

离线接入包包含本页面、客户接口 OpenAPI 文件、Python 视频提交与轮询示例,以及可修改的请求 JSON。OpenAPI 可导入 Postman、Apifox 等工具;它只包含客户接口,不包含管理接口。

下载完整接入包下载 OpenAPI JSON下载 Python 示例

  1. 安装 Python 3.10 或更新版本,然后安装 requests。
  2. 复制 video-request.example.json 为 video-request.json,替换模型 ID 和素材地址。
  3. 设置自己的 API Key。首次运行会保存幂等键与任务 ID;恢复执行时使用相同的 state 文件。
Bash
python -m pip install requests
# Linux / macOS / Git Bash
export FRAMEGATE_API_KEY='YOUR_API_KEY'
python video_client.py --payload video-request.json --state order-000001.json
PowerShell
# Windows PowerShell
$env:FRAMEGATE_API_KEY = 'YOUR_API_KEY'
python video_client.py --payload video-request.json --state order-000001.json

默认本地等待 1800 秒,可用 --wait-seconds 调整。达到等待时间只停止客户端查询,不会取消服务端任务;重新运行同一命令即可继续查询。请勿同时运行多个使用同一 state 文件的进程,也不要修改已有 state 文件对应的请求内容。state 中保存请求内容和结果链接,应按业务数据妥善保存。

上线前核对

  • 模型 ID 来自当前 Key 的查询结果,售价与业务预算已确认。
  • 幂等键在发起请求前持久化,任务 ID 和错误追踪号可追溯。
  • 能区分生成状态和账务状态,pending 不被当作免费或可自动重试。
  • 轮询遵守账户限流,结果文件及时转存,密钥只保存在服务端。