WAN 2.5 API快速入门:WaveSpeed上的认证、参数和示例请求

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。循环很简单:

  1. POST任务,
  1. 每隔几秒轮询GET /jobs/{id}
  2. 停在终端状态(成功/失败),
  3. 获取资源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中发布了一条消息。这不是优雅的,但对约束是诚实的。

最初这没有节省时间。它节省了注意力。几次运行后,护栏褪入背景,我可以再次思考工作而不是米表。