Le décodage long permet à Gemini 4 Argon de générer plus de 64 000 jetons pour les tâches de raisonnement approfondi, jusqu'à la fenêtre de contexte unifiée d'un million de jetons (1 048 576 jetons partagés entre l'entrée, le raisonnement et la sortie). Dans l'API Interactions, vous activez le décodage long avec l'exécution en arrière-plan afin que nos serveurs génèrent et combinent automatiquement chaque saut de 64 000 jetons en une seule interaction.
Fonctionnement du décodage long
Un seul appel de modèle génère jusqu'à 64 000 jetons. Lorsqu'une réponse nécessite plus de 64 000 jetons, le serveur la génère par sauts de 64 000 jetons qui reprennent là où le saut précédent s'est arrêté. Chaque saut ajoute une étape model_output à interaction.steps sous le même ID d'interaction. Vous devez donc joindre ces étapes pour lire la réponse complète :
- Vous créez une interaction avec
background: trueetmax_output_tokenssupérieur à 65 536, jusqu'à 1 million. - Le serveur génère le premier saut, jusqu'à 64 000 jetons.
- Le serveur démarre le saut suivant là où le précédent s'est arrêté et répète l'opération jusqu'à ce que le modèle se termine ou utilise tous les
max_output_tokens. - Vous interrogez l'interaction ou la diffusez en flux continu pour obtenir le résultat.
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
Limites de sortie
Les interactions en flux continu et hors flux continu sont limitées par défaut à 64 000 jetons de sortie. Les réponses contenant jusqu'à 64 000 jetons ne nécessitent donc aucune modification du code. Pour générer plus de 64 000 jetons, activez l'exécution en arrière-plan et augmentez max_output_tokens.
| Comment créer l'interaction | Limite de sortie |
|---|---|
background: false (flux continu ou hors flux continu) |
65 536 jetons. Les valeurs supérieures à 65 536 renvoient une erreur 400. Le décodage long sera bientôt disponible. |
background: true, max_output_tokens non défini |
65 536 jetons |
background: true, max_output_tokens supérieur à 65 536 |
Votre max_output_tokens, jusqu'à 1 048 576 moins votre entrée |
Quand utiliser le décodage long
La plupart des requêtes se terminent avec moins de 64 000 jetons. N'utilisez le décodage long que lorsqu'une réponse nécessite plus de réflexion et de sortie.
| Charge de travail | Utiliser le décodage long ? | Pourquoi |
|---|---|---|
| Mathématiques complexes, sciences, recherche et preuves formelles | Oui | Le modèle peut utiliser plus de 64 000 jetons pour explorer et vérifier son raisonnement. |
| Les tâches de codage et agentiques les plus difficiles | Oui | Certaines tâches nécessitent plus de 64 000 jetons de réflexion et de code dans une seule réponse. La plupart des tâches de codage et agentiques se terminent avec moins de 64 000 jetons. |
| Outils d'évaluation qui s'arrêtent à la limite de sortie | Oui | Le décodage long empêche les réponses d'être tronquées lorsque le modèle utilise une réponse complète de 64 000 jetons pour réfléchir. |
| Chat, questions-réponses, synthèse, classification et extraction | Non | Ces tâches se terminent avec moins de 32 000 jetons. |
| Requêtes de longueur fixe, telles que "écrire un livre de 700 000 mots" | Non | Le modèle ne respecte pas les objectifs de longueur. |
| Agents qui appellent des outils en plusieurs tours courts | Non | Chaque tour est court. Les sorties volumineuses à chaque tour remplissent rapidement la fenêtre de contexte partagée. |
| Prompts proches de la limite d'entrée | Non | La sortie ne peut utiliser que 1 048 576 jetons moins votre entrée. |
| Requêtes sensibles à la latence | Non | Le décodage long peut s'exécuter pendant plusieurs minutes. |
Définir un max_output_tokens élevé permet au modèle de réfléchir plus longtemps aux problèmes difficiles, mais il décide toujours de la quantité à écrire. Pour contrôler l'effort de raisonnement utilisé par le modèle, définissez thinking_level.
Choisir comment exécuter le décodage long
L'exécution en arrière-plan est le moyen le plus simple d'exécuter le décodage long sur l'API Interactions. La continuation côté client, où votre code démarre chaque saut, est disponible avec l'API GenerateContent. Elle sera bientôt disponible dans l'API Interactions en tant qu'option plus avancée pour gérer votre propre résilience.
| Exécution en arrière-plan (API Interactions) | Continuation côté client (API GenerateContent) | |
|---|---|---|
| Qui démarre chaque saut | Nos serveurs | Le SDK Google GenAI ou votre propre code |
| Jetons par requête | Votre max_output_tokens, dans une seule interaction |
64 000 par flux, 32 000 par requête hors flux continu |
| Durée d'exécution | Jusqu'à 24 heures | 20 minutes |
| Stockage | Nécessite store: true |
Rien n'est stocké sur le serveur. |
| Application idéale | Le moyen le plus simple d'exécuter le décodage long | Contrôle plus précis des nouvelles tentatives, ce qui vous permet de créer votre propre intervalle entre les tentatives, votre propre gestion des exceptions et votre propre résilience |
Pour utiliser la continuation côté client, consultez la section Décodage long avec l'API GenerateContent.
Diffuser le décodage long en flux continu
Pour diffuser les sorties et les résumés de réflexion à mesure qu'ils arrivent, ajoutez stream: true et thinking_summaries: "auto". Les flux longs peuvent être interrompus. Votre client doit donc se reconnecter. Suivez le modèle de reconnexion dans le guide d'exécution en arrière-plan. Le décodage long ajoute les règles suivantes :
- Enregistrez l'ID d'interaction : lisez-le à partir de l'événement
interaction.created. - Enregistrez chaque
event_id: unevent_idpeut arriver sur les événementsinteraction.status_update, et pas seulement sur les deltas de texte. - Reconnectez-vous avec
last_event_id: appelezinteractions.getavecstream: trueet le dernierevent_id. Le flux se poursuit après cet événement. - Lisez jusqu'à la fin : une fois que vous êtes reconnecté, lisez le flux jusqu'à la fin avant de vérifier l'état. Le serveur relit les événements manqués, même une fois l'interaction terminée.
- Définissez des délais d'expiration longs : définissez des délais d'expiration de lecture HTTP de 15 à 20 minutes par flux.
- Attendez-vous à une sortie par blocs de 5 000 jetons : après les 64 000 premiers jetons (environ les 10 premières minutes), le flux envoie la sortie par blocs d'environ 5 000 jetons. Les pauses entre les blocs sont normales. L'interaction n'est pas bloquée. Laissez donc la connexion ouverte.
État en arrière-plan
Une interaction en arrière-plan peut s'exécuter pendant 24 heures maximum. Une fois que l'état n'est plus in_progress ou queued, gérez l'état final à l'aide de ce tableau :
| État | Signification | Que faire ? |
|---|---|---|
completed |
Le modèle a terminé. | Joignez les étapes model_output dans steps et lisez usage. Pour poursuivre la conversation, transmettez le id de cette interaction en tant que previous_interaction_id. |
requires_action |
Le modèle a demandé un appel d'outil. | Exécutez l'outil. Envoyez ensuite le résultat avec l'id de cette interaction. |
incomplete |
Le modèle a utilisé tous les max_output_tokens. Le texte peut être vide si le modèle réfléchissait encore. |
Renvoyez la requête avec un max_output_tokens plus élevé. |
failed |
Le serveur n'a pas pu terminer ou l'interaction a duré plus de 24 heures. | Réessayez d'envoyer la requête. Si le problème persiste, partagez l'id de l'interaction avec l'assistance. |
cancelled |
Vous avez annulé l'interaction. | Lisez usage pour voir les jetons facturés. |
Pour arrêter une interaction en cours d'exécution, appelez client.interactions.cancel(id=interaction.id) en Python, client.interactions.cancel(interaction.id) en JavaScript ou POST /v1beta/interactions/{id}/cancel dans REST.
Définir max_output_tokens
max_output_tokens définit la limite combinée pour la réflexion et la sortie de l'interaction. La réduire ne rend pas la réflexion du modèle plus concise, mais coupe la réponse plus tôt.
| Votre charge de travail | max_output_tokens recommandé |
|---|---|
| Applications existantes avec une limite inférieure à 32 000 | Augmentez-la à 32 768. L'exécution en arrière-plan n'est pas nécessaire. |
| Tâches de codage et agentiques longues | Commencez à 65 536 (valeur par défaut). L'exécution en arrière-plan n'est pas nécessaire. |
| Raisonnement complexe, mathématiques complexes, sciences et preuves | Définissez background: true et commencez à 262 144, jusqu'à 1 048 576 moins vos jetons d'entrée. |
Pour utiliser moins de jetons, réduisez thinking_level. Utilisez high pour les tâches de raisonnement les plus difficiles. Utilisez medium (valeur par défaut) pour la plupart des tâches de codage et agentiques.
Compter les jetons
interaction.usage indique les totaux pour tous les sauts. Lisez les champs suivants : total_input_tokens, total_cached_tokens, total_output_tokens, total_thought_tokens et total_tokens.
total_input_tokens additionne les jetons d'entrée de chaque saut. Chaque saut renvoie votre prompt et tout ce qui a été généré jusqu'à présent au modèle en tant qu'entrée. Les mêmes jetons sont donc comptés à nouveau dans chaque saut ultérieur. Par exemple, un prompt de 1 000 jetons qui produit 200 000 jetons de réflexion et de sortie nécessite quatre sauts :
| Hop | Entrée envoyée au modèle | Jetons d'entrée |
|---|---|---|
| 1 | Prompt | 1 000 |
| 2 | Prompt + saut 1 | 66 536 |
| 3 | Prompt + sauts 1 et 2 | 132 072 |
| 4 | Prompt + sauts 1 à 3 | 197 608 |
| Total | 397 216 |
total_input_tokens indique environ 397 000 jetons (avec les entrées de saut répétées automatiquement réduites de 95% par la mise en cache implicite), même si la taille réelle du contexte n'est que d'environ 201 000 jetons : le prompt de 1 000 jetons plus 200 000 jetons de réflexion et de sortie.
Lors d'un flux continu, les événements step.stop et interaction.status_update incluent usage (cumulatif pour l'interaction). Lisez la dernière valeur usage au lieu de les additionner.
Comprendre la facturation
Vous payez pour chaque jeton de chaque saut, y compris les sauts qui ne contiennent que de la réflexion.
- Remise sur le cache : la mise en cache implicite réduit l'entrée répétée de chaque saut de 95%. L'entrée mise en cache coûte 0,10 $ par million de jetons au lieu de 2,00 $ pendant la période d'introduction.
- Interactions annulées et ayant échoué : vous payez pour tout le travail effectué avant la fin de l'interaction.
Dépannage
| Problème constaté | Cause et correction |
|---|---|
| La sortie s'arrête à 64 000 | background est false ou max_output_tokens n'est pas défini. Définissez background: true et max_output_tokens sur une valeur supérieure à 65 536. |
| 400 : "max_output_tokens greater than 65536 is not yet supported with background=false." | Le décodage long sans exécution en arrière-plan n'est pas encore disponible. Définissez background: true. |
| 400 : "store=true is required for background interactions" | L'exécution en arrière-plan nécessite store: true. |
État incomplete avec texte vide |
Le modèle a utilisé tous les jetons pour réfléchir. Augmentez max_output_tokens ou réduisez thinking_level. |
| La compression du contexte commence trop tôt | Votre framework d'agent ou votre outil d'évaluation lit total_input_tokens. Consultez Compter les jetons. |
Limites
- Pas de décodage long sans exécution en arrière-plan : les interactions avec
background: falses'arrêtent à 65 536 jetons. La compatibilité sera bientôt disponible. - Pas d'objectifs de longueur : le modèle ne respecte pas les objectifs de longueur de jeton ni de nombre de mots.