ANTIGRAVITY LABEN
記事一覧/AIツール
AIツール/2026-07-30上級

Pro に回す件数を半分にしても、トークンは6割残っていた — モデル振り分けの基準を測り直す

単数の設定が models コレクションに置き換わり、複数モデルのルーティングを自分で決める必要が出ました。タスク種別で振り分けていた基準を、手元のリポジトリ67タスクの実測分布で測り直した記録です。

Antigravity344モデルルーティングコンテキスト設計5コスト設計3計測6

プレミアム記事

朝の自動実行のログを眺めていて、手が止まりました。

タスクの種別で Flash と Pro を振り分ける仕組みを入れたのは、それなりに前のことです。画面やライブラリの実装は Pro、それ以外は Flash。件数で見れば、確かに Pro に回る仕事は減っています。

減っているはずなのに、体感として軽くなった気がしない。

ちょうど、単数だった gemini_configAgentConfig / LocalAgentConfigmodels コレクションへ置き換わり、複数モデルのルーティングとフォールバック、自動選択のヘルパーを扱えるようになったところでした。設定を書き直すなら、そのついでに「何を基準に選ばせるか」も書き直したい。

基準を書き直すには、まず自分が何を渡しているのかを知る必要があります。測ってみたら、種別という軸そのものが思っていたほど効いていませんでした。

「何を基準に選ばせるか」が設定の側に降りてきた

単数のモデル指定は、選択の余地がないぶん考えることもありませんでした。コレクションになると事情が変わります。役割ごとに複数のモデルを並べられるということは、どの仕事をどのモデルに落とすかを、こちらが定義しなければならないということです。

自動選択のヘルパーがあっても、選択の軸は自分で決める必要があります。よく採られるのは、タスクの種別で決める方法です。「設計を伴う実装は上位モデル、定型作業は高速モデル」。読み下せば筋が通っていますし、私も長らくこれで運用してきました。関連する話は/effort をタスク種別で振り分けた記録にも書いています。

ただ、この軸が本当に費用に効いているのかを、私は一度も確かめていませんでした。

課金されるのはタスクの件数ではなく、トークンです。件数の比率とトークンの比率が一致している保証はどこにもありません。

なお設定ファイルのフィールド名や構造はバージョンで動きます。手元のバージョンでの正確な形は、組み込みの antigravity_guide や公式リファレンスで確認してください。この記事で扱うのは、その設定に何を渡すかを決めるための測り方です。

エージェントが実際に受け取る量を測る

「1タスク」を、1つのソースファイルを編集する仕事と定義します。そのときモデルに渡るのは、対象ファイル単体ではありません。そのファイルがインポートしているローカルのモジュールも一緒に入ってきます。

そこで、対象ファイル + ローカル依存1ホップを1タスクのコンテキストとみなして、トークン数を数えました。トークナイザは手元で安定して再現できる tiktokeno200k_base を代理に使っています。実際のモデルのトークナイザとは数え方が異なるため、絶対値ではなく分布の形を見るための目盛りとして扱ってください。

#!/usr/bin/env python3
"""リポジトリを対象に、エージェントが実際に受け取るコンテキスト量を測る。
 
1タスク = 1ファイルを編集する仕事。渡るコンテキストは、そのファイルと
ローカル依存(1ホップ)の合計とみなす。
"""
import os, re, sys, json
import tiktoken
 
ROOT = sys.argv[1]
SRC = os.path.join(ROOT, "src")
ENC = tiktoken.get_encoding("o200k_base")
IMPORT_RE = re.compile(r"""(?:from|import)\s+['"]([^'"]+)['"]""")
EXTS = (".ts", ".tsx")
 
def files():
    out = []
    for d, _, fs in os.walk(SRC):
        for f in fs:
            if f.endswith(EXTS):
                out.append(os.path.join(d, f))
    return sorted(out)
 
def resolve(spec, origin):
    """インポート指定をローカルのファイルパスへ解決する。外部パッケージは None。"""
    if spec.startswith("@/"):
        base = os.path.join(SRC, spec[2:])
    elif spec.startswith("."):
        base = os.path.normpath(os.path.join(os.path.dirname(origin), spec))
    else:
        return None
    for cand in (base + ".ts", base + ".tsx",
                 os.path.join(base, "index.ts"), os.path.join(base, "index.tsx")):
        if os.path.isfile(cand):
            return cand
    return None
 
CACHE = {}
def toks(path):
    if path not in CACHE:
        with open(path, encoding="utf-8", errors="replace") as fh:
            CACHE[path] = len(ENC.encode(fh.read()))
    return CACHE[path]
 
def context(path):
    with open(path, encoding="utf-8", errors="replace") as fh:
        src = fh.read()
    deps = set()
    for spec in IMPORT_RE.findall(src):
        r = resolve(spec, path)
        if r and r != path:
            deps.add(r)
    return sorted(deps), len(ENC.encode(src))
 
def pct(sorted_vals, p):
    k = (len(sorted_vals) - 1) * p / 100
    lo, hi = int(k), min(int(k) + 1, len(sorted_vals) - 1)
    return sorted_vals[lo] + (sorted_vals[hi] - sorted_vals[lo]) * (k - lo)
 
tasks = []
for f in files():
    deps, own = context(f)
    total = own + sum(toks(d) for d in deps)
    tasks.append({"file": os.path.relpath(f, ROOT), "deps": len(deps),
                  "own": own, "ctx": total})
 
vals = sorted(t["ctx"] for t in tasks)
total_tokens = sum(vals)
print(f"tasks={len(tasks)}  total_ctx_tokens={total_tokens}")
for p in (50, 75, 90, 95, 99):
    print(f"  p{p} = {pct(vals, p):,.0f}")
print(f"  max = {vals[-1]:,}  mean = {total_tokens/len(vals):,.0f}")
top5 = max(1, round(len(vals) * 0.05))
print(f"top {top5} tasks (5%) hold {sum(vals[-top5:])/total_tokens*100:.1f}% of all context tokens")
print("\nlargest 5:")
for t in sorted(tasks, key=lambda x: -x["ctx"])[:5]:
    print(f"  {t['ctx']:>7,}  deps={t['deps']:<3} {t['file']}")
json.dump(tasks, open("tasks.json", "w"))

個人開発で回している自分のサイトのリポジトリ(TypeScript / TSX の67ファイル)に当てた結果です。所要時間は 0.6 秒でした。

tasks=67  total_ctx_tokens=220556
  p50 = 2,311
  p75 = 4,618
  p90 = 7,579
  p95 = 8,106
  p99 = 15,019
  max = 23,119  mean = 3,292
top 3 tasks (5%) hold 19.2% of all context tokens
top 13 tasks (20%) hold 51.6%

largest 5:
   23,119  deps=12  src/app/[locale]/articles/[category]/[slug]/page.tsx
   10,846  deps=3   src/app/[locale]/support/page.tsx
    8,382  deps=4   src/app/[locale]/membership/page.tsx
    8,188  deps=0   src/app/[locale]/about/page.tsx
    7,915  deps=1   src/app/[locale]/support/SupportClient.tsx

中央値 2,311 トークンに対して最大が 23,119 トークン。10 倍の開きです。上位2割のタスクが全体の 51.6% を抱えています。

この時点で、嫌な予感がしました。件数を基準に振り分けている限り、この偏りは見えません。

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

この記事の続きを読む

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

この記事で得られること
エージェントが実際に受け取るコンテキスト量を、依存の1ホップまで含めて測る Python スクリプト(そのまま自分のリポジトリに当てられる完全版)
同じ件数を Pro に送っても、種別ルータは60.9%・サイズ順なら84.6%のトークンしか掴めないという実測差と、その差が生まれる場所
やり直し率が8〜10%を超えると振り分けの節約が消えること、そしてその損益分岐が価格比をどれだけ動かしてもほとんど変わらないこと
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

AIツール2026-07-05
AI Ultra 100ドル枠は個人開発に見合うか — 上限の壁と並列度で損益分岐を測る
月100ドルの AI Ultra 枠(Pro の5倍上限)が個人開発者に見合うかを、上限に当たる頻度と並列エージェントの実効スループットから損益分岐として試算する方法を、計算スクリプトつきで整理します。
AIツール2026-07-01
Antigravity CLI のコンテキストを測って削る——トークンと待ち時間を減らす context ledger
Android CLI のトークン約70%削減という数字をきっかけに、自分の手元のエージェント運用を測る薄いラッパーと週次の棚卸しを作った記録です。ファイル全文投入を範囲指定に置き換えて待ち時間を縮めた手順を共有します。
AIツール2026-07-26
Antigravity CLI の /effort をタスク種別で振り分ける — 6週間の実測と、効かなかった領域
Antigravity CLI v1.1.5 で加わった /effort を、タスク種別ごとに自動で振り分ける仕組みを作り、6週間分の実行ログを集計しました。効いた領域と、上げるほど結果が悪くなった領域を実測値とともに整理しています。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →