私の環境
OS: Windows 11 + WSL2 + Ubuntu 24.04.1 LTS
GitHub Copilot CLI: 1.0.25
はじめに
Copilot CLI には autocompact という機能があります。会話が長くなってコンテキストが一定量を超えると、会話履歴を自動で圧縮してくれる機能です。これが実行される閾値はデフォルトで max_prompt_tokens の 80% になっています。
自動で圧縮してもらえるのは有難いのですが、圧縮が走るタイミングは把握しておきたいですよね...!そこで本日はコンテキストの使用量を以下のようにステータスバーに表示する方法を紹介します。
構成
3 つのファイルを利用します。
~/.copilot/
├── config.json # statusLine + extension 設定
├── statusline.sh # ステータスバー描画スクリプト
└── extensions/
└── context-display/
└── extension.mjs # usage_info → JSON 書き出し
Extension が session workspace(~/.copilot/session-state/<session-id>/)に statusline-context.json を書き、statusLine スクリプトがそれを読み込むという構成です。
1. Extension
~/.copilot/extensions/context-display/extension.mjs を作ります。
import { writeFile } from "node:fs/promises";
import { join } from "node:path";
import { joinSession } from "@github/copilot-sdk/extension";
const session = await joinSession({});
const usagePath = session.workspacePath
? join(session.workspacePath, "statusline-context.json")
: null;
session.on("session.usage_info", async (event) => {
if (!usagePath) return;
const { currentTokens, tokenLimit } = event.data;
await writeFile(
usagePath,
JSON.stringify({ currentTokens, tokenLimit }),
"utf-8",
);
});
session.usage_info は各 LLM 呼び出し後に発火します。currentTokens と tokenLimit を JSON に書き出しています。
@github/copilot-sdk は CLI が自動で解決するので、npm install は不要です。
2. statusLine スクリプト
~/.copilot/statusline.sh を作ります。
#!/bin/bash
input=$(cat)
echo "$input" | python3 -c "
import json
import os
import sys
d = json.load(sys.stdin)
def fmtk(n):
return f'{round(n/1000)}k' if n >= 1000 else str(n)
transcript_path = d.get('transcript_path')
usage_path = os.path.join(transcript_path, 'statusline-context.json') if transcript_path else None
if usage_path and os.path.exists(usage_path):
try:
with open(usage_path, 'r', encoding='utf-8') as f:
usage = json.load(f)
except (OSError, json.JSONDecodeError):
usage = None
if usage:
used = usage.get('currentTokens')
limit = usage.get('tokenLimit')
if isinstance(used, (int, float)) and isinstance(limit, (int, float)) and limit > 0:
pct = round(used / limit * 100)
color = '33' if pct >= 80 else '38;5;216'
print(f'\033[{color}m Context: {fmtk(used)}/{fmtk(limit)} ({pct}%)\033[0m')
" 2>/dev/null
chmod +x ~/.copilot/statusline.sh
Extension の JSON が見つかれば autocompact 基準で表示します。色は 80% 未満がオレンジ、80% 以上が黄色になるように設定しています。
3. config.json
~/.copilot/config.json に以下を追加します。現状では experimental を有効にしないと statusLine と Extension は利用できません。Extension は ~/.copilot/extensions/ 以下に置くだけで自動検出されるので、config.json への追記は不要です。
{
"experimental": true,
"statusLine": {
"type": "command",
"command": "~/.copilot/statusline.sh"
}
}
ここまで設定して CLI を起動し直すと、ステータスバーにコンテキスト使用量が表示されるようになります。
補足
なぜ Extension が必要なのか
statusLine.command に渡される JSON の context_window_size は max_context_window_tokens です。autocompact の判定基準は max_prompt_tokens なので、モデルによっては分母がずれます。(筆者独自調べ)
| モデル | max_context_window_tokens | max_prompt_tokens |
|---|---|---|
| Claude Opus 4.6 | 200k | 168k |
| Claude Sonnet 4.6 | 200k | 168k |
| Claude Haiku 4.5 | 200k | 136k |
| GPT-5.4 | 400k | 272k |
Extension SDK の session.usage_info が返す tokenLimit は max_prompt_tokens 側の値です。こちらを使えば autocompact と同じ基準で表示できます。
autocompact の閾値
Copilot CLI は max_prompt_tokens に対するパーセンテージで compaction を判定します。
- 80% でバックグラウンド compaction が開始される
- 95% でブロッキング(応答を一時停止して即時実行) compaction が走る
環境変数で変更もできます。
export COPILOT_BACKGROUND_COMPACTION_THRESHOLD=0.7
export COPILOT_BUFFER_EXHAUSTION_THRESHOLD=0.9
モデルを切り替えると max_prompt_tokens が変わるので、切り替え直後に 80% を超えていれば即座に compaction が走ります。私は GPT-5.4 から Claude Opus 4.6 に戻したとき、分母が 272k → 168k に縮んで autocompact が発動するのを確認しました。
さいごに
ステータスバーには他にもいろいろ表示できると思うので、ぜひお好みのカスタマイズをしてみてください!

