跳到正文
文档版本 r15
OpenAPIJSONYAML
指南 / 从其他服务迁移到 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 模型和 `operation`。`GET /v1/models/{id}` 返回单个模型的输入结构。如果对应关系不明确,停下来问我,不要猜。

第 4 步:创建任务。把创建调用换成 `POST /v1/generations`。请求体包含 `model`、`operation` 和 `input`。提示词放进 `input.prompt`,时长放进 `input.duration_seconds`,尺寸放进 `input.resolution` 和 `input.aspect_ratio`,声音选项放进 `input.generate_audio`。输入图片用 `input.asset_id`(见第 6 步)。只有第 3 步的结构里列出的字段才能放进 `input.native`。在 `metadata` 里加上你自己的 `client_reference`,例如订单号。调用返回 HTTP 202 和新任务,保存其中的 `id`。VizoAPI 没有同步结果,代码必须按第 5 步等待任务。创建调用超时后不要重试:再调用一次会创建第二个任务并产生第二次扣费。应先用 `GET /v1/generations` 和同一个 `client_reference` 查找任务。

第 5 步:等待结果。Replicate 的代码通常先创建预测,再轮询到最终状态,或者用一个会阻塞等待输出的辅助函数。找到这段循环;如果用了阻塞等待的辅助函数,换成你自己的“提交后轮询”函数。把它换成 `GET /v1/generations/{id}`,每 3 秒查询一次,逐渐放慢到每 10 秒。`closed_at` 不为空时任务结束。如果 `status` 是 "succeeded",取 `result.asset_id`;一次任务有多个结果时,按顺序取 `result.outputs` 里每一项的 `asset_id`。用每个资源 ID 调用 `GET /v1/assets/{id}/download`,并立即下载返回的 `url`,它在 `url_expires_at` 过期。下载 `url` 时不要附带 API Key。把文件复制到你自己的存储,因为输出只保留 7 天。如果任务结束但没有成功,就没有可下载的内容:读取 `error.code` 并处理。

第 6 步:输入文件。如果代码要发送图片、视频或音频文件,先上传:用 `mime` 和 `max_bytes` 调用 `POST /v1/assets/uploads`,把文件内容 PUT 到返回的 `upload_url`,再调用 `POST /v1/assets/{id}/complete`。把 `asset_id` 放进输入。如果代码只传公开地址,请查看第 3 步的模型结构,确认该怎么传。

第 7 步:回调。如果代码接收 Replicate 的回调,请把这个处理函数(验签和解析内容)换成下面介绍的 VizoAPI 处理方式。VizoAPI 的做法是创建任务时传 `webhook_endpoint_id`,端点需要先在控制台创建。一次通知是一个 POST 请求,带请求头 X-Relay-Event-ID、X-Relay-Timestamp 和 X-Relay-Signature。先按请求头 X-Relay-Key-ID 选出签名密钥,因为每个 Webhook 密钥的签名密钥不同,只保存一个密钥会在轮换后验证失败。然后用常量时间比较验证 Base64(HMAC-SHA256(签名密钥, 时间戳 + "." + 事件 ID + "." + 原始请求体)),只接受 5 分钟内的时间戳,并忽略已处理过的事件 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。不要把 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 模型和 `operation`。`GET /v1/models/{id}` 返回单个模型的输入结构。如果对应关系不明确,停下来问我,不要猜。

第 4 步:创建任务。把创建调用换成 `POST /v1/generations`。请求体包含 `model`、`operation` 和 `input`。提示词放进 `input.prompt`,时长放进 `input.duration_seconds`,尺寸放进 `input.resolution` 和 `input.aspect_ratio`,声音选项放进 `input.generate_audio`。输入图片用 `input.asset_id`(见第 6 步)。只有第 3 步的结构里列出的字段才能放进 `input.native`。在 `metadata` 里加上你自己的 `client_reference`,例如订单号。调用返回 HTTP 202 和新任务,保存其中的 `id`。VizoAPI 没有同步结果,代码必须按第 5 步等待任务。创建调用超时后不要重试:再调用一次会创建第二个任务并产生第二次扣费。应先用 `GET /v1/generations` 和同一个 `client_reference` 查找任务。

第 5 步:等待结果。fal.ai 的代码通常提交到队列后等待,用客户端库里订阅请求的辅助函数,或者自己写状态循环。找到这段代码,把辅助函数换成你自己的“提交后轮询”函数。VizoAPI 不推送进度日志。把它换成 `GET /v1/generations/{id}`,每 3 秒查询一次,逐渐放慢到每 10 秒。`closed_at` 不为空时任务结束。如果 `status` 是 "succeeded",取 `result.asset_id`;一次任务有多个结果时,按顺序取 `result.outputs` 里每一项的 `asset_id`。用每个资源 ID 调用 `GET /v1/assets/{id}/download`,并立即下载返回的 `url`,它在 `url_expires_at` 过期。下载 `url` 时不要附带 API Key。把文件复制到你自己的存储,因为输出只保留 7 天。如果任务结束但没有成功,就没有可下载的内容:读取 `error.code` 并处理。

第 6 步:输入文件。如果代码要发送图片、视频或音频文件,先上传:用 `mime` 和 `max_bytes` 调用 `POST /v1/assets/uploads`,把文件内容 PUT 到返回的 `upload_url`,再调用 `POST /v1/assets/{id}/complete`。把 `asset_id` 放进输入。如果代码只传公开地址,请查看第 3 步的模型结构,确认该怎么传。

第 7 步:回调。如果代码给 fal.ai 提供了回调地址,请把这个处理函数(验签和解析内容)换成下面介绍的 VizoAPI 处理方式。VizoAPI 的做法是创建任务时传 `webhook_endpoint_id`,端点需要先在控制台创建。一次通知是一个 POST 请求,带请求头 X-Relay-Event-ID、X-Relay-Timestamp 和 X-Relay-Signature。先按请求头 X-Relay-Key-ID 选出签名密钥,因为每个 Webhook 密钥的签名密钥不同,只保存一个密钥会在轮换后验证失败。然后用常量时间比较验证 Base64(HMAC-SHA256(签名密钥, 时间戳 + "." + 事件 ID + "." + 原始请求体)),只接受 5 分钟内的时间戳,并忽略已处理过的事件 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。不要把 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 模型和 `operation`。`GET /v1/models/{id}` 返回单个模型的输入结构。如果对应关系不明确,停下来问我,不要猜。

第 4 步:创建任务。把创建调用换成 `POST /v1/generations`。请求体包含 `model`、`operation` 和 `input`。提示词放进 `input.prompt`,时长放进 `input.duration_seconds`,尺寸放进 `input.resolution` 和 `input.aspect_ratio`,声音选项放进 `input.generate_audio`。输入图片用 `input.asset_id`(见第 6 步)。只有第 3 步的结构里列出的字段才能放进 `input.native`。在 `metadata` 里加上你自己的 `client_reference`,例如订单号。调用返回 HTTP 202 和新任务,保存其中的 `id`。VizoAPI 没有同步结果,代码必须按第 5 步等待任务。创建调用超时后不要重试:再调用一次会创建第二个任务并产生第二次扣费。应先用 `GET /v1/generations` 和同一个 `client_reference` 查找任务。

第 5 步:等待结果。WaveSpeed 的代码提交任务后轮询该任务的结果直到完成,或者使用它的回调选项。找到这段循环,包括任何同步等待输出的模式。把它换成 `GET /v1/generations/{id}`,每 3 秒查询一次,逐渐放慢到每 10 秒。`closed_at` 不为空时任务结束。如果 `status` 是 "succeeded",取 `result.asset_id`;一次任务有多个结果时,按顺序取 `result.outputs` 里每一项的 `asset_id`。用每个资源 ID 调用 `GET /v1/assets/{id}/download`,并立即下载返回的 `url`,它在 `url_expires_at` 过期。下载 `url` 时不要附带 API Key。把文件复制到你自己的存储,因为输出只保留 7 天。如果任务结束但没有成功,就没有可下载的内容:读取 `error.code` 并处理。

第 6 步:输入文件。如果代码要发送图片、视频或音频文件,先上传:用 `mime` 和 `max_bytes` 调用 `POST /v1/assets/uploads`,把文件内容 PUT 到返回的 `upload_url`,再调用 `POST /v1/assets/{id}/complete`。把 `asset_id` 放进输入。如果代码只传公开地址,请查看第 3 步的模型结构,确认该怎么传。

第 7 步:回调。如果代码给 WaveSpeed 提供了回调地址,请把这个处理函数(验签和解析内容)换成下面介绍的 VizoAPI 处理方式。VizoAPI 的做法是创建任务时传 `webhook_endpoint_id`,端点需要先在控制台创建。一次通知是一个 POST 请求,带请求头 X-Relay-Event-ID、X-Relay-Timestamp 和 X-Relay-Signature。先按请求头 X-Relay-Key-ID 选出签名密钥,因为每个 Webhook 密钥的签名密钥不同,只保存一个密钥会在轮换后验证失败。然后用常量时间比较验证 Base64(HMAC-SHA256(签名密钥, 时间戳 + "." + 事件 ID + "." + 原始请求体)),只接受 5 分钟内的时间戳,并忽略已处理过的事件 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。不要把 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 模型和 `operation`。`GET /v1/models/{id}` 返回单个模型的输入结构。如果对应关系不明确,停下来问我,不要猜。

第 4 步:创建任务。把创建调用换成 `POST /v1/generations`。请求体包含 `model`、`operation` 和 `input`。提示词放进 `input.prompt`,时长放进 `input.duration_seconds`,尺寸放进 `input.resolution` 和 `input.aspect_ratio`,声音选项放进 `input.generate_audio`。输入图片用 `input.asset_id`(见第 6 步)。只有第 3 步的结构里列出的字段才能放进 `input.native`。在 `metadata` 里加上你自己的 `client_reference`,例如订单号。调用返回 HTTP 202 和新任务,保存其中的 `id`。VizoAPI 没有同步结果,代码必须按第 5 步等待任务。创建调用超时后不要重试:再调用一次会创建第二个任务并产生第二次扣费。应先用 `GET /v1/generations` 和同一个 `client_reference` 查找任务。

第 5 步:等待结果。kie.ai 的代码创建任务后轮询任务详情直到完成,或者提供回调地址。找到这段循环和回调处理函数。把它换成 `GET /v1/generations/{id}`,每 3 秒查询一次,逐渐放慢到每 10 秒。`closed_at` 不为空时任务结束。如果 `status` 是 "succeeded",取 `result.asset_id`;一次任务有多个结果时,按顺序取 `result.outputs` 里每一项的 `asset_id`。用每个资源 ID 调用 `GET /v1/assets/{id}/download`,并立即下载返回的 `url`,它在 `url_expires_at` 过期。下载 `url` 时不要附带 API Key。把文件复制到你自己的存储,因为输出只保留 7 天。如果任务结束但没有成功,就没有可下载的内容:读取 `error.code` 并处理。

第 6 步:输入文件。如果代码要发送图片、视频或音频文件,先上传:用 `mime` 和 `max_bytes` 调用 `POST /v1/assets/uploads`,把文件内容 PUT 到返回的 `upload_url`,再调用 `POST /v1/assets/{id}/complete`。把 `asset_id` 放进输入。如果代码只传公开地址,请查看第 3 步的模型结构,确认该怎么传。

第 7 步:回调。如果代码给 kie.ai 提供了回调地址,请把这个处理函数(如果有验签,包括验签;以及解析内容)换成下面介绍的 VizoAPI 处理方式。VizoAPI 的做法是创建任务时传 `webhook_endpoint_id`,端点需要先在控制台创建。一次通知是一个 POST 请求,带请求头 X-Relay-Event-ID、X-Relay-Timestamp 和 X-Relay-Signature。先按请求头 X-Relay-Key-ID 选出签名密钥,因为每个 Webhook 密钥的签名密钥不同,只保存一个密钥会在轮换后验证失败。然后用常量时间比较验证 Base64(HMAC-SHA256(签名密钥, 时间戳 + "." + 事件 ID + "." + 原始请求体)),只接受 5 分钟内的时间戳,并忽略已处理过的事件 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。不要把 kie.ai 的价格写进代码。

第 9 步:不要猜名称。这段提示词只描述 kie.ai 的大致模式。修改依赖 kie.ai 具体接口和字段名的代码之前,先阅读 kie.ai 当前的文档。kie.ai 里有、VizoAPI 里没有对应的功能,请告诉我,不要自己编一个。

第 10 步:测试。用新代码完整跑一个小任务,把代码差异和结果给我看。不要切换线上流量。