



























@@ -5,8 +5,13 @@ import {
55import { expectExplicitVideoGenerationCapabilities } from "openclaw/plugin-sdk/provider-test-contracts";
66import { beforeAll, describe, expect, it, vi } from "vitest";
778-const { postJsonRequestMock, fetchWithTimeoutMock, resolveProviderHttpRequestConfigMock } =
9-getProviderHttpMocks();
8+const {
9+ postJsonRequestMock,
10+ postMultipartRequestMock,
11+ fetchWithTimeoutMock,
12+ resolveProviderHttpRequestConfigMock,
13+ sanitizeConfiguredModelProviderRequestMock,
14+} = getProviderHttpMocks();
10151116let buildOpenAIVideoGenerationProvider: typeof import("./video-generation-provider.js").buildOpenAIVideoGenerationProvider;
1217@@ -24,6 +29,16 @@ function postJsonRequest(index = 0): Record<string, unknown> {
2429return request;
2530}
263132+function postMultipartRequest(index = 0): Record<string, unknown> {
33+const request = postMultipartRequestMock.mock.calls[index]?.[0] as
34+| Record<string, unknown>
35+| undefined;
36+if (!request) {
37+throw new Error(`expected postMultipartRequest call ${index}`);
38+}
39+return request;
40+}
41+2742function fetchWithTimeoutCall(index: number): [string, RequestInit | undefined, number, unknown] {
2843const call = fetchWithTimeoutMock.mock.calls[index] as
2944| [string, RequestInit | undefined, number, unknown]
@@ -150,7 +165,7 @@ describe("openai video generation provider", () => {
150165expect(pollFetch).toBe(fetch);
151166});
152167153-it("honors configured baseUrl for video requests", async () => {
168+it("keeps configured local baseUrl private-network blocked unless explicitly enabled", async () => {
154169postJsonRequestMock.mockResolvedValue({
155170response: {
156171json: async () => ({
@@ -192,11 +207,64 @@ describe("openai video generation provider", () => {
192207});
193208194209expect(providerHttpConfigRequest().baseUrl).toBe("http://127.0.0.1:44080/v1");
210+expect(providerHttpConfigRequest().request).toBeUndefined();
195211const createRequest = postJsonRequest();
196212expect(createRequest.url).toBe("http://127.0.0.1:44080/v1/videos");
197213expect(createRequest.allowPrivateNetwork).toBe(false);
198214});
199215216+it("honors configured request allowPrivateNetwork for local video providers", async () => {
217+postJsonRequestMock.mockResolvedValue({
218+response: {
219+json: async () => ({
220+id: "vid_local",
221+model: "sora-2",
222+status: "queued",
223+}),
224+},
225+release: vi.fn(async () => {}),
226+});
227+fetchWithTimeoutMock
228+.mockResolvedValueOnce({
229+json: async () => ({
230+id: "vid_local",
231+model: "sora-2",
232+status: "completed",
233+}),
234+})
235+.mockResolvedValueOnce({
236+headers: new Headers({ "content-type": "video/mp4" }),
237+arrayBuffer: async () => Buffer.from("mp4-bytes"),
238+});
239+240+const provider = buildOpenAIVideoGenerationProvider();
241+await provider.generateVideo({
242+provider: "openai",
243+model: "sora-2",
244+prompt: "Render via local relay",
245+cfg: {
246+models: {
247+providers: {
248+openai: {
249+baseUrl: "http://127.0.0.1:44080/v1",
250+request: { allowPrivateNetwork: true },
251+models: [],
252+},
253+},
254+},
255+},
256+});
257+258+expect(sanitizeConfiguredModelProviderRequestMock).toHaveBeenCalledWith({
259+allowPrivateNetwork: true,
260+});
261+expect(providerHttpConfigRequest().baseUrl).toBe("http://127.0.0.1:44080/v1");
262+expect(providerHttpConfigRequest().request).toEqual({ allowPrivateNetwork: true });
263+const createRequest = postJsonRequest();
264+expect(createRequest.url).toBe("http://127.0.0.1:44080/v1/videos");
265+expect(createRequest.allowPrivateNetwork).toBe(true);
266+});
267+200268it("uses multipart input_reference for video-to-video uploads", async () => {
201269fetchWithTimeoutMock
202270.mockResolvedValueOnce({
@@ -229,12 +297,12 @@ describe("openai video generation provider", () => {
229297});
230298231299expect(postJsonRequestMock).not.toHaveBeenCalled();
232-const [createUrl, createInit, createTimeout, createFetch] = fetchWithTimeoutCall(0);
233-expect(createUrl).toBe("https://api.openai.com/v1/videos");
234-expect(createInit?.method).toBe("POST");
235-expect(createInit?.body).toBeInstanceOf(FormData);
236-expect(createTimeout).toBe(120000);
237-expect(createFetch).toBe(fetch);
300+const createRequest = postMultipartRequest();
301+expect(createRequest.url).toBe("https://api.openai.com/v1/videos");
302+expect(createRequest.body).toBeInstanceOf(FormData);
303+expect(createRequest.timeoutMs).toBe(120000);
304+expect(createRequest.fetchFn).toBe(fetch);
305+expect(createRequest.allowPrivateNetwork).toBe(false);
238306});
239307240308it("rejects multiple reference assets", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。