Благодаря длинному декодированию Gemini 4 Argon может генерировать более 64 000 токенов для задач, требующих глубокого логического рассуждения, вплоть до единого окна контекста на 1 млн токенов (1 048 576 токенов, распределенных между вводом, рассуждением и выводом). В Interactions API вы включаете длительное декодирование с фоновым выполнением, чтобы наши серверы автоматически генерировали и объединяли каждый переход на 64 КБ в одно взаимодействие.
Как долго работает декодирование
Один вызов модели генерирует до 64 000 токенов. Если для ответа требуется больше 64 000 токенов, сервер генерирует его частями по 64 000 токенов, каждая из которых продолжает предыдущую. Каждый переход добавляет шаг model_output к interaction.steps под тем же идентификатором взаимодействия, поэтому вы объединяете эти шаги, чтобы прочитать полный ответ:
- Вы создаете взаимодействие с
background: trueиmax_output_tokens,превышающее 65 536, но не более 1 000 000. - Сервер создает первый переход, до 64 000 токенов.
- Сервер начинает следующий переход с того места, где остановился предыдущий, и повторяет это до тех пор, пока модель не завершит работу или не использует все
max_output_tokens. - Чтобы получить результат, вы опрашиваете взаимодействие или транслируете его.
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 токенах. Скоро мы добавим ее. - Нет целей по длине. Модель не следует целям по длине токенов или количеству слов.