# Gemini 4 Argon APIのfinish_reason：途中で切れる回答の続け方

> Argonの回答が切れたら、CONTINUATIONはトークン付きで再送、MAX_TOKENSは上限を上げて送り直します。OpenAI互換経路では続きを取れません。

- URL: https://blog.laozhang.ai/ja/posts/gemini-4-argon-api-finish-reason
- Published: 2026-10-28
- Updated: 2026-10-28
- Author: LaoZhang AI Team (https://blog.laozhang.ai/ja/about)
- Topic: API ガイド
- Tags: Gemini 4 Argon, finish_reason, CONTINUATION, long decode, Gemini API

---
`gemini-4-argon`の回答が途中で切れたり空で返ってきたりしたら、最後のレスポンスの`finishReason`（Python SDKとOpenAI形式では`finish_reason`）を見るのが最初の一歩です。`CONTINUATION`なら、一緒に返ってきた`continuationToken`を付けて同じリクエストを送り直せば続きが出ます。テキストが空の`MAX_TOKENS`は、`maxOutputTokens`をすべて思考に使い切ったという意味なので、上限を上げるか思考レベルを下げます。Googleのドキュメントによると、Argonが1回のリクエストで出すのはストリーミングで64K、非ストリーミングのRESTで32Kトークンまでで、それを超える回答はこの「続きの要求」を繰り返して受け取る仕組みです。

Googleの文書どおりに続きを受け取れるのは、有料枠のAPIキーでGemini APIのネイティブな`generateContent`を呼び、Pythonなら`google-genai` 2.30.1以上、JavaScriptなら`@google/genai` 2.29.1以上を使う構成です。この場合はSDKが自動で続きを取るので、`max_output_tokens`を65,536より大きく設定するだけで済みます。反対に、OpenAI互換エンドポイントでは続きの生成そのものが使えません。間に入ったAPI中継サービスが`continuationToken`を落とすと、例外は出ずに空のテキストと`CONTINUATION`だけが手元に残ります。

2026年10月28日に実際に動かしたのは、API中継サービス1社のネイティブ経路とOpenAI互換経路への計11回のリクエストと、`google-genai` 2.33.0と2.29.0をローカルの模擬サーバーにつないだ挙動テストです。Googleに直接つなぐAPIキーは使っておらず、テストした経路では本物の`CONTINUATION`は一度も返ってきませんでした。Google直接の挙動として書いている部分は、Googleの公式ドキュメントに基づいています。

## Gemini 4 Argon APIの始め方：有料枠のキー、モデルID、SDKの更新

Argonは[Gemini APIの料金ページ](https://ai.google.dev/gemini-api/docs/pricing)で無料枠の対象外とされており、課金を有効にしたプロジェクトのキーでなければ呼べません。長い回答を前提にするなら、キーを作った段階で次の5点まで済ませておくと、後から切れた回答の原因を探す手間が減ります。

1. Google AI Studioで課金を有効にしたプロジェクトのAPIキーを作ります。[Gemini APIの課金ページ](https://ai.google.dev/gemini-api/docs/billing)では、お支払い情報の紐付けと$5以上の前払いでTier 1になり、前払い残高が0になるとキーはHTTP 402で止まります。日本は2026年10月22日更新の[Gemini APIの提供地域リスト](https://ai.google.dev/gemini-api/docs/available-regions)に含まれています。
2. モデルIDに`gemini-4-argon`を指定します。[Gemini APIの変更履歴](https://ai.google.dev/gemini-api/docs/changelog)によると、2026年10月13日に一般提供（GA）になったStable版です。
3. SDKを更新します。Pythonは`pip install -U "google-genai>=2.30.1"`、JavaScriptは`npm install "@google/genai@>=2.29.1"`です。Go 1.74.0、Java 1.77.0、.NET 1.26.0、Kotlin 1.6.0が同じ機能の最低バージョンです。
4. `max_output_tokens`を設定します。これは思考と回答を合わせた上限なので、[Gemini 4 Argonの新機能ページ](https://ai.google.dev/gemini-api/docs/latest-model)の移行手順どおり少なくとも32,768にし、64Kを超える回答を受け取りたい場合は65,536より大きくします。`temperature`・`top_p`・`top_k`は無視されるので外し、思考の深さは`thinking_level`（`low`・`medium`・`high`、既定は`medium`）で調整します。
5. HTTPクライアントの読み取りタイムアウトを20分にします。Pythonなら`genai.Client(http_options=types.HttpOptions(timeout=1_200_000))`です。3分や5分のタイムアウトでは、難しい問題で思考している途中に切れます。

料金は入力100万トークンあたり$2.00、出力（思考トークンを含む）$10.00で、2026年12月1日からはそれぞれ$4.00と$20.00に上がります。Google AI ProやUltraの契約はGeminiアプリなどの利用権で、契約しているだけではプロジェクトからAPIを呼べるようにはなりません。429エラーやティアごとの上限は[Gemini APIのレート制限：確認場所、Tier別の支出上限、上げ方](https://blog.laozhang.ai/ja/posts/gemini-api-rate-limits-guide)で扱っています。

## finish_reason一覧：Gemini 4 Argonが返す値と次にやること

Argonのレスポンスに付く終了理由は、続きを取れば完成するもの（`CONTINUATION`）、上限を見直すもの（`MAX_TOKENS`）、内容やツール定義を直さない限り何度送っても同じになるもの、の3種類に分かれます。[Gemini APIのGenerateContentリファレンス](https://ai.google.dev/api/generate-content)の列挙値のうち、画像生成専用の値（`IMAGE_SAFETY`など）はテキストしか出力しないArgonには関係しないため除いています。

| finishReason | 意味 | コードが次にやること |
|---|---|---|
| `STOP` | モデルが自然に止まった、または停止シーケンスに達した | 完了として扱う。ただし依頼どおりに仕上がったかは中身で確認する |
| `CONTINUATION`（トークンあり） | 1回分の上限に達したが、`maxOutputTokens`はまだ残っている | 同じリクエストに`continuationToken`を足して再送する。テキストが空でも正常 |
| `CONTINUATION`（トークンなし） | 経路のどこかでトークンが削られた | この経路では続けられない。Googleに直接つなぐかInteractions APIに切り替える |
| `MAX_TOKENS`（テキストあり） | 全体の`maxOutputTokens`を使い切った | トークンがあれば上限を上げて続ける。なければ上限を上げて最初からやり直す |
| `MAX_TOKENS`（テキストが空） | 上限をすべて思考に使い、回答を書く前に終わった | `maxOutputTokens`を上げるか`thinkingLevel`を下げる |
| `SAFETY`・`PROHIBITED_CONTENT`・`BLOCKLIST`・`SPII` | 安全性、禁止コンテンツ、禁止語、個人を特定できる機微情報で停止した | プロンプトや入力を変える。同じリクエストの再試行では変わらない |
| `RECITATION`・`LANGUAGE` | 既存の文章の再現、または未対応の言語と判定された | 同上。言い換えや出力言語の指定を見直す |
| `MALFORMED_FUNCTION_CALL`・`UNEXPECTED_TOOL_CALL`・`TOO_MANY_TOOL_CALLS` | 関数呼び出しの形式が不正、ツール未設定なのに呼び出した、連続呼び出しが多すぎた | ツール宣言とツールの戻し方を直してから再試行する |
| `MISSING_THOUGHT_SIGNATURE`・`MALFORMED_RESPONSE` | 履歴のthought signatureが欠けている、または応答の形式が壊れていた | 前のターンのモデル応答を加工せずに履歴へ戻してから再試行する |
| `ESCALATION`・`PUP_LIMITED_DISABLED` | エスカレーションルールで除外された、または禁止使用ポリシー違反でアカウントが制限された | 再試行しない。アカウントと利用内容を確認する |
| `OTHER` | 理由不明 | `finishMessage`を記録して1回だけ再試行する |
| 値がない、または空文字列 | 終了理由が届く前に接続が終わった | 完了扱いにしない。後述のストリームの節を参照 |

`STOP`は「モデルが自分で止まった」という意味でしかありません。2026年10月28日の中継経路のテストで、`maxOutputTokens` 33,000を指定して「1から7000までの整数をすべて1行ずつ出力して」と頼んだところ、Argonは142トークンで「1回の応答の出力上限を超えるため途中で切れてしまう」と断り、代わりに`seq 1 7000`などのコマンドを提案して`STOP`で終わりました。長い出力を求めるパイプラインでは、`STOP`を見たうえで行数や必須項目など中身の完成条件も確かめる必要があります。

## SDKがCONTINUATIONを見せない理由：自動継続とその条件

最新のGoogle GenAI SDKは、`CONTINUATION`を受け取ると自分で次のリクエストを送り、全部つなげた1つの応答を返します。[Googleのlong decodeガイド](https://ai.google.dev/gemini-api/docs/generate-content/long-decode)によると、この自動継続（`automatic_continuation`）はストリーミングでも非ストリーミングでも既定で有効です。そのため最新SDKを使っている限り、呼び出し側のコードに`CONTINUATION`が届くことは基本的にありません。

この挙動を確かめるため、2026年10月28日に`:generateContent`を真似たローカルの模擬サーバーを立て、Googleの文書にある形のレスポンスを手書きで返して、PyPIの最新版`google-genai` 2.33.0と、最低バージョンを下回る2.29.0をつなぎました。1回目は思考だけで32,768トークンを使い、テキストが空の`CONTINUATION`とトークンを返し、2回目で`STOP`を返す設定です。

| シナリオ | 2.33.0の結果 | 2.29.0の結果 |
|---|---|---|
| A：1回目`CONTINUATION`＋トークン、2回目`STOP` | リクエスト2回。2回目は同じ`contents`と同じ`maxOutputTokens` 262,144にトークンを付けて送信。呼び出し側に見えるのは`STOP`と「Final answer.」 | リクエスト1回。空のテキストと`CONTINUATION`、トークンがそのまま返り、エラーにはならない |
| B：Aと同じで`automatic_continuation=False` | リクエスト1回。`CONTINUATION`とトークンが呼び出し側に返る | 設定項目そのものが存在しない |
| C：`CONTINUATION`だがトークンなし | リクエスト1回。空のテキストと`CONTINUATION`、例外なし | 同じ |
| D：`MAX_TOKENS`＋トークン | リクエスト1回。SDKは続けず、途中までのテキストとトークンを返す | 同じ |

注意すべきなのはAの2.29.0とCです。どちらも例外が出ないので、`response.text`だけを見ていると「空の回答が返ってきた」としか見えません。2.33.0のソースコード（`google/genai/_extra_utils.py`）を読むと、続きを取りに行くのは終了理由がないか`CONTINUATION`の場合だけで、ストリーミングでは新しいチェックポイントを得られないまま3回再接続すると諦めます。SDKの自動継続を使う場合でも、最後に`finish_reason`が`STOP`かどうかを確認する1行は残しておくのが安全です。模擬サーバーの応答はGoogleの文書の形に合わせて手書きしたもので、実際のサーバーとは細部が異なる可能性があります。

## 継続ループを自分で書く：同じリクエストに最新のトークンだけ足す

SDKを使わずRESTで呼ぶ場合や、自分でループを管理したい場合は、`finishReason`が`CONTINUATION`の間だけ、最初とまったく同じリクエストに最新の`continuationToken`を足して送り続けます。トークンにはモデルの思考を含む途中の状態が入っているので、途中までの出力を`contents`に足してはいけません。次のコードは標準ライブラリだけで書いた非ストリーミングの例で、2026年10月28日にローカルの模擬サーバー相手に動かし、3回のリクエストで`STOP`までつながること、トークンが落ちた応答では止まることを確かめています。

```python
import json, os, urllib.request

URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-4-argon:generateContent"
KEY = os.environ["GEMINI_API_KEY"]
BODY = {  # 毎回まったく同じものを送る
    "contents": [{"role": "user", "parts": [{"text": "素数定理の厳密な証明を書いてください。"}]}],
    "generationConfig": {"maxOutputTokens": 262144, "thinkingConfig": {"thinkingLevel": "high"}},
}

def call(body):
    req = urllib.request.Request(URL, data=json.dumps(body).encode(),
                                 headers={"x-goog-api-key": KEY, "Content-Type": "application/json"})
    with urllib.request.urlopen(req, timeout=1200) as r:  # 20分
        return json.load(r)

parts, hops, token = [], [], None
while True:
    body = dict(BODY, continuationToken=token) if token else BODY
    resp = call(body)
    cand = resp["candidates"][0]
    parts += (cand.get("content") or {}).get("parts") or []
    hops.append(resp.get("usageMetadata", {}))
    reason, token = cand.get("finishReason"), cand.get("continuationToken")
    if reason != "CONTINUATION":
        break
    if not token:
        raise RuntimeError("CONTINUATION なのに continuationToken がない（途中で落とされている）")

text = "".join(p.get("text", "") for p in parts if not p.get("thought"))
print("finishReason:", reason, "/ hop数:", len(hops))
print("プロンプトの大きさ:", hops[0].get("promptTokenCount"))
print("入力トークン合計:", sum(h.get("promptTokenCount", 0) for h in hops))
```

Googleのドキュメントは、1回のリクエストと応答を「hop」と呼び、ループの規則を次のように定めています。`contents`・`system_instruction`・`tools`・`generation_config`は毎回同じものを送り、`max_output_tokens`も変えません。送るトークンは最新の1つだけで、終了理由が`CONTINUATION`以外になったらループを抜け、最後に全hopの`parts`を1つのモデルのターンとしてつなげて会話履歴に入れます。非ストリーミングのRESTでは1回あたり32,768トークンまでなので、同じ量でもストリーミングよりhop数が増えます。

`MAX_TOKENS`で終わった場合は事情が違います。Googleの説明では、Argonの`MAX_TOKENS`にもトークンが付いていて、それまでに使った量より大きい`max_output_tokens`にして同じリクエストを送れば続けられます。上限が使用済みの量以下だと、400エラー「Continuation token has already used output tokens…」が返ります。トークンを付けずに上限だけ上げて送り直すと最初からやり直しになり、両方の分を支払うことになります。

ストリーミングで自前のループを組む場合は、もう1つ規則が加わります。最初の32,768トークンを過ぎると、ストリームは5,000トークンごとにトークン付きのチャンク（チェックポイント）を送ってきます。受け取ったチャンクはいったん保留にしておき、トークン付きのチャンクが来た時点で確定させてトークンを保存します。途中で切れたら保留分を捨てて最後のトークンから再開し、最初のチェックポイントより前に切れた場合は元のリクエストを送り直します。

## 中継サービスとOpenAI互換経路のfinish_reason：2026年10月28日の実測

API中継サービスやOpenAI互換エンドポイントを経由すると、Googleの文書どおりの終了理由やトークンが返ってくるとは限りません。2026年10月28日に、laozhang.aiのGeminiネイティブ経路（`/v1beta/models/gemini-4-argon:generateContent`）とOpenAI互換経路（`/v1/chat/completions`）へ短いリクエストを送った結果が次の表です。費用は上限を$1と決めて動かし、後述の長いテストを含めて最悪見積もりで$0.59でした。

*注記：[laozhang.ai は当ブログ運営チームの自社サービスです](https://blog.laozhang.ai/ja/about#laozhang)。その料金は中立的な比較ではなく、自社の提示価格です。*

| リクエスト | 返ってきたもの | Googleの文書との違い |
|---|---|---|
| ネイティブ、`maxOutputTokens` 64、`thinkingLevel` low、長い解説を依頼 | `MAX_TOKENS`、291文字、`continuationToken`なし | 文書ではArgonの`MAX_TOKENS`にもトークンが付く |
| ネイティブ、200、high、難しい数学の問題 | `MAX_TOKENS`、テキスト0文字（思考197トークン） | 「全部思考に使った」パターン。ただしトークンなし |
| 1件目と同じリクエストをトークンなしで再送（上限64と600） | どちらも最初から書き直した別の回答 | トークンがなければ続きにはならない |
| ネイティブ非ストリーミング、40,000、「OKとだけ返して」 | `STOP`、「OK」 | 文書では直接のRESTで32,768超かつトークンなしは400 |
| ネイティブ、`thinkingLevel` "minimal" | HTTP 500、中国語の「上游服务异常…」とコード"402" | 文書ではArgonはminimalを受け付けない。元のエラー文が置き換えられている |
| OpenAI互換、`max_tokens` 64、長い解説を依頼 | `completion_tokens` 64、`finish_reason` "stop" | 上限まで使ったのに"length"ではない |
| OpenAI互換、`max_tokens` 40,000、「OK」 | "stop"、5トークン | 正常な完了 |

この経路では`continuationToken`が一度も返ってこなかったので、ネイティブ経路でもArgonの長い回答を継続で受け取ることはできませんでした。OpenAIのChat Completions形式では上限で打ち切られた応答は"length"で終わるのが通例なので、OpenAI互換経路のこの"stop"は打ち切りを見逃す原因になります。Googleの[OpenAI互換エンドポイントのページ](https://ai.google.dev/gemini-api/docs/openai)にもfinish_reasonの対応表はないため、OpenAI形式で受ける場合は`finish_reason`だけを信じず、`usage.completion_tokens`が`max_tokens`に達していたら打ち切りとみなすのが確実です。結果は1社の経路で1日に試したもので、ほかの中継サービスや同じ経路の今後の挙動を保証するものではありません。

Google自身のOpenAI互換エンドポイント（`https://generativelanguage.googleapis.com/v1beta/openai/`）でも、long decodeガイドの制限事項に「long decodeは使えず、出力は1回分の上限で止まる」と明記されています。`reasoning_effort`は`low`・`medium`・`high`がそのままArgonの思考レベルに対応します。OpenAI SDKの向き先を変える設定そのものは[OpenAIのbase_url変更：優先順位とパスの書き方](https://blog.laozhang.ai/ja/posts/openai-base-url-override)を参照してください。

## 続きを受け取れない経路からの切り替え先：ネイティブSDKかInteractions

自分の経路で続きを受け取れるかどうかは、`continuationToken`が手元まで届くかで決まります。OpenAI互換エンドポイント、トークンを返さない中継サービス、最低バージョン未満のSDKはいずれも、1回分の上限を超える回答を構造的に受け取れません。64Kや32Kを超える回答が必要なら、Gemini APIのネイティブ`generateContent`を最新SDKか自前のループで呼ぶか、サーバー側で続きを処理してくれるInteractions APIに切り替えます。

[Interactions APIのlong decodeガイド](https://ai.google.dev/gemini-api/docs/long-decode)によると、`background: true`と`store: true`を付け、`max_output_tokens`を65,536より大きく（最大で1,048,576から入力分を引いた値まで）指定すると、サーバーが64Kずつ生成してつなげ、最長24時間まで実行します。`background: false`のまま65,536を超える値を送ると、400エラー「max_output_tokens greater than 65536 is not yet supported with background=false」になります。Interactions APIの結果は`finishReason`ではなく`status`で返り、終わった状態は`completed`・`requires_action`・`incomplete`・`failed`・`cancelled`のいずれかです。`incomplete`は`max_output_tokens`を使い切った状態で、テキストが空のこともあるので、`MAX_TOKENS`と同じく上限か思考レベルを見直します。

## ストリームがfinishReasonなしで終わったら成功ではない

ストリームが最後のチャンクに終了理由を載せないまま閉じた場合は、完了ではなく接続の切断として扱います。`google-genai` 2.33.0のソースコードも、終了理由がない状態を`CONTINUATION`と同じく「まだ続きがある途中の状態」とみなして再開を試みます。Googleのlong decodeガイドの手順どおり、最後に保存したチェックポイントトークンから再開し、チェックポイントがなければ元のリクエストを送り直します。

2026年10月28日の中継経路のテストでは、`maxOutputTokens` 33,000で3言語2,500行のCSVを頼むと、非ストリーミングでは300.9秒で接続が切れて本文が何も返らず、`streamGenerateContent?alt=sse`のストリーミングでは993件のイベントで74,760文字（1,065行目まで）を受け取ったところで302.5秒で終わりました。最後のチャンクの`finishReason`は空文字列で、最終的なトークン数もチェックポイントトークンもありませんでした。途中のチャンクの`candidatesTokenCount`は0のままだったので、トークン数から進み具合を知ることもできません。約300秒という値はGoogleが文書化しているサーバー側の上限（非ストリーミング10分、ストリーミング20分）より短く、手元のHTTPプロキシと中継サービスのどちらで切れたのかはこの結果からは分かりません。

## check_finish.py：finish_reasonから次の動作を1つ決める判定コード

ここまでの規則を、最後のレスポンスを渡すと次の動作を1つ返す関数にまとめました。依存ライブラリはなく、Python 3.9以上で動きます。2026年10月28日に、前の2節で触れた中継経路の保存済みレスポンス7件（ネイティブ4件、OpenAI互換2件、ストリーム最後のチャンク1件）と、模擬レスポンス4件に対して実行し、11件すべてが想定どおりに分類されました。

![最後のfinishReasonがSTOP、CONTINUATION、MAX_TOKENS、SAFETYなど、値なしのどれかによって、完了・トークン付き再送・上限の引き上げ・内容の修正・再開に振り分ける図](https://blog.laozhang.ai/posts/ja/gemini-4-argon-api-finish-reason/img/finish-reason-router.webp)

```python
CONTENT = {"SAFETY", "PROHIBITED_CONTENT", "BLOCKLIST", "SPII", "RECITATION", "LANGUAGE"}
TOOLING = {"MALFORMED_FUNCTION_CALL", "UNEXPECTED_TOOL_CALL", "TOO_MANY_TOOL_CALLS",
           "MISSING_THOUGHT_SIGNATURE", "MALFORMED_RESPONSE"}

def next_action(resp: dict) -> str:
    """Gemini ネイティブ形式（REST JSON）の最後のレスポンスから次の動作を1つ返す"""
    cands = resp.get("candidates") or []
    if not cands:
        return "blocked_or_empty"            # promptFeedback を確認
    c = cands[0]
    reason = c.get("finishReason") or None   # 空文字列も「なし」として扱う
    token = c.get("continuationToken")
    parts = (c.get("content") or {}).get("parts") or []
    text = "".join(p.get("text", "") for p in parts if not p.get("thought"))
    if reason is None:
        return "transport_cut"               # 完了扱いにしない
    if reason == "STOP":
        return "done"
    if reason == "CONTINUATION":
        return "continue" if token else "continuation_without_token"
    if reason == "MAX_TOKENS":
        return ("raise_budget" + ("_empty_text" if not text else "")
                + ("_with_token" if token else "_start_over"))
    if reason in CONTENT:
        return "content_stop"                # 同じリクエストの再試行は無意味
    if reason in TOOLING:
        return "tool_or_format_stop"
    return "other"                           # finishMessage を記録して1回だけ再試行

def next_action_openai(resp, max_tokens):
    """OpenAI 互換形式：finish_reason より completion_tokens を信じる"""
    ch = (resp.get("choices") or [{}])[0]
    used = (resp.get("usage") or {}).get("completion_tokens", 0)
    if ch.get("finish_reason") == "length" or used >= max_tokens:
        return "truncated"                   # このエンドポイントでは続きを取れない
    return "done" if ch.get("finish_reason") in ("stop", "tool_calls") else "check"
```

実行結果は、64トークン上限の応答が`raise_budget_start_over`、テキスト0文字の応答が`raise_budget_empty_text_start_over`、OpenAI互換で"stop"だった64トークンの応答が`truncated`、finishReasonなしで終わったストリームが`transport_cut`でした。「1から7000まで」を断った応答は`done`に分類されます。`STOP`がタスクの完成を意味しないのはこの関数でも同じで、中身の確認は別に必要です。

## long decode後のprompt_token_countが膨らむ理由と費用の読み方

長い出力の生成（long decode）のあとに`prompt_token_count`が実際のプロンプトより何倍も大きく見えるのは、各hopの入力が足し算されているからです。2回目以降のhopでは、プロンプトにそれまで生成した分を加えたものがモデルの入力になり、SDKはその全hopの入力を合計して報告します。プロンプトの大きさを知りたいときは、Pythonなら`usage_metadata.initial_prompt_token_count`、JavaScriptなら`usageMetadata.initialPromptTokenCount`を読みます。

Googleのlong decodeガイドの例では、1,000トークンのプロンプトで思考と出力が200,000トークンになると、SDK経由で4回のhopになり、入力は1,000、66,536、132,072、197,608で合計397,216トークンと報告されます。実際の文脈は約201,000トークンなのに、`total_token_count`は約597,000になる計算です。非ストリーミングのRESTで32Kずつ回すと7回のhopになり、入力の合計は695,128トークンになります。前述の模擬サーバーのテストでも、2.33.0の`prompt_token_count`は2回分を足した33,008（120＋32,888）で、`initial_prompt_token_count`は元の120でした。

![4回のhopの入力が1,000、66,536、132,072、197,608と増えて合計397,216になる一方、実際の文脈は約201,000、プロンプトは1,000であることを示す棒グラフ](https://blog.laozhang.ai/posts/ja/gemini-4-argon-api-finish-reason/img/long-decode-token-count.webp)

この例を料金に直すと、思考を含む出力200,000トークンは2026年11月30日までの単価で200,000 ÷ 1,000,000 × $10.00 = $2.00です。入力397,216トークンは、キャッシュがまったく効かなかったとしても397,216 ÷ 1,000,000 × $2.00 ≈ $0.79が上限で、Googleの説明では2回目以降に繰り返される入力は暗黙的キャッシュで95%割り引かれ、100万トークンあたり$0.10になります。キャッシュは15〜20分使われないと消えるので、hopの間を空けると通常料金に戻ります。思考だけのhopも課金対象で、失敗したり切れたりした非ストリーミングのhopは$0、ストリームは32Kトークンより前に切れれば$0、それ以降は最後のチェックポイントまでが課金されます。

`initial_prompt_token_count`はSDKが手元で計算する値で、RESTのレスポンスにも`model_dump()`の出力にも含まれません。自前のループや中継サービスのようにRESTで呼ぶ場合は、各フィールドをhopごとに足して費用を出し、プロンプトの大きさには1回目のhopの`promptTokenCount`を使います。会話履歴の要約や切り詰めの判断に合計値を使うと、まだ余裕があるのに早すぎるタイミングで圧縮が始まります。

## Gemini 4 Argonのfinish_reasonに関するよくある質問

### Gemini 4 Argonでtemperatureやtop_pを指定するとどうなりますか？

Googleのlong decodeガイドによると、Argonは`temperature`・`top_p`・`top_k`を無視し、警告を返します。`thinking_budget`も同様に警告の対象で、思考の量は`thinking_level`で調整します。`thinking_level`と`thinking_budget`を両方指定するとエラーになるので、どちらか一方にします（2026年10月28日時点のドキュメント）。

### max_output_tokensを小さくすれば、Argonの思考は短くなりますか？

なりません。`max_output_tokens`は思考と回答の合計の上限なので、下げてもモデルが簡潔に考えるようになるわけではなく、回答が早く切れるだけです。トークンの消費を抑えたい場合は`thinking_level`を`medium`から`low`に下げるよう、Googleのlong decodeガイドは案内しています。

### Argonに文字数を指定すれば、その分だけ出力されますか？

出力されるとは限りません。Googleのドキュメントは、Argonはトークン数や文字数の目標に従わず、`max_output_tokens`を大きくしても書く量はモデルが決めると説明しています。決まった分量の出力が必要なら、章や行の範囲ごとに分けて依頼し、受け取った側で完成条件を確かめるほうが確実です。

## 参考資料

本文で参照している外部ページを、登場順に並べています。最終更新日：2026-10-28。

- [Gemini APIの料金ページ](https://ai.google.dev/gemini-api/docs/pricing) (ai.google.dev)
- [Gemini APIの課金ページ](https://ai.google.dev/gemini-api/docs/billing) (ai.google.dev)
- [Gemini APIの提供地域リスト](https://ai.google.dev/gemini-api/docs/available-regions) (ai.google.dev)
- [Gemini APIの変更履歴](https://ai.google.dev/gemini-api/docs/changelog) (ai.google.dev)
- [Gemini 4 Argonの新機能ページ](https://ai.google.dev/gemini-api/docs/latest-model) (ai.google.dev)
- [Gemini APIのGenerateContentリファレンス](https://ai.google.dev/api/generate-content) (ai.google.dev)
- [Googleのlong decodeガイド](https://ai.google.dev/gemini-api/docs/generate-content/long-decode) (ai.google.dev)
- [OpenAI互換エンドポイントのページ](https://ai.google.dev/gemini-api/docs/openai) (ai.google.dev)
- [Interactions APIのlong decodeガイド](https://ai.google.dev/gemini-api/docs/long-decode) (ai.google.dev)
