Długie dekodowanie umożliwia modelowi Gemini 4 Argon generowanie ponad 64 tys. tokenów na potrzeby złożonych zadań związanych z wnioskowaniem, aż do ujednoliconego okna kontekstu z milionem tokenów (1 048 576 tokenów współdzielonych między danymi wejściowymi, wnioskowaniem i danymi wyjściowymi). W przypadku interfejsu Interactions API włączasz długie dekodowanie z wykonywaniem w tle, dzięki czemu nasze serwery automatycznie generują i łączą każdy przeskok o długości 64 tys. tokenów w jedną interakcję.
Jak działa długie dekodowanie
Pojedyncze wywołanie modelu generuje do 64 tys. tokenów. Gdy odpowiedź wymaga więcej niż 64 tys. tokenów, serwer generuje ją w przeskokach o długości 64 tys. tokenów, które są kontynuowane od miejsca, w którym zatrzymał się poprzedni przeskok. Każdy przeskok dodaje krok model_output do interaction.steps w ramach tego samego identyfikatora interakcji, dzięki czemu możesz połączyć te kroki, aby odczytać pełną odpowiedź:
- Tworzysz interakcję z parametrami
background: trueimax_output_tokenso wartości większej niż 65 536, aż do 1 mln. - Serwer generuje pierwszy przeskok o długości do 64 tys. tokenów.
- Serwer rozpoczyna następny przeskok od miejsca, w którym zatrzymał się poprzedni, i powtarza ten proces, aż model zakończy działanie lub wykorzysta wszystkie tokeny
max_output_tokens. - Aby uzyskać wynik, odpytujesz interakcję lub przesyłasz ją strumieniowo.
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
Limity danych wyjściowych
Interakcje strumieniowe i niestrumieniowe domyślnie mają limit 64 tys. tokenów wyjściowych, więc odpowiedzi o długości do 64 tys. tokenów nie wymagają zmian w kodzie. Aby wygenerować więcej niż 64 tys. tokenów, włącz wykonywanie w tle i zwiększ wartość max_output_tokens.
| Jak tworzysz interakcję | Limit danych wyjściowych |
|---|---|
background: false (strumieniowe lub niestrumieniowe) |
65 536 tokenów. Wartości większe niż 65 536 zwracają błąd 400. Długie dekodowanie już wkrótce. |
background: true, max_output_tokens nie jest ustawiony |
65 536 tokenów |
background: true, max_output_tokens większe niż 65 536 |
Wartość max_output_tokens, maksymalnie 1 048 576 minus dane wejściowe |
Kiedy używać długiego dekodowania
Większość żądań kończy się w ciągu 64 tys. tokenów. Długiego dekodowania używaj tylko wtedy, gdy jedna odpowiedź wymaga więcej wnioskowania i danych wyjściowych.
| Zbiór zadań | Użyć długiego dekodowania? | Dlaczego |
|---|---|---|
| Trudne zadania z matematyki, nauk ścisłych, badań i dowodów formalnych | Tak | Model może wykorzystać więcej niż 64 tys. tokenów na analizę i sprawdzenie wnioskowania. |
| Najtrudniejsze zadania związane z kodowaniem i agentowe | Tak | Niektóre zadania wymagają w jednej odpowiedzi więcej niż 64 tys. tokenów wnioskowania i kodu. Większość zadań związanych z kodowaniem i agentowych kończy się w ciągu 64 tys. tokenów. |
| Narzędzia do oceny, które zatrzymują się na limicie danych wyjściowych | Tak | Długie dekodowanie zapobiega obcinaniu odpowiedzi, gdy model wykorzystuje całą odpowiedź o długości 64 tys. tokenów na wnioskowanie. |
| Czat, pytania i odpowiedzi, podsumowywanie, klasyfikacja i wyodrębnianie | Nie | Te zadania kończą się w ciągu 32 tys. tokenów. |
| Żądania o stałej długości, np. „napisz książkę o długości 700 tys. słów” | Nie | Model nie uwzględnia docelowej długości. |
| Agenci, którzy wywołują narzędzia w wielu krótkich turach | Nie | Każda tura jest krótka. Duże dane wyjściowe w każdej turze szybko wypełniają współdzielone okno kontekstu. |
| Prompty zbliżające się do limitu danych wejściowych | Nie | Dane wyjściowe mogą używać tylko 1 048 576 tokenów minus dane wejściowe. |
| Żądania wrażliwe na opóźnienie | Nie | Długie dekodowanie może trwać kilka minut. |
Ustawienie wysokiej wartości max_output_tokens daje modelowi więcej czasu na wnioskowanie w przypadku trudnych problemów, ale model nadal decyduje, ile ma napisać. Aby kontrolować, ile wysiłku model poświęca na wnioskowanie, ustaw thinking_level.
Wybierz sposób uruchamiania długiego dekodowania
Wykonywanie w tle to najłatwiejszy sposób na uruchomienie długiego dekodowania w interfejsie Interactions API. Kontynuacja po stronie klienta, w której kod rozpoczyna każdy przeskok, jest dostępna w interfejsie GenerateContent API. Już wkrótce będzie dostępna w interfejsie Interactions API jako bardziej zaawansowana opcja zarządzania odpornością.
| Wykonywanie w tle (Interactions API) | Kontynuacja po stronie klienta (GenerateContent API) | |
|---|---|---|
| Kto rozpoczyna każdy przeskok | Nasze serwery | Pakiet SDK Google GenAI lub Twój kod |
| Tokeny na żądanie | Wartość max_output_tokens w jednej interakcji |
64 tys. na strumień, 32 tys. na żądanie niestrumieniowe |
| Czas działania | Do 24 godzin | 20 minut |
| Miejsce na dane | Wymaga store: true |
Nic nie jest przechowywane na serwerze. |
| Najlepsze zastosowanie | Najłatwiejszy sposób na uruchomienie długiego dekodowania | Bardziej szczegółowa kontrola nad ponownymi próbami, dzięki czemu możesz tworzyć własne wycofywanie, obsługę błędów i odporność |
Aby użyć kontynuacji po stronie klienta, zapoznaj się z artykułem Długie dekodowanie za pomocą interfejsu GenerateContent API.
Przesyłanie strumieniowe długiego dekodowania
Aby przesyłać strumieniowo dane wyjściowe i podsumowania wnioskowania w miarę ich otrzymywania, dodaj stream: true i thinking_summaries: "auto". Długie strumienie mogą się rozłączać, więc klient musi się ponownie połączyć. Postępuj zgodnie ze wzorcem ponownego łączenia w przewodniku po wykonywaniu w tle. Długie dekodowanie dodaje te reguły:
- Zapisz identyfikator interakcji: odczytaj go z wydarzenia
interaction.created. - Zapisz każdy
event_id:event_idmoże pojawić się w wydarzeniachinteraction.status_update, a nie tylko w deltach tekstu. - Połącz się ponownie za pomocą
last_event_id: wywołajinteractions.getz parametramistream: truei ostatnimevent_id. Strumień będzie kontynuowany po tym wydarzeniu. - Odczytaj do końca: po ponownym połączeniu odczytaj strumień do końca, zanim sprawdzisz stan. Serwer odtwarza pominięte wydarzenia nawet po zakończeniu interakcji.
- Ustaw długie limity czasu: ustaw limity czasu odczytu HTTP na 15–20 minut na strumień.
- Oczekuj danych wyjściowych w blokach po 5 tys. tokenów: po pierwszych 64 tys. tokenów (czyli po około 10 minutach) strumień wysyła dane wyjściowe w blokach po około 5 tys. tokenów. Przerwy między blokami są normalne. Interakcja nie jest zablokowana, więc utrzymuj połączenie.
Stan w tle
Interakcja w tle może trwać do 24 godzin. Gdy stan nie jest już in_progress ani queued, obsługuj stan końcowy za pomocą tej tabeli:
| Stan | Znaczenie | Co zrobić |
|---|---|---|
completed |
Model zakończył działanie. | Połącz kroki model_output w steps i odczytaj usage. Aby kontynuować rozmowę, przekaż id tej interakcji jako previous_interaction_id. |
requires_action |
Model poprosił o wywołanie narzędzia. | Uruchom narzędzie. Następnie wyślij wynik z id tej interakcji. |
incomplete |
Model wykorzystał wszystkie tokeny max_output_tokens. Tekst może być pusty, jeśli model nadal wnioskował. |
Ponownie wyślij żądanie z wyższą wartością max_output_tokens. |
failed |
Serwer nie mógł zakończyć działania lub interakcja trwała dłużej niż 24 godziny. | Ponów żądanie. Jeśli problem się powtórzy, udostępnij zespołowi pomocy id interakcji. |
cancelled |
Anulowano interakcję. | Odczytaj usage, aby zobaczyć naliczone tokeny. |
Aby zatrzymać działającą interakcję, wywołaj client.interactions.cancel(id=interaction.id) w Pythonie, client.interactions.cancel(interaction.id) w JavaScript lub POST /v1beta/interactions/{id}/cancel w REST.
Ustaw max_output_tokens
max_output_tokens ustawia łączny limit wnioskowania i danych wyjściowych w ramach interakcji. Zmniejszenie tej wartości nie powoduje, że model wnioskuje bardziej zwięźle, ale skraca odpowiedź.
| Zbiór zadań | Zalecana wartość max_output_tokens |
|---|---|
| Istniejące aplikacje z limitem niższym niż 32 tys. | Zwiększ do 32 768. Wykonywanie w tle nie jest potrzebne. |
| Długie zadania związane z kodowaniem i agentowe | Zacznij od 65 536 (wartość domyślna). Wykonywanie w tle nie jest potrzebne. |
| Złożone wnioskowanie, trudne zadania z matematyki, nauk ścisłych i dowodów | Ustaw background: true i zacznij od 262 144, aż do 1 048 576 minus tokeny wejściowe. |
Aby użyć mniejszej liczby tokenów, zmniejsz wartość thinking_level. W przypadku najtrudniejszych zadań związanych z wnioskowaniem użyj wartości high. W przypadku większości zadań związanych z kodowaniem i agentowych użyj wartości medium (wartość domyślna).
Zliczanie tokenów
interaction.usage podaje sumy we wszystkich przeskokach. Odczytaj te pola: total_input_tokens, total_cached_tokens, total_output_tokens, total_thought_tokens i total_tokens.
total_input_tokens sumuje tokeny wejściowe każdego przeskoku. Każdy przeskok wysyła prompta i wszystko, co zostało wygenerowane do tej pory, z powrotem do modelu jako dane wejściowe, więc te same tokeny są zliczane ponownie w każdym kolejnym przeskoku. Na przykład prompt o długości 1000 tokenów, który generuje 200 tys. tokenów wnioskowania i danych wyjściowych, wymaga 4 przeskoków:
| Przeskok | Dane wejściowe wysłane do modelu | Tokeny wejściowe |
|---|---|---|
| 1 | Prompt | 1000 |
| 2 | Prompt + przeskok 1 | 66 536 |
| 3 | Prompt + przeskoki 1 i 2 | 132 072 |
| 4 | Prompt + przeskoki 1–3 | 197 608 |
| Łącznie | 397 216 |
total_input_tokens zgłasza około 397 tys. tokenów (z powtarzającymi się danymi wejściowymi przeskoku automatycznie pomniejszonymi o 95% przez niejawne buforowanie), mimo że rzeczywisty rozmiar kontekstu wynosi tylko około 201 tys. tokenów: prompt o długości 1000 tokenów plus 200 tys. tokenów wnioskowania i danych wyjściowych.
Podczas strumienia zarówno wydarzenia step.stop, jak i interaction.status_update zawierają usage (skumulowane dla interakcji). Zamiast dodawać je do siebie, odczytaj najnowszą wartość usage.
Informacje o rozliczeniach
Płacisz za każdy token w każdym przeskoku, w tym za przeskoki, które zawierają tylko wnioskowanie.
- Rabat za buforowanie: niejawne buforowanie zmniejsza powtarzające się dane wejściowe w każdym przeskoku o 95%. W okresie wprowadzającym buforowane dane wejściowe kosztują 0,10 USD za 1 mln tokenów zamiast 2,00 USD.
- Anulowane i nieudane interakcje: płacisz za całą pracę wykonaną przed zakończeniem interakcji.
Rozwiązywanie problemów
| Krótki opis problemu | Przyczyna i rozwiązanie |
|---|---|
| Dane wyjściowe zatrzymują się na 64 tys. | background ma wartość false lub max_output_tokens nie jest ustawiony. Ustaw background: true i max_output_tokens większe niż 65 536. |
| 400: „max_output_tokens greater than 65536 is not yet supported with background=false.” | Długie dekodowanie bez wykonywania w tle nie jest jeszcze dostępne. Ustaw background: true. |
| 400: „store=true is required for background interactions” | Wykonywanie w tle wymaga store: true. |
Stan incomplete z pustym tekstem |
Model wykorzystał wszystkie tokeny na wnioskowanie. Zwiększ wartość max_output_tokens lub zmniejsz wartość thinking_level. |
| Kompresja kontekstu rozpoczyna się zbyt wcześnie | Framework agenta lub narzędzie do oceny odczytuje total_input_tokens. Zobacz Zliczanie tokenów. |
Ograniczenia
- Brak długiego dekodowania bez wykonywania w tle: interakcje z parametrem
background: falsezatrzymują się na 65 536 tokenach. Już wkrótce. - Brak docelowej długości: model nie uwzględnia docelowej długości tokenów ani liczby słów.