指南 / 从其他服务迁移到 VizoAPI
从其他服务迁移到 VizoAPI
下面每个标签页都有一段给编程助手(Claude Code、Codex、Cursor 等)的提示词。把它粘贴到你项目里的助手中。提示词会告诉助手,如何把你当前服务商的认证、任务创建、状态查询或回调、以及结果字段,对应到 VizoAPI。
每次迁移都有三点差异。VizoAPI 是异步的:创建任务立即返回,结果之后再取。重复调用创建接口会产生第二个任务和第二次扣费,所以超时后不能盲目重试。价格按积分计算,输出保留 7 天。
提示词对其他服务商只做大致描述,并要求助手阅读该服务商当前的文档。迁移流量之前,请先检查代码差异,并跑通一个小任务。
Replicate
Replicate 用模型和输入对象创建一次预测(prediction),之后你通过轮询或回调拿结果。结果是一个或多个文件地址。
你正在把这个代码库从 Replicate 迁移到 VizoAPI。只修改调用 Replicate 的代码,应用的其余部分保持不变。
第 1 步:找出代码里所有使用 Replicate 的位置:客户端初始化、模型调用、状态查询、回调处理,以及读取结果的代码。修改之前先把清单列给我看。
第 2 步:认证。Replicate 用 API token 作为 Bearer 令牌放在 Authorization 请求头里。把它换成请求头 Authorization: Bearer <key>,key 从环境变量 VIZO_API_KEY 读取。key 只放在服务端,不要放进网页或 App 代码。
下面所有调用的基础地址是:
https://api.vizoapi.com
第 3 步:模型。调用 `GET /v1/models`,选出与当前 Replicate 模型对应的 VizoAPI 模型。每一项都列出 input 须遵循的 `inputSchema`、它的 `features` 以及每个 `tiers` 档位的价格。`GET /v1/models/{id}` 返回单个模型。选定模型后,阅读它的指南 https://vizoapi.com/docs/models/<模型 ID>.md:其中写明该模型的模式、可直接运行的示例请求体、输入上限、计费和错误;另请阅读限流、计费和错误三页(https://vizoapi.com/docs/rate-limits、https://vizoapi.com/docs/billing、https://vizoapi.com/docs/errors)。想在不创建任务的情况下校验请求体,就发给 `POST /v1/estimates`:它免费,不创建任务,对无效输入返回与创建相同的错误;它需要 generations:create 权限,并计入限流。如果对应关系不明确,停下来问我,不要猜。
第 4 步:创建任务。把创建调用换成 `POST /v1/generations`。请求体包含 `model` 和 `input`,除 `metadata` 和 `webhook_endpoint_id` 外不加其他字段;价格档位只由 input 决定。按第 3 步的 `inputSchema`、用模型自己的字段名组装 `input`:Kling 和 Wan 的提示词放进 `input.prompt`,Seedance 和 MiniMax 的提示词放进 input 内容列表里的文本项。只发送结构里列出的字段,其他字段会被 HTTP 422 拒绝。在 `metadata` 里加上你自己的 `client_reference`,例如订单号。调用返回 HTTP 202 和新任务,保存其中的 `id`。VizoAPI 没有同步结果,代码必须按第 5 步等待任务。创建调用超时后不要重试:再调用一次会创建第二个任务并产生第二次扣费。应先用 `GET /v1/generations` 和同一个 `client_reference` 查找任务。默认每个组织同时运行 3 个视频任务(图片、音频各 10 个);超出时创建请求返回 HTTP 429 concurrency_limited,所以请在你这边排队,一个任务结束后再提交下一个。
第 5 步:等待结果。Replicate 的代码通常先创建预测,再轮询到最终状态,或者用一个会阻塞等待输出的辅助函数。找到这段循环;如果用了阻塞等待的辅助函数,换成你自己的“提交后轮询”函数。把它换成 `GET /v1/generations/{id}`,每 5 秒查询一次,逐渐放慢到每 10 秒。`closed_at` 不为空时任务结束。到截止时间仍未完成的任务以 "unresolved" 结束:不扣积分,按失败处理;如果结果之后才到,`late_result_available` 变为 true,`result` 会补上,同样不扣费。如果 `status` 是 "succeeded",按顺序取 `result.outputs` 里每一项的 `asset_id`;只有一个结果的任务也列在这里。`result.asset_id` 与第一项相同,不要重复下载。用每个资源 ID 调用 `GET /v1/assets/{id}/download`,并立即下载返回的 `url`,它在 `url_expires_at` 过期。下载 `url` 时不要附带 API Key。把文件复制到你自己的存储,因为输出只保留 7 天。如果任务结束但没有成功,就没有可下载的内容:读取 `error.code` 并处理。
第 6 步:输入文件。结构里的媒体字段接受公开的 HTTPS URL,或同一项目内已上传文件的 `asset_id`。上传时用 `mime` 和 `max_bytes` 调用 `POST /v1/assets/uploads`,把文件内容 PUT 到返回的 `upload_url`,再调用 `POST /v1/assets/{id}/complete`,然后把 `asset_id` 放到结构要求媒体的位置。平台私有下载链接、本地文件路径和 Base64 数据都会被拒绝。
第 7 步:回调。如果代码接收 Replicate 的回调,请把这个处理函数(验签和解析内容)换成下面介绍的 VizoAPI 处理方式。VizoAPI 的做法是创建任务时传 `webhook_endpoint_id`,端点需要先在控制台创建。一次通知是一个按 Standard Webhooks 规范签名的 POST 请求,带请求头 webhook-id、webhook-timestamp 和 webhook-signature。用该语言的 Standard Webhooks 官方库(npm 和 PyPI 上都叫 standardwebhooks)和端点的 whsec_ 签名密钥验签,传入原始请求体;库会校验签名和 5 分钟时间窗。忽略已处理过的 webhook-id。请求体包含 `task_id`、`type` 和 `event_id`。`type` 是 `generation.succeeded`、`generation.failed`、`generation.canceled`、`generation.unresolved`、`generation.refunded` 或 `generation.late_result_available` 之一。验签之后,用 `task_id` 调用 `GET /v1/generations/{id}`,以这次查询结果为准。如果不用回调,这一步不要删除也不要添加任何代码。
第 8 步:费用。VizoAPI 按积分计价。任务扣费读取任务的 `price.charged`,余额用 `GET /v1/wallet`。无法扣款的任务会失败,`error.code` 例如 insufficient_balance。扣费按实际用量计算,可能高于估价;余额不够支付的积分记为欠款,补足之前新的创建请求返回 HTTP 402 balance_negative。调用 `GET /v1/wallet` 需要带 balance:read 权限的项目 API Key。输入和输出始终经过内容审核,没有开关;被拒的任务通常以 input_moderated 或 output_moderated 失败,部分模型(Kling)以 generation_failed 失败;无论哪种都不扣积分。不要把 Replicate 的价格写进代码。
第 9 步:不要猜名称。这段提示词只描述 Replicate 的大致模式。修改依赖 Replicate 具体接口和字段名的代码之前,先阅读 Replicate 当前的文档。Replicate 里有、VizoAPI 里没有对应的功能,请告诉我,不要自己编一个。
第 10 步:测试。用新代码完整跑一个小任务,把代码差异和结果给我看。不要切换线上流量。fal.ai
fal.ai 把请求放进队列:你提交请求,得到请求 ID,查询状态,再取结果。结果是文件地址。
你正在把这个代码库从 fal.ai 迁移到 VizoAPI。只修改调用 fal.ai 的代码,应用的其余部分保持不变。
第 1 步:找出代码里所有使用 fal.ai 的位置:客户端初始化、模型调用、状态查询、回调处理,以及读取结果的代码。修改之前先把清单列给我看。
第 2 步:认证。fal.ai 在 Authorization 请求头里使用“Key”方案,而不是 Bearer。把它换成请求头 Authorization: Bearer <key>,key 从环境变量 VIZO_API_KEY 读取。key 只放在服务端,不要放进网页或 App 代码。
下面所有调用的基础地址是:
https://api.vizoapi.com
第 3 步:模型。调用 `GET /v1/models`,选出与当前 fal.ai 模型对应的 VizoAPI 模型。每一项都列出 input 须遵循的 `inputSchema`、它的 `features` 以及每个 `tiers` 档位的价格。`GET /v1/models/{id}` 返回单个模型。选定模型后,阅读它的指南 https://vizoapi.com/docs/models/<模型 ID>.md:其中写明该模型的模式、可直接运行的示例请求体、输入上限、计费和错误;另请阅读限流、计费和错误三页(https://vizoapi.com/docs/rate-limits、https://vizoapi.com/docs/billing、https://vizoapi.com/docs/errors)。想在不创建任务的情况下校验请求体,就发给 `POST /v1/estimates`:它免费,不创建任务,对无效输入返回与创建相同的错误;它需要 generations:create 权限,并计入限流。如果对应关系不明确,停下来问我,不要猜。
第 4 步:创建任务。把创建调用换成 `POST /v1/generations`。请求体包含 `model` 和 `input`,除 `metadata` 和 `webhook_endpoint_id` 外不加其他字段;价格档位只由 input 决定。按第 3 步的 `inputSchema`、用模型自己的字段名组装 `input`:Kling 和 Wan 的提示词放进 `input.prompt`,Seedance 和 MiniMax 的提示词放进 input 内容列表里的文本项。只发送结构里列出的字段,其他字段会被 HTTP 422 拒绝。在 `metadata` 里加上你自己的 `client_reference`,例如订单号。调用返回 HTTP 202 和新任务,保存其中的 `id`。VizoAPI 没有同步结果,代码必须按第 5 步等待任务。创建调用超时后不要重试:再调用一次会创建第二个任务并产生第二次扣费。应先用 `GET /v1/generations` 和同一个 `client_reference` 查找任务。默认每个组织同时运行 3 个视频任务(图片、音频各 10 个);超出时创建请求返回 HTTP 429 concurrency_limited,所以请在你这边排队,一个任务结束后再提交下一个。
第 5 步:等待结果。fal.ai 的代码通常提交到队列后等待,用客户端库里订阅请求的辅助函数,或者自己写状态循环。找到这段代码,把辅助函数换成你自己的“提交后轮询”函数。VizoAPI 不推送进度日志。把它换成 `GET /v1/generations/{id}`,每 5 秒查询一次,逐渐放慢到每 10 秒。`closed_at` 不为空时任务结束。到截止时间仍未完成的任务以 "unresolved" 结束:不扣积分,按失败处理;如果结果之后才到,`late_result_available` 变为 true,`result` 会补上,同样不扣费。如果 `status` 是 "succeeded",按顺序取 `result.outputs` 里每一项的 `asset_id`;只有一个结果的任务也列在这里。`result.asset_id` 与第一项相同,不要重复下载。用每个资源 ID 调用 `GET /v1/assets/{id}/download`,并立即下载返回的 `url`,它在 `url_expires_at` 过期。下载 `url` 时不要附带 API Key。把文件复制到你自己的存储,因为输出只保留 7 天。如果任务结束但没有成功,就没有可下载的内容:读取 `error.code` 并处理。
第 6 步:输入文件。结构里的媒体字段接受公开的 HTTPS URL,或同一项目内已上传文件的 `asset_id`。上传时用 `mime` 和 `max_bytes` 调用 `POST /v1/assets/uploads`,把文件内容 PUT 到返回的 `upload_url`,再调用 `POST /v1/assets/{id}/complete`,然后把 `asset_id` 放到结构要求媒体的位置。平台私有下载链接、本地文件路径和 Base64 数据都会被拒绝。
第 7 步:回调。如果代码给 fal.ai 提供了回调地址,请把这个处理函数(验签和解析内容)换成下面介绍的 VizoAPI 处理方式。VizoAPI 的做法是创建任务时传 `webhook_endpoint_id`,端点需要先在控制台创建。一次通知是一个按 Standard Webhooks 规范签名的 POST 请求,带请求头 webhook-id、webhook-timestamp 和 webhook-signature。用该语言的 Standard Webhooks 官方库(npm 和 PyPI 上都叫 standardwebhooks)和端点的 whsec_ 签名密钥验签,传入原始请求体;库会校验签名和 5 分钟时间窗。忽略已处理过的 webhook-id。请求体包含 `task_id`、`type` 和 `event_id`。`type` 是 `generation.succeeded`、`generation.failed`、`generation.canceled`、`generation.unresolved`、`generation.refunded` 或 `generation.late_result_available` 之一。验签之后,用 `task_id` 调用 `GET /v1/generations/{id}`,以这次查询结果为准。如果不用回调,这一步不要删除也不要添加任何代码。
第 8 步:费用。VizoAPI 按积分计价。任务扣费读取任务的 `price.charged`,余额用 `GET /v1/wallet`。无法扣款的任务会失败,`error.code` 例如 insufficient_balance。扣费按实际用量计算,可能高于估价;余额不够支付的积分记为欠款,补足之前新的创建请求返回 HTTP 402 balance_negative。调用 `GET /v1/wallet` 需要带 balance:read 权限的项目 API Key。输入和输出始终经过内容审核,没有开关;被拒的任务通常以 input_moderated 或 output_moderated 失败,部分模型(Kling)以 generation_failed 失败;无论哪种都不扣积分。不要把 fal.ai 的价格写进代码。
第 9 步:不要猜名称。这段提示词只描述 fal.ai 的大致模式。修改依赖 fal.ai 具体接口和字段名的代码之前,先阅读 fal.ai 当前的文档。fal.ai 里有、VizoAPI 里没有对应的功能,请告诉我,不要自己编一个。
第 10 步:测试。用新代码完整跑一个小任务,把代码差异和结果给我看。不要切换线上流量。WaveSpeed
WaveSpeed 为模型创建任务并返回任务 ID,你通过轮询取结果,或者用回调接收。结果是文件地址。
你正在把这个代码库从 WaveSpeed 迁移到 VizoAPI。只修改调用 WaveSpeed 的代码,应用的其余部分保持不变。
第 1 步:找出代码里所有使用 WaveSpeed 的位置:客户端初始化、模型调用、状态查询、回调处理,以及读取结果的代码。修改之前先把清单列给我看。
第 2 步:认证。WaveSpeed 用 API Key 作为 Bearer 令牌放在 Authorization 请求头里。把它换成请求头 Authorization: Bearer <key>,key 从环境变量 VIZO_API_KEY 读取。key 只放在服务端,不要放进网页或 App 代码。
下面所有调用的基础地址是:
https://api.vizoapi.com
第 3 步:模型。调用 `GET /v1/models`,选出与当前 WaveSpeed 模型对应的 VizoAPI 模型。每一项都列出 input 须遵循的 `inputSchema`、它的 `features` 以及每个 `tiers` 档位的价格。`GET /v1/models/{id}` 返回单个模型。选定模型后,阅读它的指南 https://vizoapi.com/docs/models/<模型 ID>.md:其中写明该模型的模式、可直接运行的示例请求体、输入上限、计费和错误;另请阅读限流、计费和错误三页(https://vizoapi.com/docs/rate-limits、https://vizoapi.com/docs/billing、https://vizoapi.com/docs/errors)。想在不创建任务的情况下校验请求体,就发给 `POST /v1/estimates`:它免费,不创建任务,对无效输入返回与创建相同的错误;它需要 generations:create 权限,并计入限流。如果对应关系不明确,停下来问我,不要猜。
第 4 步:创建任务。把创建调用换成 `POST /v1/generations`。请求体包含 `model` 和 `input`,除 `metadata` 和 `webhook_endpoint_id` 外不加其他字段;价格档位只由 input 决定。按第 3 步的 `inputSchema`、用模型自己的字段名组装 `input`:Kling 和 Wan 的提示词放进 `input.prompt`,Seedance 和 MiniMax 的提示词放进 input 内容列表里的文本项。只发送结构里列出的字段,其他字段会被 HTTP 422 拒绝。在 `metadata` 里加上你自己的 `client_reference`,例如订单号。调用返回 HTTP 202 和新任务,保存其中的 `id`。VizoAPI 没有同步结果,代码必须按第 5 步等待任务。创建调用超时后不要重试:再调用一次会创建第二个任务并产生第二次扣费。应先用 `GET /v1/generations` 和同一个 `client_reference` 查找任务。默认每个组织同时运行 3 个视频任务(图片、音频各 10 个);超出时创建请求返回 HTTP 429 concurrency_limited,所以请在你这边排队,一个任务结束后再提交下一个。
第 5 步:等待结果。WaveSpeed 的代码提交任务后轮询该任务的结果直到完成,或者使用它的回调选项。找到这段循环,包括任何同步等待输出的模式。把它换成 `GET /v1/generations/{id}`,每 5 秒查询一次,逐渐放慢到每 10 秒。`closed_at` 不为空时任务结束。到截止时间仍未完成的任务以 "unresolved" 结束:不扣积分,按失败处理;如果结果之后才到,`late_result_available` 变为 true,`result` 会补上,同样不扣费。如果 `status` 是 "succeeded",按顺序取 `result.outputs` 里每一项的 `asset_id`;只有一个结果的任务也列在这里。`result.asset_id` 与第一项相同,不要重复下载。用每个资源 ID 调用 `GET /v1/assets/{id}/download`,并立即下载返回的 `url`,它在 `url_expires_at` 过期。下载 `url` 时不要附带 API Key。把文件复制到你自己的存储,因为输出只保留 7 天。如果任务结束但没有成功,就没有可下载的内容:读取 `error.code` 并处理。
第 6 步:输入文件。结构里的媒体字段接受公开的 HTTPS URL,或同一项目内已上传文件的 `asset_id`。上传时用 `mime` 和 `max_bytes` 调用 `POST /v1/assets/uploads`,把文件内容 PUT 到返回的 `upload_url`,再调用 `POST /v1/assets/{id}/complete`,然后把 `asset_id` 放到结构要求媒体的位置。平台私有下载链接、本地文件路径和 Base64 数据都会被拒绝。
第 7 步:回调。如果代码给 WaveSpeed 提供了回调地址,请把这个处理函数(验签和解析内容)换成下面介绍的 VizoAPI 处理方式。VizoAPI 的做法是创建任务时传 `webhook_endpoint_id`,端点需要先在控制台创建。一次通知是一个按 Standard Webhooks 规范签名的 POST 请求,带请求头 webhook-id、webhook-timestamp 和 webhook-signature。用该语言的 Standard Webhooks 官方库(npm 和 PyPI 上都叫 standardwebhooks)和端点的 whsec_ 签名密钥验签,传入原始请求体;库会校验签名和 5 分钟时间窗。忽略已处理过的 webhook-id。请求体包含 `task_id`、`type` 和 `event_id`。`type` 是 `generation.succeeded`、`generation.failed`、`generation.canceled`、`generation.unresolved`、`generation.refunded` 或 `generation.late_result_available` 之一。验签之后,用 `task_id` 调用 `GET /v1/generations/{id}`,以这次查询结果为准。如果不用回调,这一步不要删除也不要添加任何代码。
第 8 步:费用。VizoAPI 按积分计价。任务扣费读取任务的 `price.charged`,余额用 `GET /v1/wallet`。无法扣款的任务会失败,`error.code` 例如 insufficient_balance。扣费按实际用量计算,可能高于估价;余额不够支付的积分记为欠款,补足之前新的创建请求返回 HTTP 402 balance_negative。调用 `GET /v1/wallet` 需要带 balance:read 权限的项目 API Key。输入和输出始终经过内容审核,没有开关;被拒的任务通常以 input_moderated 或 output_moderated 失败,部分模型(Kling)以 generation_failed 失败;无论哪种都不扣积分。不要把 WaveSpeed 的价格写进代码。
第 9 步:不要猜名称。这段提示词只描述 WaveSpeed 的大致模式。修改依赖 WaveSpeed 具体接口和字段名的代码之前,先阅读 WaveSpeed 当前的文档。WaveSpeed 里有、VizoAPI 里没有对应的功能,请告诉我,不要自己编一个。
第 10 步:测试。用新代码完整跑一个小任务,把代码差异和结果给我看。不要切换线上流量。kie.ai
kie.ai 为模型创建任务并返回任务 ID,你通过轮询任务取结果,或者在回调地址上接收。结果是文件地址。
你正在把这个代码库从 kie.ai 迁移到 VizoAPI。只修改调用 kie.ai 的代码,应用的其余部分保持不变。
第 1 步:找出代码里所有使用 kie.ai 的位置:客户端初始化、模型调用、状态查询、回调处理,以及读取结果的代码。修改之前先把清单列给我看。
第 2 步:认证。kie.ai 用 API Key 作为 Bearer 令牌放在 Authorization 请求头里。把它换成请求头 Authorization: Bearer <key>,key 从环境变量 VIZO_API_KEY 读取。key 只放在服务端,不要放进网页或 App 代码。
下面所有调用的基础地址是:
https://api.vizoapi.com
第 3 步:模型。调用 `GET /v1/models`,选出与当前 kie.ai 模型对应的 VizoAPI 模型。每一项都列出 input 须遵循的 `inputSchema`、它的 `features` 以及每个 `tiers` 档位的价格。`GET /v1/models/{id}` 返回单个模型。选定模型后,阅读它的指南 https://vizoapi.com/docs/models/<模型 ID>.md:其中写明该模型的模式、可直接运行的示例请求体、输入上限、计费和错误;另请阅读限流、计费和错误三页(https://vizoapi.com/docs/rate-limits、https://vizoapi.com/docs/billing、https://vizoapi.com/docs/errors)。想在不创建任务的情况下校验请求体,就发给 `POST /v1/estimates`:它免费,不创建任务,对无效输入返回与创建相同的错误;它需要 generations:create 权限,并计入限流。如果对应关系不明确,停下来问我,不要猜。
第 4 步:创建任务。把创建调用换成 `POST /v1/generations`。请求体包含 `model` 和 `input`,除 `metadata` 和 `webhook_endpoint_id` 外不加其他字段;价格档位只由 input 决定。按第 3 步的 `inputSchema`、用模型自己的字段名组装 `input`:Kling 和 Wan 的提示词放进 `input.prompt`,Seedance 和 MiniMax 的提示词放进 input 内容列表里的文本项。只发送结构里列出的字段,其他字段会被 HTTP 422 拒绝。在 `metadata` 里加上你自己的 `client_reference`,例如订单号。调用返回 HTTP 202 和新任务,保存其中的 `id`。VizoAPI 没有同步结果,代码必须按第 5 步等待任务。创建调用超时后不要重试:再调用一次会创建第二个任务并产生第二次扣费。应先用 `GET /v1/generations` 和同一个 `client_reference` 查找任务。默认每个组织同时运行 3 个视频任务(图片、音频各 10 个);超出时创建请求返回 HTTP 429 concurrency_limited,所以请在你这边排队,一个任务结束后再提交下一个。
第 5 步:等待结果。kie.ai 的代码创建任务后轮询任务详情直到完成,或者提供回调地址。找到这段循环和回调处理函数。把它换成 `GET /v1/generations/{id}`,每 5 秒查询一次,逐渐放慢到每 10 秒。`closed_at` 不为空时任务结束。到截止时间仍未完成的任务以 "unresolved" 结束:不扣积分,按失败处理;如果结果之后才到,`late_result_available` 变为 true,`result` 会补上,同样不扣费。如果 `status` 是 "succeeded",按顺序取 `result.outputs` 里每一项的 `asset_id`;只有一个结果的任务也列在这里。`result.asset_id` 与第一项相同,不要重复下载。用每个资源 ID 调用 `GET /v1/assets/{id}/download`,并立即下载返回的 `url`,它在 `url_expires_at` 过期。下载 `url` 时不要附带 API Key。把文件复制到你自己的存储,因为输出只保留 7 天。如果任务结束但没有成功,就没有可下载的内容:读取 `error.code` 并处理。
第 6 步:输入文件。结构里的媒体字段接受公开的 HTTPS URL,或同一项目内已上传文件的 `asset_id`。上传时用 `mime` 和 `max_bytes` 调用 `POST /v1/assets/uploads`,把文件内容 PUT 到返回的 `upload_url`,再调用 `POST /v1/assets/{id}/complete`,然后把 `asset_id` 放到结构要求媒体的位置。平台私有下载链接、本地文件路径和 Base64 数据都会被拒绝。
第 7 步:回调。如果代码给 kie.ai 提供了回调地址,请把这个处理函数(如果有验签,包括验签;以及解析内容)换成下面介绍的 VizoAPI 处理方式。VizoAPI 的做法是创建任务时传 `webhook_endpoint_id`,端点需要先在控制台创建。一次通知是一个按 Standard Webhooks 规范签名的 POST 请求,带请求头 webhook-id、webhook-timestamp 和 webhook-signature。用该语言的 Standard Webhooks 官方库(npm 和 PyPI 上都叫 standardwebhooks)和端点的 whsec_ 签名密钥验签,传入原始请求体;库会校验签名和 5 分钟时间窗。忽略已处理过的 webhook-id。请求体包含 `task_id`、`type` 和 `event_id`。`type` 是 `generation.succeeded`、`generation.failed`、`generation.canceled`、`generation.unresolved`、`generation.refunded` 或 `generation.late_result_available` 之一。验签之后,用 `task_id` 调用 `GET /v1/generations/{id}`,以这次查询结果为准。如果不用回调,这一步不要删除也不要添加任何代码。
第 8 步:费用。VizoAPI 按积分计价。任务扣费读取任务的 `price.charged`(即 kie.ai 的 creditsConsumed),余额用 `GET /v1/wallet`。无法扣款的任务会失败,`error.code` 例如 insufficient_balance。扣费按实际用量计算,可能高于估价;余额不够支付的积分记为欠款,补足之前新的创建请求返回 HTTP 402 balance_negative。调用 `GET /v1/wallet` 需要带 balance:read 权限的项目 API Key。输入和输出始终经过内容审核,没有开关;被拒的任务通常以 input_moderated 或 output_moderated 失败,部分模型(Kling)以 generation_failed 失败;无论哪种都不扣积分。不要把 kie.ai 的价格写进代码。
第 9 步:不要猜名称。这段提示词只描述 kie.ai 的大致模式。修改依赖 kie.ai 具体接口和字段名的代码之前,先阅读 kie.ai 当前的文档。kie.ai 里有、VizoAPI 里没有对应的功能,请告诉我,不要自己编一个。
第 10 步:测试。用新代码完整跑一个小任务,把代码差异和结果给我看。不要切换线上流量。