Skip to content

Commit eb17b98

Browse files
committed
wip: imagen migration to nanobanana
1 parent f5d6b01 commit eb17b98

File tree

8 files changed

+44
-26
lines changed

8 files changed

+44
-26
lines changed

firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenGenerationViewModel.kt

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,24 @@ package com.google.firebase.quickstart.ai.feature.media.imagen
22

33
import android.graphics.Bitmap
44
import com.google.firebase.Firebase
5+
import com.google.firebase.ai.GenerativeModel
56
import com.google.firebase.ai.ImagenModel
67
import com.google.firebase.ai.ai
78
import com.google.firebase.ai.type.GenerativeBackend
9+
import com.google.firebase.ai.type.ImagePart
810
import com.google.firebase.ai.type.ImagenGenerationResponse
911
import com.google.firebase.ai.type.ImagenImageFormat
1012
import com.google.firebase.ai.type.ImagenInlineImage
1113
import com.google.firebase.ai.type.ImagenPersonFilterLevel
1214
import com.google.firebase.ai.type.ImagenSafetyFilterLevel
1315
import com.google.firebase.ai.type.ImagenSafetySettings
1416
import com.google.firebase.ai.type.PublicPreviewAPI
17+
import com.google.firebase.ai.type.ResponseModality
18+
import com.google.firebase.ai.type.ThinkingLevel
19+
import com.google.firebase.ai.type.generationConfig
1520
import com.google.firebase.ai.type.imagenGenerationConfig
21+
import com.google.firebase.ai.type.thinkingConfig
22+
import com.google.firebase.ai.type.toImagenInlineImage
1623
import com.google.firebase.quickstart.ai.ui.ImagenUiState
1724
import kotlinx.serialization.Serializable
1825

@@ -28,28 +35,37 @@ class ImagenGenerationViewModel : ImagenViewModel() {
2835
override val additionalImage: Bitmap? = null
2936
override val imageLabels: List<String> = emptyList()
3037

31-
private val imagenModel: ImagenModel
38+
private val generativeModel: GenerativeModel
3239

3340
init {
34-
imagenModel = Firebase.ai(
41+
generativeModel = Firebase.ai(
3542
backend = GenerativeBackend.googleAI()
36-
).imagenModel(
37-
modelName = "imagen-4.0-generate-001",
38-
generationConfig = imagenGenerationConfig {
39-
numberOfImages = 4
40-
imageFormat = ImagenImageFormat.png()
41-
},
42-
safetySettings = ImagenSafetySettings(
43-
safetyFilterLevel = ImagenSafetyFilterLevel.BLOCK_LOW_AND_ABOVE,
44-
personFilterLevel = ImagenPersonFilterLevel.BLOCK_ALL
45-
)
43+
).generativeModel(
44+
modelName = "gemini-3.1-flash-image-preview",
45+
generationConfig = generationConfig {
46+
responseModalities = listOf(ResponseModality.TEXT, ResponseModality.IMAGE)
47+
// candidateCount = 4
48+
thinkingConfig = thinkingConfig {
49+
thinkingLevel = ThinkingLevel.MINIMAL
50+
}
51+
}
4652
)
4753
}
4854

4955
override suspend fun performGeneration(
5056
inputText: String,
5157
currentState: ImagenUiState.Success
52-
): ImagenGenerationResponse<ImagenInlineImage> {
53-
return imagenModel.generateImages(inputText)
58+
): List<Bitmap> {
59+
val bitmaps = arrayListOf<Bitmap>()
60+
generativeModel.generateContent(inputText)
61+
.candidates.forEach { candidate ->
62+
candidate.content.parts.filterIsInstance<ImagePart>()
63+
.forEach {
64+
bitmaps.add(it.image)
65+
}
66+
}
67+
68+
return bitmaps
69+
// return imagenModel.generateImages(inputText)
5470
}
5571
}

firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenInpaintingViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class ImagenInpaintingViewModel : ImagenViewModel() {
5757
override suspend fun performGeneration(
5858
inputText: String,
5959
currentState: ImagenUiState.Success
60-
): ImagenGenerationResponse<ImagenInlineImage> {
60+
): List<Bitmap> {
6161
val bitmap = currentState.attachedImage!!
6262
val mask = when (currentState.selectedOption) {
6363
"Foreground" -> ImagenForegroundMask()
@@ -67,6 +67,6 @@ class ImagenInpaintingViewModel : ImagenViewModel() {
6767
listOfNotNull(ImagenRawImage(bitmap.toImagenInlineImage()), mask),
6868
inputText,
6969
ImagenEditingConfig(ImagenEditMode.INPAINT_INSERTION)
70-
)
70+
).images.map { it.asBitmap() }
7171
}
7272
}

firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenOutpaintingViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class ImagenOutpaintingViewModel : ImagenViewModel() {
5858
override suspend fun performGeneration(
5959
inputText: String,
6060
currentState: ImagenUiState.Success
61-
): ImagenGenerationResponse<ImagenInlineImage> {
61+
): List<Bitmap> {
6262
val bitmap = currentState.attachedImage!!
6363
val position = when (currentState.selectedOption) {
6464
"Top" -> ImagenImagePlacement.TOP_CENTER
@@ -77,6 +77,6 @@ class ImagenOutpaintingViewModel : ImagenViewModel() {
7777
listOf(sourceImage, ImagenRawMask(mask.image!!, 0.05)),
7878
inputText,
7979
ImagenEditingConfig(ImagenEditMode.OUTPAINT)
80-
)
80+
).images.map { it.asBitmap() }
8181
}
8282
}

firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenStyleTransferViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,14 @@ class ImagenStyleTransferViewModel : ImagenViewModel() {
5555
override suspend fun performGeneration(
5656
inputText: String,
5757
currentState: ImagenUiState.Success
58-
): ImagenGenerationResponse<ImagenInlineImage> {
58+
): List<Bitmap> {
5959
val attachedImage = currentState.attachedImage!!
6060
return imagenModel.editImage(
6161
listOf(
6262
ImagenRawImage(MainActivity.catImage.toImagenInlineImage()),
6363
ImagenStyleReference(attachedImage.toImagenInlineImage(), 1, "an art style")
6464
),
6565
"Generate an image in an art style [1] based on the following caption: $inputText",
66-
)
66+
).images.map { it.asBitmap() }
6767
}
6868
}

firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenSubjectReferenceViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class ImagenSubjectReferenceViewModel : ImagenViewModel() {
5454
override suspend fun performGeneration(
5555
inputText: String,
5656
currentState: ImagenUiState.Success
57-
): ImagenGenerationResponse<ImagenInlineImage> {
57+
): List<Bitmap> {
5858
val attachedImage = currentState.attachedImage!!
5959
return imagenModel.editImage(
6060
listOf(
@@ -67,6 +67,6 @@ class ImagenSubjectReferenceViewModel : ImagenViewModel() {
6767
),
6868
"Create an image about An animal [1] to match the description: " +
6969
inputText.replace("<subject>", "An animal [1]"),
70-
)
70+
).images.map { it.asBitmap() }
7171
}
7272
}

firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenTemplateViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class ImagenTemplateViewModel : ImagenViewModel() {
3434
override suspend fun performGeneration(
3535
inputText: String,
3636
currentState: ImagenUiState.Success
37-
): ImagenGenerationResponse<ImagenInlineImage> {
37+
): List<Bitmap> {
3838
return try {
3939
templateImagenModel.generateImages("imagen-basic", mapOf("prompt" to inputText))
4040
} catch (e: Exception) {
@@ -47,6 +47,6 @@ class ImagenTemplateViewModel : ImagenViewModel() {
4747
} else {
4848
throw e
4949
}
50-
}
50+
}.images.map { it.asBitmap() }
5151
}
5252
}

firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ abstract class ImagenViewModel : ViewModel() {
3030
protected abstract suspend fun performGeneration(
3131
inputText: String,
3232
currentState: ImagenUiState.Success
33-
): ImagenGenerationResponse<ImagenInlineImage>
33+
): List<Bitmap>
3434

3535
fun generateImages(inputText: String) {
3636
val currentState = (_uiState.value as? ImagenUiState.Success) ?: ImagenUiState.Success()
@@ -39,7 +39,7 @@ abstract class ImagenViewModel : ViewModel() {
3939
_uiState.value = ImagenUiState.Loading
4040
try {
4141
val imageResponse = performGeneration(inputText, currentState)
42-
_uiState.value = currentState.copy(images = imageResponse.images.map { it.asBitmap() })
42+
_uiState.value = currentState.copy(images = imageResponse)
4343
} catch (e: Exception) {
4444
_uiState.value = ImagenUiState.Error(e.localizedMessage ?: "Unknown error")
4545
}

firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/ImageGenerationViewModel.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,15 @@ class ImageGenerationViewModel : ChatViewModel() {
3131
modelName = "gemini-2.5-flash-image",
3232
generationConfig = generationConfig {
3333
responseModalities = listOf(ResponseModality.TEXT, ResponseModality.IMAGE)
34+
candidateCount = 4
3435
}
3536
)
3637
chat = generativeModel.startChat()
3738
}
3839

3940
override suspend fun performSendMessage(prompt: Content, currentMessages: List<UiChatMessage>) {
4041
val response = chat.sendMessage(prompt)
42+
4143
validateAndDisplayResponse(response, currentMessages)
4244
}
4345
}

0 commit comments

Comments
 (0)