Długie dekodowanie

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ź:

  1. Tworzysz interakcję z parametrami background: true i max_output_tokens o wartości większej niż 65 536, aż do 1 mln.
  2. Serwer generuje pierwszy przeskok o długości do 64 tys. tokenów.
  3. 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.
  4. 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_id może pojawić się w wydarzeniach interaction.status_update, a nie tylko w deltach tekstu.
  • Połącz się ponownie za pomocą last_event_id: wywołaj interactions.get z parametrami stream: true i ostatnim event_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: false zatrzymują 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.

Dalsze kroki