From 362a01fb403af4c35ce3255960eb304715955e1f Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Mon, 13 Jan 2025 17:53:43 -0500 Subject: [PATCH] [Vertex AI] Make `ImagenImageRepresentable` internal (#14341) --- .../Imagen/ImagenImageRepresentable.swift | 9 +++++++-- .../Imagen/InternalImagenImage.swift} | 9 ++++++++- .../Types/Public/Imagen/ImagenFileDataImage.swift | 6 ++++-- .../Types/Public/Imagen/ImagenGenerationResponse.swift | 2 +- .../Types/Public/Imagen/ImagenInlineDataImage.swift | 6 ++++-- .../Sources/Types/Public/Imagen/ImagenModel.swift | 6 +++--- .../Unit/Types/Imagen/ImagenFileDataImageTests.swift | 6 +++--- .../Unit/Types/Imagen/ImagenInlineDataImageTests.swift | 6 +++--- 8 files changed, 33 insertions(+), 17 deletions(-) rename FirebaseVertexAI/Sources/Types/{Public => Internal}/Imagen/ImagenImageRepresentable.swift (66%) rename FirebaseVertexAI/Sources/Types/{Public/Imagen/ImagenImage.swift => Internal/Imagen/InternalImagenImage.swift} (66%) diff --git a/FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenImageRepresentable.swift b/FirebaseVertexAI/Sources/Types/Internal/Imagen/ImagenImageRepresentable.swift similarity index 66% rename from FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenImageRepresentable.swift rename to FirebaseVertexAI/Sources/Types/Internal/Imagen/ImagenImageRepresentable.swift index 8c5adb7133c..006493ac5ed 100644 --- a/FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenImageRepresentable.swift +++ b/FirebaseVertexAI/Sources/Types/Internal/Imagen/ImagenImageRepresentable.swift @@ -14,7 +14,12 @@ import Foundation +// TODO(andrewheard): Make this public when the SDK supports Imagen operations that take images as +// input (upscaling / editing). @available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, watchOS 8.0, *) -public protocol ImagenImageRepresentable { - var _imagenImage: _ImagenImage { get } +protocol ImagenImageRepresentable { + /// Internal representation of the image for use with the Imagen model. + /// + /// - Important: Not needed by SDK users. + var _internalImagenImage: _InternalImagenImage { get } } diff --git a/FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenImage.swift b/FirebaseVertexAI/Sources/Types/Internal/Imagen/InternalImagenImage.swift similarity index 66% rename from FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenImage.swift rename to FirebaseVertexAI/Sources/Types/Internal/Imagen/InternalImagenImage.swift index fb19243b4b3..76b668b6981 100644 --- a/FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenImage.swift +++ b/FirebaseVertexAI/Sources/Types/Internal/Imagen/InternalImagenImage.swift @@ -14,8 +14,15 @@ import Foundation +/// Internal representation of an image for the Imagen model. +/// +/// - Important: For internal use by types conforming to ``ImagenImageRepresentable``; all +/// properties are `internal` and are not needed by SDK users. +/// +/// TODO(andrewheard): Make this public when the SDK supports Imagen operations that take images as +/// input (upscaling / editing). @available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, watchOS 8.0, *) -public struct _ImagenImage { +struct _InternalImagenImage { let mimeType: String let bytesBase64Encoded: String? let gcsURI: String? diff --git a/FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenFileDataImage.swift b/FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenFileDataImage.swift index 5f04f3c1aa9..4c87ad84f44 100644 --- a/FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenFileDataImage.swift +++ b/FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenFileDataImage.swift @@ -27,8 +27,10 @@ public struct ImagenFileDataImage { @available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, watchOS 8.0, *) extension ImagenFileDataImage: ImagenImageRepresentable { - public var _imagenImage: _ImagenImage { - _ImagenImage(mimeType: mimeType, bytesBase64Encoded: nil, gcsURI: gcsURI) + // TODO(andrewheard): Make this public when the SDK supports Imagen operations that take images as + // input (upscaling / editing). + var _internalImagenImage: _InternalImagenImage { + _InternalImagenImage(mimeType: mimeType, bytesBase64Encoded: nil, gcsURI: gcsURI) } } diff --git a/FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenGenerationResponse.swift b/FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenGenerationResponse.swift index db5a49a3daa..8082c0979b6 100644 --- a/FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenGenerationResponse.swift +++ b/FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenGenerationResponse.swift @@ -15,7 +15,7 @@ import Foundation @available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, watchOS 8.0, *) -public struct ImagenGenerationResponse { +public struct ImagenGenerationResponse { public let images: [T] public let filteredReason: String? } diff --git a/FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenInlineDataImage.swift b/FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenInlineDataImage.swift index 4c77bd86150..2a1b6f9ed27 100644 --- a/FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenInlineDataImage.swift +++ b/FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenInlineDataImage.swift @@ -31,8 +31,10 @@ public struct ImagenInlineDataImage { @available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, watchOS 8.0, *) extension ImagenInlineDataImage: ImagenImageRepresentable { - public var _imagenImage: _ImagenImage { - _ImagenImage( + // TODO(andrewheard): Make this public when the SDK supports Imagen operations that take images as + // input (upscaling / editing). + var _internalImagenImage: _InternalImagenImage { + _InternalImagenImage( mimeType: mimeType, bytesBase64Encoded: data.base64EncodedString(), gcsURI: nil diff --git a/FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenModel.swift b/FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenModel.swift index 682a47237a6..f02148f5438 100644 --- a/FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenModel.swift +++ b/FirebaseVertexAI/Sources/Types/Public/Imagen/ImagenModel.swift @@ -81,9 +81,9 @@ public final class ImagenModel { ) } - func generateImages(prompt: String, - parameters: ImageGenerationParameters) async throws - -> ImagenGenerationResponse { + func generateImages(prompt: String, + parameters: ImageGenerationParameters) async throws + -> ImagenGenerationResponse where T: Decodable, T: ImagenImageRepresentable { let request = ImagenGenerationRequest( model: modelResourceName, options: requestOptions, diff --git a/FirebaseVertexAI/Tests/Unit/Types/Imagen/ImagenFileDataImageTests.swift b/FirebaseVertexAI/Tests/Unit/Types/Imagen/ImagenFileDataImageTests.swift index 892228f8d25..f3e1bdc458d 100644 --- a/FirebaseVertexAI/Tests/Unit/Types/Imagen/ImagenFileDataImageTests.swift +++ b/FirebaseVertexAI/Tests/Unit/Types/Imagen/ImagenFileDataImageTests.swift @@ -35,9 +35,9 @@ final class ImagenFileDataImageTests: XCTestCase { XCTAssertEqual(image.mimeType, mimeType) XCTAssertEqual(image.gcsURI, gcsURI) - XCTAssertEqual(image._imagenImage.mimeType, mimeType) - XCTAssertEqual(image._imagenImage.gcsURI, gcsURI) - XCTAssertNil(image._imagenImage.bytesBase64Encoded) + XCTAssertEqual(image._internalImagenImage.mimeType, mimeType) + XCTAssertEqual(image._internalImagenImage.gcsURI, gcsURI) + XCTAssertNil(image._internalImagenImage.bytesBase64Encoded) } func testDecodeImage_missingGCSURI_throws() throws { diff --git a/FirebaseVertexAI/Tests/Unit/Types/Imagen/ImagenInlineDataImageTests.swift b/FirebaseVertexAI/Tests/Unit/Types/Imagen/ImagenInlineDataImageTests.swift index 3253716e221..697fdc01a3c 100644 --- a/FirebaseVertexAI/Tests/Unit/Types/Imagen/ImagenInlineDataImageTests.swift +++ b/FirebaseVertexAI/Tests/Unit/Types/Imagen/ImagenInlineDataImageTests.swift @@ -35,9 +35,9 @@ final class ImagenInlineDataImageTests: XCTestCase { XCTAssertEqual(image.mimeType, mimeType) XCTAssertEqual(image.data.base64EncodedString(), bytesBase64Encoded) - XCTAssertEqual(image._imagenImage.mimeType, mimeType) - XCTAssertEqual(image._imagenImage.bytesBase64Encoded, bytesBase64Encoded) - XCTAssertNil(image._imagenImage.gcsURI) + XCTAssertEqual(image._internalImagenImage.mimeType, mimeType) + XCTAssertEqual(image._internalImagenImage.bytesBase64Encoded, bytesBase64Encoded) + XCTAssertNil(image._internalImagenImage.gcsURI) } func testDecodeImage_missingBytesBase64Encoded_throws() throws {