С помощью Gemini API вы можете создавать диалоги в свободной форме с несколькими репликами. Firebase AI Logic SDK упрощает этот процесс, управляя состоянием разговора, поэтому, в отличие от generateContent() (или generateContentStream()), вам не нужно хранить историю разговора самостоятельно.
Перейти к коду для текстового чата Перейти к коду для итеративного редактирования изображений Перейти к коду для потоковых ответов
Подготовка
|
Нажмите на название своего поставщика Gemini API, чтобы посмотреть контент и код, относящиеся к нему. |
Если вы ещё этого не сделали, ознакомьтесь с кратким руководством, в котором рассказывается, как настроить проект Firebase, подключить приложение к Firebase, добавить SDK, инициализировать бэкенд-службу для выбранного поставщика Gemini API и создать экземпляр GenerativeModel.
Для тестирования и доработки запросов рекомендуем использовать Google AI Studio.
Полезные ресурсы
Swift
Как попробовать приложение для быстрого запуска
Чтобы быстро опробовать SDK и посмотреть, как он работает в разных ситуациях, используйте приложение для быстрого старта. Если у вас нет собственного приложения для платформ Apple, используйте приложение для быстрого запуска. Чтобы использовать его, подключите его к проекту Firebase.
Перейти к приложению для быстрого старта
Посмотрите видеоруководство
В этом видео показано, как реализовать чат с Firebase AI Logic на примере приложения для планирования питания на основе искусственного интеллекта, в котором пользователи могут общаться с шеф-поваром о любых рецептах, которые они хотели бы приготовить.
Вы также можете скачать и изучить базу кода для приложения из видео.
Посмотреть базу кода для приложения из видео
Kotlin
Как попробовать приложение для быстрого запуска
Чтобы быстро опробовать SDK и посмотреть, как он работает в разных ситуациях, используйте приложение для быстрого старта. Если у вас нет собственного приложения Android, используйте приложение для быстрого запуска. Чтобы использовать его, вам нужно подключить его к проекту Firebase.
Java
Как попробовать приложение для быстрого запуска
Чтобы быстро опробовать SDK и посмотреть, как он работает в разных ситуациях, используйте приложение для быстрого старта. Если у вас нет собственного приложения Android, используйте приложение для быстрого запуска. Чтобы использовать его, вам нужно подключить его к проекту Firebase.
Web
Как попробовать приложение для быстрого запуска
Чтобы быстро опробовать SDK и посмотреть, как он работает в разных ситуациях, используйте приложение для быстрого старта. Если у вас нет собственного веб-приложения, используйте приложение для быстрого запуска. Чтобы использовать его, вам нужно подключить его к проекту Firebase.
Перейти к приложению для быстрого старта
Посмотрите видеоруководство
В этом видео показано, как реализовать чат с Firebase AI Logic на примере приложения для планирования питания на основе искусственного интеллекта, в котором пользователи могут общаться с шеф-поваром о любых рецептах, которые они хотели бы приготовить.
Вы также можете скачать и изучить базу кода для приложения из видео.
Посмотреть базу кода для приложения из видео
Dart
Как попробовать приложение для быстрого запуска
Чтобы быстро опробовать SDK и посмотреть, как он работает в разных ситуациях, используйте приложение для быстрого старта. Если у вас нет собственного приложения Flutter, используйте приложение для быстрого запуска. Чтобы использовать приложение для быстрого запуска, вам нужно подключить его к проекту Firebase.
Unity
Как попробовать приложение для быстрого запуска
Чтобы быстро опробовать SDK и посмотреть, как он работает в разных ситуациях, используйте приложение для быстрого старта. Если у вас нет собственной игры Unity, используйте приложение для быстрого запуска. Чтобы использовать приложение для быстрого запуска, вам нужно подключить его к проекту Firebase.
Создайте текстовый чат
|
Прежде чем использовать этот пример, выполните инструкции из раздела Подготовка этого руководства, чтобы настроить проект и приложение. В этом разделе также нужно нажать кнопку для выбранного поставщика Gemini API, чтобы на этой странице показывался контент, относящийся к нему. |
Чтобы создать многоэтапный разговор (например, чат), начните с инициализации чата, вызвав startChat(). Затем используйте sendMessage(), чтобы отправить новое сообщение пользователя, которое также добавит сообщение и ответ в историю чата.
Для role, связанного с контентом в чате, есть два возможных варианта:
user– роль, которая предоставляет запросы. Это значение используется по умолчанию для вызововsendMessage(). Если передать другую роль, функция выдаст исключение.model– роль, которая предоставляет ответы. Эту роль можно использовать при вызовеstartChat()с существующимhistory.Обратите внимание, что для
gemini-4-argon, моделейgemini-3.x-flash(кромеgemini-3.5-flash) иgemini-3.5-flash-liteготовые реплики модели не поддерживаются. Если последняя непустая реплика в запросе – это репликаmodel, запрос завершается ошибкой 400.
Swift
Вы можете вызвать startChat() и sendMessage(), чтобы отправить сообщение нового пользователя:
import FirebaseAILogic
// Initialize the Gemini Developer API backend service.
let ai = FirebaseAI.firebaseAI(backend: .googleAI())
// Create a `GenerativeModel` instance with a model that supports your use case.
let model = ai.generativeModel(modelName: "gemini-3.8-flash")
// Optionally specify existing chat history
let history = [
ModelContent(role: "user", parts: "Hello, I have 2 dogs in my house."),
ModelContent(role: "model", parts: "Great to meet you. What would you like to know?"),
]
// Initialize the chat with optional chat history
let chat = model.startChat(history: history)
// To generate text output, call sendMessage and pass in the message
let response = try await chat.sendMessage("How many paws are in my house?")
print(response.text ?? "No text in response.")
Kotlin
Чтобы отправить новое сообщение пользователю, вызовите startChat() и sendMessage():
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a model that supports your use case.
val model = Firebase.ai(backend = GenerativeBackend.googleAI())
.generativeModel("gemini-3.8-flash")
// Initialize the chat
val chat = model.startChat(
history = listOf(
content(role = "user") { text("Hello, I have 2 dogs in my house.") },
content(role = "model") { text("Great to meet you. What would you like to know?") }
)
)
val response = chat.sendMessage("How many paws are in my house?")
print(response.text)
Java
Вы можете вызвать startChat() и sendMessage(), чтобы отправить сообщение нового пользователя:
ListenableFuture.
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a model that supports your use case.
GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI())
.generativeModel("gemini-3.8-flash");
// Use the GenerativeModelFutures Java compatibility layer which offers
// support for ListenableFuture and Publisher APIs
GenerativeModelFutures model = GenerativeModelFutures.from(ai);
// (optional) Create previous chat history for context
Content.Builder userContentBuilder = new Content.Builder();
userContentBuilder.setRole("user");
userContentBuilder.addText("Hello, I have 2 dogs in my house.");
Content userContent = userContentBuilder.build();
Content.Builder modelContentBuilder = new Content.Builder();
modelContentBuilder.setRole("model");
modelContentBuilder.addText("Great to meet you. What would you like to know?");
Content modelContent = userContentBuilder.build();
List<Content> history = Arrays.asList(userContent, modelContent);
// Initialize the chat
ChatFutures chat = model.startChat(history);
// Create a new user message
Content.Builder messageBuilder = new Content.Builder();
messageBuilder.setRole("user");
messageBuilder.addText("How many paws are in my house?");
Content message = messageBuilder.build();
// Send the message
ListenableFuture<GenerateContentResponse> response = chat.sendMessage(message);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
@Override
public void onSuccess(GenerateContentResponse result) {
String resultText = result.getText();
System.out.println(resultText);
}
@Override
public void onFailure(Throwable t) {
t.printStackTrace();
}
}, executor);
Web
Вы можете вызвать startChat() и sendMessage(), чтобы отправить сообщение нового пользователя:
import { initializeApp } from "firebase/app";
import { getAI, getGenerativeModel, GoogleAIBackend } 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-3.8-flash" });
async function run() {
const chat = model.startChat({
history: [
{
role: "user",
parts: [{ type: "text", text: "Hello, I have 2 dogs in my house." }],
},
{
role: "model",
parts: [{ type: "text", text: "Great to meet you. What would you like to know?" }],
},
],
generationConfig: {
maxOutputTokens: 100,
},
});
const msg = "How many paws are in my house?";
const result = await chat.sendMessage(msg);
const text = result.response.text();
console.log(text);
}
run();
Dart
Чтобы отправить новое сообщение пользователя, вызовите startChat() и sendMessage():
import 'package:firebase_ai/firebase_ai.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';
// Initialize FirebaseApp
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a model that supports your use case.
final model =
FirebaseAI.googleAI().generativeModel(model: 'gemini-3.8-flash');
// Initialize the chat with history
final chat = model.startChat(
history: [
Content.text('Hello, I have 2 dogs in my house.'),
Content.model([const TextPart('Great to meet you. What would you like to know?')]),
],
);
// Send a message to the chat
final response = await chat.sendMessage(Content.text('How many paws are in my house?'));
print(response.text);
Unity
Вы можете вызвать StartChat() и SendMessageAsync(), чтобы отправить сообщение нового пользователя:
using Firebase;
using Firebase.AI;
// Initialize the Gemini Developer API backend service.
var ai = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI());
// Create a `GenerativeModel` instance with a model that supports your use case.
var model = ai.GetGenerativeModel(modelName: "gemini-3.8-flash");
// Optionally specify existing chat history
var history = new [] {
ModelContent.Text("Hello, I have 2 dogs in my house."),
new ModelContent("model", new ModelContent.TextPart("Great to meet you. What would you like to know?")),
};
// Initialize the chat with optional chat history
var chat = model.StartChat(history);
// To generate text output, call SendMessageAsync and pass in the message
var response = await chat.SendMessageAsync("How many paws are in my house?");
UnityEngine.Debug.Log(response.Text ?? "No text in response.");
Узнайте, как выбрать модель в зависимости от вашего приложения и целей.
Дорабатывайте и редактируйте изображения в чате
|
Прежде чем использовать этот пример, выполните инструкции из раздела Подготовка этого руководства, чтобы настроить проект и приложение. В этом разделе также нужно нажать кнопку для выбранного поставщика Gemini API, чтобы на этой странице показывался контент, относящийся к нему. |
В многоэтапном чате вы можете вместе с моделью Gemini Nano Banana работать над изображениями, которые она генерирует или которые вы ей предоставляете.
Создайте экземпляр GenerativeModel, включите модальность ответа IMAGE в конфигурацию модели и вызовите startChat() и sendMessage(), чтобы отправлять новые сообщения пользователей.
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
}
Включить потоковую передачу ответов
|
Прежде чем использовать этот пример, выполните инструкции из раздела Подготовка этого руководства, чтобы настроить проект и приложение. В этом разделе также нужно нажать кнопку для выбранного поставщика Gemini API, чтобы на этой странице показывался контент, относящийся к нему. |
Чтобы ускорить взаимодействие, вы можете не ждать, пока модель сгенерирует весь результат, а использовать потоковую передачу для обработки частичных результатов.
Чтобы получить ответ в виде потока, вызовите sendMessageStream().
Что ещё ты умеешь делать?
- Узнайте, как подсчитать токены, прежде чем отправлять модели длинные запросы.
- Настройте Cloud Storage for Firebase, чтобы добавлять большие файлы в мультимодальные запросы и эффективнее управлять файлами в запросах. Это могут быть изображения, PDF-файлы, видео и аудио.
-
Начните подготовку к запуску рабочей версии (см. контрольный список):
- Принудительно включите Firebase App Check как можно раньше, чтобы защитить Gemini API от злоупотреблений со стороны неавторизованных клиентов.
- Используйте Firebase Remote Config или шаблоны запросов на сервере, чтобы по запросу менять конфигурации ИИ-функций (например, название модели), не выпуская новую версию приложения.
Попробуйте другие возможности
- Генерировать текст на основе текстовых запросов.
- Генерируйте текст, используя в запросах файлы разных типов, например изображения, PDF-документы, видео и аудио.
- Генерировать структурированные выходные данные (например, JSON) на основе текстовых и мультимодальных запросов.
- Генерировать и редактировать изображения на основе текстовых и мультимодальных запросов.
-
Используйте инструменты, такие как вызов функций и обоснование с помощью
Google Search илиGoogle Maps , чтобы подключить модель Gemini к другим частям приложения, а также к внешним системам и информации.
Как управлять созданием контента
- Узнайте, как составлять запросы, в том числе ознакомьтесь с рекомендациями, стратегиями и примерами.
- Настройте параметры модели, например максимальное количество выходных токенов, вероятность повторения выходных токенов и т. д.
- Используйте настройки безопасности, чтобы снизить вероятность получения ответов, которые могут считаться вредоносными.
Подробнее о поддерживаемых моделях
Узнайте, какие модели доступны для разных сценариев использования, а также ознакомьтесь с их квотами и ценами.Оставить отзыв о работе с Firebase AI Logic