Você pode pedir que um modelo do Gemini Nano Banana gere e edite imagens usando comandos de texto e de texto e arquivo. Ao usar Firebase AI Logic, é possível fazer essa solicitação diretamente do app.
Com esse recurso, é possível:
Gere imagens de forma iterativa por meio de conversas em linguagem natural, ajustando as imagens sem perder a consistência e o contexto.
Gere imagens com renderização de texto de alta qualidade, incluindo strings de texto longas.
Gerar uma resposta com texto e imagens intercalados. Por exemplo, uma postagem de blog com texto e imagens em uma única rodada. Antes, era necessário encadear vários modelos.
Gere imagens usando o conhecimento de mundo e os recursos de raciocínio do Gemini.
É possível configurar a modalidade de resposta da sua solicitação para que o modelo gere apenas imagens ou imagens e texto. Confira uma lista completa de recursos compatíveis (com exemplos de comandos) mais adiante nesta página.
Ir para o código de conversão de texto em imagem Ir para o código de conversão de vídeo em imagem Ir para o código de texto e imagens intercalados
Ir para o código de edição de imagens Ir para o código de edição iterativa de imagens
|
Confira outros guias para mais opções de trabalho com imagens Analisar imagens Analisar imagens no dispositivo Gerar saída estruturada |
Antes de começar
|
Clique no seu provedor de Gemini API para conferir o conteúdo e o código específicos do provedor nesta página. |
Se ainda não tiver feito isso, conclua o
guia de iniciação, que descreve como
configurar seu projeto do Firebase, conectar seu app ao Firebase, adicionar o SDK,
inicializar o serviço de back-end para o provedor Gemini API escolhido e
criar uma instância GenerativeModel.
Para testar e iterar seus comandos, recomendamos usar o Google AI Studio.
Modelos que aceitam esse recurso
gemini-nano-banana-2.1(Nano Banana 2.1)gemini-3.1-flash-image(Nano Banana 2)gemini-3.1-flash-lite-image(Nano Banana 2 Lite)gemini-3-pro-image(Nano Banana Pro)
O modelo gemini-2.5-flash-image é compatível com esse recurso, mas foi descontinuado.
Gerar e editar imagens
É possível gerar e editar imagens usando um modelo Gemini Nano Banana.
Gerar imagens (entrada somente de texto)
|
Antes de testar este exemplo, conclua a seção
Antes de começar deste guia
para configurar seu projeto e app. Nessa seção, você também vai clicar em um botão para o provedor do Gemini API escolhido para ver o conteúdo específico do provedor nesta página. |
Você pode pedir que um modelo Gemini Nano Banana gere imagens usando um comando de texto.
Crie uma instância GenerativeModel,
inclua a modalidade de resposta de IMAGE na configuração do modelo
e chame generateContent.
Swift
import FirebaseAILogic
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
let model = FirebaseAI.firebaseAI(backend: .googleAI()).generativeModel(
modelName: "gemini-nano-banana-2.1",
// Configure the model to respond with images only.
generationConfig: GenerationConfig(responseModalities: [.image])
)
// Provide a text prompt instructing the model to generate an image
let prompt = "Generate an image of the Eiffel tower with fireworks in the background."
// To generate an image, call `generateContent` with the text input
let response = try await model.generateContent(prompt)
// Handle the generated image
guard let inlineDataPart = response.inlineDataParts.first else {
fatalError("No image data in response.")
}
guard let uiImage = UIImage(data: inlineDataPart.data) else {
fatalError("Failed to convert data to UIImage.")
}
Kotlin
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(
modelName = "gemini-nano-banana-2.1",
// Configure the model to respond with images only.
generationConfig = generationConfig {
responseModalities = listOf(ResponseModality.IMAGE) }
)
// Provide a text prompt instructing the model to generate an image
val prompt = "Generate an image of the Eiffel tower with fireworks in the background."
// To generate image output, call `generateContent` with the text input
val generatedImageAsBitmap = model.generateContent(prompt)
// Handle the generated image
.candidates.first().content.parts.filterIsInstance<ImagePart>().firstOrNull()?.image
Java
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI()).generativeModel(
"gemini-nano-banana-2.1",
// Configure the model to respond with images only.
new GenerationConfig.Builder()
.setResponseModalities(Arrays.asList(ResponseModality.IMAGE))
.build()
);
GenerativeModelFutures model = GenerativeModelFutures.from(ai);
// Provide a text prompt instructing the model to generate an image
Content prompt = new Content.Builder()
.addText("Generate an image of the Eiffel Tower with fireworks in the background.")
.build();
// To generate an image, call `generateContent` with the text input
ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
@Override
public void onSuccess(GenerateContentResponse result) {
// iterate over all the parts in the first candidate in the result object
for (Part part : result.getCandidates().get(0).getContent().getParts()) {
if (part instanceof ImagePart) {
ImagePart imagePart = (ImagePart) part;
// The returned image as a bitmap
Bitmap generatedImageAsBitmap = imagePart.getImage();
break;
}
}
}
@Override
public void onFailure(Throwable t) {
t.printStackTrace();
}
}, executor);
Web
import { initializeApp } from "firebase/app";
import { getAI, getGenerativeModel, GoogleAIBackend, ResponseModality } from "firebase/ai";
// TODO(developer): Replace the following with your app's Firebase configuration
// See: https://firebase.google.com/docs/web/learn-more#config-object
const firebaseConfig = {
// ...
};
// Initialize FirebaseApp
const firebaseApp = initializeApp(firebaseConfig);
// Initialize the Gemini Developer API backend service.
const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });
// Create a `GenerativeModel` instance with a model that supports your use case
const model = getGenerativeModel(ai, {
model: "gemini-nano-banana-2.1",
// Configure the model to respond with images only.
generationConfig: {
responseModalities: [ResponseModality.IMAGE],
},
});
// Provide a text prompt instructing the model to generate an image
const prompt = 'Generate an image of the Eiffel Tower with fireworks in the background.';
// To generate an image, call `generateContent` with the text input
const result = model.generateContent(prompt);
// Handle the generated image
try {
const inlineDataParts = result.response.inlineDataParts();
if (inlineDataParts?.[0]) {
const image = inlineDataParts[0].inlineData;
console.log(image.mimeType, image.data);
}
} catch (err) {
console.error('Prompt or candidate was blocked:', err);
}
Dart
import 'package:firebase_ai/firebase_ai.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
final model = FirebaseAI.googleAI().generativeModel(
model: 'gemini-nano-banana-2.1',
// Configure the model to respond with images only.
generationConfig: GenerationConfig(responseModalities: [ResponseModalities.image]),
);
// Provide a text prompt instructing the model to generate an image
final prompt = [Content.text('Generate an image of the Eiffel Tower with fireworks in the background.')];
// To generate an image, call `generateContent` with the text input
final response = await model.generateContent(prompt);
if (response.inlineDataParts.isNotEmpty) {
final imageBytes = response.inlineDataParts[0].bytes;
// Process the image
} else {
// Handle the case where no images were generated
print('Error: No images were generated.');
}
Unity
using Firebase;
using Firebase.AI;
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
var model = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI()).GetGenerativeModel(
modelName: "gemini-nano-banana-2.1",
// Configure the model to respond with images only.
generationConfig: new GenerationConfig(
responseModalities: new[] { ResponseModality.Image })
);
// Provide a text prompt instructing the model to generate an image
var prompt = "Generate an image of the Eiffel Tower with fireworks in the background.";
// To generate an image, call `GenerateContentAsync` with the text input
var response = await model.GenerateContentAsync(prompt);
// Handle the generated image
var imageParts = response.Candidates.First().Content.Parts
.OfType<ModelContent.InlineDataPart>()
.Where(part => part.MimeType == "image/png");
foreach (var imagePart in imageParts) {
// Load the Image into a Unity Texture2D object
UnityEngine.Texture2D texture2D = new(2, 2);
if (texture2D.LoadImage(imagePart.Data.ToArray())) {
// Do something with the image
}
}
Editar imagens (entrada de texto e imagem)
|
Antes de testar este exemplo, conclua a seção
Antes de começar deste guia
para configurar seu projeto e app. Nessa seção, você também vai clicar em um botão para o provedor do Gemini API escolhido para ver o conteúdo específico do provedor nesta página. |
É possível pedir que um modelo Gemini Nano Banana edite imagens usando um comando com texto e uma ou mais imagens.
Crie uma instância GenerativeModel,
inclua a modalidade de resposta de IMAGE na configuração do modelo
e chame generateContent.
Swift
import FirebaseAILogic
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
let model = FirebaseAI.firebaseAI(backend: .googleAI()).generativeModel(
modelName: "gemini-nano-banana-2.1",
// Configure the model to respond with images only.
generationConfig: GenerationConfig(responseModalities: [.image])
)
// Provide an image for the model to edit
guard let image = UIImage(named: "scones") else { fatalError("Image file not found.") }
// Provide a text prompt instructing the model to edit the image
let prompt = "Edit this image to make it look like a cartoon"
// To edit the image, call `generateContent` with the image and text input
let response = try await model.generateContent(image, prompt)
// Handle the generated image
guard let inlineDataPart = response.inlineDataParts.first else {
fatalError("No image data in response.")
}
guard let uiImage = UIImage(data: inlineDataPart.data) else {
fatalError("Failed to convert data to UIImage.")
}
Kotlin
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(
modelName = "gemini-nano-banana-2.1",
// Configure the model to respond with images only.
generationConfig = generationConfig {
responseModalities = listOf(ResponseModality.IMAGE) }
)
// Provide an image for the model to edit
val bitmap = BitmapFactory.decodeResource(context.resources, R.drawable.scones)
// Provide a text prompt instructing the model to edit the image
val prompt = content {
image(bitmap)
text("Edit this image to make it look like a cartoon")
}
// To edit the image, call `generateContent` with the prompt (image and text input)
val generatedImageAsBitmap = model.generateContent(prompt)
// Handle the generated text and image
.candidates.first().content.parts.filterIsInstance<ImagePart>().firstOrNull()?.image
Java
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI()).generativeModel(
"gemini-nano-banana-2.1",
// Configure the model to respond with images only.
new GenerationConfig.Builder()
.setResponseModalities(Arrays.asList(ResponseModality.IMAGE))
.build()
);
GenerativeModelFutures model = GenerativeModelFutures.from(ai);
// Provide an image for the model to edit
Bitmap bitmap = BitmapFactory.decodeResource(resources, R.drawable.scones);
// Provide a text prompt instructing the model to edit the image
Content promptcontent = new Content.Builder()
.addImage(bitmap)
.addText("Edit this image to make it look like a cartoon")
.build();
// To edit the image, call `generateContent` with the prompt (image and text input)
ListenableFuture<GenerateContentResponse> response = model.generateContent(promptcontent);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
@Override
public void onSuccess(GenerateContentResponse result) {
// iterate over all the parts in the first candidate in the result object
for (Part part : result.getCandidates().get(0).getContent().getParts()) {
if (part instanceof ImagePart) {
ImagePart imagePart = (ImagePart) part;
Bitmap generatedImageAsBitmap = imagePart.getImage();
break;
}
}
}
@Override
public void onFailure(Throwable t) {
t.printStackTrace();
}
}, executor);
Web
import { initializeApp } from "firebase/app";
import { getAI, getGenerativeModel, GoogleAIBackend, ResponseModality } from "firebase/ai";
// TODO(developer): Replace the following with your app's Firebase configuration
// See: https://firebase.google.com/docs/web/learn-more#config-object
const firebaseConfig = {
// ...
};
// Initialize FirebaseApp
const firebaseApp = initializeApp(firebaseConfig);
// Initialize the Gemini Developer API backend service.
const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });
// Create a `GenerativeModel` instance with a model that supports your use case
const model = getGenerativeModel(ai, {
model: "gemini-nano-banana-2.1",
// Configure the model to respond with images only.
generationConfig: {
responseModalities: [ResponseModality.IMAGE],
},
});
// Prepare an image for the model to edit
async function fileToGenerativePart(file) {
const base64EncodedDataPromise = new Promise((resolve) => {
const reader = new FileReader();
reader.onloadend = () => resolve(reader.result.split(',')[1]);
reader.readAsDataURL(file);
});
return {
type: "inlineData",
inlineData: { data: await base64EncodedDataPromise, mimeType: file.type },
};
}
// Provide a text prompt instructing the model to edit the image
const prompt = "Edit this image to make it look like a cartoon";
const fileInputEl = document.querySelector("input[type=file]");
const imagePart = await fileToGenerativePart(fileInputEl.files[0]);
// To edit the image, call `generateContent` with the image and text input
const result = await model.generateContent([prompt, imagePart]);
// Handle the generated image
try {
const inlineDataParts = result.response.inlineDataParts();
if (inlineDataParts?.[0]) {
const image = inlineDataParts[0].inlineData;
console.log(image.mimeType, image.data);
}
} catch (err) {
console.error('Prompt or candidate was blocked:', err);
}
Dart
import 'package:firebase_ai/firebase_ai.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
final model = FirebaseAI.googleAI().generativeModel(
model: 'gemini-nano-banana-2.1',
// Configure the model to respond with images only.
generationConfig: GenerationConfig(responseModalities: [ResponseModalities.image]),
);
// Prepare an image for the model to edit
final image = await File('scones.jpg').readAsBytes();
final imagePart = InlineDataPart('image/jpeg', image);
// Provide a text prompt instructing the model to edit the image
final prompt = TextPart("Edit this image to make it look like a cartoon");
// To edit the image, call `generateContent` with the image and text input
final response = await model.generateContent([
Content.multi([prompt,imagePart])
]);
// Handle the generated image
if (response.inlineDataParts.isNotEmpty) {
final imageBytes = response.inlineDataParts[0].bytes;
// Process the image
} else {
// Handle the case where no images were generated
print('Error: No images were generated.');
}
Unity
using Firebase;
using Firebase.AI;
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
var model = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI()).GetGenerativeModel(
modelName: "gemini-nano-banana-2.1",
// Configure the model to respond with images only.
generationConfig: new GenerationConfig(
responseModalities: new[] { ResponseModality.Image })
);
// Prepare an image for the model to edit
var imageFile = System.IO.File.ReadAllBytes(System.IO.Path.Combine(
UnityEngine.Application.streamingAssetsPath, "scones.jpg"));
var image = ModelContent.InlineData("image/jpeg", imageFile);
// Provide a text prompt instructing the model to edit the image
var prompt = ModelContent.Text("Edit this image to make it look like a cartoon.");
// To edit the image, call `GenerateContent` with the image and text input
var response = await model.GenerateContentAsync(new [] { prompt, image });
// Handle the generated image
var imageParts = response.Candidates.First().Content.Parts
.OfType<ModelContent.InlineDataPart>()
.Where(part => part.MimeType == "image/png");
foreach (var imagePart in imageParts) {
// Load the Image into a Unity Texture2D object
Texture2D texture2D = new Texture2D(2, 2);
if (texture2D.LoadImage(imagePart.Data.ToArray())) {
// Do something with the image
}
}
Gerar imagens com base em entradas de vídeo (entrada de texto e vídeo)
|
Antes de testar este exemplo, conclua a seção
Antes de começar deste guia
para configurar seu projeto e app. Nessa seção, você também vai clicar em um botão para o provedor do Gemini API escolhido para ver o conteúdo específico do provedor nesta página. |
Você pode pedir que um modelo Gemini Nano Banana gere imagens usando um comando com texto e um vídeo.
Crie uma instância GenerativeModel,
inclua a modalidade de resposta de IMAGE na configuração do modelo
e chame generateContent.
Swift
import FirebaseAILogic
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
let model = FirebaseAI.firebaseAI(backend: .googleAI()).generativeModel(
modelName: "gemini-nano-banana-2.1",
// Configure the model to respond with images only.
generationConfig: GenerationConfig(responseModalities: [.image])
)
// Provide the video as `Data` with the appropriate MIME type.
let video = InlineDataPart(data: try Data(contentsOf: videoURL), mimeType: "video/mp4")
// Provide a text prompt instructing the model to generate an image.
let prompt = "Generate a poster image that captures the key themes of this video."
// To generate an image, call `generateContent` with the video and text input.
let response = try await model.generateContent(video, prompt)
// Handle the generated image.
guard let inlineDataPart = response.inlineDataParts.first else {
fatalError("No image data in response.")
}
guard let uiImage = UIImage(data: inlineDataPart.data) else {
fatalError("Failed to convert data to UIImage.")
}
Kotlin
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(
modelName = "gemini-nano-banana-2.1",
// Configure the model to respond with images only.
generationConfig = generationConfig {
responseModalities = listOf(ResponseModality.IMAGE) }
)
val contentResolver = applicationContext.contentResolver
contentResolver.openInputStream(videoUri).use { stream ->
stream?.let {
val bytes = stream.readBytes()
// Provide a prompt that includes the video specified above and text.
val prompt = content {
inlineData(bytes, "video/mp4")
text("Generate a poster image that captures the key themes of this video.")
}
// Call generateContent with the prompt (video and text input).
val response = model.generateContent(prompt)
// Handle the generated image.
val generatedImageAsBitmap = response.candidates.first().content.parts
.filterIsInstance<ImagePart>().firstOrNull()?.image
}
}
Java
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI()).generativeModel(
"gemini-nano-banana-2.1",
// Configure the model to respond with images only.
new GenerationConfig.Builder()
.setResponseModalities(Arrays.asList(ResponseModality.IMAGE))
.build()
);
GenerativeModelFutures model = GenerativeModelFutures.from(ai);
ContentResolver resolver = getApplicationContext().getContentResolver();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try (java.io.InputStream inputStream = resolver.openInputStream(videoUri)) {
if (inputStream != null) {
int bytesRead;
byte[] buffer = new byte[16384];
while ((bytesRead = inputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, bytesRead);
}
}
} catch (IOException e) {
e.printStackTrace();
}
// Provide a prompt that includes the video specified above and text.
Content promptContent = new Content.Builder()
.addInlineData(byteArrayOutputStream.toByteArray(), "video/mp4")
.addText("Generate a poster image that captures the key themes of this video.")
.build();
// Call generateContent with the prompt (video and text input).
ListenableFuture<GenerateContentResponse> response = model.generateContent(promptContent);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
@Override
public void onSuccess(GenerateContentResponse result) {
// We didn't get any images back from the model.
if (result.getCandidates().isEmpty()) {
return;
}
// Handle the generated image.
for (Part part : result.getCandidates().get(0).getContent().getParts()) {
if (part instanceof ImagePart) {
ImagePart imagePart = (ImagePart) part;
Bitmap generatedImageAsBitmap = imagePart.getImage();
break;
}
}
}
@Override
public void onFailure(Throwable t) {
t.printStackTrace();
}
}, executor);
Web
import { initializeApp } from "firebase/app";
import { getAI, getGenerativeModel, GoogleAIBackend, ResponseModality } from "firebase/ai";
// TODO(developer): Replace the following with your app's Firebase configuration
// See: https://firebase.google.com/docs/web/learn-more#config-object
const firebaseConfig = {
// ...
};
// Initialize FirebaseApp
const firebaseApp = initializeApp(firebaseConfig);
// Initialize the Gemini Developer API backend service.
const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });
// Create a `GenerativeModel` instance with a model that supports your use case
const model = getGenerativeModel(ai, {
model: "gemini-nano-banana-2.1",
// Configure the model to respond with images only.
generationConfig: {
responseModalities: [ResponseModality.IMAGE],
},
});
// Converts a File object to a Part object.
async function fileToGenerativePart(file) {
const base64EncodedDataPromise = new Promise((resolve) => {
const reader = new FileReader();
reader.onloadend = () => resolve(reader.result.split(',')[1]);
reader.readAsDataURL(file);
});
return {
inlineData: { data: await base64EncodedDataPromise, mimeType: file.type },
};
}
async function run() {
// Provide a text prompt instructing the model to generate an image.
const prompt = "Generate a poster image that captures the key themes of this video.";
const fileInputEl = document.querySelector("input[type=file]");
const videoPart = await fileToGenerativePart(fileInputEl.files[0]);
// Call generateContent with the video and text input.
const result = await model.generateContent([prompt, videoPart]);
// Handle the generated image.
try {
const inlineDataParts = result.response.inlineDataParts();
if (inlineDataParts?.[0]) {
const image = inlineDataParts[0].inlineData;
console.log(image.mimeType, image.data);
}
} catch (err) {
console.error('Prompt or candidate was blocked:', err);
}
}
run();
Dart
import 'package:firebase_ai/firebase_ai.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
final model = FirebaseAI.googleAI().generativeModel(
model: 'gemini-nano-banana-2.1',
// Configure the model to respond with images only.
generationConfig: GenerationConfig(responseModalities: [ResponseModalities.image]),
);
// Prepare video for input.
final video = await File('video0.mp4').readAsBytes();
final videoPart = InlineDataPart('video/mp4', video);
// Provide a text prompt instructing the model to generate an image.
final prompt = TextPart("Generate a poster image that captures the key themes of this video.");
// Call generateContent with the video and text input.
final response = await model.generateContent([
Content.multi([prompt, videoPart])
]);
// Handle the generated image.
if (response.inlineDataParts.isNotEmpty) {
final imageBytes = response.inlineDataParts.first.bytes;
// Process the image.
} else {
// Handle the case where no images were generated.
print('Error: No images were generated.');
}
Unity
using Firebase;
using Firebase.AI;
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
var model = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI()).GetGenerativeModel(
modelName: "gemini-nano-banana-2.1",
// Configure the model to respond with images only.
generationConfig: new GenerationConfig(
responseModalities: new[] { ResponseModality.Image })
);
// Prepare a video for input.
var videoFile = System.IO.File.ReadAllBytes(System.IO.Path.Combine(
UnityEngine.Application.streamingAssetsPath, "yourVideo.mp4"));
var video = ModelContent.InlineData("video/mp4", videoFile);
// Provide a text prompt instructing the model to generate an image.
var prompt = ModelContent.Text("Generate a poster image that captures the key themes of this video.");
// Call GenerateContentAsync with the video and text input.
var response = await model.GenerateContentAsync(new [] { prompt, video });
// Handle the generated image.
var imageParts = response.Candidates.First().Content.Parts
.OfType<ModelContent.InlineDataPart>()
.Where(part => part.MimeType == "image/png");
foreach (var imagePart in imageParts) {
// Load the Image into a Unity Texture2D object.
Texture2D texture2D = new Texture2D(2, 2);
if (texture2D.LoadImage(imagePart.Data.ToArray())) {
// Do something with the image.
}
}
Gerar resposta com textos e imagens
|
Antes de testar este exemplo, conclua a seção
Antes de começar deste guia
para configurar seu projeto e app. Nessa seção, você também vai clicar em um botão para o provedor do Gemini API escolhido para ver o conteúdo específico do provedor nesta página. |
Você pode pedir que um modelo Gemini Nano Banana gere imagens intercaladas com as respostas de texto. Por exemplo, é possível gerar imagens de como cada etapa de uma receita gerada pode ser, junto com as instruções da etapa, e não é necessário fazer solicitações separadas para o modelo ou modelos diferentes.
Crie uma instância GenerativeModel,
inclua as modalidades de resposta de TEXT e IMAGE na configuração do modelo
e chame generateContent.
Swift
import FirebaseAILogic
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
let model = FirebaseAI.firebaseAI(backend: .googleAI()).generativeModel(
modelName: "gemini-nano-banana-2.1",
// Configure the model to respond with text and images.
generationConfig: GenerationConfig(responseModalities: [.text, .image])
)
// Provide a text prompt instructing the model to generate interleaved text and images
let prompt = """
Generate an illustrated recipe for a paella.
Create images to go alongside the text as you generate the recipe
"""
// To generate interleaved text and images, call `generateContent` with the text input
let response = try await model.generateContent(prompt)
// Handle the generated text and image
guard let candidate = response.candidates.first else {
fatalError("No candidates in response.")
}
for part in candidate.content.parts {
switch part {
case let textPart as TextPart:
// Do something with the generated text
let text = textPart.text
case let inlineDataPart as InlineDataPart:
// Do something with the generated image
guard let uiImage = UIImage(data: inlineDataPart.data) else {
fatalError("Failed to convert data to UIImage.")
}
default:
fatalError("Unsupported part type: \(part)")
}
}
Kotlin
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(
modelName = "gemini-nano-banana-2.1",
// Configure the model to respond with text and images.
generationConfig = generationConfig {
responseModalities = listOf(ResponseModality.TEXT, ResponseModality.IMAGE) }
)
// Provide a text prompt instructing the model to generate interleaved text and images
val prompt = """
Generate an illustrated recipe for a paella.
Create images to go alongside the text as you generate the recipe
""".trimIndent()
// To generate interleaved text and images, call `generateContent` with the text input
val responseContent = model.generateContent(prompt).candidates.first().content
// The response will contain image and text parts interleaved
for (part in responseContent.parts) {
when (part) {
is ImagePart -> {
// ImagePart as a bitmap
val generatedImageAsBitmap: Bitmap? = part.asImageOrNull()
}
is TextPart -> {
// Text content from the TextPart
val text = part.text
}
}
}
Java
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI()).generativeModel(
"gemini-nano-banana-2.1",
// Configure the model to respond with text and images.
new GenerationConfig.Builder()
.setResponseModalities(Arrays.asList(ResponseModality.TEXT, ResponseModality.IMAGE))
.build()
);
GenerativeModelFutures model = GenerativeModelFutures.from(ai);
// Provide a text prompt instructing the model to generate interleaved text and images
Content prompt = new Content.Builder()
.addText("Generate an illustrated recipe for a paella.\n" +
"Create images to go alongside the text as you generate the recipe")
.build();
// To generate interleaved text and images, call `generateContent` with the text input
ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
@Override
public void onSuccess(GenerateContentResponse result) {
Content responseContent = result.getCandidates().get(0).getContent();
// The response will contain image and text parts interleaved
for (Part part : responseContent.getParts()) {
if (part instanceof ImagePart) {
// ImagePart as a bitmap
Bitmap generatedImageAsBitmap = ((ImagePart) part).getImage();
} else if (part instanceof TextPart){
// Text content from the TextPart
String text = ((TextPart) part).getText();
}
}
}
@Override
public void onFailure(Throwable t) {
System.err.println(t);
}
}, executor);
Web
import { initializeApp } from "firebase/app";
import { getAI, getGenerativeModel, GoogleAIBackend, ResponseModality } from "firebase/ai";
// TODO(developer): Replace the following with your app's Firebase configuration
// See: https://firebase.google.com/docs/web/learn-more#config-object
const firebaseConfig = {
// ...
};
// Initialize FirebaseApp
const firebaseApp = initializeApp(firebaseConfig);
// Initialize the Gemini Developer API backend service.
const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });
// Create a `GenerativeModel` instance with a model that supports your use case
const model = getGenerativeModel(ai, {
model: "gemini-nano-banana-2.1",
// Configure the model to respond with text and images.
generationConfig: {
responseModalities: [ResponseModality.TEXT, ResponseModality.IMAGE],
},
});
// Provide a text prompt instructing the model to generate interleaved text and images
const prompt = 'Generate an illustrated recipe for a paella.\n.' +
'Create images to go alongside the text as you generate the recipe';
// To generate interleaved text and images, call `generateContent` with the text input
const result = await model.generateContent(prompt);
// Handle the generated text and image
try {
const response = result.response;
if (response.candidates?.[0].content?.parts) {
for (const part of response.candidates?.[0].content?.parts) {
if (part.type === "text") {
// Do something with the text
console.log(part.text);
}
if (part.type === "inlineData") {
// Do something with the image
const image = part.inlineData;
console.log(image.mimeType, image.data);
}
}
}
} catch (err) {
console.error('Prompt or candidate was blocked:', err);
}
Dart
import 'package:firebase_ai/firebase_ai.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
final model = FirebaseAI.googleAI().generativeModel(
model: 'gemini-nano-banana-2.1',
// Configure the model to respond with text and images.
generationConfig: GenerationConfig(responseModalities: [ResponseModalities.text, ResponseModalities.image]),
);
// Provide a text prompt instructing the model to generate interleaved text and images
final prompt = [Content.text(
'Generate an illustrated recipe for a paella\n ' +
'Create images to go alongside the text as you generate the recipe'
)];
// To generate interleaved text and images, call `generateContent` with the text input
final response = await model.generateContent(prompt);
// Handle the generated text and image
final parts = response.candidates.firstOrNull?.content.parts;
if (parts != null && parts.isNotEmpty) {
for (final part in parts) {
if (part is TextPart) {
// Do something with text part
final text = part.text;
}
if (part is InlineDataPart) {
// Process image
final imageBytes = part.bytes;
}
}
} else {
// Handle the case where no images were generated
print('Error: No images were generated.');
}
Unity
using Firebase;
using Firebase.AI;
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
var model = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI()).GetGenerativeModel(
modelName: "gemini-nano-banana-2.1",
// Configure the model to respond with text and images.
generationConfig: new GenerationConfig(
responseModalities: new[] { ResponseModality.Text, ResponseModality.Image })
);
// Provide a text prompt instructing the model to generate interleaved text and images
var prompt = "Generate an illustrated recipe for a paella \n" +
"Create images to go alongside the text as you generate the recipe";
// To generate interleaved text and images, call `GenerateContentAsync` with the text input
var response = await model.GenerateContentAsync(prompt);
// Handle the generated text and image
foreach (var part in response.Candidates.First().Content.Parts) {
if (part is ModelContent.TextPart textPart) {
if (!string.IsNullOrWhiteSpace(textPart.Text)) {
// Do something with the text
}
} else if (part is ModelContent.InlineDataPart dataPart) {
if (dataPart.MimeType == "image/png") {
// Load the Image into a Unity Texture2D object
UnityEngine.Texture2D texture2D = new(2, 2);
if (texture2D.LoadImage(dataPart.Data.ToArray())) {
// Do something with the image
}
}
}
}
Iterar e editar imagens usando a conversa multiturno
|
Antes de testar este exemplo, conclua a seção
Antes de começar deste guia
para configurar seu projeto e app. Nessa seção, você também vai clicar em um botão para o provedor do Gemini API escolhido para ver o conteúdo específico do provedor nesta página. |
Usando a conversa multiturno, é possível interagir com um modelo Gemini Nano Banana nas imagens que ele gera ou que você fornece.
Crie uma instância GenerativeModel,
inclua a modalidade de resposta de IMAGE na configuração do modelo
e chame startChat() e sendMessage() para enviar novas mensagens do usuário.
Swift
import FirebaseAILogic
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
let model = FirebaseAI.firebaseAI(backend: .googleAI()).generativeModel(
modelName: "gemini-nano-banana-2.1",
// Configure the model to respond with images only.
generationConfig: GenerationConfig(responseModalities: [.image])
)
// Initialize the chat
let chat = model.startChat()
guard let image = UIImage(named: "scones") else { fatalError("Image file not found.") }
// Provide an initial text prompt instructing the model to edit the image
let prompt = "Edit this image to make it look like a cartoon"
// To generate an initial response, send a user message with the image and text prompt
let response = try await chat.sendMessage(image, prompt)
// Inspect the generated image
guard let inlineDataPart = response.inlineDataParts.first else {
fatalError("No image data in response.")
}
guard let uiImage = UIImage(data: inlineDataPart.data) else {
fatalError("Failed to convert data to UIImage.")
}
// Follow up requests do not need to specify the image again
let followUpResponse = try await chat.sendMessage("But make it old-school line drawing style")
// Inspect the edited image after the follow up request
guard let followUpInlineDataPart = followUpResponse.inlineDataParts.first else {
fatalError("No image data in response.")
}
guard let followUpUIImage = UIImage(data: followUpInlineDataPart.data) else {
fatalError("Failed to convert data to UIImage.")
}
Kotlin
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(
modelName = "gemini-nano-banana-2.1",
// Configure the model to respond with images only.
generationConfig = generationConfig {
responseModalities = listOf(ResponseModality.IMAGE) }
)
// Provide an image for the model to edit
val bitmap = BitmapFactory.decodeResource(context.resources, R.drawable.scones)
// Create the initial prompt instructing the model to edit the image
val prompt = content {
image(bitmap)
text("Edit this image to make it look like a cartoon")
}
// Initialize the chat
val chat = model.startChat()
// To generate an initial response, send a user message with the image and text prompt
var response = chat.sendMessage(prompt)
// Inspect the returned image
var generatedImageAsBitmap = response
.candidates.first().content.parts.filterIsInstance<ImagePart>().firstOrNull()?.image
// Follow up requests do not need to specify the image again
response = chat.sendMessage("But make it old-school line drawing style")
generatedImageAsBitmap = response
.candidates.first().content.parts.filterIsInstance<ImagePart>().firstOrNull()?.image
Java
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI()).generativeModel(
"gemini-nano-banana-2.1",
// Configure the model to respond with images only.
new GenerationConfig.Builder()
.setResponseModalities(Arrays.asList(ResponseModality.IMAGE))
.build()
);
GenerativeModelFutures model = GenerativeModelFutures.from(ai);
// Provide an image for the model to edit
Bitmap bitmap = BitmapFactory.decodeResource(resources, R.drawable.scones);
// Initialize the chat
ChatFutures chat = model.startChat();
// Create the initial prompt instructing the model to edit the image
Content prompt = new Content.Builder()
.setRole("user")
.addImage(bitmap)
.addText("Edit this image to make it look like a cartoon")
.build();
// To generate an initial response, send a user message with the image and text prompt
ListenableFuture<GenerateContentResponse> response = chat.sendMessage(prompt);
// Extract the image from the initial response
ListenableFuture<@Nullable Bitmap> initialRequest = Futures.transform(response, result -> {
for (Part part : result.getCandidates().get(0).getContent().getParts()) {
if (part instanceof ImagePart) {
ImagePart imagePart = (ImagePart) part;
return imagePart.getImage();
}
}
return null;
}, executor);
// Follow up requests do not need to specify the image again
ListenableFuture<GenerateContentResponse> modelResponseFuture = Futures.transformAsync(
initialRequest,
generatedImage -> {
Content followUpPrompt = new Content.Builder()
.addText("But make it old-school line drawing style")
.build();
return chat.sendMessage(followUpPrompt);
},
executor);
// Add a final callback to check the reworked image
Futures.addCallback(modelResponseFuture, new FutureCallback<GenerateContentResponse>() {
@Override
public void onSuccess(GenerateContentResponse result) {
for (Part part : result.getCandidates().get(0).getContent().getParts()) {
if (part instanceof ImagePart) {
ImagePart imagePart = (ImagePart) part;
Bitmap generatedImageAsBitmap = imagePart.getImage();
break;
}
}
}
@Override
public void onFailure(Throwable t) {
t.printStackTrace();
}
}, executor);
Web
import { initializeApp } from "firebase/app";
import { getAI, getGenerativeModel, GoogleAIBackend, ResponseModality } from "firebase/ai";
// TODO(developer): Replace the following with your app's Firebase configuration
// See: https://firebase.google.com/docs/web/learn-more#config-object
const firebaseConfig = {
// ...
};
// Initialize FirebaseApp
const firebaseApp = initializeApp(firebaseConfig);
// Initialize the Gemini Developer API backend service.
const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });
// Create a `GenerativeModel` instance with a model that supports your use case
const model = getGenerativeModel(ai, {
model: "gemini-nano-banana-2.1",
// Configure the model to respond with images only.
generationConfig: {
responseModalities: [ResponseModality.IMAGE],
},
});
// Prepare an image for the model to edit
async function fileToGenerativePart(file) {
const base64EncodedDataPromise = new Promise((resolve) => {
const reader = new FileReader();
reader.onloadend = () => resolve(reader.result.split(',')[1]);
reader.readAsDataURL(file);
});
return {
type: "inlineData",
inlineData: { data: await base64EncodedDataPromise, mimeType: file.type },
};
}
const fileInputEl = document.querySelector("input[type=file]");
const imagePart = await fileToGenerativePart(fileInputEl.files[0]);
// Provide an initial text prompt instructing the model to edit the image
const prompt = "Edit this image to make it look like a cartoon";
// Initialize the chat
const chat = model.startChat();
// To generate an initial response, send a user message with the image and text prompt
const result = await chat.sendMessage([prompt, imagePart]);
// Request and inspect the generated image
try {
const inlineDataParts = result.response.inlineDataParts();
if (inlineDataParts?.[0]) {
// Inspect the generated image
const image = inlineDataParts[0].inlineData;
console.log(image.mimeType, image.data);
}
} catch (err) {
console.error('Prompt or candidate was blocked:', err);
}
// Follow up requests do not need to specify the image again
const followUpResult = await chat.sendMessage("But make it old-school line drawing style");
// Request and inspect the returned image
try {
const followUpInlineDataParts = followUpResult.response.inlineDataParts();
if (followUpInlineDataParts?.[0]) {
// Inspect the generated image
const followUpImage = followUpInlineDataParts[0].inlineData;
console.log(followUpImage.mimeType, followUpImage.data);
}
} catch (err) {
console.error('Prompt or candidate was blocked:', err);
}
Dart
import 'package:firebase_ai/firebase_ai.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
final model = FirebaseAI.googleAI().generativeModel(
model: 'gemini-nano-banana-2.1',
// Configure the model to respond with images only.
generationConfig: GenerationConfig(responseModalities: [ResponseModalities.image]),
);
// Prepare an image for the model to edit
final image = await File('scones.jpg').readAsBytes();
final imagePart = InlineDataPart('image/jpeg', image);
// Provide an initial text prompt instructing the model to edit the image
final prompt = TextPart("Edit this image to make it look like a cartoon");
// Initialize the chat
final chat = model.startChat();
// To generate an initial response, send a user message with the image and text prompt
final response = await chat.sendMessage([
Content.multi([prompt,imagePart])
]);
// Inspect the returned image
if (response.inlineDataParts.isNotEmpty) {
final imageBytes = response.inlineDataParts[0].bytes;
// Process the image
} else {
// Handle the case where no images were generated
print('Error: No images were generated.');
}
// Follow up requests do not need to specify the image again
final followUpResponse = await chat.sendMessage([
Content.text("But make it old-school line drawing style")
]);
// Inspect the returned image
if (followUpResponse.inlineDataParts.isNotEmpty) {
final followUpImageBytes = response.inlineDataParts[0].bytes;
// Process the image
} else {
// Handle the case where no images were generated
print('Error: No images were generated.');
}
Unity
using Firebase;
using Firebase.AI;
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
var model = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI()).GetGenerativeModel(
modelName: "gemini-nano-banana-2.1",
// Configure the model to respond with images only.
generationConfig: new GenerationConfig(
responseModalities: new[] { ResponseModality.Image })
);
// Prepare an image for the model to edit
var imageFile = System.IO.File.ReadAllBytes(System.IO.Path.Combine(
UnityEngine.Application.streamingAssetsPath, "scones.jpg"));
var image = ModelContent.InlineData("image/jpeg", imageFile);
// Provide an initial text prompt instructing the model to edit the image
var prompt = ModelContent.Text("Edit this image to make it look like a cartoon.");
// Initialize the chat
var chat = model.StartChat();
// To generate an initial response, send a user message with the image and text prompt
var response = await chat.SendMessageAsync(new [] { prompt, image });
// Inspect the returned image
var imageParts = response.Candidates.First().Content.Parts
.OfType<ModelContent.InlineDataPart>()
.Where(part => part.MimeType == "image/png");
// Load the image into a Unity Texture2D object
UnityEngine.Texture2D texture2D = new(2, 2);
if (texture2D.LoadImage(imageParts.First().Data.ToArray())) {
// Do something with the image
}
// Follow up requests do not need to specify the image again
var followUpResponse = await chat.SendMessageAsync("But make it old-school line drawing style");
// Inspect the returned image
var followUpImageParts = followUpResponse.Candidates.First().Content.Parts
.OfType<ModelContent.InlineDataPart>()
.Where(part => part.MimeType == "image/png");
// Load the image into a Unity Texture2D object
UnityEngine.Texture2D followUpTexture2D = new(2, 2);
if (followUpTexture2D.LoadImage(followUpImageParts.First().Data.ToArray())) {
// Do something with the image
}
Fornecer imagens de referência
Os modelos Gemini Nano Banana permitem que você forneça imagens de referência no seu comando. Essas imagens podem incluir o seguinte:
Gemini Nano Banana 2.1 (
gemini-nano-banana-2.1):- Até 10 imagens de objetos com alta fidelidade para incluir na imagem final
- Até 4 imagens de personagens para manter a consistência deles
Gemini Nano Banana 2 (
gemini-3.1-flash-image):- Até 10 imagens de objetos com alta fidelidade para incluir na imagem final
- Até 4 imagens de personagens para manter a consistência deles
Gemini Nano Banana 2 Lite (
gemini-3.1-flash-lite-image):- Até 10 imagens de objetos com alta fidelidade para incluir na imagem final
- Até 4 imagens de personagens para manter a consistência deles
Gemini Nano Banana Pro (
gemini-3-pro-image)- Até 6 imagens de objetos com alta fidelidade para incluir na imagem final
- Até 5 imagens de personagens para manter a consistência deles
- Até 3 imagens para usar como referência de estilo
O modelo gemini-2.5-flash-image só aceita até 3 imagens.
Configurar a geração de imagens
Por padrão, os modelos Gemini Nano Banana geram imagens quadradas
(proporção de 1:1) com resolução de 1024 x 1024. É possível personalizar a saída das
imagens geradas usando a propriedade imageConfig em generationConfig.
Por exemplo, é possível configurar a imagem de saída usando tipos enumerados de proporção e tamanho de imagem (como uma proporção de 16:9 e resolução de 2K, resultando em uma imagem de 2752 x 1536), desta forma:
Swift
// ...
// Specify aspect ratio and image size (both optional) in an image config.
let imageConfig = ImageConfig(aspectRatio: .landscape16x9, imageSize: .size2K)
let generationConfig = GenerationConfig(
// Configure the model to respond with text (optional) and images (required).
// Include the text modality only if you want interleaved text and images in the response.
responseModalities: [.text, .image],
imageConfig: imageConfig
)
// Make sure you initialize your chosen Gemini API backend service
let model = FirebaseAI.firebaseAI().generativeModel(
modelName: "gemini-nano-banana-2.1",
generationConfig: generationConfig
)
// ...
Kotlin
// ...
val config = generationConfig {
// Configure the model to respond with text (optional) and images (required).
// Include the text modality only if you want interleaved text and images in the response.
responseModalities = listOf(ResponseModality.TEXT, ResponseModality.IMAGE)
// Specify aspect ratio and image size (both optional) in an image config.
imageConfig = imageConfig {
aspectRatio = AspectRatio.LANDSCAPE_16x9
imageSize = ImageSize.SIZE_2K
}
}
// Make sure you initialize your chosen Gemini API backend service
val model = Firebase.ai.generativeModel(
modelName = "gemini-nano-banana-2.1",
generationConfig = config
)
// ...
Java
// ...
GenerationConfig config = new GenerationConfig.Builder()
// Configure the model to respond with text (optional) and images (required).
// Include the text modality only if you want interleaved text and images in the response.
.setResponseModalities(Arrays.asList(ResponseModality.TEXT, ResponseModality.IMAGE))
// Specify aspect ratio and image size (both optional) in an image config.
.setImageConfig(
ImageConfig.builder()
.setAspectRatio(AspectRatio.LANDSCAPE_16x9)
.setImageSize(ImageSize.SIZE_2K)
.build()
)
.build();
// Make sure you initialize your chosen Gemini API backend service
GenerativeModel model = FirebaseAI.getInstance().generativeModel(
"gemini-nano-banana-2.1",
config
);
// ...
Web
import {
getGenerativeModel,
ResponseModality,
ImageConfigAspectRatio,
ImageConfigImageSize
} from "firebase/ai";
// ...
const generationConfig = {
// Configure the model to respond with text (optional) and images (required).
// Include the text modality only if you want interleaved text and images in the response.
responseModalities: [ResponseModality.TEXT, ResponseModality.IMAGE],
// Specify aspect ratio and image size (both optional) in an image config.
imageConfig: {
aspectRatio: ImageConfigAspectRatio.LANDSCAPE_16x9,
imageSize: ImageConfigImageSize.SIZE_2K
}
};
// Make sure you initialize your chosen Gemini API backend service
const model = getGenerativeModel(ai, {
model: "gemini-nano-banana-2.1",
generationConfig
});
// ...
Dart
// ...
final generationConfig = GenerationConfig(
// Configure the model to respond with text (optional) and images (required).
// Include the text modality only if you want interleaved text and images in the response.
responseModalities: [ResponseModalities.text, ResponseModalities.image],
// Specify aspect ratio and image size (both optional) in an image config.
imageConfig: ImageConfig(
aspectRatio: ImageAspectRatio.landscape16x9,
imageSize: ImageSize.size2K,
),
);
// Make sure you initialize your chosen Gemini API backend service
final model = FirebaseAI.instance.generativeModel(
model: 'gemini-nano-banana-2.1,
generationConfig: generationConfig,
);
// ...
Unity
// ...
var generationConfig = new GenerationConfig(
// Configure the model to respond with text (optional) and images (required).
// Include the text modality only if you want interleaved text and images in the response.
responseModalities: new[] { ResponseModality.Text, ResponseModality.Image },
// Specify aspect ratio and image size (both optional) in an image config.
imageConfig: new ImageConfig(
aspectRatio: ImageConfig.AspectRatio.Landscape16x9,
imageSize: ImageConfig.ImageSize.Size2K)
);
// Make sure you initialize your chosen Gemini API backend service.
var model = FirebaseAI.GetInstance().GetGenerativeModel(
modelName: "gemini-nano-banana-2.1",
generationConfig: generationConfig
);
// ...
Proporções compatíveis
Todos os modelos Gemini Nano Banana são compatíveis com as seguintes proporções:
Padrão: 1:1 (quadrado)
1:1, 1:4, 1:8, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1,
9:16, 16:9, 21:9
Tamanhos de imagem (resoluções) compatíveis
Os tamanhos de imagem (resoluções) aceitos dependem do modelo que você está usando.
| Gemini Nano Banana modelo | Tamanhos (resoluções) compatíveis |
|---|---|
Gemini Nano Banana 2.1gemini-nano-banana-2.1
|
Padrão: 1K (1024)1K (1024), 2K (2048), 4K (4096)
|
Gemini Nano Banana 2gemini-3.1-flash-image
|
Padrão: 1K (1024)512, 1K (1024), 2K (2048), 4K (4096)
|
Gemini Nano Banana 2 Litegemini-3.1-flash-lite-image
|
Padrão: 1K (1024)512 (somente Gemini Developer API), 1K (1024)
|
Gemini Nano Banana Progemini-3-pro-image
|
Padrão: 1K (1024)1K (1024), 2K (2048), 4K (4096)
|
Use um sufixo K em maiúsculas (ou seja, 1K, 2K, 4K).
O valor 512 não usa um sufixo K.
Um sufixo k em minúsculas (por exemplo, 1k) será rejeitado.
O modelo gemini-2.5-flash-image é fixado em 1K (1024).
Recursos compatíveis
Confira a seguir os recursos compatíveis, como modalidades, ferramentas, entrada e idiomas.
Para saber as proporções e resoluções compatíveis com cada modelo, consulte Configurar a geração de imagens anteriormente neste guia.
Modalidades aceitas
Confira a seguir as "modalidades" compatíveis com os modelos Gemini Nano Banana. Essas "modalidades" não são definidas explicitamente nas suas solicitações. Eles são mais como padrões recomendados para casos de uso comuns. Cada modalidade nesta lista mostra um exemplo de comando e tem um exemplo de código anteriormente neste guia.
Texto Imagens (somente texto para imagem)
- Gere uma imagem da Torre Eiffel com fogos de artifício ao fundo.
Texto Imagens (renderização de texto na imagem)
- Gere uma foto cinematográfica de um prédio grande com este texto gigante projetado na frente do prédio.
Edição de imagens (texto e imagem para imagem)
[imagem de scones] + Edite esta imagem para que ela pareça um desenho animado
[imagem de um gato] + [imagem de uma almofada] + Crie um ponto cruz do meu gato nesta almofada.
Imagens de vídeo e texto (texto e vídeo para imagem)
- [vídeo/URL de um parque] + Gere uma imagem de pôster que capture os principais temas deste vídeo.
Texto Imagens e texto (intercalados)
Gere uma receita ilustrada de paella. Crie imagens junto com o texto ao gerar a receita.
Crie uma história sobre um cachorro no estilo de animação 3D. Para cada cena, gere uma imagem.
Imagens e texto Imagens e texto (intercalados)
- [imagem de uma sala mobiliada] + Que outras cores de sofá combinariam com o meu espaço? Você pode atualizar a imagem?
Edição de imagens multiturno (chat)
- [imagem de um carro azul] + Transforme este carro em um conversível., depois Agora mude a cor para amarelo.
Ferramentas compatíveis
Suporte para
embasamento com
Gemini Nano Banana 2.1 (
gemini-nano-banana-2.1)Gemini Nano Banana 2 (
gemini-3.1-flash-image)Gemini Nano Banana Pro (
gemini-3-pro-image)
Outros recursos compatíveis
Entrada multimodal compatível:
Entrada de imagem: todos os modelos Nano Banana.
Entrada de vídeo:
- Gemini Nano Banana 2.1 (
gemini-nano-banana-2.1) - Gemini Nano Banana 2 (
gemini-3.1-flash-image) - Gemini Nano Banana 2 Lite (
gemini-3.1-flash-lite-image)
- Gemini Nano Banana 2.1 (
Entrada de áudio: nenhum dos modelos Nano Banana.
Todos os modelos Nano Banana são compatíveis com o seguinte:
- Gerando imagens PNG.
- Gerar e editar imagens de pessoas.
- Usar filtros de segurança que oferecem uma experiência do usuário flexível e menos restritiva.
Suporte para geração de saída estruturada (como JSON):
- Gemini Nano Banana Pro (
gemini-3-pro-image)
- Gemini Nano Banana Pro (
Idiomas compatíveis
Embora os modelos Gemini Nano Banana possam aceitar comandos de texto em vários idiomas, os idiomas listados nesta seção oferecem o melhor desempenho.
Estes são os idiomas disponíveis para o comando de texto e o texto na imagem generativa:
ar-EG, de-DE, EN, es-MX, fr-FR, hi-IN, id-ID, it-IT,
ja-JP, ko-KR, pt-BR, ru-RU, uk-UA, vi-VN, zh-CN
Para usar um idioma específico em uma imagem generativa (mesmo sem o código de idioma), basta pedir ao modelo no comando (por exemplo, "Atualize este infográfico para que ele fique em espanhol. Não mude nenhum outro elemento da imagem.").
O modelo gemini-2.5-flash-image só aceita
EN, es-MX, ja-JP, zh-CN e hi-IN no comando de texto e só pode
gerar inglês em imagens.
Práticas recomendadas
Confira as práticas recomendadas para modelos Gemini Nano Banana.
Ao gerar uma imagem que contém texto, primeiro gere o texto e depois gere uma imagem com esse texto.
A geração de imagens nem sempre é acionada. Além disso, a geração de imagens ou textos pode não funcionar como esperado nestas situações:
O modelo pode gerar apenas texto gerado e nenhuma imagem (especialmente se o comando for ambíguo). Se isso acontecer, o
FinishReasonseráNO_IMAGE.
Peça explicitamente para o modelo gerar imagens. Por exemplo, "gere uma imagem", "forneça imagens conforme avança", "atualize a imagem".O modelo pode parar de gerar no meio do processo.
Tente de novo ou use outro comando.O modelo pode gerar texto como uma imagem.
Peça explicitamente respostas em texto. Por exemplo, "gerar texto narrativo com ilustrações".Se um comando for potencialmente inseguro, o modelo pode não processar a solicitação e retornar uma resposta indicando que não pode criar imagens inseguras. Se isso acontecer, o
FinishReasonseráSTOP.