4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitHub Copilot CLI でコンテキスト使用量をステータスバーに表示する方法

4
Last updated at Posted at 2026-04-14

2026年4月17日時点の GitHub Copilot CLI の最新版 v1.0.30 でコンテキスト使用量がステータスバーにデフォルトで表示されていることを確認しました。本記事の方法は、表示内容をカスタマイズしたい場合の参考としてご覧ください。

image.png

私の環境

OS: Windows 11 + WSL2 + Ubuntu 24.04.1 LTS
GitHub Copilot CLI: 1.0.25

はじめに

Copilot CLI には autocompact という機能があります。会話が長くなってコンテキストが一定量を超えると、会話履歴を自動で圧縮してくれる機能です。これが実行される閾値はデフォルトで max_prompt_tokens の 80% になっています。

自動で圧縮してもらえるのは有難いのですが、圧縮が走るタイミングは把握しておきたいですよね...!そこで本日はコンテキストの使用量を以下のようにステータスバーに表示する方法を紹介します。

image.png

構成

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 呼び出し後に発火します。currentTokenstokenLimit を 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 を起動し直すと、ステータスバーにコンテキスト使用量が表示されるようになります。

image.png

補足

なぜ Extension が必要なのか

statusLine.command に渡される JSON の context_window_sizemax_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 が返す tokenLimitmax_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 が発動するのを確認しました。

さいごに

ステータスバーには他にもいろいろ表示できると思うので、ぜひお好みのカスタマイズをしてみてください!

参考

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?