





















@@ -1,23 +1,25 @@
11import { afterEach, describe, expect, it, vi } from "vitest";
223-const { createGoogleGenAIMock, generateVideosMock, getVideosOperationMock } = vi.hoisted(() => {
4-const generateVideosMock = vi.fn();
5-const getVideosOperationMock = vi.fn();
6-const createGoogleGenAIMock = vi.fn(() => {
7-return {
8-models: {
9-generateVideos: generateVideosMock,
10-},
11-operations: {
12-getVideosOperation: getVideosOperationMock,
13-},
14-files: {
15-download: vi.fn(),
16-},
17-};
3+const { createGoogleGenAIMock, downloadMock, generateVideosMock, getVideosOperationMock } =
4+vi.hoisted(() => {
5+const generateVideosMock = vi.fn();
6+const getVideosOperationMock = vi.fn();
7+const downloadMock = vi.fn();
8+const createGoogleGenAIMock = vi.fn(() => {
9+return {
10+models: {
11+generateVideos: generateVideosMock,
12+},
13+operations: {
14+getVideosOperation: getVideosOperationMock,
15+},
16+files: {
17+download: downloadMock,
18+},
19+};
20+});
21+return { createGoogleGenAIMock, downloadMock, generateVideosMock, getVideosOperationMock };
1822});
19-return { createGoogleGenAIMock, generateVideosMock, getVideosOperationMock };
20-});
21232224vi.mock("./google-genai-runtime.js", () => ({
2325createGoogleGenAI: createGoogleGenAIMock,
@@ -30,6 +32,8 @@ import { buildGoogleVideoGenerationProvider } from "./video-generation-provider.
3032describe("google video generation provider", () => {
3133afterEach(() => {
3234vi.restoreAllMocks();
35+vi.unstubAllGlobals();
36+downloadMock.mockReset();
3337generateVideosMock.mockReset();
3438getVideosOperationMock.mockReset();
3539createGoogleGenAIMock.mockClear();
@@ -139,6 +143,51 @@ describe("google video generation provider", () => {
139143);
140144});
141145146+it("downloads MLDev direct video uri responses without routing through the Files API", async () => {
147+vi.spyOn(providerAuthRuntime, "resolveApiKeyForProvider").mockResolvedValue({
148+apiKey: "google-key",
149+source: "env",
150+mode: "api-key",
151+});
152+generateVideosMock.mockResolvedValue({
153+done: true,
154+response: {
155+generatedVideos: [
156+{
157+video: {
158+uri: "https://generativelanguage.googleapis.com/v1beta/files/generated-video:download?alt=media",
159+mimeType: "video/mp4",
160+},
161+},
162+],
163+},
164+});
165+const fetchMock = vi.fn(async () => {
166+return new Response("direct-mp4", {
167+status: 200,
168+statusText: "OK",
169+headers: { "content-type": "video/mp4" },
170+});
171+});
172+vi.stubGlobal("fetch", fetchMock);
173+174+const provider = buildGoogleVideoGenerationProvider();
175+const result = await provider.generateVideo({
176+provider: "google",
177+model: "veo-3.1-fast-generate-preview",
178+prompt: "A tiny robot watering a windowsill garden",
179+cfg: {},
180+durationSeconds: 3,
181+});
182+183+expect(fetchMock).toHaveBeenCalledWith(
184+"https://generativelanguage.googleapis.com/v1beta/files/generated-video:download?alt=media&key=google-key",
185+);
186+expect(downloadMock).not.toHaveBeenCalled();
187+expect(result.videos[0]?.buffer).toEqual(Buffer.from("direct-mp4"));
188+expect(result.videos[0]?.mimeType).toBe("video/mp4");
189+});
190+142191it("does NOT strip /v1beta when it appears mid-path (end-anchor proof)", async () => {
143192vi.spyOn(providerAuthRuntime, "resolveApiKeyForProvider").mockResolvedValue({
144193apiKey: "google-key",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。