ANTIGRAVITY LABEN
記事一覧/AIツール
AIツール/2026-08-19上級

Antigravity の既定モデルが入れ替わっても壊れないのは、出力を先に狭めてある仕事です

Gemini 3.7 Flash が Antigravity のエージェント既定モデルになりました。設定を触っていない箇所ほど静かに影響を受けます。既定に依存している場所を機械的に洗い出し、乗せる仕事と据え置く仕事を出力の自由度で切り分ける手順を、3つの検査スクリプトとともに記します。

antigravity440gemini16agents92model-migration2

プレミアム記事

朝いちばんに走らせている定型の生成タスクがあります。壁紙アプリのアセットを分類させるもので、もう何ヶ月も同じ設定のまま回しています。

その出力の形が変わりうる、と気づいたのは自分の環境を見たからではありませんでした。変更履歴のほうが先でした。8月13日に一般提供となった Gemini 3.7 Flash が、Antigravity エージェントの既定モデルになっています。

こちらは設定を一行も触っていません。それでも、モデル名を書いていない場所は全部、静かに新しい既定へ移ります。

移行するかどうかを考える前に、確かめるべきことがありました。自分の運用のうち、どこが「既定」という名前のない場所に乗っているのか。

既定モデルは、こちらの合意を待たずに入れ替わる

モデルの乗り換えというと、普通は自分で決めて自分で切り替えるものです。検証して、比べて、良ければ移す。

既定モデルの入れ替わりはその逆を行きます。提供側が決めて、こちらの設定が沈黙している箇所にだけ適用されます。判断を求められないので、判断した記憶も残りません。

Gemini 3.7 Flash は入力 100 万トークンあたり 0.75 ドル、出力 3.75 ドルという導入価格で提供されています。この価格は 2026 年 12 月 31 日までで、2027 年 1 月 1 日からは入力 1.50 ドル、出力 7.50 ドルに上がります。コンテキストウィンドウは 1,048,576 トークン、出力上限は 65,536 トークンです。

数字が出ていると、つい費用の話から入りたくなります。私はそこから入るのをやめました。理由は後半に書きます。

先にやるべきなのは棚卸しです。

既定に乗っている場所を機械的に洗い出す

設定を目で追って確認するのは、思っているより当てになりません。エージェント定義のフロントマター、settings.json のエントリ、シェルスクリプトからの呼び出し。同じ「モデル指定」でも書く場所が三箇所に散っていて、しかも「書き忘れ」と「意図して既定へ委ねている」が見た目でほとんど区別できないからです。

区別できないまま数えると、棚卸しは役に立ちません。inherit と書いてある箇所は、既定が変わることを承知のうえで委ねた場所です。キーそのものが無い箇所は、そもそも考えていなかった場所です。後者だけを拾いたい。

#!/usr/bin/env python3
"""既定モデルに黙って依存している箇所を洗い出す。
 
対象:
  1. エージェント定義の YAML フロントマター(model キーの有無)
  2. settings.json の agents.* エントリ
  3. CLI を叩くシェルスクリプト(--model 指定の有無)
 
"inherit" と "default" は「明示的に既定へ委ねている」扱いにして、
書き忘れ(キーそのものが無い)と区別する。ここを混ぜると棚卸しが役に立たない。
"""
import json
import pathlib
import re
import sys
 
DELEGATING = {"inherit", "default", "auto"}
 
 
def read_frontmatter(path: pathlib.Path) -> dict:
    """--- で囲まれた先頭ブロックだけを素朴に読む(PyYAML 非依存)。"""
    text = path.read_text(encoding="utf-8")
    if not text.startswith("---"):
        return {}
    end = text.find("\n---", 3)
    if end == -1:
        return {}
    fm = {}
    for line in text[3:end].splitlines():
        if ":" not in line or line.strip().startswith("#"):
            continue
        key, _, value = line.partition(":")
        fm[key.strip()] = value.strip().strip("\"'")
    return fm
 
 
def scan(root: pathlib.Path) -> list:
    findings = []
 
    for path in sorted(root.glob(".antigravity/agents/*.md")):
        fm = read_frontmatter(path)
        model = fm.get("model")
        if model is None:
            state = "unpinned"      # キーが無い = 既定に無言で乗っている
        elif model.lower() in DELEGATING:
            state = "delegated"     # 意図して既定に委ねている
        else:
            state = "pinned"
        findings.append({"where": str(path.relative_to(root)), "kind": "agent-def",
                         "name": fm.get("name", path.stem), "state": state, "model": model})
 
    settings = root / ".antigravity" / "settings.json"
    if settings.exists():
        data = json.loads(settings.read_text(encoding="utf-8"))
        for name, cfg in (data.get("agents") or {}).items():
            model = cfg.get("model")
            state = "unpinned" if model is None else (
                "delegated" if str(model).lower() in DELEGATING else "pinned")
            findings.append({"where": "settings.json", "kind": "settings",
                             "name": name, "state": state, "model": model})
 
    for path in sorted(root.rglob("*.sh")):
        for lineno, line in enumerate(path.read_text(encoding="utf-8").splitlines(), 1):
            if "antigravity" not in line or " run" not in line:
                continue
            pinned = re.search(r"--model[= ]([\w.\-]+)", line)
            agent = re.search(r"--agent[= ]([\w.\-]+)", line)
            findings.append({"where": f"{path.relative_to(root)}:{lineno}", "kind": "cli-call",
                             "name": agent.group(1) if agent else "(inline)",
                             "state": "pinned" if pinned else "unpinned",
                             "model": pinned.group(1) if pinned else None})
    return findings
 
 
def main() -> int:
    root = pathlib.Path(sys.argv[1] if len(sys.argv) > 1 else ".").resolve()
    findings = scan(root)
    unpinned = [f for f in findings if f["state"] == "unpinned"]
 
    width = max((len(f["where"]) for f in findings), default=10)
    for f in findings:
        mark = {"pinned": "  ", "delegated": "= ", "unpinned": "! "}[f["state"]]
        print(f"{mark}{f['where']:<{width}}  {f['kind']:<9}  {f['name']:<20}  {f['model'] or '-'}")
 
    print(f"\n{len(findings)} 箇所中 {len(unpinned)} 箇所が既定モデル依存(! 印)")
    return 1 if unpinned else 0
 
 
if __name__ == "__main__":
    sys.exit(main())

手元の小さなサンプルツリーに当てると、こうなります。

  .antigravity/agents/classify-wallpaper.md  agent-def  classify-wallpaper    gemini-3.7-flash
! .antigravity/agents/draft-release-note.md  agent-def  draft-release-note    -
= .antigravity/agents/summarize-crash.md     agent-def  summarize-crash       inherit
  settings.json                              settings   classify-wallpaper    gemini-3.7-flash
! settings.json                              settings   draft-release-note    -
! scripts/nightly.sh:2                       cli-call   classify-wallpaper    -
! scripts/nightly.sh:3                       cli-call   draft-release-note    -
 
7 箇所中 4 箇所が既定モデル依存(! 印)

目を引いたのは 6 行目です。classify-wallpaper は定義でもモデルを書いてあり、settings.json でも書いてあります。それでも夜間スクリプトからの呼び出しは --model を持っていません。

三箇所のうち二箇所を埋めたことで、埋まった気になっていた場所です。どの経路の指定が最終的に勝つのかは、版と呼び出し方で変わりえます。だからこそ、経路の数だけ穴が空きうると考えて数えるほうが安全でした。

このスクリプトは違反があると終了コード 1 を返します。定期実行の前段に置いておくと、新しいエージェントを足したときに気づけます。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
自分の運用のどこが既定モデルに黙って依存しているかを、設定ファイルとスクリプトから機械的に洗い出せるようになる
生成物の書式が崩れてから対処に追われる前に、崩れる側の仕事だけを先に据え置く判断ができるようになる
期間限定の導入価格に判断を引きずられず、乗り換えの可否を出力契約の側から決められるようになる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

Agents & Manager2026-04-20
Antigravity × Google Workspace API で構築するビジネス自動化エージェント — Gmail・Drive・Sheets・Docs 完全連携実装ガイド
Antigravity と Google Workspace API(Gmail・Drive・Sheets・Docs)を組み合わせ、ビジネス文書処理・メール自動応答・データ集計を完全自動化するAIエージェントの設計から本番運用までを解説します。
Agents & Manager2026-03-20
Antigravity マルチモデル実践: Gemini × Claude × GPT-OSS の最適な使い分け戦略
Antigravity IDE で利用できる Gemini 3.1 Pro・Claude Opus 4.6・GPT-OSS 120B を場面ごとに最適に使い分ける実践ガイド。モデル特性の比較、AGENTS.md での制御方法、コスト最適化戦略を詳しく解説します。
AIツール2026-06-18
v2.1.4 のクォータ画面を週次の精算に使う — used と remaining を読み崩して個人開発の予算を回す
Antigravity v2.1.4 で刷新されたクォータ画面の used/remaining 表示を、感覚ではなく週次の精算に使う方法です。ベースライン記録・バーンレート計算・複数プロジェクトへの配分まで、個人開発の運用手順として整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →