WAN 2.5 API快速入门:WaveSpeed上的认证、参数和示例请求
嘿,我是Dora。最初,我没有计划这周尝试WaveSpeed上的WAN 2.5 API。一个小烦恼把我推到了那里:我需要为一个草稿生成几个一致的图像变体,而我常用的工具要么操作太繁琐,要么太聪明反而不实用。我想要一个无聊可靠的东西,可以编程、可以版本控制、易于回滚。
所以我打开了文档,泡了茶,写了一个小脚本。这是我一路上记下的东西,在2026年1月测试过,不加修饰。这不是关于”功能”,而是关于那些一旦到位就让工作感觉更轻松的部分。
API概览
如果你接触过任何现代AI API,WaveSpeed对WAN 2.5的处理会感到熟悉。HTTP进,JSON出。你发送一个提示词(有时还有一张图像),它要么返回一个完成的工件,要么返回一个可以轮询的任务ID。
在写任何代码之前,我注意了一些基线细节:
- 版本控制: WAN 2.5作为一个不同的版本暴露出来,这对可重复性很重要。我坚持在URL中使用显式的版本路径,而不是”最新”别名。这个小选择让未来的我不会遭遇无声的行为变化。

- 模式: 有些工作是同步的(小的、快的),有些则作为任务分离。如果你在做高分辨率生成或批处理,预期会有一个带有状态端点或webhook的异步流。
- 格式: JSON响应通常包括一个状态、资源URL或base64有效负载,以及一些元数据(种子、步数、时间)。我保留元数据,当你想稍后重现某个外观时很方便。
- 限制: 图像大小、步数和并发都有上限。默认值对草稿已经足够,但一旦我试图提高分辨率就碰到了天花板。下面有更多关于速率限制的内容。
简单来说:如果你熟悉REST,这是一条直路。技巧是把几个无聊的部分(密钥、参数、重试)搞对,这样你就可以忘记它们。
这种简洁性正是我们构建WaveSpeed方式的部分原因。我想让WAN 2.5(和其他模型)感到可编程、可版本控制,以及最好的方式无聊。如果你自己接线,你可以在这里探索它。
认证与密钥
我在仪表板中生成了一个WaveSpeed API密钥,并将其放入环境变量。没有什么花哨的,但这样做可以免除我在文件中追寻密钥的麻烦。
- 从WaveSpeed上的账户设置获取密钥。它与你的组织/项目相关联。
- 将其存储在本地作为环境变量:
WAVESPEED_API_KEY。我在开发时使用了.env文件,在运行时使用了CI的密钥存储。 - 在报头中使用Bearer认证:
Authorization: Bearer $WAVESPEED_API_KEY。 - 如果你轮换密钥,在低流量时段进行。当定时轮换中断一个长时间运行的任务时,我用平静的方式学到了这一点。
如果你的团队需要作用域密钥,请检查仪表板设置。对于任何与自动化相关的东西,我倾向于最小权限路由。一个小的摩擦点是:如果你在多台机器上运行,请按主机或服务清楚地标记密钥,当你后来审计使用情况时会有帮助。
必需参数
确切的名称可能因端点而异,但这是我在WaveSpeed上为Wan 2.5使用的最小形状。把这些当作骨架,确认官方文档中你的账户的字段名。

- model:我显式地将其设置为
wan-2.5(或你的计划中最接近的确切字符串)。这在更新中保持行为稳定。 - input:提示字符串。我保持简洁和具体。WAN倾向于对清晰、简单的措辞反应更好,而不是形容词汤。
- mode或task:图像生成对比变体/放大。如果你传递一个源图像,这很重要。
- output:我默认请求图像URL。Base64就在那儿,但URL对内存更友好。
当我忘记显式设置模型时,我得到了一个明智的默认值,但我的结果在运行中略微移位。不是错误,只是不可重复。锁定版本消除了那种摇晃。
可选参数
这是真正控制所在的地方。第一天我只接触了少数几个。
- seed:一旦我喜欢了某个外观,我就打开它。它稳定了变体的感觉。
- steps:更高的步数可以以时间和学分的代价推动细节。我以小幅增量(例如24→32)进行调整并查看回报。
- guidance或cfg_scale:加强对提示的遵守。太高了就变得脆弱。
- size或resolution:这是成本跳跃的地方。我用小草图,然后用目标尺寸重新运行最终版本。
- image:对于变体,传递源图像URL或上传。如果支持,与strength参数配对。
- safety或moderation flags:除非你的工作流确实需要自定义处理,否则保持打开。
- user或metadata:我添加请求ID或项目标签来追踪日志中的运行。
微小的观察:同时改变两个旋钮很难判断什么有帮助。我每次运行改变一个东西,并在注释中做笔记。老派,但很有效。
示例请求模式
我尝试了三种简单的形状:一个快速的curl、一个小的Python脚本和一个用于异步的后台任务。
同步草稿(curl)
这足以在连接任何其他东西之前检验我的密钥和提示。
示例端点,确认文档中你的账户和地区的确切路径:
POST https://api.wavespeed.ai/wan/v2.5/generations
报头:
- Authorization: Bearer $WAVESPEED_API_KEY
- Content-Type: application/json
主体(最小):
{
"model": "wan-2.5",
"input": "quiet studio light, sketch on kraft paper",
"output": { "format": "url" }
}
我监视的内容:
- 200带有结果和元数据→你很好。
- 202带有任务id→切换到异步流。
- 4xx→有效负载或认证中的某些内容不对。
小Python助手
我写了一个小函数来处理报头、超时和json。它要么返回一个URL,要么抛出一个干净的异常。没有什么神奇的,只是那种你不会想两次的包装。
实际的部分:
- 设置较短的连接超时和稍长的读取超时。
- 使用重试和抖动处理429。
- 记录每次运行的种子、步数和大小。
异步流(任务)
对于更大的图像或批处理,我收到了202和一个任务id。循环很简单:
- POST任务,
- 每隔几秒轮询GET
/jobs/{id}, - 停在终端状态(成功/失败),
- 获取资源URL。
如果你的堆栈喜欢webhook,WaveSpeed也暴露了回调。我最初坚持轮询,在设置时它少了一个活动的部分。
错误代码
我在编辑器旁边保留了一个小地图。比我预期的要快得多地得到了回报。
- 400 Bad Request:通常是字段名或类型不匹配。我曾经将大小作为字符串而不是对象发送。一旦我放慢速度并阅读消息,修复就很明显了。
- 401 Unauthorized:密钥缺失或格式不正确。检查你的Bearer报头和尾部空格。
- 403 Forbidden:密钥存在但缺乏端点或模型层的范围。
- 404 Not Found:端点路径错误或任务id过期。
- 409 Conflict:当更新已经结算的任务时,你有时会看到这个。再轮询一次,不要继续推送。
- 429 Too Many Requests:你超过了每分钟或每个组织的限制。用指数重试退避。
- 500/503 Server Errors:在我的测试中很少见,但要为它们计划。一个短重试循环让我的脚本保持冷静。
帮助过的小习惯:我将错误代码和请求id(如果存在)冒泡到我的日志中。当某些事情出现奇怪时,支持可以使用该id来追踪它。
速率限制
一旦我在并发上变得懒惰,我就碰到了速率限制。容易做到,更容易避免。
什么有效:
- 尊重报头:许多端点返回速率报头(例如,剩余、重置时间)。报头名称可能有所不同,检查文档,但值得阅读。
- 使用令牌桶或简单队列。我限制我的脚本为一个小的、稳定的滴流而不是突发。系统呼吸得更容易,我也是。
- 分离草稿和最终版本。草稿可以运行小而快:最终版本可以在后台逐个运行。
- 缓存重复。如果你在测试提示,保留先前的结果几分钟,这样你就不会燃烧相同的调用。
我还构建了一个非常简单的退避:基础延迟1秒,在每个429上翻倍,上限为30秒,最多4次重试。它感到不匆不忙,避免了对服务的狗堆。
成本护栏
这是我的主要担忧。图像工作可以在你泡茶时在后台啃学分。
我在第一天设置的几个保护:
- 仪表板中的预算上限: 我设置了一个月度上限和电子邮件警报,低于它一刻。如果你的团队共享密钥,警报可以帮助你及早捕捉循环。
- 每个请求的上限: 我强制大小和步数在最大值下生活,除非我通过了覆盖标志。它救了我脱离”哎呀,4K一切”。
- 草稿优先工作流: 我运行小预览(较低分辨率、较少步数)并仅放大保留者。这在第一个下午就削减了我的支出超过一半。
- 种子纪律: 一旦我发现了我喜欢的方向,我固定了种子并一次改变了一个参数。更少的盲目运行:更多的有意的运行。
- 带有成本的日志:如果响应包括学分或使用字段(一些端点会),存储它。当它不这样做时,根据分辨率和步数进行估计并注意这是一个估计。
我还在我的脚本中放了一个软杀死开关:如果当天的使用跨越了阈值,新任务暂停并在Slack中发布了一条消息。这不是优雅的,但对约束是诚实的。
最初这没有节省时间。它节省了注意力。几次运行后,护栏褪入背景,我可以再次思考工作而不是米表。





