fix: validate deepinfra video seed metadata · openclaw/openclaw@4dbe2a3
steipete
·
2026-05-29
·
via Recent Commits to openclaw:main
| Original file line number | Diff line number | Diff line change |
|---|
@@ -151,6 +151,34 @@ describe("deepinfra video generation provider", () => {
|
151 | 151 | expect(Reflect.get(Reflect.get(postRequest ?? {}, "body") ?? {}, "seed")).toBeUndefined(); |
152 | 152 | }); |
153 | 153 | |
| 154 | +it("drops malformed response seed metadata", async () => { |
| 155 | +postJsonRequestMock.mockResolvedValue({ |
| 156 | +response: { |
| 157 | +json: async () => ({ |
| 158 | +video_url: "/generated/video.mp4", |
| 159 | +request_id: "req_bad_seed", |
| 160 | +seed: 1.5, |
| 161 | +inference_status: { status: "succeeded" }, |
| 162 | +}), |
| 163 | +}, |
| 164 | +release: vi.fn(async () => {}), |
| 165 | +}); |
| 166 | + |
| 167 | +const provider = buildDeepInfraVideoGenerationProvider(); |
| 168 | +const result = await provider.generateVideo({ |
| 169 | +provider: "deepinfra", |
| 170 | +model: "deepinfra/Pixverse/Pixverse-T2V", |
| 171 | +prompt: "A bicycle weaving through a rainy neon street", |
| 172 | +cfg: {}, |
| 173 | +}); |
| 174 | + |
| 175 | +expect(result.metadata).toEqual({ |
| 176 | +requestId: "req_bad_seed", |
| 177 | +seed: undefined, |
| 178 | +status: "succeeded", |
| 179 | +}); |
| 180 | +}); |
| 181 | + |
154 | 182 | it("reports malformed native video JSON as a provider error", async () => { |
155 | 183 | const release = vi.fn(async () => {}); |
156 | 184 | postJsonRequestMock.mockResolvedValue({ |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -8,7 +8,8 @@ import {
|
8 | 8 | resolveProviderHttpRequestConfig, |
9 | 9 | } from "openclaw/plugin-sdk/provider-http"; |
10 | 10 | import { |
11 | | -asFiniteNumber as coerceProviderNumber, |
| 11 | +asFiniteNumber, |
| 12 | +asSafeIntegerInRange, |
12 | 13 | normalizeOptionalString, |
13 | 14 | } from "openclaw/plugin-sdk/string-coerce-runtime"; |
14 | 15 | import type { |
@@ -94,11 +95,7 @@ function resolveDurationSeconds(value: number | undefined): number | undefined {
|
94 | 95 | } |
95 | 96 | |
96 | 97 | function resolveSeed(value: unknown): number | undefined { |
97 | | -const seed = coerceProviderNumber(value); |
98 | | -if (seed == null || !Number.isSafeInteger(seed) || seed < 0 || seed > 4_294_967_295) { |
99 | | -return undefined; |
100 | | -} |
101 | | -return seed; |
| 98 | +return asSafeIntegerInRange(value, { min: 0, max: 4_294_967_295 }); |
102 | 99 | } |
103 | 100 | |
104 | 101 | function buildDeepInfraVideoBody( |
@@ -132,7 +129,7 @@ function buildDeepInfraVideoBody(
|
132 | 129 | body.style = style; |
133 | 130 | } |
134 | 131 | const guidanceScale = |
135 | | -coerceProviderNumber(options.guidance_scale) ?? coerceProviderNumber(options.guidanceScale); |
| 132 | +asFiniteNumber(options.guidance_scale) ?? asFiniteNumber(options.guidanceScale); |
136 | 133 | if (guidanceScale != null && model.startsWith("Wan-AI/")) { |
137 | 134 | body.guidance_scale = guidanceScale; |
138 | 135 | } |
@@ -288,7 +285,7 @@ export function buildDeepInfraVideoGenerationProvider(options?: {
|
288 | 285 | model, |
289 | 286 | metadata: { |
290 | 287 | requestId: normalizeOptionalString(payload.request_id), |
291 | | -seed: payload.seed, |
| 288 | +seed: resolveSeed(payload.seed), |
292 | 289 | status: payload.inference_status?.status ?? payload.status, |
293 | 290 | }, |
294 | 291 | }; |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。