長いデコード

ロングデコードにより、Gemini 4 Argon は、深い推論タスクにおいて単一リクエストの出力上限を超えて生成できるようになり、統合された 100 万トークンのコンテキスト ウィンドウ(入力、思考、出力で共有される 1,048,576 トークン)まで対応します。

モデル ID を変更するだけでは、長いデコードは有効になりません。追加の設定を行わない場合、出力はストリーミング呼び出しでは 64,000 トークン、非ストリーミング呼び出しでは 32,000 トークンで停止します。長いデコードを有効にする最も簡単な方法は、Google GenAI SDK をアップグレードし、max_output_tokens を 65,536 より大きい値に設定することです。このガイドでは、長いデコードの仕組み、使用するタイミング、generateContent で有効にする方法について説明します。

デコードの有効期間

1 回のストリーミング リクエストまたは SDK リクエストで最大 64,000 トークンが生成され、ストリーミング以外の REST リクエストで最大 32,000 トークンが生成されます。レスポンスにさらにトークンが必要な場合、モデルは複数のリクエストとレスポンスのホップにわたってレスポンスを生成します。各ホップは、前のホップが停止した場所から続行されます。

  • 入力トークンと出力トークンの統合上限: 入力、思考、関数呼び出し、最終応答で 1 つの 100 万トークン ウィンドウを共有します。出力には、入力トークン数から 1,048,576 を引いた数までのトークンを使用できます。
  • 各ホップの上限: 1 つのホップで最大 65,536 個の出力トークンが返されます。非ストリーミング REST リクエストは最大 32,768 を返します。
  • 継続シグナル: モデルが上限に達し、トークンが残っている場合、レスポンスは finish_reason: CONTINUATION と continuation_token で終了します。
  • ネクストホップ: クライアントは、トークンを使用して同じリクエストを再度送信します。モデルは停止したところから再開されます。
  • すべてのホップの合計: max_output_tokens は、すべてのホップの思考トークンと出力トークンの合計を設定します。
  • 停止シグナル: モデルが max_output_tokens をすべて使用すると、レスポンスは finish_reason: MAX_TOKENS で終了します。

難しい問題では、ホップがすべてのトークンを内部思考に費やし、continuation_token で空のテキストを返すことがあります。これは正常な動作であり、最終的な回答は後のホップで返されます。

デフォルトの出力上限

長いデコードがない場合、単一のリクエストはリクエストごとの次の上限で停止します。

  • Google GenAI SDK(generate_content)を介したストリーミング リクエストと非ストリーミング リクエスト: デフォルトは 64K 出力トークンです。
  • ストリーミング以外の REST 呼び出し(generateContent): デフォルトは 32,000 個の出力トークンです。continuation_token を指定せずに、非ストリーミング REST 呼び出しで max_output_tokens を 32,768 より大きい値に設定すると、400 エラーが返されます。
モデルの呼び出し方法 長いデコードなしの出力上限 起動時のデコード時間が長い 手順
Google GenAI SDK の最新バージョン 64 K はい、SDK は継続されます max_output_tokens を設定します。
Google GenAI SDK(古いバージョン、非ストリーミング) 64 K いいえ SDK をアップグレードします。
REST streamGenerateContent 64 K はい(独自のループを使用) ループを記述します。オプション 2 をご覧ください。
REST generateContent 3.2 万 はい、独自のループを使用 ループを記述します。オプション 2 をご覧ください。

長いデコードを使用するタイミング

ほとんどのリクエストは、単一リクエストの上限(ストリーミング呼び出しと SDK 呼び出しの場合は 64,000 トークン、非ストリーミング REST 呼び出しの場合は 32,000 トークン)内で完了します。レスポンスに、1 つのリクエストで許可されるよりも多くの思考トークンと出力トークンの組み合わせが必要な場合は、長いデコードを使用します。max_output_tokens を増やすと、標準的な回答が長くなるのではなく、モデルが難しい問題を推論するための上限が高くなります。

ワークロード 長いデコードを使用しますか? 理由
難しい数学、科学、研究、形式的な証明 ○ モデルは 64,000 を超えるトークンを使用して、推論を探索して確認できます。
最も困難なコーディング タスクとエージェント タスク ○ 一部のタスクでは、1 つのレスポンスで 64,000 トークンを超える思考とコードが必要になります。ほとんどのコーディング タスクとエージェント タスクは 64,000 未満で完了します。
出力制限で停止する評価ハーネス ○ 長いデコードにより、モデルが 64K または 32K のリクエスト全体を思考に費やした場合に、回答が途中で切れるのを防ぎます。
チャット、Q&A、要約、分類、抽出 いいえ これらのタスクは 32K トークンを大幅に下回って完了します。
「70 万語の本を書いて」など、固定長のテキストを求めるリクエスト いいえ モデルが長さの目標に従っていない。
エージェントが短いターンでツールを何度も呼び出す場合 いいえ 各ターンは短いです。各ターンで出力が大きいと、100 万の統合された入出力ウィンドウがすぐにいっぱいになります。
100 万の入力上限に近いプロンプト いいえ 出力で使用できるのは、100 万から入力を差し引いた数のみです。
レイテンシの影響を受けやすいリクエスト いいえ 長いデコードは数分間実行されることがあります。

max_output_tokens を高く設定すると、モデルは難しい問題についてより長く考えることができますが、どの程度記述するかはモデルが決定します。モデルが使用する推論能力を制御するには、thinking_level を設定します。

長いデコードをオンにする

Google GenAI SDK を使用して長いデコードを自動的に実行するか(オプション 1、ほとんどのアプリにおすすめ)、独自の継続ループを作成します(オプション 2)。どちらのオプションも、100 万トークンのコンテキスト ウィンドウ全体をサポートしています。

オプション 1: Google GenAI SDK(推奨) オプション 2: 独自のストリーミング ループ オプション 2: ストリーミング以外の独自のループ
各ホップを開始するユーザー SDK。max_output_tokens を設定します。 コード(各チェックポイントまたはストリームのドロップ後) コード(32, 000 トークンごと)
リクエストあたりのトークン数 ホップあたり 64K ストリームあたり 64K、32K 以降は 5K トークンごとにチェックポイント リクエストあたり 32K
リクエストあたりの時間制限 20 分 20 分 20 分
ストレージ サーバー ストレージなし サーバー ストレージなし サーバー ストレージなし
最適な用途 ほとんどのアプリケーション REST 呼び出し元とストリーミングするカスタム ハーネス シンプルな評価ハーネス

暗号化された continuation_token は、リクエスト間でモデルの状態を保持するため、サーバーには何も保存されません。

オプション 1: Google GenAI SDK を使用する(推奨)

最新の Google GenAI SDK では、automatic_continuation はストリーミング呼び出しと非ストリーミング呼び出しの両方でデフォルトで有効になっているため、設定する必要はありません。max_output_tokens をリクエストあたりの上限より大きく設定すると、SDK は継続ホップを自動的に実行し、1 つの結合されたレスポンスを返します。

  1. SDK をアップグレードします。

    Python

    pip install -U "google-genai>=2.30.1"
    

    JavaScript

    npm install "@google/genai@>=2.29.1"
    
  2. max_output_tokens を 65,536 より大きい値に設定します。

    Python

    from google import genai
    from google.genai import types
    
    client = genai.Client()  # Reads GEMINI_API_KEY
    
    response = client.models.generate_content(
        model="gemini-4-argon",
        contents="Write a complete, rigorous proof of the prime number theorem.",
        config=types.GenerateContentConfig(
            max_output_tokens=262_144,  # Total thinking and output for all hops
            thinking_config=types.ThinkingConfig(thinking_level="high"),
            automatic_continuation=True,  # Default. Shown for clarity.
        ),
    )
    
    print(response.text)
    print("Finish reason:", response.candidates[0].finish_reason)
    print("Prompt size:", response.usage_metadata.initial_prompt_token_count)
    print("Billed tokens:", response.usage_metadata.total_token_count)
    

    JavaScript

    import { GoogleGenAI, ThinkingLevel } from "@google/genai";
    
    const ai = new GoogleGenAI({}); // Reads GEMINI_API_KEY
    
    const response = await ai.models.generateContent({
      model: "gemini-4-argon",
      contents: "Write a complete, rigorous proof of the prime number theorem.",
      config: {
        maxOutputTokens: 262144, // Total thinking and output for all hops
        thinkingConfig: { thinkingLevel: ThinkingLevel.HIGH },
        automaticContinuation: true, // Default. Shown for clarity.
      },
    });
    
    console.log(response.text);
    console.log("Finish reason:", response.candidates?.[0]?.finishReason);
    console.log("Prompt size:", response.usageMetadata?.initialPromptTokenCount);
    console.log("Billed tokens:", response.usageMetadata?.totalTokenCount);
    

ポイントは次のとおりです。

  • ストリーミング: generate_content_stream(Python)と generateContentStream(JavaScript)も継続されます。チェックポイントの後にストリームがドロップした場合、SDK はそのチェックポイントから再開します。
  • タイムアウト: タイムアウトと再試行は、実行全体ではなく、各ホップに適用されます。
  • 手動制御: ループを自分で実行するには、automatic_continuation=False(Python)または automaticContinuation: false(JavaScript)を設定します。オプション 2 に沿って操作します。
  • 使用量: 使用量フィールドには、すべてのホップの合計が表示されます。プロンプトのサイズを取得するには、initial_prompt_token_count を読み取ります。トークンをカウントするをご覧ください。

オプション 2: 独自のループを作成する

REST を直接呼び出す場合、最新の SDK を使用しない言語を使用する場合、または完全な制御が必要な場合は、独自のループを作成します。また、Python と JavaScript/TypeScript の Google GenAI SDK の実装も参考にしてください。

以下のルールに従ってください。

  1. すべてのホップで同じリクエストを送信する。contents、system_instruction、tools、generation_config の原本を送信します。max_output_tokens は変更しないでください。
  2. 部分的な出力を contents に追加しないでください。continuation_token には、思考を含むモデルの状態が含まれます。
  3. 最新のトークンのみを送信する。各トークンには、それまでのすべての進捗状況が含まれます。
  4. finish_reason が CONTINUATION の間は続行します。その他の終了理由で停止します。
  5. 最後のホップの後にパーツを結合します。すべてのホップの部分を 1 つのモデルターンに結合して、会話履歴を作成します。

Python

from google import genai
from google.genai import types

client = genai.Client()  # Reads GEMINI_API_KEY
PROMPT = "Write a complete, rigorous proof of the prime number theorem."
parts = []
token = None

while True:
    response = client.models.generate_content(
        model="gemini-4-argon",
        contents=PROMPT,  # The original contents on every request
        config=types.GenerateContentConfig(
            max_output_tokens=262_144,  # The same total on every request
            thinking_config=types.ThinkingConfig(thinking_level="high"),
            automatic_continuation=False,  # You run the loop
            continuation_token=token,
        ),
    )
    candidate = response.candidates[0]
    if candidate.content and candidate.content.parts:
        parts.extend(candidate.content.parts)
    token = candidate.continuation_token
    if candidate.finish_reason != types.FinishReason.CONTINUATION or not token:
        break

print("".join(p.text for p in parts if p.text and not p.thought))
print("Finish reason:", candidate.finish_reason)

JavaScript

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

const ai = new GoogleGenAI({}); // Reads GEMINI_API_KEY
const PROMPT = "Write a complete, rigorous proof of the prime number theorem.";
const parts = [];
let token = undefined;
let candidate = undefined;

while (true) {
  const response = await ai.models.generateContent({
    model: "gemini-4-argon",
    contents: PROMPT, // The original contents on every request
    config: {
      maxOutputTokens: 262144, // The same total on every request
      thinkingConfig: { thinkingLevel: ThinkingLevel.HIGH },
      automaticContinuation: false, // You run the loop
      continuationToken: token,
    },
  });
  candidate = response.candidates?.[0];
  if (candidate?.content?.parts) {
    parts.push(...candidate.content.parts);
  }
  token = candidate?.continuationToken;
  if (candidate?.finishReason !== "CONTINUATION" || !token) {
    break;
  }
}

console.log(parts.filter((p) => p.text && !p.thought).map((p) => p.text).join(""));
console.log("Finish reason:", candidate?.finishReason);

REST

# Hop 1: send the request with max_output_tokens.
curl -s "https://generativelanguage.googleapis.com/v1beta/models/gemini-4-argon:generateContent" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [{"role": "user", "parts": [{"text": "Write a complete, rigorous proof of the prime number theorem."}]}],
    "generationConfig": {
      "maxOutputTokens": 262144,
      "thinkingConfig": {"thinkingLevel": "high"}
    }
  }'

# Hop 2: if finishReason is CONTINUATION, send the same request plus the token.
curl -s "https://generativelanguage.googleapis.com/v1beta/models/gemini-4-argon:generateContent" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [{"role": "user", "parts": [{"text": "Write a complete, rigorous proof of the prime number theorem."}]}],
    "generationConfig": {
      "maxOutputTokens": 262144,
      "thinkingConfig": {"thinkingLevel": "high"}
    },
    "continuationToken": "TOKEN_FROM_HOP_1"
  }'

思考に完全に費やされたホップは、finishReason: "CONTINUATION" を含む空の text を返します。通常の進捗状況として扱い、次のホップをリクエストします。

{
  "candidates": [{
    "content": {"role": "model", "parts": [{"text": ""}]},
    "finishReason": "CONTINUATION",
    "continuationToken": "CiQ4ZmQ3..."
  }],
  "usageMetadata": {
    "promptTokenCount": 142,
    "candidatesTokenCount": 0,
    "thoughtsTokenCount": 32768,
    "totalTokenCount": 32910
  }
}

ストリーミング ループには、もう 1 つルールが必要です。最初の 32,768 トークンの後、ストリームは 5,000 トークンごとにチェックポイント トークンを送信します。新しいチャンクを保留リストに保持します。チャンクに continuation_token がある場合は、保留中のチャンクを commit 済みの出力に移動し、トークンを保存します。ストリームが切断された場合は、保留中のチャンクを破棄し、最後のトークンから再開します。最初のチェックポイントの前にストリームがドロップした場合は、元のリクエストを再度送信します。

max_output_tokens を設定

max_output_tokens は、すべてのホップにわたる思考と出力の合計上限を設定します。値を下げても、モデルがより簡潔に考えるわけではなく、レスポンスが途中で終わってしまいます。

ワークロード 推奨: max_output_tokens
32K 未満の制限が設定されている既存のアプリ 32,768 に引き上げます。
長いコーディング タスクとエージェント タスク 65,536 から開始します。
高度な数学、科学、研究、証明 262,144 から 1,048,576 までの値から入力トークンを引いた値をテストします。

使用するトークンを減らすには、thinking_level を下げます。最も困難な推論タスクには high を使用します。ほとんどのコーディングとエージェント作業には medium(デフォルト)を使用します。複雑でないタスクには low を使用します。

長時間実行リクエストを処理する

Gemini 4 Argon は、難しい問題に対して Gemini 3.x モデルよりも長い時間をかけて思考するため、長いリクエストが早期に切断されないように、クライアントのタイムアウトを増やす必要があります。

  • 非ストリーミング呼び出し: サーバーは 10 分後に接続を閉じます。
  • ストリーミング呼び出し: サーバーは 20 分後にストリームを閉じます。
  • クライアント タイムアウト: HTTP 読み取りタイムアウトを 20 分に設定します。3 分または 5 分のタイムアウトにより、リクエストが早期に停止します。

Python では、クライアントのタイムアウトをミリ秒単位で設定します。

client = genai.Client(http_options=types.HttpOptions(timeout=1_200_000))  # 20 minutes

クライアントがポーリングするジョブの場合、Interactions API はサーバーで長いデコードを実行します。バックグラウンド実行をご覧ください。

モデルがすべての出力トークンを使用したら再開する

レスポンスが MAX_TOKENS で終わる場合でも、continuation_token が含まれます。これには次の 2 つの選択肢があります。

  • 続行: トークンとより高い max_output_tokens を指定して同じリクエストを送信します。値は、これまでに使用されたトークン数より大きくする必要があります。それ以外の場合、API は 400 エラーを返します。
  • 再開: max_output_tokens を大きくして、トークンなしで元のリクエストを送信します。両方の実行に対して料金が発生します。

トークンのカウント

自動継続では、usage_metadata はすべてのホップの合計をレポートします。SDK は、すべてのカウント フィールド(prompt_token_count、cached_content_token_count、candidates_token_count、thoughts_token_count、total_token_count)を加算します。

prompt_token_count は、すべてのホップの入力トークンを合計します。各ホップは、プロンプトとそれまでに生成されたすべてのものを入力としてモデルに送り返すため、同じトークンが後続のすべてのホップで再度カウントされます。たとえば、Google GenAI SDK を使用する場合、1,000 トークンのプロンプトで 200,000 トークンの思考と出力が生成されると、4 つのホップが必要になります。

ホップ モデルに送信された入力 入力トークン
1 プロンプト 1,000
2 プロンプト + ホップ 1 66,536
3 プロンプト + ホップ 1、2 132,072
4 プロンプト + ホップ 1 ~ 3 197,608
合計 397,216

実際のコンテキスト サイズは約 201,000 トークン(1,000 トークンのプロンプトと 200,000 トークンの思考と出力)であるにもかかわらず、prompt_token_count は約 397,000 トークン(暗黙的なキャッシュ保存により、繰り返されるホップ入力が自動的に 95% 割引されます)、total_token_count は約 597,000 トークンを報告します。非ストリーミング REST ループは 32K ホップを使用するため、同じ出力に 7 ホップかかり、695,128 個の入力トークンが報告されます。

モデルの呼び出し方法 usage_metadata が表示する内容 費用の場合 プロンプトのサイズ
Google GenAI SDK、自動継続(デフォルト) すべてのホップの合計 使用状況フィールドをそのまま読み取ります。 usage_metadata.initial_prompt_token_count(Python)または usageMetadata.initialPromptTokenCount(JavaScript)を読み取る。
automatic_continuation=False または REST を使用した SDK 1 回のレスポンスにつき 1 ホップ ホップ間で各フィールドを追加します。 最初のホップから prompt_token_count を読み取ります。

prompt_token_count と total_token_count は、コンテキストのサイズではなく、すべてのホップの合計です。会話履歴の要約や切り捨て(コンテキストの圧縮)のタイミングを決定したり、コンテキストの上限を適用したりするために使用しないでください。コンテキスト サイズを見積もるには、テーブルのプロンプト サイズを candidates_token_count と thoughts_token_count に追加します。

長いデコードを実行する前に、エージェント フレームワーク、評価ツール、またはプロキシを更新します。

  • エージェントと評価ツール: コードがコンテキストを圧縮するか、トークン上限で実行を停止する場合は、合計された prompt_token_count ではなく、initial_prompt_token_count(または REST の最初のホップの prompt_token_count)を使用します。1 ホップで終了するレスポンスでは両方のフィールドに同じ値が報告されるため、短いテストでは問題が示されません。
  • REST を呼び出すプロキシとゲートウェイ: 各 REST レスポンスは、独自のホップのみを報告します。ホップごとにコストの各フィールドを追加し、最初のホップの promptTokenCount をプロンプト サイズとして保持します。そうしないと、ユーザーが同じリクエストに対して SDK ユーザーとは異なる数値を確認することになります。
  • ログとシリアル化されたレスポンス: SDK はクライアントで initial_prompt_token_count を計算します。REST レスポンスや SDK の JSON 出力(model_dump() など)には含まれません。後で必要になる場合は、別の値として保存してください。

独自のループでストリーミングする場合、usage_metadata は各ストリーム内で累積されます。各ストリームの最後の値のみを保持し、ホップ間で値を加算します。

課金について

思考のみを含むホップを含め、すべてのホップのすべてのトークンに対して料金が発生します。

  • キャッシュ割引: 暗黙的なキャッシュ保存により、各ホップで繰り返される入力が 95% 割引されます。お試し期間中は、キャッシュに保存された入力の料金は $2.00 ではなく 100 万トークンあたり $0.10 です。
  • キャッシュの有効期限: キャッシュは、15 ~ 20 分間使用されないと期限切れになります。ホップ間の時間が長いと、再度、全入力レートが課金されます。
  • 失敗した非ストリーミング ホップ: 料金は、レスポンスが完了した場合にのみ発生します。失敗したリクエストやドロップされたリクエストの費用は $0 です。
  • ドロップされたストリーム: 32,000 トークンに達する前にドロップされたストリームの費用は $0 です。その後は、最後のチェックポイント トークンまで支払います。これは、そこから再開できるためです。

トラブルシューティング

症状 原因と解決策
CONTINUATION を使用すると、出力が 64K または 32K で停止する モデルにはトークンが残っていますが、リクエストが継続されませんでした。SDK をアップグレードするか、ループを追加します。
MAX_TOKENS を使用すると、出力が 64K または 32K で停止する max_output_tokens が設定されていないか、低すぎます。65,536 より大きい値に設定します。
MAX_TOKENS の空のテキスト モデルは思考ですべてのトークンを使用しました。上げるには max_output_tokens、下げるには thinking_level を押します。
400: 「継続トークンは出力トークンをすでに使用しています...」 max_output_tokens が、これまでに使用されたトークン数を超えていません。引き上げましょう。
thinking_level: "minimal" のエラー、または thinking_level を含む thinking_budget のエラー Gemini 4 Argon は minimal をサポートしていません。low、medium、または high を使用します。thinking_level または thinking_budget のいずれかを設定します。両方は設定しないでください。
thinking_budget、temperature、top_p、top_k の警告 Gemini 4 Argon は、これらのフィールドを無視するか、マッピングします。thinking_level を使用し、サンプリング パラメータを削除します。
リクエストは 3 ~ 5 分後に終了します クライアントのタイムアウトが短すぎる。20 分に設定します。
コンテキストの圧縮が早すぎる ハーネスは合計された入力を読み取ります。代わりに initial_prompt_token_count をご覧ください。

制限事項

  • OpenAI 互換性エンドポイント: ロングデコードは使用できません。出力はリクエストごとの上限で停止します。
  • 古い SDK: 注記に記載されている最小バージョンより古いバージョンは、自動的に継続されません。
  • 長さ: モデルがトークン長または単語数の目標に従っていない。

チェックリスト

  • Google GenAI SDK を最小バージョンにアップグレードします。
  • max_output_tokens を 65,536 より大きく設定します。
  • thinking_budget ではなく、thinking_level(low、medium、または high)を使用します。
  • HTTP 読み取りタイムアウトを 20 分に設定します。
  • コンテキスト サイズと圧縮には initial_prompt_token_count を使用します。
  • 大規模な評価の前に、1 つのプロンプトをテストとして実行します。

次のステップ