From 5932a8bd8e9ac4629bd79c055be88d3e8449da01 Mon Sep 17 00:00:00 2001 From: Christina Holland Date: Thu, 9 May 2024 09:21:02 -0700 Subject: [PATCH 1/2] Fix filename bug --- packages/main/src/files/file-manager.test.ts | 37 +++++++++++++++++++- packages/main/src/files/file-manager.ts | 27 +++++++++----- 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/packages/main/src/files/file-manager.test.ts b/packages/main/src/files/file-manager.test.ts index f3bf5462d..748f6743f 100644 --- a/packages/main/src/files/file-manager.test.ts +++ b/packages/main/src/files/file-manager.test.ts @@ -15,13 +15,14 @@ * limitations under the License. */ import { expect, use } from "chai"; -import { GoogleAIFileManager } from "./file-manager"; +import { GoogleAIFileManager, getUploadMetadata } from "./file-manager"; import * as sinonChai from "sinon-chai"; import * as chaiAsPromised from "chai-as-promised"; import { restore, stub } from "sinon"; import * as request from "./request"; import { FilesTask } from "./constants"; import { DEFAULT_API_VERSION } from "../requests/request"; +import { FileMetadata } from "./types"; use(sinonChai); use(chaiAsPromised); @@ -254,4 +255,38 @@ describe("GoogleAIFileManager", () => { "Invalid fileId", ); }); + + describe("getUploadMetadata", () => { + it("getUploadMetadata with only mimeType", () => { + const uploadMetadata = getUploadMetadata({ mimeType: "image/jpeg" }); + expect(uploadMetadata.mimeType).to.equal("image/jpeg"); + expect(uploadMetadata.displayName).be.undefined; + expect(uploadMetadata.name).be.undefined; + }); + it("getUploadMetadata with no mimeType", () => { + expect(() => getUploadMetadata({} as FileMetadata)).to.throw( + "Must provide a mimeType.", + ); + }); + it("getUploadMetadata with all fields defined", () => { + const uploadMetadata = getUploadMetadata({ + mimeType: "image/jpeg", + displayName: "display name", + name: "filename", + }); + expect(uploadMetadata.mimeType).to.equal("image/jpeg"); + expect(uploadMetadata.displayName).to.equal("display name"); + expect(uploadMetadata.name).to.equal("files/filename"); + }); + it("getUploadMetadata with full file path", () => { + const uploadMetadata = getUploadMetadata({ + mimeType: "image/jpeg", + displayName: "display name", + name: "custom/path/filename", + }); + expect(uploadMetadata.mimeType).to.equal("image/jpeg"); + expect(uploadMetadata.displayName).to.equal("display name"); + expect(uploadMetadata.name).to.equal("custom/path/filename"); + }); + }); }); diff --git a/packages/main/src/files/file-manager.ts b/packages/main/src/files/file-manager.ts index e8577d686..0289e2afa 100644 --- a/packages/main/src/files/file-manager.ts +++ b/packages/main/src/files/file-manager.ts @@ -26,7 +26,7 @@ import { UploadFileResponse, } from "./types"; import { FilesTask } from "./constants"; -import { GoogleGenerativeAIError } from "../errors"; +import { GoogleGenerativeAIError, GoogleGenerativeAIRequestInputError } from "../errors"; // Internal type, metadata sent in the upload export interface UploadMetadata { @@ -66,13 +66,7 @@ export class GoogleAIFileManager { `multipart/related; boundary=${boundary}`, ); - const uploadMetadata: FileMetadata = { - mimeType: fileMetadata.mimeType, - displayName: fileMetadata.displayName, - name: fileMetadata.name?.includes("/") - ? fileMetadata.name - : `files/${fileMetadata.name}`, - }; + const uploadMetadata = getUploadMetadata(fileMetadata); // Multipart formatting code taken from @firebase/storage const metadataString = JSON.stringify({ file: uploadMetadata }); @@ -169,3 +163,20 @@ function generateBoundary(): string { } return str; } + +export function getUploadMetadata(inputMetadata: FileMetadata): FileMetadata { + if (!inputMetadata.mimeType) { + throw new GoogleGenerativeAIRequestInputError('Must provide a mimeType.'); + } + const uploadMetadata: FileMetadata = { + mimeType: inputMetadata.mimeType, + displayName: inputMetadata.displayName + }; + + if (inputMetadata.name) { + uploadMetadata.name = inputMetadata.name.includes("/") + ? inputMetadata.name + : `files/${inputMetadata.name}`; + } + return uploadMetadata; +} From a5f304441d05d3093a7204e4ca5b06e367041586 Mon Sep 17 00:00:00 2001 From: Christina Holland Date: Thu, 9 May 2024 09:22:21 -0700 Subject: [PATCH 2/2] format, changeset --- .changeset/dirty-pillows-vanish.md | 5 +++++ packages/main/src/files/file-manager.ts | 9 ++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 .changeset/dirty-pillows-vanish.md diff --git a/.changeset/dirty-pillows-vanish.md b/.changeset/dirty-pillows-vanish.md new file mode 100644 index 000000000..34bdae5f3 --- /dev/null +++ b/.changeset/dirty-pillows-vanish.md @@ -0,0 +1,5 @@ +--- +"@google/generative-ai": patch +--- + +Fix a bug that caused file uploads to be named "undefined" if no file name is provided. diff --git a/packages/main/src/files/file-manager.ts b/packages/main/src/files/file-manager.ts index 0289e2afa..42f6b8c55 100644 --- a/packages/main/src/files/file-manager.ts +++ b/packages/main/src/files/file-manager.ts @@ -26,7 +26,10 @@ import { UploadFileResponse, } from "./types"; import { FilesTask } from "./constants"; -import { GoogleGenerativeAIError, GoogleGenerativeAIRequestInputError } from "../errors"; +import { + GoogleGenerativeAIError, + GoogleGenerativeAIRequestInputError, +} from "../errors"; // Internal type, metadata sent in the upload export interface UploadMetadata { @@ -166,11 +169,11 @@ function generateBoundary(): string { export function getUploadMetadata(inputMetadata: FileMetadata): FileMetadata { if (!inputMetadata.mimeType) { - throw new GoogleGenerativeAIRequestInputError('Must provide a mimeType.'); + throw new GoogleGenerativeAIRequestInputError("Must provide a mimeType."); } const uploadMetadata: FileMetadata = { mimeType: inputMetadata.mimeType, - displayName: inputMetadata.displayName + displayName: inputMetadata.displayName, }; if (inputMetadata.name) {