Долгое декодирование

Благодаря длинному декодированию Gemini 4 Argon может генерировать более 64 000 токенов для задач, требующих глубокого логического рассуждения, вплоть до единого окна контекста на 1 млн токенов (1 048 576 токенов, распределенных между вводом, рассуждением и выводом). В Interactions API вы включаете длительное декодирование с фоновым выполнением, чтобы наши серверы автоматически генерировали и объединяли каждый переход на 64 КБ в одно взаимодействие.

Как долго работает декодирование

Один вызов модели генерирует до 64 000 токенов. Если для ответа требуется больше 64 000 токенов, сервер генерирует его частями по 64 000 токенов, каждая из которых продолжает предыдущую. Каждый переход добавляет шаг model_output к interaction.steps под тем же идентификатором взаимодействия, поэтому вы объединяете эти шаги, чтобы прочитать полный ответ:

  1. Вы создаете взаимодействие с background: true и max_output_tokens,превышающее 65 536, но не более 1 000 000.
  2. Сервер создает первый переход, до 64 000 токенов.
  3. Сервер начинает следующий переход с того места, где остановился предыдущий, и повторяет это до тех пор, пока модель не завершит работу или не использует все max_output_tokens.
  4. Чтобы получить результат, вы опрашиваете взаимодействие или транслируете его.

Python

import time
from google import genai

client = genai.Client()

interaction = client.interactions.create(
    model="gemini-4-argon",
    input="Write a complete, rigorous proof of the prime number theorem.",
    background=True,
    generation_config={
        "max_output_tokens": 262144,
        "thinking_level": "high",
    },
)

while interaction.status in ("in_progress", "queued"):
    time.sleep(5)
    interaction = client.interactions.get(id=interaction.id)

# Each hop adds a model_output step, so join the text of all of them.
text = "".join(
    content.text
    for step in interaction.steps
    if step.type == "model_output"
    for content in step.content
    if content.type == "text"
)
print(text)
print("Status:", interaction.status)
print("Usage:", interaction.usage)

JavaScript

import { GoogleGenAI } from "@google/genai";

const client = new GoogleGenAI({});

let interaction = await client.interactions.create({
  model: "gemini-4-argon",
  input: "Write a complete, rigorous proof of the prime number theorem.",
  background: true,
  generation_config: {
    max_output_tokens: 262144,
    thinking_level: "high",
  },
});

while (interaction.status === "in_progress" || interaction.status === "queued") {
  await new Promise((resolve) => setTimeout(resolve, 5000));
  interaction = await client.interactions.get(interaction.id);
}

// Each hop adds a model_output step, so join the text of all of them.
const text = interaction.steps
  .filter((step) => step.type === "model_output")
  .flatMap((step) => step.content ?? [])
  .filter((content) => content.type === "text")
  .map((content) => content.text)
  .join("");
console.log(text);
console.log("Status:", interaction.status);
console.log("Usage:", interaction.usage);

REST

# 1. Create the background interaction. It returns an ID right away.
ID=$(curl -s -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-4-argon",
    "input": "Write a complete, rigorous proof of the prime number theorem.",
    "background": true,
    "generation_config": {"max_output_tokens": 262144, "thinking_level": "high"}
  }' | jq -r '.id')

# 2. Poll until the status is no longer in_progress or queued.
#    The REST response has no output_text field, so join the text of every model_output step.
while true; do
  RESP=$(curl -s "https://generativelanguage.googleapis.com/v1beta/interactions/$ID" \
    -H "x-goog-api-key: $GEMINI_API_KEY")
  STATUS=$(echo "$RESP" | jq -r '.status')
  if [[ "$STATUS" != "in_progress" && "$STATUS" != "queued" ]]; then
    echo "$RESP" | jq -r '[.steps[]? | select(.type == "model_output") | .content[]? | select(.type == "text") | .text] | join("")'
    echo "$RESP" | jq '{status, usage}'
    break
  fi
  sleep 5
done

Ограничения на выходные данные

Для потоковых и непотоковых взаимодействий по умолчанию задано ограничение на количество выходных токенов в 64 000, поэтому для ответов размером до 64 000 токенов не требуется вносить изменения в код. Чтобы сгенерировать больше 64 000 токенов, включите выполнение в фоновом режиме и увеличьте значение max_output_tokens.

Как вы создаете взаимодействие Ограничение на количество результатов
background: false (трансляция или нет) 65 536 токенов. Если значение превышает 65 536,возвращается ошибка 400. Скоро будет доступна расшифровка длинных записей.
background: true, max_output_tokens не задано 65 536 токенов
background: true, max_output_tokens больше 65 536 Ваше значение max_output_tokens, до 1 048 576 минус ваше значение

Когда использовать длинное декодирование

Большинство запросов укладываются в 64 000 токенов. Используйте его, только если для ответа требуется больше времени и ресурсов.

Рабочая нагрузка Использовать длинное декодирование? Зачем
Сложные математические, научные и исследовательские задачи, а также формальные доказательства. Да Модель может потратить более 64 тысяч токенов на рассуждения и их проверку.
Самые сложные задачи по написанию кода и задачи агентов Да Для некоторых задач требуется более 64 000 токенов на рассуждения и код в одном ответе. Большинство задач по программированию и агентных задач завершаются в пределах 64 тыс. токенов.
Инструменты оценки, которые останавливаются на ограничении выходных данных Да Длинное декодирование предотвращает обрывы ответов, когда модель тратит все 64 КБ ответа на размышления.
Чат, ответы на вопросы, обобщение, классификация и извлечение Нет Эти задачи выполняются с использованием менее 32 000 токенов.
Запросы на создание текста определенной длины, например "напиши книгу на 700 000 слов". Нет Модель не соблюдает целевую длину.
Агенты, которые вызывают инструменты за несколько коротких шагов Нет Каждый ход короткий. Большие выходные данные на каждом шаге быстро заполняют общее окно контекста.
Запросы, близкие к лимиту на ввод Нет Для вывода можно использовать только 1 048 576 токенов минус количество токенов, использованных для ввода.
Запросы, чувствительные к задержкам Нет Длинное декодирование может выполняться несколько минут.

Если задать высокое значение max_output_tokens, у модели будет больше времени на обдумывание сложных задач, но она сама решает, сколько текста нужно сгенерировать. Чтобы контролировать, сколько усилий модель тратит на рассуждения, задайте параметр thinking_level.

Выберите, как запустить длительное декодирование

Фоновое выполнение – самый простой способ запустить длительное декодирование с помощью Interactions API. Клиентское продолжение, когда ваш код запускает каждый переход, доступно в GenerateContent API. Скоро в Interactions API появится более продвинутый вариант управления устойчивостью.

Выполнение в фоновом режиме (Interactions API) Клиентское продолжение (GenerateContent API)
Кто начинает каждый переход Наши серверы Google GenAI SDK или собственный код.
Токены на запрос max_output_tokens в одном взаимодействии 64 000 на поток, 32 000 на запрос без потоковой передачи
Время выполнения До 24 часов 20 минут
Хранилище Требуется столбец "store: true" На сервере ничего не хранится.
Для чего подходит Самый простой способ запустить длительное декодирование Более точное управление повторными попытками, чтобы вы могли создавать собственные стратегии отсрочки, обработки ошибок и устойчивости.

Чтобы использовать клиентское продолжение, ознакомьтесь с информацией о длинном декодировании с помощью API GenerateContent.

Расшифровка длинного потока

Чтобы получать выходные данные и краткие изложения мыслей по мере их поступления, добавьте stream: true и thinking_summaries: "auto". Длинные потоки могут прерываться, и клиенту придется подключаться заново. Следуйте инструкциям по повторному подключению в руководстве по выполнению в фоновом режиме. При длинном декодировании применяются следующие правила:

  • Сохраните идентификатор взаимодействия. Его можно получить из события interaction.created.
  • Сохранять каждый event_id. event_id может поступать в событиях interaction.status_update, а не только в дельтах текста.
  • Возобновить общение с пользователем last_event_id. Позвонить пользователю interactions.get, используя stream: true и последние event_id. После этого трансляция продолжится.
  • Дочитайте до конца. После повторного подключения прочитайте поток до конца, прежде чем проверять статус. Сервер воспроизводит пропущенные события, даже если взаимодействие уже завершено.
  • Установите длительные тайм-ауты. Установите тайм-ауты чтения HTTP на 15–20 минут на поток.
  • Ожидайте вывод фрагментами по 5000 токенов. После первых 64 000 токенов (примерно первые 10 минут) поток отправляет вывод фрагментами примерно по 5000 токенов. Паузы между фрагментами – это нормально. Взаимодействие не зависло, поэтому не закрывайте подключение.

Статус фона

Взаимодействие в фоновом режиме может выполняться до 24 часов. Когда статус перестанет быть in_progress или queued, обработайте конечное состояние, используя эту таблицу:

Статус Значение Что вам нужно сделать
completed Модель завершила работу. Присоединитесь к комнате model_output, выполнив инструкции в steps, и прочитайте usage. Чтобы продолжить разговор, передайте id этого взаимодействия как previous_interaction_id.
requires_action Модель запросила вызов инструмента. Запустите инструмент. Затем отправьте результат с id этого взаимодействия.
incomplete Модель использовала все max_output_tokens. Текст может быть пустым, если модель ещё думала. Отправьте запрос повторно, указав более высокое значение max_output_tokens.
failed Сервер не смог завершить работу, или взаимодействие длилось дольше 24 часов. Повторите запрос. Если ошибка повторится, отправьте информацию о взаимодействии id в службу поддержки.
cancelled Вы отменили взаимодействие. Прочитайте usage, чтобы посмотреть оплаченные токены.

Чтобы остановить текущее взаимодействие, вызовите client.interactions.cancel(id=interaction.id) в Python, client.interactions.cancel(interaction.id) в JavaScript или POST /v1beta/interactions/{id}/cancel в REST.

Установить max_output_tokens

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

Ваша рабочая нагрузка Рекомендуется: max_output_tokens
Существующие приложения с ограничением менее 32 000 Увеличьте его до 32 768. Выполнение в фоновом режиме не требуется.
Длительные задачи по программированию и задачи агентов Начните с 65 536 (значение по умолчанию). Выполнение в фоновом режиме не требуется.
Сложные рассуждения, математика, наука и доказательства Установите значение background: true и начните с 262 144, но не более 1 048 576 минус входные токены.

Чтобы использовать меньше токенов, уменьшите значение thinking_level. Используйте high для самых сложных задач, требующих рассуждения. Используйте medium (по умолчанию) для большинства задач по программированию и работе с агентами.

Как подсчитать токены

interaction.usage – общее количество по всем переходам. Прочитайте следующие поля: total_input_tokens, total_cached_tokens, total_output_tokens, total_thought_tokens и total_tokens.

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

Хип-хоп Входные данные, отправленные модели Входные токены
1 Запрос 1000
2 Запрос + переход 1 66 536
3 Запрос + шаги 1 и 2 132 072
4 Запрос + от 1 до 3 переходов 197 608
Итого 397 216

total_input_tokens сообщает о 397 000 токенов (повторяющиеся входные данные автоматически учитываются с 95-процентной скидкой благодаря неявному кешированию), хотя фактический размер контекста составляет всего около 201 000 токенов: 1000 токенов в запросе плюс 200 000 токенов в рассуждениях и ответе.

Во время трансляции события step.stop и interaction.status_update включают параметр usage (накопительный для взаимодействия). Прочитайте последнее значение usage, а не складывайте их.

Оплата

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

  • Скидка на кеш. Неявное кеширование снижает стоимость повторного ввода на каждом этапе на 95%. В течение пробного периода цена за 1 млн токенов для кешированных входных данных составляет 0,10 долл.США вместо 2 долл.США.
  • Отмененные и неудачные взаимодействия. Вы платите за всю работу, выполненную до завершения взаимодействия.

Устранение неполадок

Symptom Причина и решение
Вывод останавливается на 64 КБ background – false или max_output_tokens не задано. Установите для параметров background: true и max_output_tokens значения больше 65 536.
400: "max_output_tokens greater than 65536 is not yet supported with background=false." Длительное декодирование без выполнения в фоновом режиме пока недоступно. Установите значение background: true.
400: "store=true is required for background interactions" (Для взаимодействий в фоновом режиме требуется store=true) Для выполнения в фоновом режиме требуется store: true.
Статус incomplete с пустым текстом Модель использовала все токены для размышлений. Поднять руку max_output_tokens или опустить руку thinking_level.
Сжатие контекста начинается слишком рано Фреймворк агента или инструмент оценки считывает total_input_tokens. Подробнее о подсчете токенов…

Ограничения

  • Нет долгого декодирования без фонового выполнения. Взаимодействие с background: false останавливается на 65 536 токенах. Скоро мы добавим ее.
  • Нет целей по длине. Модель не следует целям по длине токенов или количеству слов.

Дальнейшие действия