Думающая

Во всех последних моделях Gemini используется внутренний "процесс мышления", который значительно улучшает их способность к рассуждению и многоэтапному планированию, что делает их очень эффективными для выполнения сложных задач, таких как программирование, продвинутая математика и анализ данных.

Модели мышления предлагают следующие конфигурации и варианты:

  • Контролируйте объем обработки
    Вы можете настроить объем обработки, который может выполнять модель. Эта настройка особенно важна, если приоритет отдается снижению задержки или стоимости. Также ознакомьтесь со сравнением сложности задач, чтобы понять, насколько модели может понадобиться способность рассуждать.

    Управлять этой конфигурацией можно с помощью уровней рассуждений (модели Gemini 3.x и более поздние) или бюджетов на рассуждения (модели Gemini 2.5).

  • Получайте краткие пересказы рассуждений
    Вы можете включить краткие пересказы рассуждений, которые будут добавляться к сгенерированному ответу. Это обобщенные версии внутренних рассуждений модели, которые позволяют понять, как она пришла к тому или иному выводу.

  • Обработка подписей размышлений
    Firebase AI Logic SDK автоматически обрабатывают подписи размышлений, чтобы у модели был доступ к контексту размышлений из предыдущих ходов, особенно при использовании вызова функций.

Ознакомьтесь с рекомендациями по использованию моделей мышления и составлению запросов.



Рекомендации по использованию моделей мышления и созданию запросов

Рекомендуем протестировать запрос в Google AI Studio или Agent  Studio, где можно посмотреть весь процесс рассуждения. Вы можете определить, в каких областях модель могла ошибиться, чтобы улучшить свои запросы и получать более точные и последовательные ответы.

Начните с общего запроса, описывающего желаемый результат, и посмотрите, как модель определяет свой ответ. Если ответ не соответствует вашим ожиданиям, попробуйте улучшить его с помощью методов составления запросов:

  • Предоставьте пошаговые инструкции.
  • Приведите несколько примеров пар "входные данные – выходные данные".
  • Укажите, как должны быть сформулированы и отформатированы ответы.
  • Укажите конкретные шаги для проверки

Помимо запросов, вы можете использовать следующие рекомендации:

  • Задайте системные инструкции, которые будут использоваться как "преамбула" перед тем, как модель получит дальнейшие инструкции из запроса или от конечного пользователя. Они позволяют управлять поведением модели в соответствии с вашими потребностями и вариантами использования.

  • Установите уровень мышления (или бюджет на мышление для моделей Gemini 2.5), чтобы контролировать, сколько времени модель может потратить на размышления. Если вы установите высокий уровень, модель сможет больше думать, если это необходимо. Если задать более низкое значение, модель не будет "слишком долго думать" над ответом, а также сможет использовать больше токенов для самого ответа, что поможет снизить задержку и стоимость.

  • Включите мониторинг ИИ в консоли Firebase, чтобы отслеживать количество токенов размышления и задержку запросов, для которых включен режим размышления. Если у вас включены краткие изложения мыслей, они будут показываться в консоли, где можно изучить подробные рассуждения модели, чтобы отлаживать и улучшать запросы.



Контроль времени на обдумывание

Вы можете настроить, сколько времени модель может "думать" и рассуждать, прежде чем вернуть ответ. Эта конфигурация особенно важна, если для вас приоритетны снижение задержки или стоимости.

Ознакомьтесь с сравнением сложности задач, чтобы понять, насколько модели необходимы возможности рассуждения. Вот несколько общих рекомендаций:

  • Установите более низкое значение, если задача несложная или если для вас в приоритете снижение задержки или стоимости.
  • Для более сложных задач задайте более высокое значение.

Управлять этой конфигурацией можно с помощью уровней рассуждений (модели Gemini 3.x и более поздние) или бюджетов на рассуждения (модели Gemini 2.5).

Уровни мышления (модели Gemini 3.x и более поздние)

Чтобы контролировать, сколько времени Gemini 3.x и более поздние модели могут тратить на обдумывание ответа, можно указать уровень мышления для количества токенов, которые разрешено использовать.

Как задать уровень мышления

Нажмите на поставщика Gemini API, чтобы посмотреть контент и код, относящиеся к нему.

Установите уровень мышления в GenerationConfig при создании экземпляра GenerativeModel. Конфигурация сохраняется на протяжении всего времени существования экземпляра. Если вы хотите использовать разные уровни мышления для разных запросов, создайте экземпляры GenerativeModel, настроенные на каждый уровень.

Подробнее о поддерживаемых значениях уровня мышления…

Swift

Установите уровень рассуждений в GenerationConfig при создании экземпляра GenerativeModel.


// ...

// Set the thinking configuration.
// Use a thinking level value appropriate for your model (example value shown here).
let generationConfig = GenerationConfig(
  thinkingConfig: ThinkingConfig(thinkingLevel: .low)
)

// Specify the config as part of creating the `GenerativeModel` instance.
let model = FirebaseAI.firebaseAI(backend: .googleAI()).generativeModel(
  modelName: "GEMINI_3.x_MODEL_NAME",
  generationConfig: generationConfig
)

// ...

Kotlin

Задайте значения параметров в GenerationConfig при создании экземпляра GenerativeModel.


// ...

// Set the thinking configuration.
// Use a thinking level value appropriate for your model (example value shown here).
val generationConfig = generationConfig {
  thinkingConfig = thinkingConfig {
      thinkingLevel = ThinkingLevel.LOW
  }
}

// Specify the config as part of creating the `GenerativeModel` instance.
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(
  modelName = "GEMINI_3.x_MODEL_NAME",
  generationConfig,
)

// ...

Java

Задайте значения параметров в GenerationConfig при создании экземпляра GenerativeModel.


// ...

// Set the thinking configuration.
// Use a thinking level value appropriate for your model (example value shown here).
ThinkingConfig thinkingConfig = new ThinkingConfig.Builder()
    .setThinkingLevel(ThinkingLevel.LOW)
    .build();

GenerationConfig generationConfig = GenerationConfig.builder()
    .setThinkingConfig(thinkingConfig)
    .build();

// Specify the config as part of creating the `GenerativeModel` instance.
GenerativeModelFutures model = GenerativeModelFutures.from(
        FirebaseAI.getInstance(GenerativeBackend.googleAI())
                .generativeModel(
                  /* modelName */ "GEMINI_3.x_MODEL_NAME",
                  /* generationConfig */ generationConfig
                );
);

// ...

Web

Задайте значения параметров в GenerationConfig при создании экземпляра GenerativeModel.


// ...

const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });

// Set the thinking configuration.
// Use a thinking level value appropriate for your model (example value shown here).
const generationConfig = {
  thinkingConfig: {
    thinkingLevel: ThinkingLevel.LOW
  }
};

// Specify the config as part of creating the `GenerativeModel` instance.
const model = getGenerativeModel(ai, { model: "GEMINI_3.x_MODEL_NAME", generationConfig });

// ...

Dart

Задайте значения параметров в элементе GenerationConfig при создании экземпляра GenerativeModel.


// ...

// Set the thinking configuration.
// Use a thinking level value appropriate for your model (example value shown here).
final thinkingConfig = ThinkingConfig.withThinkingLevel(ThinkingLevel.low);

final generationConfig = GenerationConfig(
  thinkingConfig: thinkingConfig
);

// Specify the config as part of creating the `GenerativeModel` instance.
final model = FirebaseAI.googleAI().generativeModel(
  model: 'GEMINI_3.x_MODEL_NAME',
  config: generationConfig,
);

// ...

Unity

Задайте значения параметров в GenerationConfig при создании экземпляра GenerativeModel.


// ...

// Set the thinking configuration.
// Use a thinking level value appropriate for your model (example value shown here).
var thinkingConfig = new ThinkingConfig(thinkingLevel: ThinkingLevel.Low);

var generationConfig = new GenerationConfig(
  thinkingConfig: thinkingConfig
);

// Specify the config as part of creating the `GenerativeModel` instance.
var model = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI()).GetGenerativeModel(
  modelName: "GEMINI_3.x_MODEL_NAME",
  generationConfig: generationConfig
);

// ...

Допустимые значения уровня рассуждений

В таблице ниже перечислены значения уровня мышления, которые можно задать для каждой модели, настроив параметр thinkingLevel модели.

MINIMAL LOW MEDIUM HIGH

Модель использует как можно меньше токенов; почти не думает

Простые задачи

Модель использует меньше токенов, что позволяет снизить задержку и стоимость.

Простые задачи и задачи с высокой пропускной способностью

Модель использует сбалансированный подход

Задачи средней сложности

Модель использует токены до максимального уровня

Сложные запросы, требующие глубокого анализа.

Gemini 3.x Pro
gemini-3.1-pro-preview
(по умолчанию)
Gemini 3.x Flash
gemini-3.8-flash
gemini-3.7-flash
gemini-3.6-flash
gemini-3.5-flash

не поддерживается gemini-3.8-flash или gemini-3.7-flash 1
(по умолчанию)
Gemini 3.x Flash‑Lite
gemini-3.5-flash-lite
gemini-3.1-flash-lite
(по умолчанию)
Gemini 3.x Pro Image
gemini-3-pro-image
("Nano Banana Pro")
(по умолчанию)
Gemini 3.x Flash Image
gemini-3.1-flash-image
("Nano Banana 2")
(по умолчанию)
Gemini 3.x Flash‑Lite Image
gemini-3.1-flash-lite-image
("Nano Banana 2 Lite")
(по умолчанию)

1 gemini-3.8-flash и gemini-3.7-flashне поддерживают уровень мышления MINIMAL. Если вы зададите уровень мышления MINIMAL, запрос не будет выполнен и вернет ошибку 400.



Бюджет на размышления (модели Gemini 2.5)

Чтобы контролировать, сколько времени модель Gemini 2.5 может потратить на создание ответа, можно задать бюджет на размышления – количество токенов, которые она может использовать.

Как задать бюджет на размышления

Нажмите на поставщика Gemini API, чтобы посмотреть контент и код, относящиеся к нему.

Задайте бюджет на размышления в GenerationConfig при создании экземпляра GenerativeModel для модели Gemini 2.5. Конфигурация сохраняется на протяжении всего времени существования экземпляра. Если вы хотите использовать разные бюджеты для разных запросов, создайте экземпляры GenerativeModel, настроенные с каждым бюджетом.

Подробнее о поддерживаемых значениях бюджета на обдумывание…

Swift

Задайте бюджет на размышления в GenerationConfig при создании экземпляра GenerativeModel.


// ...

// Set the thinking configuration.
// Use a thinking budget value appropriate for your model (example value shown here).
let generationConfig = GenerationConfig(
  thinkingConfig: ThinkingConfig(thinkingBudget: 1024)
)

// Specify the config as part of creating the `GenerativeModel` instance.
let model = FirebaseAI.firebaseAI(backend: .googleAI()).generativeModel(
  modelName: "GEMINI_2.5_MODEL_NAME",
  generationConfig: generationConfig
)

// ...

Kotlin

Задайте значения параметров в GenerationConfig при создании экземпляра GenerativeModel.


// ...

// Set the thinking configuration.
// Use a thinking budget value appropriate for your model (example value shown here).
val generationConfig = generationConfig {
  thinkingConfig = thinkingConfig {
      thinkingBudget = 1024
  }
}

// Specify the config as part of creating the `GenerativeModel` instance.
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(
  modelName = "GEMINI_2.5_MODEL_NAME",
  generationConfig,
)

// ...

Java

Задайте значения параметров в GenerationConfig при создании экземпляра GenerativeModel.


// ...

// Set the thinking configuration.
// Use a thinking budget value appropriate for your model (example value shown here).
ThinkingConfig thinkingConfig = new ThinkingConfig.Builder()
    .setThinkingBudget(1024)
    .build();

GenerationConfig generationConfig = GenerationConfig.builder()
    .setThinkingConfig(thinkingConfig)
    .build();

// Specify the config as part of creating the `GenerativeModel` instance.
GenerativeModelFutures model = GenerativeModelFutures.from(
        FirebaseAI.getInstance(GenerativeBackend.googleAI())
                .generativeModel(
                  /* modelName */ "GEMINI_2.5_MODEL_NAME",
                  /* generationConfig */ generationConfig
                );
);

// ...

Web

Задайте значения параметров в GenerationConfig при создании экземпляра GenerativeModel.


// ...

const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });

// Set the thinking configuration.
// Use a thinking budget value appropriate for your model (example value shown here).
const generationConfig = {
  thinkingConfig: {
    thinkingBudget: 1024
  }
};

// Specify the config as part of creating the `GenerativeModel` instance.
const model = getGenerativeModel(ai, { model: "GEMINI_2.5_MODEL_NAME", generationConfig });

// ...

Dart

Задайте значения параметров в элементе GenerationConfig при создании экземпляра GenerativeModel.


// ...

// Set the thinking configuration.
// Use a thinking budget value appropriate for your model (example value shown here).
final thinkingConfig = ThinkingConfig.withThinkingBudget(1024);

final generationConfig = GenerationConfig(
  thinkingConfig: thinkingConfig
);

// Specify the config as part of creating the `GenerativeModel` instance.
final model = FirebaseAI.googleAI().generativeModel(
  model: 'GEMINI_2.5_MODEL_NAME',
  config: generationConfig,
);

// ...

Unity

Задайте значения параметров в GenerationConfig при создании экземпляра GenerativeModel.


// ...

// Set the thinking configuration.
// Use a thinking budget value appropriate for your model (example value shown here).
var thinkingConfig = new ThinkingConfig(thinkingBudget: 1024);

var generationConfig = new GenerationConfig(
  thinkingConfig: thinkingConfig
);

// Specify the config as part of creating the `GenerativeModel` instance.
var model = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI()).GetGenerativeModel(
  modelName: "GEMINI_2.5_MODEL_NAME",
  generationConfig: generationConfig
);

// ...

Допустимые значения бюджета на обдумывание

В таблице ниже перечислены значения бюджета на размышление, которые можно задать для каждой модели, настроив параметр thinkingBudget.

Модель Значение по умолчанию Доступный диапазон для бюджета думающей модели Значение,
отключающее размышления
Ценность
включить режим размышления
Минимальное значение Максимальное значение
Gemini 2.5 Pro 8,192 128 32,768 Нельзя отключить -1
Gemini 2.5 Flash 8,192 1 24,576 0 -1
Gemini 2.5 Flash‑Lite 0
(по умолчанию функция "Размышления" отключена)
512 24,576 0
(или не настраивать бюджет на размышления)
-1



Сложность задачи для всех моделей мышления

  • Простые задачи, не требующие глубокого анализа
    Простые запросы, не требующие сложных рассуждений, например извлечение фактов или классификация. Примеры:

    • "Где была основана компания DeepMind?"
    • "В этом письме предлагается провести встречу или просто предоставляется информация?"
  • Задачи средней сложности – требуется некоторое обдумывание
    Распространенные запросы, для которых полезно пошаговое выполнение или более глубокое понимание. Примеры:

    • "Придумай аналогию между фотосинтезом и взрослением".
    • "Сравни и сопоставь электромобили и гибридные автомобили".
  • Сложные задачи – может потребоваться максимальное мышление
    Действительно сложные задачи, например решение сложных математических задач или задач по программированию. Для выполнения таких задач модели необходимо задействовать все свои возможности рассуждения и планирования, часто выполняя множество внутренних шагов, прежде чем предоставить ответ. Примеры:

    • "Реши задачу 1 из AIME 2025: найди сумму всех целых оснований b > 9, для которых 17b является делителем 97b".
    • "Напиши код на языке Python для веб-приложения, которое визуализирует данные фондового рынка в реальном времени, включая аутентификацию пользователей. Сделай его как можно более эффективным".



Краткие пересказы рассуждений

Краткие изложения рассуждений – это синтезированные версии необработанных рассуждений модели, которые позволяют понять внутреннюю логику ее работы.

Вот несколько причин, по которым стоит добавлять краткие пересказы в ответы:

  • Вы можете показывать краткий пересказ в интерфейсе приложения или предоставлять пользователям доступ к нему. Краткое изложение мыслей возвращается как отдельная часть ответа, чтобы вы могли лучше контролировать, как оно используется в вашем приложении.

  • Если вы также включите мониторинг ИИ в консоли Firebase, то в ней будут показываться краткие пересказы рассуждений модели. Это поможет вам отлаживать и улучшать запросы.

Вот несколько важных моментов, которые нужно учитывать при работе с кратким изложением мыслей:

  • На краткие пересказы не влияют бюджеты на размышления (бюджеты применяются только к исходным размышлениям модели). Однако если мышление отключено, модель не вернет краткое изложение мыслей.

  • Краткие изложения мыслей считаются частью обычного сгенерированного текста и учитываются как токены вывода.

Как включить краткие пересказы

Нажмите на поставщика Gemini API, чтобы посмотреть контент и код, относящиеся к нему.

Чтобы включить краткие пересказы, задайте для параметра includeThoughts значение true в конфигурации модели. После этого вы можете получить доступ к краткому пересказу, проверив поле thoughtSummary в ответе.

Ниже приведен пример того, как включить и получить краткие пересказы мыслей в ответе:

Swift

Включите краткие пересказы в GenerationConfig при создании экземпляра GenerativeModel.


// ...

// Set the thinking configuration.
// Optionally enable thought summaries in the generated response (default is false).
let generationConfig = GenerationConfig(
  thinkingConfig: ThinkingConfig(includeThoughts: true)
)

// Specify the config as part of creating the `GenerativeModel` instance.
let model = FirebaseAI.firebaseAI(backend: .googleAI()).generativeModel(
  modelName: "GEMINI_MODEL_NAME",
  generationConfig: generationConfig
)

let response = try await model.generateContent("solve x^2 + 4x + 4 = 0")

// Handle the response that includes thought summaries.
if let thoughtSummary = response.thoughtSummary {
  print("Thought Summary: \(thoughtSummary)")
}
guard let text = response.text else {
  fatalError("No text in response.")
}
print("Answer: \(text)")

Kotlin

Включите краткие пересказы в GenerationConfig при создании экземпляра GenerativeModel.


// ...

// Set the thinking configuration.
// Optionally enable thought summaries in the generated response (default is false).
val generationConfig = generationConfig {
  thinkingConfig = thinkingConfig {
      includeThoughts = true
  }
}

// Specify the config as part of creating the `GenerativeModel` instance.
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(
  modelName = "GEMINI_MODEL_NAME",
  generationConfig,
)

val response = model.generateContent("solve x^2 + 4x + 4 = 0")

// Handle the response that includes thought summaries.
response.thoughtSummary?.let {
    println("Thought Summary: $it")
}
response.text?.let {
    println("Answer: $it")
}

Java

Включите краткие пересказы в GenerationConfig при создании экземпляра GenerativeModel.


// ...

// Set the thinking configuration.
// Optionally enable thought summaries in the generated response (default is false).
ThinkingConfig thinkingConfig = new ThinkingConfig.Builder()
    .setIncludeThoughts(true)
    .build();

GenerationConfig generationConfig = GenerationConfig.builder()
    .setThinkingConfig(thinkingConfig)
    .build();

// Specify the config as part of creating the `GenerativeModel` instance.
GenerativeModelFutures model = GenerativeModelFutures.from(
        FirebaseAI.getInstance(GenerativeBackend.googleAI())
                .generativeModel(
                  /* modelName */ "GEMINI_MODEL_NAME",
                  /* generationConfig */ generationConfig
                );
);

// Handle the response that includes thought summaries.
ListenableFuture responseFuture = model.generateContent("solve x^2 + 4x + 4 = 0");
Futures.addCallback(responseFuture, new FutureCallback() {
    @Override
    public void onSuccess(GenerateContentResponse response) {
        if (response.getThoughtSummary() != null) {
            System.out.println("Thought Summary: " + response.getThoughtSummary());
        }
        if (response.getText() != null) {
            System.out.println("Answer: " + response.getText());
        }
    }

    @Override
    public void onFailure(Throwable t) {
        // Handle error
    }
}, MoreExecutors.directExecutor());

Web

Включите краткие пересказы в GenerationConfig при создании экземпляра GenerativeModel.


// ...

const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });

// Set the thinking configuration.
// Optionally enable thought summaries in the generated response (default is false).
const generationConfig = {
  thinkingConfig: {
    includeThoughts: true
  }
};

// Specify the config as part of creating the `GenerativeModel` instance.
const model = getGenerativeModel(ai, { model: "GEMINI_MODEL_NAME", generationConfig });

const result = await model.generateContent("solve x^2 + 4x + 4 = 0");
const response = result.response;

// Handle the response that includes thought summaries.
if (response.thoughtSummary()) {
    console.log(`Thought Summary: ${response.thoughtSummary()}`);
}
const text = response.text();
console.log(`Answer: ${text}`);

Dart

Включите краткие пересказы в GenerationConfig при создании экземпляра GenerativeModel.


// ...

// Set the thinking configuration.
// Optionally enable thought summaries in the generated response (default is false).
final thinkingConfig = ThinkingConfig(includeThoughts: true);

final generationConfig = GenerationConfig(
  thinkingConfig: thinkingConfig
);

// Specify the config as part of creating the `GenerativeModel` instance.
final model = FirebaseAI.googleAI().generativeModel(
  model: 'GEMINI_MODEL_NAME',
  generationConfig: generationConfig,
);

final response = await model.generateContent('solve x^2 + 4x + 4 = 0');

// Handle the response that includes thought summaries.
if (response.thoughtSummary != null) {
  print('Thought Summary: ${response.thoughtSummary}');
}
if (response.text != null) {
  print('Answer: ${response.text}');
}

Unity

Включите краткие пересказы в GenerationConfig при создании экземпляра GenerativeModel.


// ...

// Set the thinking configuration.
// Optionally enable thought summaries in the generated response (default is false).
var thinkingConfig = new ThinkingConfig(includeThoughts: true);

var generationConfig = new GenerationConfig(
  thinkingConfig: thinkingConfig
);

// Specify the config as part of creating the `GenerativeModel` instance.
var model = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI()).GetGenerativeModel(
  modelName: "GEMINI_MODEL_NAME",
  generationConfig: generationConfig
);

var response = await model.GenerateContentAsync("solve x^2 + 4x + 4 = 0");

// Handle the response that includes thought summaries.
if (response.ThoughtSummary != null) {
    Debug.Log($"Thought Summary: {response.ThoughtSummary}");
}
if (response.Text != null) {
    Debug.Log($"Answer: {response.Text}");
}

Пересказ цепочки рассуждений в режиме стриминга

Если вы выберете потоковую передачу ответа с помощью generateContentStream, то также сможете посмотреть краткое изложение рассуждений. В результате во время генерации ответа будут возвращаться текущие дополнительные сводки.

Swift

Включите краткие пересказы в GenerationConfig при создании экземпляра GenerativeModel.


// ...

// Set the thinking configuration.
// Optionally enable thought summaries in the generated response (default is false).
let generationConfig = GenerationConfig(
  thinkingConfig: ThinkingConfig(includeThoughts: true)
)

// Specify the config as part of creating the `GenerativeModel` instance.
let model = FirebaseAI.firebaseAI(backend: .googleAI()).generativeModel(
  modelName: "GEMINI_MODEL_NAME",
  generationConfig: generationConfig
)

let stream = try model.generateContentStream("solve x^2 + 4x + 4 = 0")

// Handle the streamed response that includes thought summaries.
var thoughts = ""
var answer = ""
for try await response in stream {
  if let thought = response.thoughtSummary {
    if thoughts.isEmpty {
      print("--- Thoughts Summary ---")
    }
    print(thought)
    thoughts += thought
  }

  if let text = response.text {
    if answer.isEmpty {
      print("--- Answer ---")
    }
    print(text)
    answer += text
  }
}

Kotlin

Включите краткие пересказы в GenerationConfig при создании экземпляра GenerativeModel.


// ...

// Set the thinking configuration.
// Optionally enable thought summaries in the generated response (default is false).
val generationConfig = generationConfig {
  thinkingConfig = thinkingConfig {
      includeThoughts = true
  }
}

// Specify the config as part of creating the `GenerativeModel` instance.
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(
  modelName = "GEMINI_MODEL_NAME",
  generationConfig,
)

// Handle the streamed response that includes thought summaries.
var thoughts = ""
var answer = ""
model.generateContentStream("solve x^2 + 4x + 4 = 0").collect { response ->
    response.thoughtSummary?.let {
        if (thoughts.isEmpty()) {
            println("--- Thoughts Summary ---")
        }
        print(it)
        thoughts += it
    }
    response.text?.let {
        if (answer.isEmpty()) {
            println("--- Answer ---")
        }
        print(it)
        answer += it
    }
}

Java

Включите краткие пересказы в GenerationConfig при создании экземпляра GenerativeModel.


// ...

// Set the thinking configuration.
// Optionally enable thought summaries in the generated response (default is false).
ThinkingConfig thinkingConfig = new ThinkingConfig.Builder()
    .setIncludeThoughts(true)
    .build();

GenerationConfig generationConfig = GenerationConfig.builder()
    .setThinkingConfig(thinkingConfig)
    .build();

// Specify the config as part of creating the `GenerativeModel` instance.
GenerativeModelFutures model = GenerativeModelFutures.from(
        FirebaseAI.getInstance(GenerativeBackend.googleAI())
                .generativeModel(
                  /* modelName */ "GEMINI_MODEL_NAME",
                  /* generationConfig */ generationConfig
                );
);

// Streaming with Java is complex and depends on the async library used.
// This is a conceptual example using a reactive stream.
Flowable responseStream = model.generateContentStream("solve x^2 + 4x + 4 = 0");

// Handle the streamed response that includes thought summaries
StringBuilder thoughts = new StringBuilder();
StringBuilder answer = new StringBuilder();

responseStream.subscribe(response -> {
    if (response.getThoughtSummary() != null) {
        if (thoughts.length() == 0) {
            System.out.println("--- Thoughts Summary ---");
        }
        System.out.print(response.getThoughtSummary());
        thoughts.append(response.getThoughtSummary());
    }
    if (response.getText() != null) {
        if (answer.length() == 0) {
            System.out.println("--- Answer ---");
        }
        System.out.print(response.getText());
        answer.append(response.getText());
    }
}, throwable -> {
    // Handle error
});

Web

Включите краткие пересказы в GenerationConfig при создании экземпляра GenerativeModel.


// ...

const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });

// Set the thinking configuration.
// Optionally enable thought summaries in the generated response (default is false).
const generationConfig = {
  thinkingConfig: {
    includeThoughts: true
  }
};

// Specify the config as part of creating the `GenerativeModel` instance.
const model = getGenerativeModel(ai, { model: "GEMINI_MODEL_NAME", generationConfig });

const result = await model.generateContentStream("solve x^2 + 4x + 4 = 0");

// Handle the streamed response that includes thought summaries.
let thoughts = "";
let answer = "";
for await (const chunk of result.stream) {
  if (chunk.thoughtSummary()) {
    if (thoughts === "") {
      console.log("--- Thoughts Summary ---");
    }
    // In Node.js, process.stdout.write(chunk.thoughtSummary()) could be used
    // to avoid extra newlines.
    console.log(chunk.thoughtSummary());
    thoughts += chunk.thoughtSummary();
  }

  const text = chunk.text();
  if (text) {
    if (answer === "") {
      console.log("--- Answer ---");
    }
    // In Node.js, process.stdout.write(text) could be used.
    console.log(text);
    answer += text;
  }
}

Dart

Включите краткие пересказы в GenerationConfig при создании экземпляра GenerativeModel.


// ...

// Set the thinking configuration.
// Optionally enable thought summaries in the generated response (default is false).
final thinkingConfig = ThinkingConfig(includeThoughts: true);

final generationConfig = GenerationConfig(
  thinkingConfig: thinkingConfig
);

// Specify the config as part of creating the `GenerativeModel` instance.
final model = FirebaseAI.googleAI().generativeModel(
  model: 'GEMINI_MODEL_NAME',
  generationConfig: generationConfig,
);

final responses = model.generateContentStream('solve x^2 + 4x + 4 = 0');

// Handle the streamed response that includes thought summaries.
var thoughts = '';
var answer = '';
await for (final response in responses) {
  if (response.thoughtSummary != null) {
    if (thoughts.isEmpty) {
      print('--- Thoughts Summary ---');
    }
    thoughts += response.thoughtSummary!;
  }
  if (response.text != null) {
    if (answer.isEmpty) {
      print('--- Answer ---');
    }
    answer += response.text!;
  }
}

Unity

Включите краткие пересказы в GenerationConfig при создании экземпляра GenerativeModel.


// ...

// Set the thinking configuration.
// Optionally enable thought summaries in the generated response (default is false).
var thinkingConfig = new ThinkingConfig(includeThoughts: true);

var generationConfig = new GenerationConfig(
  thinkingConfig: thinkingConfig
);

// Specify the config as part of creating the `GenerativeModel` instance.
var model = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI()).GetGenerativeModel(
  modelName: "GEMINI_MODEL_NAME",
  generationConfig: generationConfig
);

var stream = model.GenerateContentStreamAsync("solve x^2 + 4x + 4 = 0");

// Handle the streamed response that includes thought summaries.
var thoughts = "";
var answer = "";
await foreach (var response in stream)
{
    if (response.ThoughtSummary != null)
    {
        if (string.IsNullOrEmpty(thoughts))
        {
            Debug.Log("--- Thoughts Summary ---");
        }
        Debug.Log(response.ThoughtSummary);
        thoughts += response.ThoughtSummary;
    }
    if (response.Text != null)
    {
        if (string.IsNullOrEmpty(answer))
        {
            Debug.Log("--- Answer ---");
        }
        Debug.Log(response.Text);
        answer += response.Text;
    }
}



Подписи к рассуждениям

При многоходовом взаимодействии модель не имеет доступа к контексту размышлений из предыдущих ходов. Однако если вы используете вызов функций, то можете воспользоваться подписями рассуждений, чтобы сохранять контекст рассуждений между ходами. Подписи размышлений – это зашифрованные представления внутреннего мыслительного процесса модели. Они доступны при использовании функции "Размышления" и вызова функций. В частности, подписи рассуждений создаются в следующих случаях:

  • Режим размышления включен, и мысли генерируются.
  • Запрос содержит объявления функций.

Чтобы использовать сигнатуры мыслей, вызывайте функции как обычно. Firebase AI Logic SDK упрощают процесс, управляя состоянием и автоматически обрабатывая подписи мыслей. Сгенерированные подписи мыслей автоматически передаются между последующими вызовами sendMessage или sendMessageStream в сеансе Chat.



Цены и подсчет токенов

Токены, используемые для размышлений, стоят столько же, сколько и токены для вывода текста. Если вы включите краткие пересказы, они будут считаться токенами размышлений и оплачиваться соответствующим образом.

Вы можете включить мониторинг ИИ в консоли Firebase, чтобы отслеживать количество токенов, используемых для размышления, в запросах, для которых включена эта функция.

Общее количество токенов для размышления можно получить из поля thoughtsTokenCount атрибута usageMetadata ответа:

Swift

// ...

let response = try await model.generateContent("Why is the sky blue?")

if let usageMetadata = response.usageMetadata {
  print("Thoughts Token Count: \(usageMetadata.thoughtsTokenCount)")
}

Kotlin

// ...

val response = model.generateContent("Why is the sky blue?")

response.usageMetadata?.let { usageMetadata ->
    println("Thoughts Token Count: ${usageMetadata.thoughtsTokenCount}")
}

Java

// ...

ListenableFuture<GenerateContentResponse> response =
    model.generateContent("Why is the sky blue?");

Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String usageMetadata = result.getUsageMetadata();
        if (usageMetadata != null) {
            System.out.println("Thoughts Token Count: " +
                usageMetadata.getThoughtsTokenCount());
        }
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
}, executor);

Web

// ...

const response = await model.generateContent("Why is the sky blue?");

if (response?.usageMetadata?.thoughtsTokenCount != null) {
    console.log(`Thoughts Token Count: ${response.usageMetadata.thoughtsTokenCount}`);
}

Dart

// ...

final response = await model.generateContent(
  Content.text("Why is the sky blue?"),
]);

if (response?.usageMetadata case final usageMetadata?) {
  print("Thoughts Token Count: ${usageMetadata.thoughtsTokenCount}");
}

Unity

// ...

var response = await model.GenerateContentAsync("Why is the sky blue?");

if (response.UsageMetadata != null)
{
    UnityEngine.Debug.Log($"Thoughts Token Count: {response.UsageMetadata?.ThoughtsTokenCount}");
}

Подробнее о токенах можно узнать в руководстве по подсчету токенов.