changelog の 10 月 13 日の項目で、gemini-4-argon が一般提供になったと知りました。モデル ID を書き換えるだけなら一分で済みます。ただ、個人開発でレビュー返信の下書きや運用スクリプトに Gemini を使っている身としては、ID を替えた翌朝に何かがずれているのが、いちばん落ち着かない展開です。替える前に「何を消すか」を先に洗い出しておきたくなりました。
最初にお伝えしたいのは、Argon への移行では「足すもの」よりも「消すもの」のほうが多い、ということです。公式の移行チェックリストを読むと、外すか見直すべき書き方が四つ並んでいます。私自身は Argon をまだ本番の呼び出しで試しておりません。ですからこの記事は、替える前に自分のコードを棚卸しするための道具と、その見方の記録です。
Argon で挙動が変わると公式に書かれている 4 点
Gemini 4 Argon の案内ページ(What's new in Gemini 4 Argon)で、移行時に手を入れる項目として明記されているのは、次の四つです。
| コードの書き方 | Argon での扱い | やること |
|---|---|---|
cachedContents / caches.create による明示キャッシュ | 非対応。暗黙キャッシュのみ | 作成・参照の呼び出しを外す |
temperature / top_p / top_k | 指定しても無視される | 削除するか、効いていないと分かる形にする |
max_output_tokens が 32,768 未満 | 思考にも枠を使うため、答えが途中で切れうる | 32,768 以上へ。難しい処理はもっと大きく |
| HTTP クライアントのタイムアウトが短い | 難しい入力は数分かかりうる | 15 分以上、または background 実行 |
暗黙キャッシュは 4,096 トークン以上のプロンプトで既定で有効になり、キャッシュが当たった入力トークンは 95% 割り引かれる、とあります。明示キャッシュで組んでいた方は、保存料の考え方ごと変わるのだと思います。
失敗しやすいのは、エラーにならない 2 つです
四つのうち、cachedContents は非対応なので呼べばおそらく失敗として気づけます。厄介なのは temperature と max_output_tokens のほうです。
temperature は無視されるだけで、エラーは出ません。つまり、レビュー返信の文体を安定させるために 0.2 に固定していたコードは、Argon に替えた瞬間から「固定しているつもり」で動き続けます。出力が揺れても、設定が効いていないとは気づきにくいのです。
max_output_tokens も同じです。Flash の頃に 8,192 で足りていた処理は、Argon では同じ枠を思考と回答で分け合うため、回答が短く終わったり途中で止まったりしかねません。公式は、既存の上限が 32K を下回るなら 32,768 以上に上げるよう勧めています。
エラーで教えてくれない変更ほど、替える前に自分の手で探します。 この線引きだけは、モデルが新しくなるたびに守るようにしております。
自分のコードから 4 つを探すスクリプト
リポジトリを歩いて、上の四つに当たる行を一覧にするだけの小さなスクリプトです。標準ライブラリだけで動き、見つかったら終了コード 1 を返します。手元の数行のサンプルで、四種類とも拾えることは確かめました。
#!/usr/bin/env python3
"""gemini-4-argon へ model を替える前に、自分のコードから引っかかる書き方を探す。"""
import pathlib
import re
import sys
EXTS = {".py", ".js", ".ts", ".tsx", ".mjs", ".sh", ".json", ".yaml", ".yml"}
SKIP = {"node_modules", ".git", ".next", "dist", "__pycache__", ".venv"}
CHECKS = [
("明示キャッシュ", r"cachedContents|caches\.create|cached_content|cachedContent",
"Argon は明示キャッシュ非対応。呼び出しを外し、暗黙キャッシュに任せる"),
("サンプリング指定", r"\b(temperature|top_p|top_k|topP|topK)\b[\"']?\s*[:=]",
"Argon では指定しても無視される。残すなら『効いていない』と分かる印を付ける"),
("出力上限が小さい", r"(max_output_tokens|maxOutputTokens)\"?\s*[:=]\s*(\d+)",
"32,768 未満は思考で使い切るおそれ。数字を見て判断する"),
("短いタイムアウト", r"(timeout|timeout_ms|timeoutMs)\"?\s*[:=]\s*(\d+)",
"難しい入力は数分かかる。15 分未満なら background 実行を検討する"),
]
def scan(root: pathlib.Path):
hits = []
for path in root.rglob("*"):
if path.suffix not in EXTS or any(p in SKIP for p in path.parts):
continue
try:
lines = path.read_text(encoding="utf-8").splitlines()
except (UnicodeDecodeError, OSError):
continue
for no, line in enumerate(lines, 1):
for name, pattern, hint in CHECKS:
m = re.search(pattern, line)
if not m:
continue
if name == "出力上限が小さい" and int(m.group(2)) >= 32768:
continue
hits.append((name, f"{path}:{no}", line.strip()[:90], hint))
return hits
if __name__ == "__main__":
target = pathlib.Path(sys.argv[1] if len(sys.argv) > 1 else ".")
found = scan(target)
seen = set()
for name, where, text, hint in found:
print(f"[{name}] {where}\n {text}")
seen.add((name, hint))
print(f"\n{len(found)} 件 / {len({n for n, _ in seen})} 種類")
for name, hint in sorted(seen):
print(f"- {name}: {hint}")
sys.exit(1 if found else 0)使い方は python3 argon_preflight.py ./my-app の一行です。出力はたとえば次のようになります。
[サンプリング指定] app/reply.py:12
cfg = {"temperature": 0.2, "max_output_tokens": 8192}
[出力上限が小さい] app/reply.py:12
cfg = {"temperature": 0.2, "max_output_tokens": 8192}同じ行が二つの種類で出るのは仕様です。一行に二つの問題が同居しうるためで、設定を辞書にまとめて書く癖のある方ほど、こうした行が出やすいはずです。
読み方で気をつけた点
- タイムアウトの単位は秒とミリ秒が混ざります。
60000が 60 秒なのか 60,000 秒なのかは、呼び出し側のライブラリを見て判断してください - 正規表現での検出ですから、コメントやテストデータにも当たります。0 件にすることより、全件に目を通すことを目的にしております
max_output_tokensに変数を渡している行は数字が読めず、拾えません。そこは別に探す必要があります
替えたあとに確かめること
スクリプトで洗い出した後は、Argon への切り替えを一度に全面でやらず、まず一本の処理だけにするのが無難だと考えています。見る点は三つです。
- 応答が途中で切れていないかを、
finishReasonと文字数で見ます - 思考を含む出力トークン数が、これまでの何倍になったかを数えます
- 思考レベルを
low・medium・highで比べ、品質に足りる最小のものを選びます
公式も、三つのレベルで評価してから最小のものを選ぶよう案内しています。既定は medium です。
料金の確認も、先にしておくと胃が痛くなりません。gemini-4-argon は 2026 年 11 月 30 日までが導入価格で、入力が 100 万トークンあたり 2 ドル、出力(思考を含む)が 10 ドルです。12 月 1 日からは入力 4 ドル・出力 20 ドルになります。同じ時期の gemini-3.8-flash は、2026 年 12 月 31 日まで入力 0.75 ドル・出力 3.75 ドルです。単価だけで見れば Argon は数倍高く、さらに思考に使うトークンも増えうるのです。Flash 側の価格切り替えは、導入価格が終わる前後の二列見積もりで扱っています。
全部を Argon にしない、という選び方
ここまで書いて、あらためて思うのは、移行のコストが高い処理は替えなくてもよい、ということです。ストアレビューへの返信文の下書きのように、短くて形式が決まっている処理は、Flash のままでも困りません。Argon の案内ページが挙げている得意分野は、複雑なコーディング、エージェント、数学・科学です。そこに当たる処理だけを移し、残りは据え置く。この使い分けが、いまのところ私の結論です。
モデルが入れ替わったかどうかを毎回見分ける方法は、要求した ID と応答した ID を突き合わせる記録に書きました。Argon に一本移したあとも、あの記録は続けるつもりです。
まずは今日、argon_preflight.py を自分のリポジトリに一度だけ当てて、出てきた行を数えてみていただければと思います。件数が分かれば、移すかどうかを決める材料の半分は揃います。