Conversation
Migrate Magic Selfie to Nano Banana2 and remove ML Kit depency for background selection
Summary of ChangesHello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request significantly refactors the "Magic Selfie" sample application by upgrading its core AI technology. It transitions from a two-component system (ML Kit for segmentation and Imagen for generation) to a unified approach leveraging the Nano Banana 2 (Gemini 3.1 Flash Image Preview) model. This change simplifies the application's architecture, reduces dependencies, and enhances the image manipulation process by utilizing a single multimodal model capable of direct semantic image editing. Highlights
🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Changelog
Activity
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Code Review
This pull request migrates the Magic Selfie sample to use the gemini-3.1-flash-image-preview model, removing the dependency on ML Kit and simplifying the implementation. However, it introduces a potential prompt injection vulnerability in the MagicSelfieRepository where user input is directly concatenated into the LLM prompt without sanitization. Besides the security concern, the changes are well-executed and consistent across the codebase, including updates to the UI, data layer, and documentation. Consider improving the error handling and ensuring documentation consistency.
| suspend fun generateMagicSelfie(bitmap: Bitmap, prompt: String): Bitmap { | ||
| val multimodalPrompt = content { | ||
| image(bitmap) | ||
| text("Change the background of this image to $prompt") |
There was a problem hiding this comment.
The user-provided prompt is directly concatenated into the multimodal prompt sent to the Gemini model. This makes the application vulnerable to prompt injection, where an attacker can provide a crafted prompt to manipulate the model's behavior, potentially bypassing intended constraints or generating inappropriate content. Consider sanitizing the input or using system instructions to define the model's behavior more securely.
| } | ||
| val response = generativeModel.generateContent(multimodalPrompt) | ||
| return response.candidates.firstOrNull()?.content?.parts?.firstNotNullOfOrNull { it.asImageOrNull() } | ||
| ?: throw Exception("No image generated") |
There was a problem hiding this comment.
To keep the documentation consistent with the suggested code change in MagicSelfieRepository.kt, please update the exception type in this code snippet as well. This ensures the documentation accurately reflects the implementation.
| ?: throw Exception("No image generated") | |
| ?: throw IllegalStateException("No image generated") |
| return response.candidates.firstOrNull()?.content?.parts?.firstNotNullOfOrNull { it.asImageOrNull() } | ||
| ?: throw Exception("No image generated") |
There was a problem hiding this comment.
For better error handling and clarity, it's recommended to throw a more specific exception than the generic Exception. Using IllegalStateException would be more appropriate here, as it signals that the response from the generative model was not in the expected state (i.e., it did not contain an image). This makes debugging easier and the code more self-documenting.
| return response.candidates.firstOrNull()?.content?.parts?.firstNotNullOfOrNull { it.asImageOrNull() } | |
| ?: throw Exception("No image generated") | |
| return response.candidates.firstOrNull()?.content?.parts?.firstNotNullOfOrNull { it.asImageOrNull() } | |
| ?: throw IllegalStateException("No image generated") |
Migrate Magic Selfie to Nano Banana2 and remove ML Kit depency for background selection