fix: validate openrouter video seeds · openclaw/openclaw@d9452e6
steipete
·
2026-05-29
·
via Recent Commits to openclaw:main
| Original file line number | Diff line number | Diff line change |
|---|
@@ -553,6 +553,23 @@ describe("openrouter video generation provider", () => {
|
553 | 553 | }); |
554 | 554 | }); |
555 | 555 | |
| 556 | +it("rejects malformed numeric seed values before submitting video jobs", async () => { |
| 557 | +const provider = buildOpenRouterVideoGenerationProvider(); |
| 558 | +await expect( |
| 559 | +provider.generateVideo({ |
| 560 | +provider: "openrouter", |
| 561 | +model: "google/veo-3.1", |
| 562 | +prompt: "A glass cube reflects a neon skyline", |
| 563 | +cfg: {} as never, |
| 564 | +providerOptions: { |
| 565 | +seed: 42.9, |
| 566 | +}, |
| 567 | +}), |
| 568 | +).rejects.toThrow("OpenRouter video seed must be an integer"); |
| 569 | + |
| 570 | +expect(postJsonRequestMock).not.toHaveBeenCalled(); |
| 571 | +}); |
| 572 | + |
556 | 573 | it("wraps malformed successful OpenRouter submit responses", async () => { |
557 | 574 | postJsonRequestMock.mockResolvedValue(releasedJson([])); |
558 | 575 | |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -202,6 +202,19 @@ function resolveResolution(resolution: VideoGenerationRequest["resolution"]): st
|
202 | 202 | return normalized ? normalized.toLowerCase() : undefined; |
203 | 203 | } |
204 | 204 | |
| 205 | +function resolveSeed(seed: unknown): number | undefined { |
| 206 | +if (seed === undefined) { |
| 207 | +return undefined; |
| 208 | +} |
| 209 | +if (typeof seed !== "number") { |
| 210 | +return undefined; |
| 211 | +} |
| 212 | +if (!Number.isSafeInteger(seed)) { |
| 213 | +throw new Error("OpenRouter video seed must be an integer"); |
| 214 | +} |
| 215 | +return seed; |
| 216 | +} |
| 217 | + |
205 | 218 | function buildRequestBody(req: VideoGenerationRequest, model: string): Record<string, unknown> { |
206 | 219 | const { frameImages, inputReferences } = buildImageInputs(req.inputImages); |
207 | 220 | const supportedDurations = |
@@ -239,9 +252,9 @@ function buildRequestBody(req: VideoGenerationRequest, model: string): Record<st
|
239 | 252 | body.input_references = inputReferences; |
240 | 253 | } |
241 | 254 | |
242 | | -const seed = typeof req.providerOptions?.seed === "number" ? req.providerOptions.seed : undefined; |
243 | | -if (seed != null) { |
244 | | -body.seed = Math.trunc(seed); |
| 255 | +const seed = resolveSeed(req.providerOptions?.seed); |
| 256 | +if (seed !== undefined) { |
| 257 | +body.seed = seed; |
245 | 258 | } |
246 | 259 | const callbackUrl = |
247 | 260 | typeof req.providerOptions?.callback_url === "string" |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。