Skip to content

Commit 674d1ca

Browse files
author
David Motsonashvili
committed
Merge branch 'davidmotson.imagen_editing' into davidmotson.imagen_editing_docs
2 parents cdecb91 + e710498 commit 674d1ca

File tree

6 files changed

+75
-21
lines changed

6 files changed

+75
-21
lines changed

firebase-ai/api.txt

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ package com.google.firebase.ai {
6565
}
6666

6767
@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenModel {
68+
method public suspend Object? editImage(String prompt, com.google.firebase.ai.type.ImagenEditingConfig config, kotlin.coroutines.Continuation<? super com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>>);
6869
method public suspend Object? generateImages(String prompt, kotlin.coroutines.Continuation<? super com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>>);
6970
}
7071

@@ -104,6 +105,7 @@ package com.google.firebase.ai.java {
104105
}
105106

106107
@com.google.firebase.ai.type.PublicPreviewAPI public abstract class ImagenModelFutures {
108+
method public abstract com.google.common.util.concurrent.ListenableFuture<com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>> editImage(String prompt, com.google.firebase.ai.type.ImagenEditingConfig config);
107109
method public static final com.google.firebase.ai.java.ImagenModelFutures from(com.google.firebase.ai.ImagenModel model);
108110
method public abstract com.google.common.util.concurrent.ListenableFuture<com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>> generateImages(String prompt);
109111
method public abstract com.google.firebase.ai.ImagenModel getImageModel();
@@ -484,6 +486,47 @@ package com.google.firebase.ai.type {
484486
public static final class ImagenAspectRatio.Companion {
485487
}
486488

489+
public final class ImagenEditMode {
490+
field public static final com.google.firebase.ai.type.ImagenEditMode.Companion Companion;
491+
}
492+
493+
public static final class ImagenEditMode.Companion {
494+
method public com.google.firebase.ai.type.ImagenEditMode getINPAINT_INSERTION();
495+
method public com.google.firebase.ai.type.ImagenEditMode getINPAINT_REMOVAL();
496+
method public com.google.firebase.ai.type.ImagenEditMode getOUTPAINT();
497+
property public final com.google.firebase.ai.type.ImagenEditMode INPAINT_INSERTION;
498+
property public final com.google.firebase.ai.type.ImagenEditMode INPAINT_REMOVAL;
499+
property public final com.google.firebase.ai.type.ImagenEditMode OUTPAINT;
500+
}
501+
502+
@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenEditingConfig {
503+
ctor public ImagenEditingConfig(com.google.firebase.ai.type.ImagenInlineImage image, com.google.firebase.ai.type.ImagenEditMode editMode, com.google.firebase.ai.type.ImagenInlineImage? mask = null, Double? maskDilation = null, Integer? editSteps = null);
504+
field public static final com.google.firebase.ai.type.ImagenEditingConfig.Companion Companion;
505+
}
506+
507+
public static final class ImagenEditingConfig.Builder {
508+
ctor public ImagenEditingConfig.Builder();
509+
method public com.google.firebase.ai.type.ImagenEditingConfig build();
510+
method public com.google.firebase.ai.type.ImagenEditingConfig.Builder setEditMode(com.google.firebase.ai.type.ImagenEditMode editMode);
511+
method public com.google.firebase.ai.type.ImagenEditingConfig.Builder setEditSteps(int editSteps);
512+
method public com.google.firebase.ai.type.ImagenEditingConfig.Builder setImage(com.google.firebase.ai.type.ImagenInlineImage image);
513+
method public com.google.firebase.ai.type.ImagenEditingConfig.Builder setMask(com.google.firebase.ai.type.ImagenInlineImage mask);
514+
method public com.google.firebase.ai.type.ImagenEditingConfig.Builder setMaskDilation(double maskDilation);
515+
field public com.google.firebase.ai.type.ImagenEditMode? editMode;
516+
field public Integer? editSteps;
517+
field public com.google.firebase.ai.type.ImagenInlineImage? image;
518+
field public com.google.firebase.ai.type.ImagenInlineImage? mask;
519+
field public Double? maskDilation;
520+
}
521+
522+
public static final class ImagenEditingConfig.Companion {
523+
method public com.google.firebase.ai.type.ImagenEditingConfig.Builder builder();
524+
}
525+
526+
public final class ImagenEditingConfigKt {
527+
method @com.google.firebase.ai.type.PublicPreviewAPI public static com.google.firebase.ai.type.ImagenEditingConfig imagenEditingConfig(kotlin.jvm.functions.Function1<? super com.google.firebase.ai.type.ImagenEditingConfig.Builder,kotlin.Unit> init);
528+
}
529+
487530
@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenGenerationConfig {
488531
ctor public ImagenGenerationConfig(String? negativePrompt = null, Integer? numberOfImages = 1, com.google.firebase.ai.type.ImagenAspectRatio? aspectRatio = null, com.google.firebase.ai.type.ImagenImageFormat? imageFormat = null, Boolean? addWatermark = null);
489532
method public Boolean? getAddWatermark();
@@ -552,6 +595,10 @@ package com.google.firebase.ai.type {
552595
property public final String mimeType;
553596
}
554597

598+
public final class ImagenInlineImageKt {
599+
method @com.google.firebase.ai.type.PublicPreviewAPI public static com.google.firebase.ai.type.ImagenInlineImage toImagenInlineImage(android.graphics.Bitmap);
600+
}
601+
555602
@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenPersonFilterLevel {
556603
field public static final com.google.firebase.ai.type.ImagenPersonFilterLevel ALLOW_ADULT;
557604
field public static final com.google.firebase.ai.type.ImagenPersonFilterLevel ALLOW_ALL;

firebase-ai/src/main/kotlin/com/google/firebase/ai/ImagenModel.kt

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ internal constructor(
7676
public suspend fun generateImages(prompt: String): ImagenGenerationResponse<ImagenInlineImage> =
7777
try {
7878
controller
79-
.generateImage(constructGenerationRequest(prompt, null, generationConfig))
79+
.generateImage(constructGenerateImageRequest(prompt, generationConfig))
8080
.validate()
8181
.toPublicInline()
8282
} catch (e: Throwable) {
@@ -95,31 +95,27 @@ internal constructor(
9595
config: ImagenEditingConfig
9696
): ImagenGenerationResponse<ImagenInlineImage> =
9797
try {
98-
controller
99-
.generateImage(constructEditRequest(prompt, null, config))
100-
.validate()
101-
.toPublicInline()
98+
controller.generateImage(constructEditRequest(prompt, config)).validate().toPublicInline()
10299
} catch (e: Throwable) {
103100
throw FirebaseAIException.from(e)
104101
}
105102

106-
private fun constructGenerationRequest(
103+
private fun constructGenerateImageRequest(
107104
prompt: String,
108-
gcsUri: String? = null,
109105
generationConfig: ImagenGenerationConfig? = null,
110106
): GenerateImageRequest {
111107
return GenerateImageRequest(
112108
listOf(GenerateImageRequest.ImagenPrompt(prompt)),
113109
GenerateImageRequest.ImagenParameters(
114110
sampleCount = generationConfig?.numberOfImages ?: 1,
115111
includeRaiReason = true,
116-
addWatermark = this.generationConfig?.addWatermark,
112+
addWatermark = generationConfig?.addWatermark,
117113
personGeneration = safetySettings?.personFilterLevel?.internalVal,
118114
negativePrompt = generationConfig?.negativePrompt,
119115
safetySetting = safetySettings?.safetyFilterLevel?.internalVal,
120-
storageUri = gcsUri,
116+
storageUri = null,
121117
aspectRatio = generationConfig?.aspectRatio?.internalVal,
122-
imageOutputOptions = this.generationConfig?.imageFormat?.toInternal(),
118+
imageOutputOptions = generationConfig?.imageFormat?.toInternal(),
123119
editMode = null,
124120
editConfig = null
125121
),
@@ -128,7 +124,6 @@ internal constructor(
128124

129125
private fun constructEditRequest(
130126
prompt: String,
131-
gcsUri: String? = null,
132127
editConfig: ImagenEditingConfig,
133128
): GenerateImageRequest {
134129
return GenerateImageRequest(
@@ -165,13 +160,13 @@ internal constructor(
165160
GenerateImageRequest.ImagenParameters(
166161
sampleCount = generationConfig?.numberOfImages ?: 1,
167162
includeRaiReason = true,
168-
addWatermark = this.generationConfig?.addWatermark,
163+
addWatermark = generationConfig?.addWatermark,
169164
personGeneration = safetySettings?.personFilterLevel?.internalVal,
170165
negativePrompt = generationConfig?.negativePrompt,
171166
safetySetting = safetySettings?.safetyFilterLevel?.internalVal,
172-
storageUri = gcsUri,
167+
storageUri = null,
173168
aspectRatio = generationConfig?.aspectRatio?.internalVal,
174-
imageOutputOptions = this.generationConfig?.imageFormat?.toInternal(),
169+
imageOutputOptions = generationConfig?.imageFormat?.toInternal(),
175170
editMode = editConfig.editMode.value,
176171
editConfig = editConfig.toInternal()
177172
),

firebase-ai/src/main/kotlin/com/google/firebase/ai/common/Request.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ internal data class GenerateImageRequest(
9393
@Serializable
9494
internal data class ImagenParameters(
9595
val sampleCount: Int,
96-
val includeRaiReason: Boolean?,
96+
val includeRaiReason: Boolean,
9797
val storageUri: String?,
9898
val negativePrompt: String?,
9999
val aspectRatio: String?,

firebase-ai/src/main/kotlin/com/google/firebase/ai/java/ImagenModelFutures.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package com.google.firebase.ai.java
1919
import androidx.concurrent.futures.SuspendToFutureAdapter
2020
import com.google.common.util.concurrent.ListenableFuture
2121
import com.google.firebase.ai.ImagenModel
22+
import com.google.firebase.ai.type.ImagenEditingConfig
2223
import com.google.firebase.ai.type.ImagenGenerationResponse
2324
import com.google.firebase.ai.type.ImagenInlineImage
2425
import com.google.firebase.ai.type.PublicPreviewAPI
@@ -39,6 +40,11 @@ public abstract class ImagenModelFutures internal constructor() {
3940
prompt: String,
4041
): ListenableFuture<ImagenGenerationResponse<ImagenInlineImage>>
4142

43+
public abstract fun editImage(
44+
prompt: String,
45+
config: ImagenEditingConfig
46+
): ListenableFuture<ImagenGenerationResponse<ImagenInlineImage>>
47+
4248
/** Returns the [ImagenModel] object wrapped by this object. */
4349
public abstract fun getImageModel(): ImagenModel
4450

@@ -48,6 +54,12 @@ public abstract class ImagenModelFutures internal constructor() {
4854
): ListenableFuture<ImagenGenerationResponse<ImagenInlineImage>> =
4955
SuspendToFutureAdapter.launchFuture { model.generateImages(prompt) }
5056

57+
override fun editImage(
58+
prompt: String,
59+
config: ImagenEditingConfig
60+
): ListenableFuture<ImagenGenerationResponse<ImagenInlineImage>> =
61+
SuspendToFutureAdapter.launchFuture { model.editImage(prompt, config) }
62+
5163
override fun getImageModel(): ImagenModel = model
5264
}
5365

firebase-ai/src/main/kotlin/com/google/firebase/ai/type/ImagenEditingConfig.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ import kotlinx.serialization.Serializable
2828
*/
2929
@PublicPreviewAPI
3030
public class ImagenEditingConfig(
31-
public val image: ImagenInlineImage,
32-
public val editMode: ImagenEditMode,
33-
public val mask: ImagenInlineImage? = null,
34-
public val maskDilation: Double? = null,
35-
public val editSteps: Int? = null,
31+
internal val image: ImagenInlineImage,
32+
internal val editMode: ImagenEditMode,
33+
internal val mask: ImagenInlineImage? = null,
34+
internal val maskDilation: Double? = null,
35+
internal val editSteps: Int? = null,
3636
) {
3737
public companion object {
3838
public fun builder(): Builder = Builder()

firebase-ai/src/main/kotlin/com/google/firebase/ai/type/ImagenInlineImage.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ internal constructor(public val data: ByteArray, public val mimeType: String) {
4949
}
5050

5151
@PublicPreviewAPI
52-
public fun Bitmap.toImagenImage(): ImagenInlineImage {
52+
public fun Bitmap.toImagenInlineImage(): ImagenInlineImage {
5353
val byteArrayOutputStream = ByteArrayOutputStream()
5454
this.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream)
5555
val byteArray = byteArrayOutputStream.toByteArray()

0 commit comments

Comments
 (0)