Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 26 additions & 41 deletions firebase-ai/api.txt
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ package com.google.firebase.ai {
method public suspend Object? editImage(java.util.List<? extends com.google.firebase.ai.type.ImagenReferenceImage> referenceImages, String prompt, com.google.firebase.ai.type.ImagenEditingConfig? config = null, kotlin.coroutines.Continuation<? super com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>>);
method public suspend Object? generateImages(String prompt, kotlin.coroutines.Continuation<? super com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>>);
method public suspend Object? inpaintImage(com.google.firebase.ai.type.ImagenInlineImage image, String prompt, com.google.firebase.ai.type.ImagenMaskReference mask, com.google.firebase.ai.type.ImagenEditingConfig config, kotlin.coroutines.Continuation<? super com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>>);
method public suspend Object? outpaintImage(com.google.firebase.ai.type.ImagenInlineImage image, com.google.firebase.ai.type.Dimensions newDimensions, com.google.firebase.ai.type.ImagenImagePlacement newPosition = ImagenImagePlacement.CENTER, String prompt = "", com.google.firebase.ai.type.ImagenEditingConfig? config = null, kotlin.coroutines.Continuation<? super com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>>);
method public suspend Object? outpaintImage(com.google.firebase.ai.type.ImagenInlineImage image, com.google.firebase.ai.type.Dimensions newDimensions, com.google.firebase.ai.type.ImagenImagePlacement newPosition = com.google.firebase.ai.type.ImagenImagePlacement.CENTER, String prompt = "", com.google.firebase.ai.type.ImagenEditingConfig? config = null, kotlin.coroutines.Continuation<? super com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>>);
}

@com.google.firebase.ai.type.PublicPreviewAPI public final class LiveGenerativeModel {
Expand Down Expand Up @@ -115,7 +115,7 @@ package com.google.firebase.ai.java {
method public abstract com.google.common.util.concurrent.ListenableFuture<com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>> generateImages(String prompt);
method public abstract com.google.firebase.ai.ImagenModel getImageModel();
method public abstract com.google.common.util.concurrent.ListenableFuture<com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>> inpaintImage(com.google.firebase.ai.type.ImagenInlineImage image, String prompt, com.google.firebase.ai.type.ImagenMaskReference mask, com.google.firebase.ai.type.ImagenEditingConfig config);
method public abstract com.google.common.util.concurrent.ListenableFuture<com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>> outpaintImage(com.google.firebase.ai.type.ImagenInlineImage image, com.google.firebase.ai.type.Dimensions newDimensions, com.google.firebase.ai.type.ImagenImagePlacement newPosition = ImagenImagePlacement.CENTER, String prompt = "", com.google.firebase.ai.type.ImagenEditingConfig? config = null);
method public abstract com.google.common.util.concurrent.ListenableFuture<com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>> outpaintImage(com.google.firebase.ai.type.ImagenInlineImage image, com.google.firebase.ai.type.Dimensions newDimensions, com.google.firebase.ai.type.ImagenImagePlacement newPosition = com.google.firebase.ai.type.ImagenImagePlacement.CENTER, String prompt = "", com.google.firebase.ai.type.ImagenEditingConfig? config = null);
field public static final com.google.firebase.ai.java.ImagenModelFutures.Companion Companion;
}

Expand Down Expand Up @@ -556,31 +556,24 @@ package com.google.firebase.ai.type {
}

public final class ImagenControlType {
field public static final com.google.firebase.ai.type.ImagenControlType CANNY;
field public static final com.google.firebase.ai.type.ImagenControlType COLOR_SUPERPIXEL;
field public static final com.google.firebase.ai.type.ImagenControlType.Companion Companion;
field public static final com.google.firebase.ai.type.ImagenControlType FACE_MESH;
field public static final com.google.firebase.ai.type.ImagenControlType SCRIBBLE;
}

public static final class ImagenControlType.Companion {
method public com.google.firebase.ai.type.ImagenControlType getCANNY();
method public com.google.firebase.ai.type.ImagenControlType getCOLOR_SUPERPIXEL();
method public com.google.firebase.ai.type.ImagenControlType getFACE_MESH();
method public com.google.firebase.ai.type.ImagenControlType getSCRIBBLE();
property public final com.google.firebase.ai.type.ImagenControlType CANNY;
property public final com.google.firebase.ai.type.ImagenControlType COLOR_SUPERPIXEL;
property public final com.google.firebase.ai.type.ImagenControlType FACE_MESH;
property public final com.google.firebase.ai.type.ImagenControlType SCRIBBLE;
}

public final class ImagenEditMode {
field public static final com.google.firebase.ai.type.ImagenEditMode.Companion Companion;
field public static final com.google.firebase.ai.type.ImagenEditMode INPAINT_INSERTION;
field public static final com.google.firebase.ai.type.ImagenEditMode INPAINT_REMOVAL;
field public static final com.google.firebase.ai.type.ImagenEditMode OUTPAINT;
}

public static final class ImagenEditMode.Companion {
method public com.google.firebase.ai.type.ImagenEditMode getINPAINT_INSERTION();
method public com.google.firebase.ai.type.ImagenEditMode getINPAINT_REMOVAL();
method public com.google.firebase.ai.type.ImagenEditMode getOUTPAINT();
property public final com.google.firebase.ai.type.ImagenEditMode INPAINT_INSERTION;
property public final com.google.firebase.ai.type.ImagenEditMode INPAINT_REMOVAL;
property public final com.google.firebase.ai.type.ImagenEditMode OUTPAINT;
}

@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenEditingConfig {
Expand Down Expand Up @@ -652,33 +645,25 @@ package com.google.firebase.ai.type {
}

public final class ImagenImagePlacement {
method public static com.google.firebase.ai.type.ImagenImagePlacement fromCoordinate(int x, int y);
method public Integer? getX();
method public Integer? getY();
property public final Integer? x;
property public final Integer? y;
field public static final com.google.firebase.ai.type.ImagenImagePlacement BOTTOM_CENTER;
field public static final com.google.firebase.ai.type.ImagenImagePlacement BOTTOM_LEFT;
field public static final com.google.firebase.ai.type.ImagenImagePlacement BOTTOM_RIGHT;
field public static final com.google.firebase.ai.type.ImagenImagePlacement CENTER;
field public static final com.google.firebase.ai.type.ImagenImagePlacement.Companion Companion;
field public static final com.google.firebase.ai.type.ImagenImagePlacement LEFT_CENTER;
field public static final com.google.firebase.ai.type.ImagenImagePlacement RIGHT_CENTER;
field public static final com.google.firebase.ai.type.ImagenImagePlacement TOP_CENTER;
field public static final com.google.firebase.ai.type.ImagenImagePlacement TOP_LEFT;
field public static final com.google.firebase.ai.type.ImagenImagePlacement TOP_RIGHT;
}

public static final class ImagenImagePlacement.Companion {
method public com.google.firebase.ai.type.ImagenImagePlacement fromCoordinate(int x, int y);
method public com.google.firebase.ai.type.ImagenImagePlacement getBOTTOM_CENTER();
method public com.google.firebase.ai.type.ImagenImagePlacement getBOTTOM_LEFT();
method public com.google.firebase.ai.type.ImagenImagePlacement getBOTTOM_RIGHT();
method public com.google.firebase.ai.type.ImagenImagePlacement getCENTER();
method public com.google.firebase.ai.type.ImagenImagePlacement getLEFT_CENTER();
method public com.google.firebase.ai.type.ImagenImagePlacement getRIGHT_CENTER();
method public com.google.firebase.ai.type.ImagenImagePlacement getTOP_CENTER();
method public com.google.firebase.ai.type.ImagenImagePlacement getTOP_LEFT();
method public com.google.firebase.ai.type.ImagenImagePlacement getTOP_RIGHT();
property public final com.google.firebase.ai.type.ImagenImagePlacement BOTTOM_CENTER;
property public final com.google.firebase.ai.type.ImagenImagePlacement BOTTOM_LEFT;
property public final com.google.firebase.ai.type.ImagenImagePlacement BOTTOM_RIGHT;
property public final com.google.firebase.ai.type.ImagenImagePlacement CENTER;
property public final com.google.firebase.ai.type.ImagenImagePlacement LEFT_CENTER;
property public final com.google.firebase.ai.type.ImagenImagePlacement RIGHT_CENTER;
property public final com.google.firebase.ai.type.ImagenImagePlacement TOP_CENTER;
property public final com.google.firebase.ai.type.ImagenImagePlacement TOP_LEFT;
property public final com.google.firebase.ai.type.ImagenImagePlacement TOP_RIGHT;
}

@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenInlineImage {
Expand All @@ -694,11 +679,14 @@ package com.google.firebase.ai.type {
}

@com.google.firebase.ai.type.PublicPreviewAPI public abstract class ImagenMaskReference extends com.google.firebase.ai.type.ImagenReferenceImage {
method public static final java.util.List<com.google.firebase.ai.type.ImagenReferenceImage> generateMaskAndPadForOutpainting(com.google.firebase.ai.type.ImagenInlineImage image, com.google.firebase.ai.type.Dimensions newDimensions);
method public static final java.util.List<com.google.firebase.ai.type.ImagenReferenceImage> generateMaskAndPadForOutpainting(com.google.firebase.ai.type.ImagenInlineImage image, com.google.firebase.ai.type.Dimensions newDimensions, com.google.firebase.ai.type.ImagenImagePlacement newPosition = com.google.firebase.ai.type.ImagenImagePlacement.CENTER);
field public static final com.google.firebase.ai.type.ImagenMaskReference.Companion Companion;
}

public static final class ImagenMaskReference.Companion {
method public java.util.List<com.google.firebase.ai.type.ImagenReferenceImage> generateMaskAndPadForOutpainting(com.google.firebase.ai.type.ImagenInlineImage image, com.google.firebase.ai.type.Dimensions newDimensions, com.google.firebase.ai.type.ImagenImagePlacement newPosition = ImagenImagePlacement.CENTER);
method public java.util.List<com.google.firebase.ai.type.ImagenReferenceImage> generateMaskAndPadForOutpainting(com.google.firebase.ai.type.ImagenInlineImage image, com.google.firebase.ai.type.Dimensions newDimensions);
method public java.util.List<com.google.firebase.ai.type.ImagenReferenceImage> generateMaskAndPadForOutpainting(com.google.firebase.ai.type.ImagenInlineImage image, com.google.firebase.ai.type.Dimensions newDimensions, com.google.firebase.ai.type.ImagenImagePlacement newPosition = com.google.firebase.ai.type.ImagenImagePlacement.CENTER);
}

@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenPersonFilterLevel {
Expand Down Expand Up @@ -754,16 +742,13 @@ package com.google.firebase.ai.type {
}

public final class ImagenSubjectReferenceType {
field public static final com.google.firebase.ai.type.ImagenSubjectReferenceType ANIMAL;
field public static final com.google.firebase.ai.type.ImagenSubjectReferenceType.Companion Companion;
field public static final com.google.firebase.ai.type.ImagenSubjectReferenceType PERSON;
field public static final com.google.firebase.ai.type.ImagenSubjectReferenceType PRODUCT;
}

public static final class ImagenSubjectReferenceType.Companion {
method public com.google.firebase.ai.type.ImagenSubjectReferenceType getANIMAL();
method public com.google.firebase.ai.type.ImagenSubjectReferenceType getPERSON();
method public com.google.firebase.ai.type.ImagenSubjectReferenceType getPRODUCT();
property public final com.google.firebase.ai.type.ImagenSubjectReferenceType ANIMAL;
property public final com.google.firebase.ai.type.ImagenSubjectReferenceType PERSON;
property public final com.google.firebase.ai.type.ImagenSubjectReferenceType PRODUCT;
}

public final class InlineDataPart implements com.google.firebase.ai.type.Part {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* Copyright 2025 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.firebase.ai

import com.google.firebase.ai.AIModels.Companion.app
import com.google.firebase.ai.type.ImagenBackgroundMask
import com.google.firebase.ai.type.ImagenEditMode
import com.google.firebase.ai.type.ImagenEditingConfig
import com.google.firebase.ai.type.ImagenRawImage
import com.google.firebase.ai.type.PublicPreviewAPI
import kotlinx.coroutines.runBlocking
import org.junit.Test

@OptIn(PublicPreviewAPI::class)
class ImagenTests {
@Test
fun testGenerateAndEditImage() {
val imageGenerationModel = FirebaseAI.getInstance(app()).imagenModel("imagen-3.0-generate-002")
val imageEditingModel = FirebaseAI.getInstance(app()).imagenModel("imagen-3.0-capability-001")

runBlocking {
val catImage = imageGenerationModel.generateImages("A cat").images.first()
val editedCatImage =
imageEditingModel.editImage(
listOf(ImagenRawImage(catImage), ImagenBackgroundMask()),
"A cat flying through space",
ImagenEditingConfig(ImagenEditMode.INPAINT_INSERTION)
)
assert(editedCatImage.images.size == 1)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,21 @@ package com.google.firebase.ai.type
/** Represents a control type for controlled Imagen generation/editing */
public class ImagenControlType internal constructor(internal val value: String) {
public companion object {

/** Use edge detection to ensure the new image follow the same outlines */
public val CANNY: ImagenControlType = ImagenControlType("CONTROL_TYPE_CANNY")
@JvmField public val CANNY: ImagenControlType = ImagenControlType("CONTROL_TYPE_CANNY")

/** Use enhanced edge detection to ensure the new image follow similar outlines */
public val SCRIBBLE: ImagenControlType = ImagenControlType("CONTROL_TYPE_SCRIBBLE")
@JvmField public val SCRIBBLE: ImagenControlType = ImagenControlType("CONTROL_TYPE_SCRIBBLE")

/** Use face mesh control to ensure that the new image has the same facial expressions */
public val FACE_MESH: ImagenControlType = ImagenControlType("CONTROL_TYPE_FACE_MESH")
@JvmField public val FACE_MESH: ImagenControlType = ImagenControlType("CONTROL_TYPE_FACE_MESH")

/**
* Use color superpixels to ensure that the new image is similar in shape and color to the
* original
*/
@JvmField
public val COLOR_SUPERPIXEL: ImagenControlType =
ImagenControlType("CONTROL_TYPE_COLOR_SUPERPIXEL")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,12 @@ public class ImagenEditMode private constructor(internal val value: String) {

public companion object {
/** Inserts a new element into an image */
@JvmField
public val INPAINT_INSERTION: ImagenEditMode = ImagenEditMode("EDIT_MODE_INPAINT_INSERTION")
/** Removes an element from an image */
@JvmField
public val INPAINT_REMOVAL: ImagenEditMode = ImagenEditMode("EDIT_MODE_INPAINT_REMOVAL")
/** Extend the borders of an image outwards */
public val OUTPAINT: ImagenEditMode = ImagenEditMode("EDIT_MODE_OUTPAINT")
@JvmField public val OUTPAINT: ImagenEditMode = ImagenEditMode("EDIT_MODE_OUTPAINT")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,27 +73,36 @@ private constructor(public val x: Int? = null, public val y: Int? = null) {
* @param x the x coordinate of the top left corner of the original image
* @param y the y coordinate of the top left corner of the original image
*/
@JvmStatic
public fun fromCoordinate(x: Int, y: Int): ImagenImagePlacement {
return ImagenImagePlacement(x, y)
}

/** Center the image horizontally and vertically within the larger image */
public val CENTER: ImagenImagePlacement = ImagenImagePlacement()
@JvmField public val CENTER: ImagenImagePlacement = ImagenImagePlacement()

/** Center the image horizontally and aligned with the top edge of the larger image */
public val TOP_CENTER: ImagenImagePlacement = ImagenImagePlacement()
@JvmField public val TOP_CENTER: ImagenImagePlacement = ImagenImagePlacement()

/** Center the image horizontally and aligned with the bottom edge of the larger image */
public val BOTTOM_CENTER: ImagenImagePlacement = ImagenImagePlacement()
@JvmField public val BOTTOM_CENTER: ImagenImagePlacement = ImagenImagePlacement()

/** Center the image vertically and aligned with the left edge of the larger image */
public val LEFT_CENTER: ImagenImagePlacement = ImagenImagePlacement()
@JvmField public val LEFT_CENTER: ImagenImagePlacement = ImagenImagePlacement()

/** Center the image vertically and aligned with the right edge of the larger image */
public val RIGHT_CENTER: ImagenImagePlacement = ImagenImagePlacement()
@JvmField public val RIGHT_CENTER: ImagenImagePlacement = ImagenImagePlacement()

/** Align the image with the top left corner of the larger image */
public val TOP_LEFT: ImagenImagePlacement = ImagenImagePlacement(0, 0)
@JvmField public val TOP_LEFT: ImagenImagePlacement = ImagenImagePlacement(0, 0)

/** Align the image with the top right corner of the larger image */
public val TOP_RIGHT: ImagenImagePlacement = ImagenImagePlacement()
@JvmField public val TOP_RIGHT: ImagenImagePlacement = ImagenImagePlacement()

/** Align the image with the bottom left corner of the larger image */
public val BOTTOM_LEFT: ImagenImagePlacement = ImagenImagePlacement()
@JvmField public val BOTTOM_LEFT: ImagenImagePlacement = ImagenImagePlacement()

/** Align the image with the bottom right corner of the larger image */
public val BOTTOM_RIGHT: ImagenImagePlacement = ImagenImagePlacement()
@JvmField public val BOTTOM_RIGHT: ImagenImagePlacement = ImagenImagePlacement()
}
}
Loading
Loading